Deploying to gh-pages from @ mark3labs/kit@7e6455732c 🚀

This commit is contained in:
ezynda3
2026-04-15 15:06:42 +00:00
parent 9d6ce4eefb
commit ff3c30d651
40 changed files with 124 additions and 40 deletions
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.
+1 -1
View File
@@ -1 +1 @@
{"version":"1.5.2","languages":{"en":{"hash":"en_578751942f","wasm":"en","page_count":21}},"include_characters":["_","‿","⁀","⁔","︳","︴","","","","_"]}
{"version":"1.5.2","languages":{"en":{"hash":"en_fc2c9eb3d3","wasm":"en","page_count":21}},"include_characters":["_","‿","⁀","⁔","︳","︴","","","","_"]}
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -7,7 +7,7 @@
<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-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.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>
+1 -1
View File
@@ -7,7 +7,7 @@
<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-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.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>
+1 -1
View File
@@ -7,7 +7,7 @@
<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-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.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>
@@ -66,6 +66,49 @@ const s={frontmatter:{title:"Callbacks",description:"Monitor tool calls and stre
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">kit.HookPriorityNormal </span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> 50</span><span style="color:#6A737D;--shiki-dark:#6A737D"> // default</span></span>
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">kit.HookPriorityLow </span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> 100</span><span style="color:#6A737D;--shiki-dark:#6A737D"> // runs last</span></span></code></pre>
<p>Lower values run first. First non-nil result wins.</p>
<h2 id="all-event-types"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#all-event-types"><span class="icon icon-link"></span></a>All event types</h2>
<table>
<thead>
<tr>
<th>Event</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>ToolCallEvent</code></td>
<td>Tool call parsed and about to execute</td>
</tr>
<tr>
<td><code>ToolResultEvent</code></td>
<td>Tool execution completed with result</td>
</tr>
<tr>
<td><code>ToolOutputEvent</code></td>
<td>Streaming output chunk from tool (e.g., bash stdout/stderr)</td>
</tr>
<tr>
<td><code>MessageUpdateEvent</code></td>
<td>Streaming text chunk from LLM</td>
</tr>
<tr>
<td><code>ResponseEvent</code></td>
<td>Final response received</td>
</tr>
<tr>
<td><code>TurnStartEvent</code></td>
<td>Agent turn started</td>
</tr>
<tr>
<td><code>TurnEndEvent</code></td>
<td>Agent turn completed</td>
</tr>
<tr>
<td><code>PasswordPromptEvent</code></td>
<td>Sudo command needs password (respond via <code>ResponseCh</code>)</td>
</tr>
</tbody>
</table>
<h2 id="subagent-event-monitoring"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#subagent-event-monitoring"><span class="icon icon-link"></span></a>Subagent event monitoring</h2>
<p>Monitor real-time events from LLM-initiated subagents (when the model uses the <code>subagent</code> tool):</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">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">e</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>
@@ -81,7 +124,7 @@ const s={frontmatter:{title:"Callbacks",description:"Monitor tool calls and stre
<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><code>SubscribeSubagent</code> returns an unsubscribe function. Listeners are also cleaned up automatically when the subagent completes. See <a href="/advanced/subagents">Subagents</a> for more details.</p>`,headings:[{depth:2,text:"Event-based monitoring",id:"event-based-monitoring"},{depth:2,text:"Hook system",id:"hook-system"},{depth:3,text:"BeforeToolCall block tool execution",id:"beforetoolcall--block-tool-execution"},{depth:3,text:"AfterToolResult modify tool output",id:"aftertoolresult--modify-tool-output"},{depth:3,text:"BeforeTurn modify prompt, inject messages",id:"beforeturn--modify-prompt-inject-messages"},{depth:3,text:"AfterTurn observation only",id:"afterturn--observation-only"},{depth:3,text:"Hook priorities",id:"hook-priorities"},{depth:2,text:"Subagent event monitoring",id:"subagent-event-monitoring"}],raw:`
<p><code>SubscribeSubagent</code> returns an unsubscribe function. Listeners are also cleaned up automatically when the subagent completes. See <a href="/advanced/subagents">Subagents</a> for more details.</p>`,headings:[{depth:2,text:"Event-based monitoring",id:"event-based-monitoring"},{depth:2,text:"Hook system",id:"hook-system"},{depth:3,text:"BeforeToolCall block tool execution",id:"beforetoolcall--block-tool-execution"},{depth:3,text:"AfterToolResult modify tool output",id:"aftertoolresult--modify-tool-output"},{depth:3,text:"BeforeTurn modify prompt, inject messages",id:"beforeturn--modify-prompt-inject-messages"},{depth:3,text:"AfterTurn observation only",id:"afterturn--observation-only"},{depth:3,text:"Hook priorities",id:"hook-priorities"},{depth:2,text:"All event types",id:"all-event-types"},{depth:2,text:"Subagent event monitoring",id:"subagent-event-monitoring"}],raw:`
# Callbacks
## Event-based monitoring
@@ -179,6 +222,19 @@ kit.HookPriorityLow = 100 // runs last
Lower values run first. First non-nil result wins.
## All event types
| Event | Description |
|-------|-------------|
| \`ToolCallEvent\` | Tool call parsed and about to execute |
| \`ToolResultEvent\` | Tool execution completed with result |
| \`ToolOutputEvent\` | Streaming output chunk from tool (e.g., bash stdout/stderr) |
| \`MessageUpdateEvent\` | Streaming text chunk from LLM |
| \`ResponseEvent\` | Final response received |
| \`TurnStartEvent\` | Agent turn started |
| \`TurnEndEvent\` | Agent turn completed |
| \`PasswordPromptEvent\` | Sudo command needs password (respond via \`ResponseCh\`) |
## Subagent event monitoring
Monitor real-time events from LLM-initiated subagents (when the model uses the \`subagent\` tool):
@@ -25,7 +25,7 @@ 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/core/ - Built-in tools (bash with sudo password prompt, 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
@@ -90,7 +90,7 @@ 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/core/ - Built-in tools (bash with sudo password prompt, 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
File diff suppressed because one or more lines are too long
@@ -5,7 +5,7 @@ const t={frontmatter:{title:"Kit",description:"Kit is a powerful, extensible AI
<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, subagent with no MCP overhead</li>
<li><strong>Built-in Core Tools</strong> bash (with interactive sudo password prompt), read, write, edit, grep, find, ls, subagent with no MCP overhead</li>
<li><strong>Smart @ Attachments</strong> Binary files auto-detected via MIME type, MCP resources via <code>@mcp:server:uri</code></li>
<li><strong>MCP Integration</strong> Connect external MCP servers for expanded capabilities (tools, prompts, and resources)</li>
<li><strong>Extension System</strong> Write custom tools, commands, widgets, and UI modifications in Go</li>
@@ -55,7 +55,7 @@ A powerful, extensible AI coding agent CLI with multi-provider support, built-in
## 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, subagent with no MCP overhead
- **Built-in Core Tools** bash (with interactive sudo password prompt), read, write, edit, grep, find, ls, subagent with no MCP overhead
- **Smart @ Attachments** Binary files auto-detected via MIME type, MCP resources via \`@mcp:server:uri\`
- **MCP Integration** Connect external MCP servers for expanded capabilities (tools, prompts, and resources)
- **Extension System** Write custom tools, commands, widgets, and UI modifications in Go
+1 -1
View File
@@ -7,7 +7,7 @@
<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-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.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>
+1 -1
View File
@@ -7,7 +7,7 @@
<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-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.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>
+1 -1
View File
@@ -7,7 +7,7 @@
<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-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.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>
+2 -2
View File
@@ -7,7 +7,7 @@
<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-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.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>
@@ -47,7 +47,7 @@ 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/core/ - Built-in tools (bash with sudo password prompt, 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
+1 -1
View File
@@ -7,7 +7,7 @@
<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-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.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>
+1 -1
View File
@@ -7,7 +7,7 @@
<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-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.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>
+1 -1
View File
@@ -7,7 +7,7 @@
<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-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.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>
+1 -1
View File
@@ -7,7 +7,7 @@
<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-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.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>
+1 -1
View File
@@ -7,7 +7,7 @@
<meta name="description" content="Write unit tests for your Kit extensions using the test package.">
<link rel="canonical" href="/extensions/testing">
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
<script type="module" src="/assets/index-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.js"></script>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Testing Extensions","description":"Write unit tests for your Kit extensions using the test package.","url":"https://go-kit.dev/extensions/testing","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
</head>
<body>
+1 -1
View File
@@ -15,7 +15,7 @@
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: #333; border-radius: 3px; }
</style>
<script type="module" crossorigin src="/assets/index-8qR0kq1Z.js"></script>
<script type="module" crossorigin src="/assets/index-DTEMNIPk.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>
+1 -1
View File
@@ -7,7 +7,7 @@
<meta name="description" content="Install Kit using npm, bun, pnpm, 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-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.js"></script>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Installation","description":"Install Kit using npm, bun, pnpm, Go, or build from source.","url":"https://go-kit.dev/installation","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
</head>
<body>
+15 -2
View File
@@ -826,7 +826,7 @@ 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/core/ - Built-in tools (bash with sudo password prompt, 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
@@ -2078,7 +2078,7 @@ A powerful, extensible AI coding agent CLI with multi-provider support, built-in
## 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, subagent with no MCP overhead
- **Built-in Core Tools** — bash (with interactive sudo password prompt), read, write, edit, grep, find, ls, subagent with no MCP overhead
- **Smart @ Attachments** — Binary files auto-detected via MIME type, MCP resources via `@mcp:server:uri`
- **MCP Integration** — Connect external MCP servers for expanded capabilities (tools, prompts, and resources)
- **Extension System** — Write custom tools, commands, widgets, and UI modifications in Go
@@ -2512,6 +2512,19 @@ kit.HookPriorityLow = 100 // runs last
Lower values run first. First non-nil result wins.
## All event types
| Event | Description |
|-------|-------------|
| `ToolCallEvent` | Tool call parsed and about to execute |
| `ToolResultEvent` | Tool execution completed with result |
| `ToolOutputEvent` | Streaming output chunk from tool (e.g., bash stdout/stderr) |
| `MessageUpdateEvent` | Streaming text chunk from LLM |
| `ResponseEvent` | Final response received |
| `TurnStartEvent` | Agent turn started |
| `TurnEndEvent` | Agent turn completed |
| `PasswordPromptEvent` | Sudo command needs password (respond via `ResponseCh`) |
## Subagent event monitoring
Monitor real-time events from LLM-initiated subagents (when the model uses the `subagent` tool):
+4 -3
View File
@@ -123,7 +123,7 @@
"Community"
],
"tags": [],
"content": "\n# Development\n\n## Build and test\n\n```bash\n# Build\ngo build -o output/kit ./cmd/kit\n\n# Run all tests\ngo test -race ./...\n\n# Run a specific test\ngo test -race ./cmd -run TestScriptExecution\n\n# Lint\ngo vet ./...\n\n# Format\ngo fmt ./...\n```\n\n## Project structure\n\n```\ncmd/kit/ - CLI entry point (main.go)\ncmd/ - CLI command implementations (root, auth, models, etc.)\npkg/kit/ - Go SDK for embedding Kit\ninternal/app/ - Application orchestrator (agent loop, message store, queue)\ninternal/agent/ - Agent execution and tool dispatch\ninternal/auth/ - OAuth authentication and credential storage\ninternal/acpserver/ - ACP (Agent Client Protocol) server\ninternal/clipboard/ - Cross-platform clipboard operations\ninternal/compaction/ - Conversation compaction and summarization\ninternal/config/ - Configuration management\ninternal/core/ - Built-in tools (bash, read, write, edit, grep, find, ls)\ninternal/extensions/ - Yaegi extension system\ninternal/kitsetup/ - Initial setup wizard\ninternal/message/ - Message content types and structured content blocks\ninternal/models/ - Provider and model management\ninternal/session/ - Session persistence (tree-based JSONL)\ninternal/skills/ - Skill loading and system prompt composition\ninternal/tools/ - MCP tool integration\ninternal/ui/ - Bubble Tea TUI components\nexamples/extensions/ - Example extension files\nnpm/ - NPM package wrapper for distribution\n```\n\n## Architecture overview\n\nKit is built around a few key architectural patterns:\n\n### Multi-provider LLM support\n\nThe `llm.Provider` interface abstracts different LLM providers. Each provider implements message formatting, tool calling, and streaming for its specific API.\n\n### MCP client-server model\n\nExternal tools are integrated via the Model Context Protocol (MCP). Kit acts as an MCP client, connecting to MCP servers configured in `.kit.yml`.\n\n### Extension system\n\nExtensions 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.\n\n### TUI architecture\n\nThe 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.).\n\n### Decoupling pattern\n\n`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.\n\n## Contributing\n\nContributions are welcome! Please see the [contribution guide](https://github.com/mark3labs/kit/blob/master/contribute/contribute.md) for guidelines.\n\n## Community\n\n- [Discord](https://discord.gg/RqSS2NQVsY)\n- [GitHub Issues](https://github.com/mark3labs/kit/issues)\n"
"content": "\n# Development\n\n## Build and test\n\n```bash\n# Build\ngo build -o output/kit ./cmd/kit\n\n# Run all tests\ngo test -race ./...\n\n# Run a specific test\ngo test -race ./cmd -run TestScriptExecution\n\n# Lint\ngo vet ./...\n\n# Format\ngo fmt ./...\n```\n\n## Project structure\n\n```\ncmd/kit/ - CLI entry point (main.go)\ncmd/ - CLI command implementations (root, auth, models, etc.)\npkg/kit/ - Go SDK for embedding Kit\ninternal/app/ - Application orchestrator (agent loop, message store, queue)\ninternal/agent/ - Agent execution and tool dispatch\ninternal/auth/ - OAuth authentication and credential storage\ninternal/acpserver/ - ACP (Agent Client Protocol) server\ninternal/clipboard/ - Cross-platform clipboard operations\ninternal/compaction/ - Conversation compaction and summarization\ninternal/config/ - Configuration management\ninternal/core/ - Built-in tools (bash with sudo password prompt, read, write, edit, grep, find, ls)\ninternal/extensions/ - Yaegi extension system\ninternal/kitsetup/ - Initial setup wizard\ninternal/message/ - Message content types and structured content blocks\ninternal/models/ - Provider and model management\ninternal/session/ - Session persistence (tree-based JSONL)\ninternal/skills/ - Skill loading and system prompt composition\ninternal/tools/ - MCP tool integration\ninternal/ui/ - Bubble Tea TUI components\nexamples/extensions/ - Example extension files\nnpm/ - NPM package wrapper for distribution\n```\n\n## Architecture overview\n\nKit is built around a few key architectural patterns:\n\n### Multi-provider LLM support\n\nThe `llm.Provider` interface abstracts different LLM providers. Each provider implements message formatting, tool calling, and streaming for its specific API.\n\n### MCP client-server model\n\nExternal tools are integrated via the Model Context Protocol (MCP). Kit acts as an MCP client, connecting to MCP servers configured in `.kit.yml`.\n\n### Extension system\n\nExtensions 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.\n\n### TUI architecture\n\nThe 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.).\n\n### Decoupling pattern\n\n`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.\n\n## Contributing\n\nContributions are welcome! Please see the [contribution guide](https://github.com/mark3labs/kit/blob/master/contribute/contribute.md) for guidelines.\n\n## Community\n\n- [Discord](https://discord.gg/RqSS2NQVsY)\n- [GitHub Issues](https://github.com/mark3labs/kit/issues)\n"
},
{
"url": "/extensions/capabilities",
@@ -255,7 +255,7 @@
"Quick links"
],
"tags": [],
"content": "\n<div style=\"text-align: center; margin: 2rem 0;\">\n <img src=\"/logo.jpg\" alt=\"KIT\" style=\"max-width: 400px; width: 100%; margin: 0 auto; display: block;\" />\n</div>\n\nA powerful, extensible AI coding agent CLI with multi-provider support, built-in tools, and a rich extension system.\n\n## Features\n\n- **Multi-Provider LLM Support** — Anthropic, OpenAI, Google Gemini, Ollama, Azure OpenAI, AWS Bedrock, OpenRouter, and more\n- **Built-in Core Tools** — bash, read, write, edit, grep, find, ls, subagent with no MCP overhead\n- **Smart @ Attachments** — Binary files auto-detected via MIME type, MCP resources via `@mcp:server:uri`\n- **MCP Integration** — Connect external MCP servers for expanded capabilities (tools, prompts, and resources)\n- **Extension System** — Write custom tools, commands, widgets, and UI modifications in Go\n- **Interactive TUI** — Rich terminal interface powered by Bubble Tea with streaming, syntax highlighting, and custom rendering\n- **Session Management** — Tree-based conversation history with branching support\n- **Non-Interactive Mode** — Script-friendly positional args with JSON output\n- **ACP Server** — Run Kit as an [Agent Client Protocol](https://agentclientprotocol.com) agent over stdio\n- **Go SDK** — Embed Kit in your own applications\n\n## Quick links\n\n| Resource | Description |\n|----------|-------------|\n| [Installation](/installation) | Get Kit up and running |\n| [Quick Start](/quick-start) | Your first Kit session |\n| [Configuration](/configuration) | Customize Kit for your workflow |\n| [Extensions](/extensions/overview) | Build custom tools and UI components |\n| [Go SDK](/sdk/overview) | Embed Kit in your applications |\n"
"content": "\n<div style=\"text-align: center; margin: 2rem 0;\">\n <img src=\"/logo.jpg\" alt=\"KIT\" style=\"max-width: 400px; width: 100%; margin: 0 auto; display: block;\" />\n</div>\n\nA powerful, extensible AI coding agent CLI with multi-provider support, built-in tools, and a rich extension system.\n\n## Features\n\n- **Multi-Provider LLM Support** — Anthropic, OpenAI, Google Gemini, Ollama, Azure OpenAI, AWS Bedrock, OpenRouter, and more\n- **Built-in Core Tools** — bash (with interactive sudo password prompt), read, write, edit, grep, find, ls, subagent with no MCP overhead\n- **Smart @ Attachments** — Binary files auto-detected via MIME type, MCP resources via `@mcp:server:uri`\n- **MCP Integration** — Connect external MCP servers for expanded capabilities (tools, prompts, and resources)\n- **Extension System** — Write custom tools, commands, widgets, and UI modifications in Go\n- **Interactive TUI** — Rich terminal interface powered by Bubble Tea with streaming, syntax highlighting, and custom rendering\n- **Session Management** — Tree-based conversation history with branching support\n- **Non-Interactive Mode** — Script-friendly positional args with JSON output\n- **ACP Server** — Run Kit as an [Agent Client Protocol](https://agentclientprotocol.com) agent over stdio\n- **Go SDK** — Embed Kit in your own applications\n\n## Quick links\n\n| Resource | Description |\n|----------|-------------|\n| [Installation](/installation) | Get Kit up and running |\n| [Quick Start](/quick-start) | Your first Kit session |\n| [Configuration](/configuration) | Customize Kit for your workflow |\n| [Extensions](/extensions/overview) | Build custom tools and UI components |\n| [Go SDK](/sdk/overview) | Embed Kit in your applications |\n"
},
{
"url": "/installation",
@@ -317,10 +317,11 @@
"BeforeTurn — modify prompt, inject messages",
"AfterTurn — observation only",
"Hook priorities",
"All event types",
"Subagent event monitoring"
],
"tags": [],
"content": "\n# Callbacks\n\n## Event-based monitoring\n\nSubscribe to events for real-time monitoring. Each method returns an unsubscribe function:\n\n```go\nunsub := host.OnToolCall(func(event kit.ToolCallEvent) {\n fmt.Printf(\"Tool: %s, Args: %s\\n\", event.ToolName, event.ToolArgs)\n})\ndefer unsub()\n\nunsub2 := host.OnToolResult(func(event kit.ToolResultEvent) {\n fmt.Printf(\"Result: %s (error: %v)\\n\", event.ToolName, event.IsError)\n})\ndefer unsub2()\n\nunsub3 := host.OnStreaming(func(event kit.MessageUpdateEvent) {\n fmt.Print(event.Chunk)\n})\ndefer unsub3()\n\nunsub4 := host.OnResponse(func(event kit.ResponseEvent) {\n fmt.Println(\"Final response received\")\n})\ndefer unsub4()\n\nunsub5 := host.OnTurnStart(func(event kit.TurnStartEvent) {\n fmt.Println(\"Turn started\")\n})\ndefer unsub5()\n\nunsub6 := host.OnTurnEnd(func(event kit.TurnEndEvent) {\n fmt.Println(\"Turn ended\")\n})\ndefer unsub6()\n```\n\n## Hook system\n\nHooks can **modify or cancel** operations. Unlike events (read-only), hooks are read-write interceptors.\n\n### BeforeToolCall — block tool execution\n\n```go\nhost.OnBeforeToolCall(kit.HookPriorityNormal, func(h kit.BeforeToolCallHook) *kit.BeforeToolCallResult {\n // h.ToolCallID, h.ToolName, h.ToolArgs\n if h.ToolName == \"bash\" && strings.Contains(h.ToolArgs, \"rm -rf\") {\n return &kit.BeforeToolCallResult{Block: true, Reason: \"dangerous command\"}\n }\n return nil // allow\n})\n```\n\n### AfterToolResult — modify tool output\n\n```go\nhost.OnAfterToolResult(kit.HookPriorityNormal, func(h kit.AfterToolResultHook) *kit.AfterToolResultResult {\n // h.ToolCallID, h.ToolName, h.ToolArgs, h.Result, h.IsError\n if h.ToolName == \"read\" {\n filtered := redactSecrets(h.Result)\n return &kit.AfterToolResultResult{Result: &filtered}\n }\n return nil\n})\n```\n\n### BeforeTurn — modify prompt, inject messages\n\n```go\nhost.OnBeforeTurn(kit.HookPriorityNormal, func(h kit.BeforeTurnHook) *kit.BeforeTurnResult {\n // h.Prompt\n newPrompt := h.Prompt + \"\\nAlways respond in JSON.\"\n return &kit.BeforeTurnResult{Prompt: &newPrompt}\n // Also available: SystemPrompt *string, InjectText *string\n})\n```\n\n### AfterTurn — observation only\n\n```go\nhost.OnAfterTurn(kit.HookPriorityNormal, func(h kit.AfterTurnHook) {\n // h.Response, h.Error\n log.Printf(\"Turn completed: %d chars\", len(h.Response))\n})\n```\n\n### Hook priorities\n\n```go\nkit.HookPriorityHigh = 0 // runs first\nkit.HookPriorityNormal = 50 // default\nkit.HookPriorityLow = 100 // runs last\n```\n\nLower values run first. First non-nil result wins.\n\n## Subagent event monitoring\n\nMonitor real-time events from LLM-initiated subagents (when the model uses the `subagent` tool):\n\n```go\nhost.OnToolCall(func(e kit.ToolCallEvent) {\n if e.ToolName == \"subagent\" {\n host.SubscribeSubagent(e.ToolCallID, func(event kit.Event) {\n // Receives the same event types as Subscribe(), scoped to the child agent\n switch ev := event.(type) {\n case kit.MessageUpdateEvent:\n fmt.Print(ev.Chunk)\n case kit.ToolCallEvent:\n fmt.Printf(\"Subagent calling: %s\\n\", ev.ToolName)\n }\n })\n }\n})\n```\n\n`SubscribeSubagent` returns an unsubscribe function. Listeners are also cleaned up automatically when the subagent completes. See [Subagents](/advanced/subagents) for more details.\n"
"content": "\n# Callbacks\n\n## Event-based monitoring\n\nSubscribe to events for real-time monitoring. Each method returns an unsubscribe function:\n\n```go\nunsub := host.OnToolCall(func(event kit.ToolCallEvent) {\n fmt.Printf(\"Tool: %s, Args: %s\\n\", event.ToolName, event.ToolArgs)\n})\ndefer unsub()\n\nunsub2 := host.OnToolResult(func(event kit.ToolResultEvent) {\n fmt.Printf(\"Result: %s (error: %v)\\n\", event.ToolName, event.IsError)\n})\ndefer unsub2()\n\nunsub3 := host.OnStreaming(func(event kit.MessageUpdateEvent) {\n fmt.Print(event.Chunk)\n})\ndefer unsub3()\n\nunsub4 := host.OnResponse(func(event kit.ResponseEvent) {\n fmt.Println(\"Final response received\")\n})\ndefer unsub4()\n\nunsub5 := host.OnTurnStart(func(event kit.TurnStartEvent) {\n fmt.Println(\"Turn started\")\n})\ndefer unsub5()\n\nunsub6 := host.OnTurnEnd(func(event kit.TurnEndEvent) {\n fmt.Println(\"Turn ended\")\n})\ndefer unsub6()\n```\n\n## Hook system\n\nHooks can **modify or cancel** operations. Unlike events (read-only), hooks are read-write interceptors.\n\n### BeforeToolCall — block tool execution\n\n```go\nhost.OnBeforeToolCall(kit.HookPriorityNormal, func(h kit.BeforeToolCallHook) *kit.BeforeToolCallResult {\n // h.ToolCallID, h.ToolName, h.ToolArgs\n if h.ToolName == \"bash\" && strings.Contains(h.ToolArgs, \"rm -rf\") {\n return &kit.BeforeToolCallResult{Block: true, Reason: \"dangerous command\"}\n }\n return nil // allow\n})\n```\n\n### AfterToolResult — modify tool output\n\n```go\nhost.OnAfterToolResult(kit.HookPriorityNormal, func(h kit.AfterToolResultHook) *kit.AfterToolResultResult {\n // h.ToolCallID, h.ToolName, h.ToolArgs, h.Result, h.IsError\n if h.ToolName == \"read\" {\n filtered := redactSecrets(h.Result)\n return &kit.AfterToolResultResult{Result: &filtered}\n }\n return nil\n})\n```\n\n### BeforeTurn — modify prompt, inject messages\n\n```go\nhost.OnBeforeTurn(kit.HookPriorityNormal, func(h kit.BeforeTurnHook) *kit.BeforeTurnResult {\n // h.Prompt\n newPrompt := h.Prompt + \"\\nAlways respond in JSON.\"\n return &kit.BeforeTurnResult{Prompt: &newPrompt}\n // Also available: SystemPrompt *string, InjectText *string\n})\n```\n\n### AfterTurn — observation only\n\n```go\nhost.OnAfterTurn(kit.HookPriorityNormal, func(h kit.AfterTurnHook) {\n // h.Response, h.Error\n log.Printf(\"Turn completed: %d chars\", len(h.Response))\n})\n```\n\n### Hook priorities\n\n```go\nkit.HookPriorityHigh = 0 // runs first\nkit.HookPriorityNormal = 50 // default\nkit.HookPriorityLow = 100 // runs last\n```\n\nLower values run first. First non-nil result wins.\n\n## All event types\n\n| Event | Description |\n|-------|-------------|\n| `ToolCallEvent` | Tool call parsed and about to execute |\n| `ToolResultEvent` | Tool execution completed with result |\n| `ToolOutputEvent` | Streaming output chunk from tool (e.g., bash stdout/stderr) |\n| `MessageUpdateEvent` | Streaming text chunk from LLM |\n| `ResponseEvent` | Final response received |\n| `TurnStartEvent` | Agent turn started |\n| `TurnEndEvent` | Agent turn completed |\n| `PasswordPromptEvent` | Sudo command needs password (respond via `ResponseCh`) |\n\n## Subagent event monitoring\n\nMonitor real-time events from LLM-initiated subagents (when the model uses the `subagent` tool):\n\n```go\nhost.OnToolCall(func(e kit.ToolCallEvent) {\n if e.ToolName == \"subagent\" {\n host.SubscribeSubagent(e.ToolCallID, func(event kit.Event) {\n // Receives the same event types as Subscribe(), scoped to the child agent\n switch ev := event.(type) {\n case kit.MessageUpdateEvent:\n fmt.Print(ev.Chunk)\n case kit.ToolCallEvent:\n fmt.Printf(\"Subagent calling: %s\\n\", ev.ToolName)\n }\n })\n }\n})\n```\n\n`SubscribeSubagent` returns an unsubscribe function. Listeners are also cleaned up automatically when the subagent completes. See [Subagents](/advanced/subagents) for more details.\n"
},
{
"url": "/sdk/options",
+1 -1
View File
@@ -7,7 +7,7 @@
<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-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.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>
+1 -1
View File
@@ -7,7 +7,7 @@
<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-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.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>
+14 -1
View File
@@ -7,7 +7,7 @@
<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-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.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>
@@ -110,6 +110,19 @@ kit.HookPriorityLow = 100 // runs last
Lower values run first. First non-nil result wins.
## All event types
| Event | Description |
|-------|-------------|
| `ToolCallEvent` | Tool call parsed and about to execute |
| `ToolResultEvent` | Tool execution completed with result |
| `ToolOutputEvent` | Streaming output chunk from tool (e.g., bash stdout/stderr) |
| `MessageUpdateEvent` | Streaming text chunk from LLM |
| `ResponseEvent` | Final response received |
| `TurnStartEvent` | Agent turn started |
| `TurnEndEvent` | Agent turn completed |
| `PasswordPromptEvent` | Sudo command needs password (respond via `ResponseCh`) |
## Subagent event monitoring
Monitor real-time events from LLM-initiated subagents (when the model uses the `subagent` tool):
+1 -1
View File
@@ -7,7 +7,7 @@
<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-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.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>
+1 -1
View File
@@ -7,7 +7,7 @@
<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-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.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>
+1 -1
View File
@@ -7,7 +7,7 @@
<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-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.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>
+4 -3
View File
@@ -133,7 +133,7 @@
"Community"
],
"tags": [],
"wordCount": 350
"wordCount": 354
},
{
"id": "extensions/capabilities",
@@ -271,7 +271,7 @@
"Quick links"
],
"tags": [],
"wordCount": 235
"wordCount": 240
},
{
"id": "installation",
@@ -337,10 +337,11 @@
"BeforeTurn — modify prompt, inject messages",
"AfterTurn — observation only",
"Hook priorities",
"All event types",
"Subagent event monitoring"
],
"tags": [],
"wordCount": 342
"wordCount": 425
},
{
"id": "sdk/options",
+1 -1
View File
@@ -7,7 +7,7 @@
<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-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.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>
+1 -1
View File
@@ -7,7 +7,7 @@
<meta name="description" content="Customize Kit's appearance with built-in themes, custom theme files, and the extension theme API.">
<link rel="canonical" href="/themes">
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
<script type="module" src="/assets/index-8qR0kq1Z.js"></script>
<script type="module" src="/assets/index-DTEMNIPk.js"></script>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Themes","description":"Customize Kit's appearance with built-in themes, custom theme files, and the extension theme API.","url":"https://go-kit.dev/themes","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
</head>
<body>