@openadapter/koda 1.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4448 -0
- package/README.md +665 -0
- package/dist/bun/cli.d.ts +2 -0
- package/dist/bun/cli.js +2 -0
- package/dist/bun/register-bedrock.d.ts +1 -0
- package/dist/bun/register-bedrock.js +1 -0
- package/dist/bun/restore-sandbox-env.d.ts +12 -0
- package/dist/bun/restore-sandbox-env.js +1 -0
- package/dist/cli/args.d.ts +55 -0
- package/dist/cli/args.js +167 -0
- package/dist/cli/config-selector.d.ts +13 -0
- package/dist/cli/config-selector.js +1 -0
- package/dist/cli/file-processor.d.ts +14 -0
- package/dist/cli/file-processor.js +7 -0
- package/dist/cli/import-sessions.d.ts +34 -0
- package/dist/cli/import-sessions.js +6 -0
- package/dist/cli/initial-message.d.ts +17 -0
- package/dist/cli/initial-message.js +1 -0
- package/dist/cli/list-models.d.ts +8 -0
- package/dist/cli/list-models.js +2 -0
- package/dist/cli/openadapter-setup.d.ts +29 -0
- package/dist/cli/openadapter-setup.js +3 -0
- package/dist/cli/session-picker.d.ts +8 -0
- package/dist/cli/session-picker.js +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +2 -0
- package/dist/config.d.ts +92 -0
- package/dist/config.js +1 -0
- package/dist/core/agent-session-runtime.d.ts +116 -0
- package/dist/core/agent-session-runtime.js +1 -0
- package/dist/core/agent-session-services.d.ts +86 -0
- package/dist/core/agent-session-services.js +1 -0
- package/dist/core/agent-session.d.ts +747 -0
- package/dist/core/agent-session.js +32 -0
- package/dist/core/auth-guidance.d.ts +4 -0
- package/dist/core/auth-guidance.js +8 -0
- package/dist/core/auth-storage.d.ts +140 -0
- package/dist/core/auth-storage.js +1 -0
- package/dist/core/bash-executor.d.ts +31 -0
- package/dist/core/bash-executor.js +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +89 -0
- package/dist/core/compaction/branch-summarization.js +38 -0
- package/dist/core/compaction/compaction.d.ts +120 -0
- package/dist/core/compaction/compaction.js +104 -0
- package/dist/core/compaction/index.d.ts +6 -0
- package/dist/core/compaction/index.js +1 -0
- package/dist/core/compaction/utils.d.ts +37 -0
- package/dist/core/compaction/utils.js +19 -0
- package/dist/core/defaults.d.ts +2 -0
- package/dist/core/defaults.js +1 -0
- package/dist/core/diagnostics.d.ts +14 -0
- package/dist/core/diagnostics.js +0 -0
- package/dist/core/event-bus.d.ts +8 -0
- package/dist/core/event-bus.js +1 -0
- package/dist/core/exec.d.ts +28 -0
- package/dist/core/exec.js +1 -0
- package/dist/core/export-html/ansi-to-html.d.ts +21 -0
- package/dist/core/export-html/ansi-to-html.js +1 -0
- package/dist/core/export-html/index.d.ts +36 -0
- package/dist/core/export-html/index.js +2 -0
- package/dist/core/export-html/template.css +1066 -0
- package/dist/core/export-html/template.html +55 -0
- package/dist/core/export-html/template.js +72 -0
- package/dist/core/export-html/tool-renderer.d.ts +33 -0
- package/dist/core/export-html/tool-renderer.js +1 -0
- package/dist/core/export-html/vendor/highlight.min.js +8 -0
- package/dist/core/export-html/vendor/marked.min.js +56 -0
- package/dist/core/extensions/index.d.ts +11 -0
- package/dist/core/extensions/index.js +1 -0
- package/dist/core/extensions/loader.d.ts +23 -0
- package/dist/core/extensions/loader.js +1 -0
- package/dist/core/extensions/runner.d.ts +160 -0
- package/dist/core/extensions/runner.js +1 -0
- package/dist/core/extensions/types.d.ts +1180 -0
- package/dist/core/extensions/types.js +1 -0
- package/dist/core/extensions/wrapper.d.ts +19 -0
- package/dist/core/extensions/wrapper.js +1 -0
- package/dist/core/footer-data-provider.d.ts +53 -0
- package/dist/core/footer-data-provider.js +1 -0
- package/dist/core/http-dispatcher.d.ts +20 -0
- package/dist/core/http-dispatcher.js +1 -0
- package/dist/core/index.d.ts +11 -0
- package/dist/core/index.js +1 -0
- package/dist/core/keybindings.d.ts +352 -0
- package/dist/core/keybindings.js +1 -0
- package/dist/core/messages.d.ts +76 -0
- package/dist/core/messages.js +17 -0
- package/dist/core/model-registry.d.ts +149 -0
- package/dist/core/model-registry.js +9 -0
- package/dist/core/model-resolver.d.ts +109 -0
- package/dist/core/model-resolver.js +1 -0
- package/dist/core/output-guard.d.ts +6 -0
- package/dist/core/output-guard.js +1 -0
- package/dist/core/package-manager.d.ts +203 -0
- package/dist/core/package-manager.js +3 -0
- package/dist/core/prompt-templates.d.ts +51 -0
- package/dist/core/prompt-templates.js +2 -0
- package/dist/core/provider-attribution.d.ts +3 -0
- package/dist/core/provider-attribution.js +1 -0
- package/dist/core/provider-display-names.d.ts +1 -0
- package/dist/core/provider-display-names.js +1 -0
- package/dist/core/resolve-config-value.d.ts +30 -0
- package/dist/core/resolve-config-value.js +1 -0
- package/dist/core/resource-loader.d.ts +193 -0
- package/dist/core/resource-loader.js +1 -0
- package/dist/core/sdk.d.ts +108 -0
- package/dist/core/sdk.js +1 -0
- package/dist/core/session-cwd.d.ts +18 -0
- package/dist/core/session-cwd.js +7 -0
- package/dist/core/session-manager.d.ts +331 -0
- package/dist/core/session-manager.js +11 -0
- package/dist/core/settings-manager.d.ts +265 -0
- package/dist/core/settings-manager.js +1 -0
- package/dist/core/skills.d.ts +59 -0
- package/dist/core/skills.js +4 -0
- package/dist/core/slash-commands.d.ts +13 -0
- package/dist/core/slash-commands.js +1 -0
- package/dist/core/source-info.d.ts +17 -0
- package/dist/core/source-info.js +1 -0
- package/dist/core/system-prompt.d.ts +27 -0
- package/dist/core/system-prompt.js +52 -0
- package/dist/core/telemetry.d.ts +2 -0
- package/dist/core/telemetry.js +1 -0
- package/dist/core/timings.d.ts +7 -0
- package/dist/core/timings.js +3 -0
- package/dist/core/tools/bash.d.ts +67 -0
- package/dist/core/tools/bash.js +18 -0
- package/dist/core/tools/edit-diff.d.ts +86 -0
- package/dist/core/tools/edit-diff.js +16 -0
- package/dist/core/tools/edit.d.ts +50 -0
- package/dist/core/tools/edit.js +2 -0
- package/dist/core/tools/file-mutation-queue.d.ts +5 -0
- package/dist/core/tools/file-mutation-queue.js +1 -0
- package/dist/core/tools/find.d.ts +34 -0
- package/dist/core/tools/find.js +13 -0
- package/dist/core/tools/grep.d.ts +36 -0
- package/dist/core/tools/grep.js +13 -0
- package/dist/core/tools/index.d.ts +39 -0
- package/dist/core/tools/index.js +1 -0
- package/dist/core/tools/ls.d.ts +36 -0
- package/dist/core/tools/ls.js +9 -0
- package/dist/core/tools/output-accumulator.d.ts +51 -0
- package/dist/core/tools/output-accumulator.js +4 -0
- package/dist/core/tools/path-utils.d.ts +9 -0
- package/dist/core/tools/path-utils.js +1 -0
- package/dist/core/tools/read.d.ts +34 -0
- package/dist/core/tools/read.js +22 -0
- package/dist/core/tools/render-utils.d.ts +23 -0
- package/dist/core/tools/render-utils.js +4 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts +13 -0
- package/dist/core/tools/tool-definition-wrapper.js +1 -0
- package/dist/core/tools/truncate.d.ts +69 -0
- package/dist/core/tools/truncate.js +5 -0
- package/dist/core/tools/write.d.ts +25 -0
- package/dist/core/tools/write.js +13 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +1 -0
- package/dist/main.d.ts +11 -0
- package/dist/main.js +1 -0
- package/dist/migrations.d.ts +32 -0
- package/dist/migrations.js +8 -0
- package/dist/modes/index.d.ts +8 -0
- package/dist/modes/index.js +1 -0
- package/dist/modes/interactive/assets/clankolas.png +0 -0
- package/dist/modes/interactive/components/armin.d.ts +33 -0
- package/dist/modes/interactive/components/armin.js +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +19 -0
- package/dist/modes/interactive/components/assistant-message.js +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +33 -0
- package/dist/modes/interactive/components/bash-execution.js +13 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts +15 -0
- package/dist/modes/interactive/components/bordered-loader.js +1 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts +15 -0
- package/dist/modes/interactive/components/branch-summary-message.js +3 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +15 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +3 -0
- package/dist/modes/interactive/components/config-selector.d.ts +70 -0
- package/dist/modes/interactive/components/config-selector.js +1 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts +13 -0
- package/dist/modes/interactive/components/countdown-timer.js +1 -0
- package/dist/modes/interactive/components/custom-editor.d.ts +20 -0
- package/dist/modes/interactive/components/custom-editor.js +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts +19 -0
- package/dist/modes/interactive/components/custom-message.js +2 -0
- package/dist/modes/interactive/components/daxnuts.d.ts +22 -0
- package/dist/modes/interactive/components/daxnuts.js +1 -0
- package/dist/modes/interactive/components/diff.d.ts +11 -0
- package/dist/modes/interactive/components/diff.js +3 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts +14 -0
- package/dist/modes/interactive/components/dynamic-border.js +1 -0
- package/dist/modes/interactive/components/earendil-announcement.d.ts +4 -0
- package/dist/modes/interactive/components/earendil-announcement.js +1 -0
- package/dist/modes/interactive/components/extension-editor.d.ts +19 -0
- package/dist/modes/interactive/components/extension-editor.js +3 -0
- package/dist/modes/interactive/components/extension-input.d.ts +22 -0
- package/dist/modes/interactive/components/extension-input.js +2 -0
- package/dist/modes/interactive/components/extension-selector.d.ts +25 -0
- package/dist/modes/interactive/components/extension-selector.js +2 -0
- package/dist/modes/interactive/components/footer.d.ts +27 -0
- package/dist/modes/interactive/components/footer.js +1 -0
- package/dist/modes/interactive/components/index.d.ts +31 -0
- package/dist/modes/interactive/components/index.js +1 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts +12 -0
- package/dist/modes/interactive/components/keybinding-hints.js +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts +51 -0
- package/dist/modes/interactive/components/login-dialog.js +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +46 -0
- package/dist/modes/interactive/components/model-selector.js +2 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts +30 -0
- package/dist/modes/interactive/components/oauth-selector.js +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +41 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts +22 -0
- package/dist/modes/interactive/components/session-selector-search.js +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +95 -0
- package/dist/modes/interactive/components/session-selector.js +2 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +68 -0
- package/dist/modes/interactive/components/settings-selector.js +1 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts +9 -0
- package/dist/modes/interactive/components/show-images-selector.js +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +16 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +3 -0
- package/dist/modes/interactive/components/theme-selector.d.ts +10 -0
- package/dist/modes/interactive/components/theme-selector.js +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +10 -0
- package/dist/modes/interactive/components/thinking-selector.js +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +62 -0
- package/dist/modes/interactive/components/tool-execution.js +4 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +88 -0
- package/dist/modes/interactive/components/tree-selector.js +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts +29 -0
- package/dist/modes/interactive/components/user-message-selector.js +1 -0
- package/dist/modes/interactive/components/user-message.d.ts +9 -0
- package/dist/modes/interactive/components/user-message.js +1 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts +23 -0
- package/dist/modes/interactive/components/visual-truncate.js +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +417 -0
- package/dist/modes/interactive/interactive-mode.js +116 -0
- package/dist/modes/interactive/theme/dark.json +86 -0
- package/dist/modes/interactive/theme/light.json +85 -0
- package/dist/modes/interactive/theme/theme-schema.json +335 -0
- package/dist/modes/interactive/theme/theme.d.ts +101 -0
- package/dist/modes/interactive/theme/theme.js +18 -0
- package/dist/modes/print-mode.d.ts +27 -0
- package/dist/modes/print-mode.js +4 -0
- package/dist/modes/rpc/jsonl.d.ts +16 -0
- package/dist/modes/rpc/jsonl.js +3 -0
- package/dist/modes/rpc/rpc-client.d.ts +226 -0
- package/dist/modes/rpc/rpc-client.js +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts +19 -0
- package/dist/modes/rpc/rpc-mode.js +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +419 -0
- package/dist/modes/rpc/rpc-types.js +0 -0
- package/dist/package-manager-cli.d.ts +3 -0
- package/dist/package-manager-cli.js +49 -0
- package/dist/utils/ansi.d.ts +1 -0
- package/dist/utils/ansi.js +1 -0
- package/dist/utils/auto-update.d.ts +13 -0
- package/dist/utils/auto-update.js +1 -0
- package/dist/utils/changelog.d.ts +20 -0
- package/dist/utils/changelog.js +4 -0
- package/dist/utils/child-process.d.ts +14 -0
- package/dist/utils/child-process.js +1 -0
- package/dist/utils/clipboard-image.d.ts +10 -0
- package/dist/utils/clipboard-image.js +1 -0
- package/dist/utils/clipboard-native.d.ts +9 -0
- package/dist/utils/clipboard-native.js +1 -0
- package/dist/utils/clipboard.d.ts +1 -0
- package/dist/utils/clipboard.js +1 -0
- package/dist/utils/deprecation.d.ts +3 -0
- package/dist/utils/deprecation.js +1 -0
- package/dist/utils/exif-orientation.d.ts +4 -0
- package/dist/utils/exif-orientation.js +1 -0
- package/dist/utils/frontmatter.d.ts +7 -0
- package/dist/utils/frontmatter.js +4 -0
- package/dist/utils/fs-watch.d.ts +4 -0
- package/dist/utils/fs-watch.js +1 -0
- package/dist/utils/git.d.ts +25 -0
- package/dist/utils/git.js +1 -0
- package/dist/utils/html.d.ts +6 -0
- package/dist/utils/html.js +1 -0
- package/dist/utils/image-convert.d.ts +8 -0
- package/dist/utils/image-convert.js +1 -0
- package/dist/utils/image-resize-core.d.ts +29 -0
- package/dist/utils/image-resize-core.js +1 -0
- package/dist/utils/image-resize-worker.d.ts +1 -0
- package/dist/utils/image-resize-worker.js +1 -0
- package/dist/utils/image-resize.d.ts +15 -0
- package/dist/utils/image-resize.js +1 -0
- package/dist/utils/json.d.ts +2 -0
- package/dist/utils/json.js +1 -0
- package/dist/utils/koda-user-agent.d.ts +1 -0
- package/dist/utils/koda-user-agent.js +1 -0
- package/dist/utils/mime.d.ts +2 -0
- package/dist/utils/mime.js +1 -0
- package/dist/utils/paths.d.ts +30 -0
- package/dist/utils/paths.js +1 -0
- package/dist/utils/photon.d.ts +20 -0
- package/dist/utils/photon.js +1 -0
- package/dist/utils/shell.d.ts +29 -0
- package/dist/utils/shell.js +8 -0
- package/dist/utils/sleep.d.ts +4 -0
- package/dist/utils/sleep.js +1 -0
- package/dist/utils/syntax-highlight.d.ts +11 -0
- package/dist/utils/syntax-highlight.js +2 -0
- package/dist/utils/tools-manager.d.ts +2 -0
- package/dist/utils/tools-manager.js +1 -0
- package/dist/utils/version-check.d.ts +14 -0
- package/dist/utils/version-check.js +1 -0
- package/dist/utils/windows-self-update.d.ts +2 -0
- package/dist/utils/windows-self-update.js +1 -0
- package/docs/compaction.md +394 -0
- package/docs/custom-provider.md +736 -0
- package/docs/development.md +71 -0
- package/docs/docs.json +148 -0
- package/docs/extensions.md +2626 -0
- package/docs/images/doom-extension.png +0 -0
- package/docs/images/exy.png +0 -0
- package/docs/images/interactive-mode.png +0 -0
- package/docs/images/tree-view.png +0 -0
- package/docs/index.md +80 -0
- package/docs/json.md +82 -0
- package/docs/keybindings.md +197 -0
- package/docs/models.md +493 -0
- package/docs/packages.md +226 -0
- package/docs/prompt-templates.md +88 -0
- package/docs/providers.md +253 -0
- package/docs/quickstart.md +165 -0
- package/docs/rpc.md +1408 -0
- package/docs/sdk.md +1137 -0
- package/docs/session-format.md +412 -0
- package/docs/sessions.md +145 -0
- package/docs/settings.md +281 -0
- package/docs/shell-aliases.md +13 -0
- package/docs/skills.md +231 -0
- package/docs/terminal-setup.md +114 -0
- package/docs/termux.md +127 -0
- package/docs/themes.md +295 -0
- package/docs/tmux.md +61 -0
- package/docs/tui.md +927 -0
- package/docs/usage.md +288 -0
- package/docs/windows.md +17 -0
- package/npm-shrinkwrap.json +1792 -0
- package/openadapter/extensions/koda-ask.js +12 -0
- package/openadapter/extensions/koda-bg.js +14 -0
- package/openadapter/extensions/koda-commands.mjs +15 -0
- package/openadapter/extensions/koda-help.js +8 -0
- package/openadapter/extensions/koda-memory.js +16 -0
- package/openadapter/extensions/koda-status.js +1 -0
- package/openadapter/extensions/koda-todo.js +4 -0
- package/openadapter/extensions/koda-vision.js +4 -0
- package/openadapter/extensions/koda-web.js +7 -0
- package/openadapter/setup.mjs +173 -0
- package/openadapter/skills/code-review/SKILL.md +22 -0
- package/openadapter/skills/debugging/SKILL.md +28 -0
- package/openadapter/skills/frontend/SKILL.md +38 -0
- package/package.json +108 -0
package/dist/main.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var ue=Object.defineProperty;var l=(e,t)=>ue(e,"name",{value:t,configurable:!0});import{createInterface as pe}from"node:readline";import{modelsAreEqual as ge}from"@openadapter/koda-ai";import{ProcessTerminal as he,setKeybindings as ve,TUI as Se}from"@openadapter/koda-tui";import c from"chalk";import{parseArgs as we,printHelp as xe}from"./cli/args.js";import{processFileArguments as ye}from"./cli/file-processor.js";import{buildInitialMessage as j}from"./cli/initial-message.js";import{listModels as ke}from"./cli/list-models.js";import{handleImportCommand as Te,handleSetupCommand as Me,maybeFirstRunSetup as Pe}from"./cli/openadapter-setup.js";import{selectSession as Ce}from"./cli/session-picker.js";import{ENV_SESSION_DIR as Ee,expandTildePath as Ie,getAgentDir as D,getPackageDir as Fe,VERSION as Le}from"./config.js";import{createAgentSessionRuntime as be}from"./core/agent-session-runtime.js";import{createAgentSessionFromServices as Ae,createAgentSessionServices as Oe}from"./core/agent-session-services.js";import{formatNoModelsAvailableMessage as $e}from"./core/auth-guidance.js";import{AuthStorage as Re}from"./core/auth-storage.js";import{exportFromFile as Ke}from"./core/export-html/index.js";import{configureHttpDispatcher as _e}from"./core/http-dispatcher.js";import{KeybindingsManager as Ne}from"./core/keybindings.js";import{resolveCliModel as We,resolveModelScope as je}from"./core/model-resolver.js";import{restoreStdout as De,takeOverStdout as He}from"./core/output-guard.js";import{formatMissingSessionCwdPrompt as Be,getMissingSessionCwdIssue as Ve,MissingSessionCwdError as qe}from"./core/session-cwd.js";import{assertValidSessionId as Ue,SessionManager as f}from"./core/session-manager.js";import{SettingsManager as ze}from"./core/settings-manager.js";import{printTimings as C,resetTimings as Ye,time as p}from"./core/timings.js";import{runMigrations as Qe,showDeprecationWarnings as Ge}from"./migrations.js";import{InteractiveMode as Je,runPrintMode as Xe,runRpcMode as Ze}from"./modes/index.js";import{ExtensionSelectorComponent as eo}from"./modes/interactive/components/extension-selector.js";import{initTheme as O,stopThemeWatcher as $}from"./modes/interactive/theme/theme.js";import{handleConfigCommand as oo,handlePackageCommand as to}from"./package-manager-cli.js";import{isLocalPath as no,normalizePath as io,resolvePath as H}from"./utils/paths.js";import{cleanupWindowsSelfUpdateQuarantine as so}from"./utils/windows-self-update.js";async function ro(){if(!process.stdin.isTTY)return new Promise(e=>{let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",n=>{t+=n}),process.stdin.on("end",()=>{e(t.trim()||void 0)}),process.stdin.resume()})}l(ro,"readPipedStdin");function B(e,t){return e.drainErrors().map(({scope:n,error:o})=>({type:"warning",message:`(${t}, ${n} settings) ${o.message}`}))}l(B,"collectSettingsDiagnostics");function V(e){for(const t of e){const n=t.type==="error"?c.red:t.type==="warning"?c.yellow:c.dim,o=t.type==="error"?"Error: ":t.type==="warning"?"Warning: ":"";console.error(n(`${o}${t.message}`))}}l(V,"reportDiagnostics");function q(e){return e?e==="1"||e.toLowerCase()==="true"||e.toLowerCase()==="yes":!1}l(q,"isTruthyEnvFlag");function ao(e,t){return e.mode==="rpc"?"rpc":e.mode==="json"?"json":e.print||!t?"print":"interactive"}l(ao,"resolveAppMode");function lo(e){return e==="json"?"json":"text"}l(lo,"toPrintOutputMode");async function co(e,t,n){if(e.fileArgs.length===0)return j({parsed:e,stdinContent:n});const{text:o,images:i}=await ye(e.fileArgs,{autoResizeImages:t});return j({parsed:e,fileText:o,fileImages:i,stdinContent:n})}l(co,"prepareInitialMessage");async function U(e,t,n){const i=(await f.list(t,n)).find(s=>s.id===e);return i?{type:"local",path:i.path}:void 0}l(U,"findLocalSessionByExactId");async function z(e,t,n){if(e.includes("/")||e.includes("\\")||e.endsWith(".jsonl"))return{type:"path",path:H(e,t)};const o=await f.list(t,n),i=o.find(d=>d.id===e)??o.find(d=>d.id.startsWith(e));if(i)return{type:"local",path:i.path};const s=await f.listAll(n),u=s.find(d=>d.id===e)??s.find(d=>d.id.startsWith(e));return u?{type:"global",path:u.path,cwd:u.cwd}:{type:"not_found",arg:e}}l(z,"resolveSessionPath");async function mo(e){return new Promise(t=>{const n=pe({input:process.stdin,output:process.stdout});n.question(`${e} [y/N] `,o=>{n.close(),t(o.toLowerCase()==="y"||o.toLowerCase()==="yes")})})}l(mo,"promptConfirm");function fo(e){if(!e.fork)return;const t=[e.session?"--session":void 0,e.continue?"--continue":void 0,e.resume?"--resume":void 0,e.noSession?"--no-session":void 0].filter(n=>n!==void 0);t.length>0&&(console.error(c.red(`Error: --fork cannot be combined with ${t.join(", ")}`)),process.exit(1))}l(fo,"validateForkFlags");function uo(e){if(e.sessionId===void 0)return;const t=[e.session?"--session":void 0,e.continue?"--continue":void 0,e.resume?"--resume":void 0,e.noSession?"--no-session":void 0].filter(n=>n!==void 0);t.length>0&&(console.error(c.red(`Error: --session-id cannot be combined with ${t.join(", ")}`)),process.exit(1));try{Ue(e.sessionId)}catch(n){const o=n instanceof Error?n.message:String(n);console.error(c.red(`Error: ${o}`)),process.exit(1)}}l(uo,"validateSessionIdFlags");function Y(e,t,n,o){try{return f.forkFrom(e,t,n,{id:o})}catch(i){const s=i instanceof Error?i.message:String(i);console.error(c.red(`Error: ${s}`)),process.exit(1)}}l(Y,"forkSessionOrExit");async function po(e,t,n,o){if(e.noSession||e.help||e.listModels!==void 0)return f.inMemory(t);if(e.fork){e.sessionId&&await U(e.sessionId,t,n)&&(console.error(c.red(`Session already exists with id '${e.sessionId}'`)),process.exit(1));const i=await z(e.fork,t,n);switch(i.type){case"path":case"local":case"global":return Y(i.path,t,n,e.sessionId);case"not_found":console.error(c.red(`No session found matching '${i.arg}'`)),process.exit(1)}}if(e.session){const i=await z(e.session,t,n);switch(i.type){case"path":case"local":return f.open(i.path,n);case"global":return console.log(c.yellow(`Session found in different project: ${i.cwd}`)),await mo("Fork this session into current directory?")||(console.log(c.dim("Aborted.")),process.exit(0)),Y(i.path,t,n);case"not_found":console.error(c.red(`No session found matching '${i.arg}'`)),process.exit(1)}}if(e.resume){O(o.getTheme(),!0);try{const i=await Ce(s=>f.list(t,n,s),s=>f.listAll(n,s));return i||(console.log(c.dim("No session selected")),process.exit(0)),f.open(i,n)}finally{$()}}if(e.continue)return f.continueRecent(t,n);if(e.sessionId){const i=await U(e.sessionId,t,n);if(i)return f.open(i.path,n)}return f.create(t,n,{id:e.sessionId})}l(po,"createSessionManager");function go(e,t,n,o,i){const s={},u=[];let d=!1;if(e.model){const a=We({cliProvider:e.provider,cliModel:e.model,modelRegistry:o});a.warning&&u.push({type:"warning",message:a.warning}),a.error&&u.push({type:"error",message:a.error}),a.model&&(s.model=a.model,!e.thinking&&a.thinkingLevel&&(s.thinkingLevel=a.thinkingLevel,d=!0))}if(!s.model&&t.length>0&&!n){const a=i.getDefaultProvider(),w=i.getDefaultModel(),h=a&&w?o.find(a,w):void 0,v=h?t.find(y=>ge(y.model,h)):void 0;v?(s.model=v.model,!e.thinking&&v.thinkingLevel&&(s.thinkingLevel=v.thinkingLevel)):(s.model=t[0].model,!e.thinking&&t[0].thinkingLevel&&(s.thinkingLevel=t[0].thinkingLevel))}return e.thinking&&(s.thinkingLevel=e.thinking),t.length>0&&(s.scopedModels=t.map(a=>({model:a.model,thinkingLevel:a.thinkingLevel}))),e.noTools?s.noTools="all":e.noBuiltinTools&&(s.noTools="builtin"),e.tools&&(s.tools=[...e.tools]),e.excludeTools&&(s.excludeTools=[...e.excludeTools]),{options:s,cliThinkingFromModel:d,diagnostics:u}}l(go,"buildSessionOptions");function E(e,t){return t?.map(n=>no(n)?H(n,e):n)}l(E,"resolveCliPaths");async function ho(e,t){return O(t.getTheme()),ve(Ne.create()),new Promise(n=>{const o=new Se(new he,t.getShowHardwareCursor());o.setClearOnShrink(t.getClearOnShrink());let i=!1;const s=l(d=>{i||(i=!0,o.stop(),n(d))},"finish"),u=new eo(Be(e),["Continue","Cancel"],d=>s(d==="Continue"?e.fallbackCwd:void 0),()=>s(void 0),{tui:o});o.addChild(u),o.setFocus(u),o.start()})}l(ho,"promptForMissingSessionCwd");async function Qo(e,t){if(Ye(),(e.includes("--offline")||q(process.env.KODA_OFFLINE))&&(process.env.KODA_OFFLINE="1",process.env.KODA_SKIP_VERSION_CHECK="1"),process.platform==="win32"&&so(Fe()),await to(e)||await oo(e)||await Me(e)||await Te(e))return;const o=we(e);if(o.diagnostics.length>0){for(const r of o.diagnostics){const m=r.type==="error"?c.red:c.yellow;console.error(m(`${r.type==="error"?"Error":"Warning"}: ${r.message}`))}o.diagnostics.some(r=>r.type==="error")&&process.exit(1)}p("parseArgs");let i=ao(o,process.stdin.isTTY);if(i!=="interactive"&&He(),o.version&&(console.log(Le),process.exit(0)),o.export){let r;try{const m=o.messages.length>0?o.messages[0]:void 0;r=await Ke(o.export,m)}catch(m){const T=m instanceof Error?m.message:"Failed to export session";console.error(c.red(`Error: ${T}`)),process.exit(1)}console.log(`Exported to: ${r}`),process.exit(0)}o.mode==="rpc"&&o.fileArgs.length>0&&(console.error(c.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),fo(o),uo(o),i==="interactive"&&await Pe(D());const{migratedAuthProviders:u,deprecationWarnings:d}=Qe(process.cwd());p("runMigrations");const a=process.cwd(),w=D(),h=ze.create(a,w);V(B(h,"startup session lookup"));const v=process.env[Ee],y=(o.sessionDir?io(o.sessionDir):void 0)??(v?Ie(v):void 0)??h.getSessionDir();let x=await po(o,a,y,h);const k=Ve(x,a);if(k)if(i==="interactive"){const r=await ho(k,h);r||process.exit(0),x=f.open(k.sessionFile,y,r)}else console.error(c.red(new qe(k).message)),process.exit(1);if(o.name!==void 0){const r=o.name.trim();r||(console.error(c.red("Error: --name requires a non-empty value")),process.exit(1)),x.appendSessionInfo(r)}p("createSessionManager");const Q=E(a,o.extensions),G=E(a,o.skills),J=E(a,o.promptTemplates),X=E(a,o.themes),R=Re.create(),Z=l(async({cwd:r,agentDir:m,sessionManager:T,sessionStartEvent:se})=>{const M=await Oe({cwd:r,agentDir:m,authStorage:R,extensionFlagValues:o.unknownFlags,resourceLoaderOptions:{additionalExtensionPaths:Q,additionalSkillPaths:G,additionalPromptTemplatePaths:J,additionalThemePaths:X,noExtensions:o.noExtensions,noSkills:o.noSkills,noPromptTemplates:o.noPromptTemplates,noThemes:o.noThemes,noContextFiles:o.noContextFiles,systemPrompt:o.systemPrompt,appendSystemPrompt:o.appendSystemPrompt,extensionFactories:t?.extensionFactories}}),{settingsManager:L,modelRegistry:W,resourceLoader:re}=M,b=[...M.diagnostics,...B(L,"runtime creation"),...re.getExtensions().errors.map(({path:me,error:fe})=>({type:"error",message:`Failed to load extension "${me}": ${fe}`}))],A=o.models??L.getEnabledModels(),ae=A&&A.length>0?await je(A,W):[],{options:g,cliThinkingFromModel:le,diagnostics:ce}=go(o,ae,T.buildSessionContext().messages.length>0,W,L);b.push(...ce),o.apiKey&&(g.model?R.setRuntimeApiKey(g.model.provider,o.apiKey):b.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"}));const P=await Ae({services:M,sessionManager:T,sessionStartEvent:se,model:g.model,thinkingLevel:g.thinkingLevel,scopedModels:g.scopedModels,tools:g.tools,excludeTools:g.excludeTools,noTools:g.noTools,customTools:g.customTools}),de=o.thinking!==void 0||le;return P.session.model&&de&&P.session.setThinkingLevel(P.session.thinkingLevel),{...P,services:M,diagnostics:b}},"createRuntime");p("createRuntime");const S=await be(Z,{cwd:x.getCwd(),agentDir:w,sessionManager:x});p("createAgentSessionRuntime");const{services:ee,session:oe,modelFallbackMessage:te}=S,{settingsManager:I,modelRegistry:ne,resourceLoader:ie}=ee;if(_e(I.getHttpIdleTimeoutMs()),o.help){const r=ie.getExtensions().extensions.flatMap(m=>Array.from(m.flags.values()));xe(r),process.exit(0)}if(o.listModels!==void 0){const r=typeof o.listModels=="string"?o.listModels:void 0;await ke(ne,r),process.exit(0)}let F;i!=="rpc"&&(F=await ro(),F!==void 0&&i==="interactive"&&(i="print")),p("readPipedStdin");const{initialMessage:K,initialImages:_}=await co(o,I.getImageAutoResize(),F);p("prepareInitialMessage"),O(I.getTheme(),i==="interactive"),p("initTheme"),i==="interactive"&&d.length>0&&await Ge(d),p("resolveModelScope"),V(S.diagnostics),S.diagnostics.some(r=>r.type==="error")&&process.exit(1),p("createAgentSession"),i!=="interactive"&&!oe.model&&(console.error(c.red($e())),process.exit(1));const N=q(process.env.KODA_STARTUP_BENCHMARK);if(N&&i!=="interactive"&&(console.error(c.red("Error: KODA_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),i==="rpc")C(),await Ze(S);else if(i==="interactive"){const r=new Je(S,{migratedProviders:u,modelFallbackMessage:te,initialMessage:K,initialImages:_,initialMessages:o.messages,verbose:o.verbose});if(N){await r.init(),p("interactiveMode.init"),C(),r.stop(),$(),process.stdout.writableLength>0&&await new Promise(m=>process.stdout.once("drain",m)),process.stderr.writableLength>0&&await new Promise(m=>process.stderr.once("drain",m));return}C(),await r.run()}else{C();const r=await Xe(S,{mode:lo(i),messages:o.messages,initialMessage:K,initialImages:_});$(),De(),r!==0&&(process.exitCode=r);return}}l(Qo,"main");export{Qo as main};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One-time migrations that run on startup.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Migrate legacy oauth.json and settings.json apiKeys to auth.json.
|
|
6
|
+
*
|
|
7
|
+
* @returns Array of provider names that were migrated
|
|
8
|
+
*/
|
|
9
|
+
export declare function migrateAuthToAuthJson(): string[];
|
|
10
|
+
/**
|
|
11
|
+
* Migrate sessions from ~/.pi/agent/*.jsonl to proper session directories.
|
|
12
|
+
*
|
|
13
|
+
* Bug in v0.30.0: Sessions were saved to ~/.pi/agent/ instead of
|
|
14
|
+
* ~/.pi/agent/sessions/<encoded-cwd>/. This migration moves them
|
|
15
|
+
* to the correct location based on the cwd in their session header.
|
|
16
|
+
*
|
|
17
|
+
* See: https://openadapter.in/issues/320
|
|
18
|
+
*/
|
|
19
|
+
export declare function migrateSessionsFromAgentRoot(): void;
|
|
20
|
+
/**
|
|
21
|
+
* Print deprecation warnings and wait for keypress.
|
|
22
|
+
*/
|
|
23
|
+
export declare function showDeprecationWarnings(warnings: string[]): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Run all migrations. Called once on startup.
|
|
26
|
+
*
|
|
27
|
+
* @returns Object with migration results and deprecation warnings
|
|
28
|
+
*/
|
|
29
|
+
export declare function runMigrations(cwd: string): {
|
|
30
|
+
migratedAuthProviders: string[];
|
|
31
|
+
deprecationWarnings: string[];
|
|
32
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
var P=Object.defineProperty;var l=(o,e)=>P(o,"name",{value:e,configurable:!0});import m from"chalk";import{chmodSync as k,existsSync as u,mkdirSync as S,readdirSync as $,readFileSync as h,renameSync as b,rmSync as C,writeFileSync as O}from"fs";import{dirname as R,join as f}from"path";import{CONFIG_DIR_NAME as E,getAgentDir as A,getBinDir as M}from"./config.js";import{migrateKeybindingsConfig as V}from"./core/keybindings.js";import{isLegacyEnvVarNameConfigValue as K}from"./core/resolve-config-value.js";import{stripJsonComments as _}from"./utils/json.js";const I="https://openadapter.in/blob/main/packages/coding-agent/CHANGELOG.md#extensions-migration",L="https://openadapter.in/blob/main/packages/coding-agent/docs/extensions.md";function T(){const o=A(),e=f(o,"auth.json"),t=f(o,"oauth.json"),i=f(o,"settings.json");if(u(e))return[];const n={},s=[];if(u(t))try{const a=JSON.parse(h(t,"utf-8"));for(const[r,c]of Object.entries(a))n[r]={type:"oauth",...c},s.push(r);b(t,`${t}.migrated`)}catch{}if(u(i))try{const a=h(i,"utf-8"),r=JSON.parse(a);if(r.apiKeys&&typeof r.apiKeys=="object"){for(const[c,d]of Object.entries(r.apiKeys))!n[c]&&typeof d=="string"&&(n[c]={type:"api_key",key:d},s.push(c));delete r.apiKeys,O(i,JSON.stringify(r,null,2))}}catch{}return Object.keys(n).length>0&&(S(R(e),{recursive:!0}),O(e,JSON.stringify(n,null,2),{mode:384})),s}l(T,"migrateAuthToAuthJson");function N(o){return K(o)?`$${o}`:void 0}l(N,"migrateLegacyEnvVarString");function w(o,e,t,i){const n=o[e];if(typeof n!="string")return!1;const s=N(n);return s===void 0?!1:(o[e]=s,i.push({location:t,from:n,to:s}),!0)}l(w,"migrateStringProperty");function v(o,e,t){if(typeof o!="object"||o===null||Array.isArray(o))return!1;const i=o;let n=!1;for(const[s,a]of Object.entries(i)){if(typeof a!="string")continue;const r=N(a);r!==void 0&&(i[s]=r,t.push({location:`${e}[${JSON.stringify(s)}]`,from:a,to:r}),n=!0)}return n}l(v,"migrateHeadersConfig");function G(o){const e=f(o,"auth.json");if(!u(e))return[];try{const t=JSON.parse(h(e,"utf-8"));if(typeof t!="object"||t===null||Array.isArray(t))return[];const i=t,n=[];for(const[s,a]of Object.entries(i)){if(typeof a!="object"||a===null||Array.isArray(a))continue;const r=a;r.type==="api_key"&&w(r,"key",`auth.json[${JSON.stringify(s)}].key`,n)}return n.length===0?[]:(O(e,`${JSON.stringify(t,null,2)}
|
|
2
|
+
`,"utf-8"),k(e,384),n)}catch{return[]}}l(G,"migrateAuthJsonConfigValues");function W(o){const e=f(o,"models.json");if(!u(e))return[];const t=JSON.parse(_(h(e,"utf-8")));if(typeof t!="object"||t===null||Array.isArray(t))return[];const n=t.providers;if(typeof n!="object"||n===null||Array.isArray(n))return[];const s=[];for(const[a,r]of Object.entries(n)){if(typeof r!="object"||r===null||Array.isArray(r))continue;const c=r,d=`models.json.providers[${JSON.stringify(a)}]`;if(w(c,"apiKey",`${d}.apiKey`,s),v(c.headers,`${d}.headers`,s),Array.isArray(c.models))for(let y=0;y<c.models.length;y++){const g=c.models[y];if(typeof g!="object"||g===null||Array.isArray(g))continue;const j=g,J=typeof j.id=="string"?JSON.stringify(j.id):String(y);v(j.headers,`${d}.models[${J}].headers`,s)}const p=c.modelOverrides;if(typeof p=="object"&&p!==null&&!Array.isArray(p))for(const[y,g]of Object.entries(p)){if(typeof g!="object"||g===null||Array.isArray(g))continue;v(g.headers,`${d}.modelOverrides[${JSON.stringify(y)}].headers`,s)}}return s.length===0?[]:(O(e,`${JSON.stringify(t,null,2)}
|
|
3
|
+
`,"utf-8"),s)}l(W,"migrateModelsJsonConfigValues");function F(){const o=A(),e=[...G(o),...W(o)];if(e.length===0)return;const t=e.map(i=>` - ${i.location}: ${i.from} -> ${i.to}`);console.log(m.yellow(["Warning: Migrated API key/header environment references to explicit $ENV_VAR syntax. Plain strings will be treated as literals.",...t].join(`
|
|
4
|
+
`)))}l(F,"migrateExplicitEnvVarConfigValues");function H(){const o=A();let e;try{e=$(o).filter(t=>t.endsWith(".jsonl")).map(t=>f(o,t))}catch{return}if(e.length!==0)for(const t of e)try{const n=h(t,"utf8").split(`
|
|
5
|
+
`)[0];if(!n?.trim())continue;const s=JSON.parse(n);if(s.type!=="session"||!s.cwd)continue;const r=`--${s.cwd.replace(/^[/\\]/,"").replace(/[/\\:]/g,"-")}--`,c=f(o,"sessions",r);u(c)||S(c,{recursive:!0});const d=t.split("/").pop()||t.split("\\").pop(),p=f(c,d);if(u(p))continue;b(t,p)}catch{}}l(H,"migrateSessionsFromAgentRoot");function D(o,e){const t=f(o,"commands"),i=f(o,"prompts");if(u(t)&&!u(i))try{return b(t,i),console.log(m.green(`Migrated ${e} commands/ \u2192 prompts/`)),!0}catch(n){console.log(m.yellow(`Warning: Could not migrate ${e} commands/ to prompts/: ${n instanceof Error?n.message:n}`))}return!1}l(D,"migrateCommandsToPrompts");function U(){const o=f(A(),"keybindings.json");if(u(o))try{const e=JSON.parse(h(o,"utf-8"));if(typeof e!="object"||e===null||Array.isArray(e))return;const{config:t,migrated:i}=V(e);if(!i)return;O(o,`${JSON.stringify(t,null,2)}
|
|
6
|
+
`,"utf-8")}catch{}}l(U,"migrateKeybindingsConfigFile");function B(){const o=A(),e=f(o,"tools"),t=M();if(!u(e))return;const i=["fd","rg","fd.exe","rg.exe"];let n=!1;for(const s of i){const a=f(e,s),r=f(t,s);if(u(a))if(u(t)||S(t,{recursive:!0}),u(r))try{C?.(a,{force:!0})}catch{}else try{b(a,r),n=!0}catch{}}n&&console.log(m.green("Migrated managed binaries tools/ \u2192 bin/"))}l(B,"migrateToolsToBin");function x(o,e){const t=f(o,"hooks"),i=f(o,"tools"),n=[];if(u(t)&&n.push(`${e} hooks/ directory found. Hooks have been renamed to extensions.`),u(i))try{$(i).filter(r=>{const c=r.toLowerCase();return c!=="fd"&&c!=="rg"&&c!=="fd.exe"&&c!=="rg.exe"&&!r.startsWith(".")}).length>0&&n.push(`${e} tools/ directory contains custom tools. Custom tools have been merged into extensions.`)}catch{}return n}l(x,"checkDeprecatedExtensionDirs");function X(o){const e=A(),t=f(o,E);return D(e,"Global"),D(t,"Project"),[...x(e,"Global"),...x(t,"Project")]}l(X,"migrateExtensionSystem");async function ne(o){if(o.length!==0){for(const e of o)console.log(m.yellow(`Warning: ${e}`));console.log(m.yellow(`
|
|
7
|
+
Move your extensions to the extensions/ directory.`)),console.log(m.yellow(`Migration guide: ${I}`)),console.log(m.yellow(`Documentation: ${L}`)),console.log(m.dim(`
|
|
8
|
+
Press any key to continue...`)),await new Promise(e=>{process.stdin.setRawMode?.(!0),process.stdin.resume(),process.stdin.once("data",()=>{process.stdin.setRawMode?.(!1),process.stdin.pause(),e()})}),console.log()}}l(ne,"showDeprecationWarnings");function re(o){const e=T();F(),H(),B(),U();const t=X(o);return{migratedAuthProviders:e,deprecationWarnings:t}}l(re,"runMigrations");export{T as migrateAuthToAuthJson,H as migrateSessionsFromAgentRoot,re as runMigrations,ne as showDeprecationWarnings};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run modes for the coding agent.
|
|
3
|
+
*/
|
|
4
|
+
export { InteractiveMode, type InteractiveModeOptions } from "./interactive/interactive-mode.ts";
|
|
5
|
+
export { type PrintModeOptions, runPrintMode } from "./print-mode.ts";
|
|
6
|
+
export { type ModelInfo, RpcClient, type RpcClientOptions, type RpcEventListener } from "./rpc/rpc-client.ts";
|
|
7
|
+
export { runRpcMode } from "./rpc/rpc-mode.ts";
|
|
8
|
+
export type { RpcCommand, RpcResponse, RpcSessionState } from "./rpc/rpc-types.ts";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{InteractiveMode as e}from"./interactive/interactive-mode.js";import{runPrintMode as p}from"./print-mode.js";import{RpcClient as f}from"./rpc/rpc-client.js";import{runRpcMode as x}from"./rpc/rpc-mode.js";export{e as InteractiveMode,f as RpcClient,p as runPrintMode,x as runRpcMode};
|
|
Binary file
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Armin says hi! A fun easter egg with animated XBM art.
|
|
3
|
+
*/
|
|
4
|
+
import type { Component, TUI } from "@openadapter/koda-tui";
|
|
5
|
+
export declare class ArminComponent implements Component {
|
|
6
|
+
private ui;
|
|
7
|
+
private interval;
|
|
8
|
+
private effect;
|
|
9
|
+
private finalGrid;
|
|
10
|
+
private currentGrid;
|
|
11
|
+
private effectState;
|
|
12
|
+
private cachedLines;
|
|
13
|
+
private cachedWidth;
|
|
14
|
+
private gridVersion;
|
|
15
|
+
private cachedVersion;
|
|
16
|
+
constructor(ui: TUI);
|
|
17
|
+
invalidate(): void;
|
|
18
|
+
render(width: number): string[];
|
|
19
|
+
private createEmptyGrid;
|
|
20
|
+
private initEffect;
|
|
21
|
+
private startAnimation;
|
|
22
|
+
private stopAnimation;
|
|
23
|
+
private tickEffect;
|
|
24
|
+
private tickTypewriter;
|
|
25
|
+
private tickScanline;
|
|
26
|
+
private tickRain;
|
|
27
|
+
private tickFade;
|
|
28
|
+
private tickCrt;
|
|
29
|
+
private tickGlitch;
|
|
30
|
+
private tickDissolve;
|
|
31
|
+
private updateDisplay;
|
|
32
|
+
dispose(): void;
|
|
33
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var m=Object.defineProperty;var o=(a,t)=>m(a,"name",{value:t,configurable:!0});import{theme as h}from"../theme/theme.js";const c=31,l=36,G=[255,255,255,127,255,240,255,127,255,237,255,127,255,219,255,127,255,183,255,127,255,119,254,127,63,248,254,127,223,255,254,127,223,63,252,127,159,195,251,127,111,252,244,127,247,15,247,127,247,255,247,127,247,255,227,127,247,7,232,127,239,248,103,112,15,255,187,111,241,0,208,91,253,63,236,83,193,255,239,87,159,253,238,95,159,252,174,95,31,120,172,95,63,0,80,108,127,0,220,119,255,192,63,120,255,1,248,127,255,3,156,120,255,7,140,124,255,15,206,120,255,255,207,127,255,255,207,120,255,255,223,120,255,255,223,125,255,255,63,126,255,255,255,127],g=Math.ceil(c/8),s=Math.ceil(l/2),d=["typewriter","scanline","rain","fade","crt","glitch","dissolve"];function u(a,t){if(t>=l)return!1;const e=t*g+Math.floor(a/8),i=a%8;return(G[e]>>i&1)===0}o(u,"getPixel");function M(a,t){const e=u(a,t*2),i=u(a,t*2+1);return e&&i?"\u2588":e?"\u2580":i?"\u2584":" "}o(M,"getChar");function k(){const a=[];for(let t=0;t<s;t++){const e=[];for(let i=0;i<c;i++)e.push(M(i,t));a.push(e)}return a}o(k,"buildFinalGrid");class w{static{o(this,"ArminComponent")}ui;interval=null;effect;finalGrid;currentGrid;effectState={};cachedLines=[];cachedWidth=0;gridVersion=0;cachedVersion=-1;constructor(t){this.ui=t,this.effect=d[Math.floor(Math.random()*d.length)],this.finalGrid=k(),this.currentGrid=this.createEmptyGrid(),this.initEffect(),this.startAnimation()}invalidate(){this.cachedWidth=0}render(t){if(t===this.cachedWidth&&this.cachedVersion===this.gridVersion)return this.cachedLines;const e=1,i=t-e;this.cachedLines=this.currentGrid.map(n=>{const x=n.slice(0,i).join(""),p=Math.max(0,t-e-x.length);return` ${h.fg("accent",x)}${" ".repeat(p)}`});const r="ARMIN SAYS HI",f=Math.max(0,t-e-r.length);return this.cachedLines.push(` ${h.fg("accent",r)}${" ".repeat(f)}`),this.cachedWidth=t,this.cachedVersion=this.gridVersion,this.cachedLines}createEmptyGrid(){return Array.from({length:s},()=>Array(c).fill(" "))}initEffect(){switch(this.effect){case"typewriter":this.effectState={pos:0};break;case"scanline":this.effectState={row:0};break;case"rain":this.effectState={drops:Array.from({length:c},()=>({y:-Math.floor(Math.random()*s*2),settled:0}))};break;case"fade":{const t=[];for(let e=0;e<s;e++)for(let i=0;i<c;i++)t.push([e,i]);for(let e=t.length-1;e>0;e--){const i=Math.floor(Math.random()*(e+1));[t[e],t[i]]=[t[i],t[e]]}this.effectState={positions:t,idx:0};break}case"crt":this.effectState={expansion:0};break;case"glitch":this.effectState={phase:0,glitchFrames:8};break;case"dissolve":{this.currentGrid=Array.from({length:s},()=>Array.from({length:c},()=>{const e=[" ","\u2591","\u2592","\u2593","\u2588","\u2580","\u2584"];return e[Math.floor(Math.random()*e.length)]}));const t=[];for(let e=0;e<s;e++)for(let i=0;i<c;i++)t.push([e,i]);for(let e=t.length-1;e>0;e--){const i=Math.floor(Math.random()*(e+1));[t[e],t[i]]=[t[i],t[e]]}this.effectState={positions:t,idx:0};break}}}startAnimation(){const t=this.effect==="glitch"?60:30;this.interval=setInterval(()=>{const e=this.tickEffect();this.updateDisplay(),this.ui.requestRender(),e&&this.stopAnimation()},1e3/t)}stopAnimation(){this.interval&&(clearInterval(this.interval),this.interval=null)}tickEffect(){switch(this.effect){case"typewriter":return this.tickTypewriter();case"scanline":return this.tickScanline();case"rain":return this.tickRain();case"fade":return this.tickFade();case"crt":return this.tickCrt();case"glitch":return this.tickGlitch();case"dissolve":return this.tickDissolve();default:return!0}}tickTypewriter(){const t=this.effectState,e=3;for(let i=0;i<e;i++){const r=Math.floor(t.pos/c),f=t.pos%c;if(r>=s)return!0;this.currentGrid[r][f]=this.finalGrid[r][f],t.pos++}return!1}tickScanline(){const t=this.effectState;if(t.row>=s)return!0;for(let e=0;e<c;e++)this.currentGrid[t.row][e]=this.finalGrid[t.row][e];return t.row++,!1}tickRain(){const t=this.effectState;let e=!0;this.currentGrid=this.createEmptyGrid();for(let i=0;i<c;i++){const r=t.drops[i];for(let n=s-1;n>=s-r.settled;n--)n>=0&&(this.currentGrid[n][i]=this.finalGrid[n][i]);if(r.settled>=s)continue;e=!1;let f=-1;for(let n=s-1-r.settled;n>=0;n--)if(this.finalGrid[n][i]!==" "){f=n;break}r.y++,r.y>=0&&r.y<s&&(f>=0&&r.y>=f?(r.settled=s-f,r.y=-Math.floor(Math.random()*5)-1):this.currentGrid[r.y][i]="\u2593")}return e}tickFade(){const t=this.effectState,e=15;for(let i=0;i<e;i++){if(t.idx>=t.positions.length)return!0;const[r,f]=t.positions[t.idx];this.currentGrid[r][f]=this.finalGrid[r][f],t.idx++}return!1}tickCrt(){const t=this.effectState,e=Math.floor(s/2);this.currentGrid=this.createEmptyGrid();const i=e-t.expansion,r=e+t.expansion;for(let f=Math.max(0,i);f<=Math.min(s-1,r);f++)for(let n=0;n<c;n++)this.currentGrid[f][n]=this.finalGrid[f][n];return t.expansion++,t.expansion>s}tickGlitch(){const t=this.effectState;return t.phase<t.glitchFrames?(this.currentGrid=this.finalGrid.map(e=>{const i=Math.floor(Math.random()*7)-3,r=[...e];if(Math.random()<.3)return r.slice(i).concat(r.slice(0,i)).slice(0,c);if(Math.random()<.2){const f=Math.floor(Math.random()*s);return[...this.finalGrid[f]]}return r}),t.phase++,!1):(this.currentGrid=this.finalGrid.map(e=>[...e]),!0)}tickDissolve(){const t=this.effectState,e=20;for(let i=0;i<e;i++){if(t.idx>=t.positions.length)return!0;const[r,f]=t.positions[t.idx];this.currentGrid[r][f]=this.finalGrid[r][f],t.idx++}return!1}updateDisplay(){this.gridVersion++}dispose(){this.stopAnimation()}}export{w as ArminComponent};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AssistantMessage } from "@openadapter/koda-ai";
|
|
2
|
+
import { Container, type MarkdownTheme } from "@openadapter/koda-tui";
|
|
3
|
+
/**
|
|
4
|
+
* Component that renders a complete assistant message
|
|
5
|
+
*/
|
|
6
|
+
export declare class AssistantMessageComponent extends Container {
|
|
7
|
+
private contentContainer;
|
|
8
|
+
private hideThinkingBlock;
|
|
9
|
+
private markdownTheme;
|
|
10
|
+
private hiddenThinkingLabel;
|
|
11
|
+
private lastMessage?;
|
|
12
|
+
private hasToolCalls;
|
|
13
|
+
constructor(message?: AssistantMessage, hideThinkingBlock?: boolean, markdownTheme?: MarkdownTheme, hiddenThinkingLabel?: string);
|
|
14
|
+
invalidate(): void;
|
|
15
|
+
setHideThinkingBlock(hide: boolean): void;
|
|
16
|
+
setHiddenThinkingLabel(label: string): void;
|
|
17
|
+
render(width: number): string[];
|
|
18
|
+
updateContent(message: AssistantMessage): void;
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var k=Object.defineProperty;var a=(l,t)=>k(l,"name",{value:t,configurable:!0});import{Container as c,Markdown as g,Spacer as s,Text as d}from"@openadapter/koda-tui";import{getMarkdownTheme as f,theme as r}from"../theme/theme.js";const T="\x1B]133;A\x07",p="\x1B]133;B\x07",w="\x1B]133;C\x07";class u extends c{static{a(this,"AssistantMessageComponent")}contentContainer;hideThinkingBlock;markdownTheme;hiddenThinkingLabel;lastMessage;hasToolCalls=!1;constructor(t,e=!1,h=f(),n="Thinking..."){super(),this.hideThinkingBlock=e,this.markdownTheme=h,this.hiddenThinkingLabel=n,this.contentContainer=new c,this.addChild(this.contentContainer),t&&this.updateContent(t)}invalidate(){super.invalidate(),this.lastMessage&&this.updateContent(this.lastMessage)}setHideThinkingBlock(t){this.hideThinkingBlock=t,this.lastMessage&&this.updateContent(this.lastMessage)}setHiddenThinkingLabel(t){this.hiddenThinkingLabel=t,this.lastMessage&&this.updateContent(this.lastMessage)}render(t){const e=super.render(t);return this.hasToolCalls||e.length===0||(e[0]=T+e[0],e[e.length-1]=p+w+e[e.length-1]),e}updateContent(t){this.lastMessage=t,this.contentContainer.clear();const e=t.content.some(n=>n.type==="text"&&n.text.trim()||n.type==="thinking"&&n.thinking.trim());e&&this.contentContainer.addChild(new s(1));for(let n=0;n<t.content.length;n++){const i=t.content[n];if(i.type==="text"&&i.text.trim())this.contentContainer.addChild(new g(i.text.trim(),1,0,this.markdownTheme));else if(i.type==="thinking"&&i.thinking.trim()){const C=t.content.slice(n+1).some(o=>o.type==="text"&&o.text.trim()||o.type==="thinking"&&o.thinking.trim());this.hideThinkingBlock?(this.contentContainer.addChild(new d(r.italic(r.fg("thinkingText",this.hiddenThinkingLabel)),1,0)),C&&this.contentContainer.addChild(new s(1))):(this.contentContainer.addChild(new g(i.thinking.trim(),1,0,this.markdownTheme,{color:a(o=>r.fg("thinkingText",o),"color"),italic:!0})),C&&this.contentContainer.addChild(new s(1)))}}const h=t.content.some(n=>n.type==="toolCall");if(this.hasToolCalls=h,!h){if(t.stopReason==="aborted"){const n=t.errorMessage&&t.errorMessage!=="Request was aborted"?t.errorMessage:"Operation aborted";e?this.contentContainer.addChild(new s(1)):this.contentContainer.addChild(new s(1)),this.contentContainer.addChild(new d(r.fg("error",n),1,0))}else if(t.stopReason==="error"){const n=t.errorMessage||"Unknown error";/rate.?limit|429|too many requests|retry|quota|overloaded|503|502|temporarily|timeout/i.test(n)||(this.contentContainer.addChild(new s(1)),this.contentContainer.addChild(new d(r.fg("error",`Error: ${n}`),1,0)))}}}}export{u as AssistantMessageComponent};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component for displaying bash command execution with streaming output.
|
|
3
|
+
*/
|
|
4
|
+
import { Container, type TUI } from "@openadapter/koda-tui";
|
|
5
|
+
import { type TruncationResult } from "../../../core/tools/truncate.ts";
|
|
6
|
+
export declare class BashExecutionComponent extends Container {
|
|
7
|
+
private command;
|
|
8
|
+
private outputLines;
|
|
9
|
+
private status;
|
|
10
|
+
private exitCode;
|
|
11
|
+
private loader;
|
|
12
|
+
private truncationResult?;
|
|
13
|
+
private fullOutputPath?;
|
|
14
|
+
private expanded;
|
|
15
|
+
private contentContainer;
|
|
16
|
+
constructor(command: string, ui: TUI, excludeFromContext?: boolean);
|
|
17
|
+
/**
|
|
18
|
+
* Set whether the output is expanded (shows full output) or collapsed (preview only).
|
|
19
|
+
*/
|
|
20
|
+
setExpanded(expanded: boolean): void;
|
|
21
|
+
invalidate(): void;
|
|
22
|
+
appendOutput(chunk: string): void;
|
|
23
|
+
setComplete(exitCode: number | undefined, cancelled: boolean, truncationResult?: TruncationResult, fullOutputPath?: string): void;
|
|
24
|
+
private updateDisplay;
|
|
25
|
+
/**
|
|
26
|
+
* Get the raw output for creating BashExecutionMessage.
|
|
27
|
+
*/
|
|
28
|
+
getOutput(): string;
|
|
29
|
+
/**
|
|
30
|
+
* Get the command that was executed.
|
|
31
|
+
*/
|
|
32
|
+
getCommand(): string;
|
|
33
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
var x=Object.defineProperty;var u=(f,e)=>x(f,"name",{value:e,configurable:!0});import{Container as m,Loader as y,Spacer as $,Text as h}from"@openadapter/koda-tui";import{DEFAULT_MAX_BYTES as w,DEFAULT_MAX_LINES as T,truncateTail as O}from"../../../core/tools/truncate.js";import{stripAnsi as E}from"../../../utils/ansi.js";import{theme as i}from"../theme/theme.js";import{DynamicBorder as g}from"./dynamic-border.js";import{keyHint as C,keyText as D}from"./keybinding-hints.js";import{truncateToVisualLines as b}from"./visual-truncate.js";const L=20;class S extends m{static{u(this,"BashExecutionComponent")}command;outputLines=[];status="running";exitCode=void 0;loader;truncationResult;fullOutputPath;expanded=!1;contentContainer;constructor(e,s,n=!1){super(),this.command=e;const a=n?"dim":"bashMode",o=u(t=>i.fg(a,t),"borderColor");this.addChild(new $(1)),this.addChild(new g(o)),this.contentContainer=new m,this.addChild(this.contentContainer);const c=new h(i.fg(a,i.bold(`$ ${e}`)),1,0);this.contentContainer.addChild(c),this.loader=new y(s,t=>i.fg(a,t),t=>i.fg("muted",t),`Running... (${D("tui.select.cancel")} to cancel)`),this.contentContainer.addChild(this.loader),this.addChild(new g(o))}setExpanded(e){this.expanded=e,this.updateDisplay()}invalidate(){super.invalidate(),this.updateDisplay()}appendOutput(e){const n=E(e).replace(/\r\n/g,`
|
|
2
|
+
`).replace(/\r/g,`
|
|
3
|
+
`).split(`
|
|
4
|
+
`);this.outputLines.length>0&&n.length>0?(this.outputLines[this.outputLines.length-1]+=n[0],this.outputLines.push(...n.slice(1))):this.outputLines.push(...n),this.updateDisplay()}setComplete(e,s,n,a){this.exitCode=e,this.status=s?"cancelled":e!==0&&e!==void 0&&e!==null?"error":"complete",this.truncationResult=n,this.fullOutputPath=a,this.loader.stop(),this.updateDisplay()}updateDisplay(){const e=this.outputLines.join(`
|
|
5
|
+
`),s=O(e,{maxLines:T,maxBytes:w}),n=s.content?s.content.split(`
|
|
6
|
+
`):[],a=n.slice(-L),o=n.length-a.length;this.contentContainer.clear();const c=new h(i.fg("bashMode",i.bold(`$ ${this.command}`)),1,0);if(this.contentContainer.addChild(c),n.length>0)if(this.expanded){const t=n.map(l=>i.fg("muted",l)).join(`
|
|
7
|
+
`);this.contentContainer.addChild(new h(`
|
|
8
|
+
${t}`,1,0))}else{const l=`
|
|
9
|
+
${a.map(d=>i.fg("muted",d)).join(`
|
|
10
|
+
`)}`;let p,r;this.contentContainer.addChild({render:u(d=>((r===void 0||p!==d)&&(r=b(l,L,d,1).visualLines,p=d),r??[]),"render"),invalidate:u(()=>{p=void 0,r=void 0},"invalidate")})}if(this.status==="running")this.contentContainer.addChild(this.loader);else{const t=[];o>0&&(this.expanded?t.push(`(${C("app.tools.expand","to collapse")})`):t.push(`${i.fg("muted",`... ${o} more lines`)} (${C("app.tools.expand","to expand")})`)),this.status==="cancelled"?t.push(i.fg("warning","(cancelled)")):this.status==="error"&&t.push(i.fg("error",`(exit ${this.exitCode})`)),(this.truncationResult?.truncated||s.truncated)&&this.fullOutputPath&&t.push(i.fg("warning",`Output truncated. Full output: ${this.fullOutputPath}`)),t.length>0&&this.contentContainer.addChild(new h(`
|
|
11
|
+
${t.join(`
|
|
12
|
+
`)}`,1,0))}}getOutput(){return this.outputLines.join(`
|
|
13
|
+
`)}getCommand(){return this.command}}export{S as BashExecutionComponent};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Container, type TUI } from "@openadapter/koda-tui";
|
|
2
|
+
import type { Theme } from "../theme/theme.ts";
|
|
3
|
+
/** Loader wrapped with borders for extension UI */
|
|
4
|
+
export declare class BorderedLoader extends Container {
|
|
5
|
+
private loader;
|
|
6
|
+
private cancellable;
|
|
7
|
+
private signalController?;
|
|
8
|
+
constructor(tui: TUI, theme: Theme, message: string, options?: {
|
|
9
|
+
cancellable?: boolean;
|
|
10
|
+
});
|
|
11
|
+
get signal(): AbortSignal;
|
|
12
|
+
set onAbort(fn: (() => void) | undefined);
|
|
13
|
+
handleInput(data: string): void;
|
|
14
|
+
dispose(): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var c=Object.defineProperty;var i=(o,l)=>c(o,"name",{value:l,configurable:!0});import{CancellableLoader as h,Container as f,Loader as p,Spacer as n,Text as b}from"@openadapter/koda-tui";import{DynamicBorder as s}from"./dynamic-border.js";import{keyHint as C}from"./keybinding-hints.js";class y extends f{static{i(this,"BorderedLoader")}loader;cancellable;signalController;constructor(l,t,a,d){super(),this.cancellable=d?.cancellable??!0;const r=i(e=>t.fg("border",e),"borderColor");this.addChild(new s(r)),this.cancellable?this.loader=new h(l,e=>t.fg("accent",e),e=>t.fg("muted",e),a):(this.signalController=new AbortController,this.loader=new p(l,e=>t.fg("accent",e),e=>t.fg("muted",e),a)),this.addChild(this.loader),this.cancellable&&(this.addChild(new n(1)),this.addChild(new b(C("tui.select.cancel","cancel"),1,0))),this.addChild(new n(1)),this.addChild(new s(r))}get signal(){return this.cancellable?this.loader.signal:this.signalController?.signal??new AbortController().signal}set onAbort(l){this.cancellable&&(this.loader.onAbort=l)}handleInput(l){this.cancellable&&this.loader.handleInput(l)}dispose(){"dispose"in this.loader&&typeof this.loader.dispose=="function"?this.loader.dispose():"stop"in this.loader&&typeof this.loader.stop=="function"&&this.loader.stop()}}export{y as BorderedLoader};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Box, type MarkdownTheme } from "@openadapter/koda-tui";
|
|
2
|
+
import type { BranchSummaryMessage } from "../../../core/messages.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Component that renders a branch summary message with collapsed/expanded state.
|
|
5
|
+
* Uses same background color as custom messages for visual consistency.
|
|
6
|
+
*/
|
|
7
|
+
export declare class BranchSummaryMessageComponent extends Box {
|
|
8
|
+
private expanded;
|
|
9
|
+
private message;
|
|
10
|
+
private markdownTheme;
|
|
11
|
+
constructor(message: BranchSummaryMessage, markdownTheme?: MarkdownTheme);
|
|
12
|
+
setExpanded(expanded: boolean): void;
|
|
13
|
+
invalidate(): void;
|
|
14
|
+
private updateDisplay;
|
|
15
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var n=Object.defineProperty;var d=(m,e)=>n(m,"name",{value:e,configurable:!0});import{Box as o,Markdown as h,Spacer as r,Text as i}from"@openadapter/koda-tui";import{getMarkdownTheme as p,theme as s}from"../theme/theme.js";import{keyText as l}from"./keybinding-hints.js";class f extends o{static{d(this,"BranchSummaryMessageComponent")}expanded=!1;message;markdownTheme;constructor(e,a=p()){super(1,1,t=>s.bg("customMessageBg",t)),this.message=e,this.markdownTheme=a,this.updateDisplay()}setExpanded(e){this.expanded=e,this.updateDisplay()}invalidate(){super.invalidate(),this.updateDisplay()}updateDisplay(){this.clear();const e=s.fg("customMessageLabel","\x1B[1m[branch]\x1B[22m");if(this.addChild(new i(e,0,0)),this.addChild(new r(1)),this.expanded){const a=`**Branch Summary**
|
|
2
|
+
|
|
3
|
+
`;this.addChild(new h(a+this.message.summary,0,0,this.markdownTheme,{color:d(t=>s.fg("customMessageText",t),"color")}))}else this.addChild(new i(s.fg("customMessageText","Branch summary (")+s.fg("dim",l("app.tools.expand"))+s.fg("customMessageText"," to expand)"),0,0))}}export{f as BranchSummaryMessageComponent};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Box, type MarkdownTheme } from "@openadapter/koda-tui";
|
|
2
|
+
import type { CompactionSummaryMessage } from "../../../core/messages.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Component that renders a compaction message with collapsed/expanded state.
|
|
5
|
+
* Uses same background color as custom messages for visual consistency.
|
|
6
|
+
*/
|
|
7
|
+
export declare class CompactionSummaryMessageComponent extends Box {
|
|
8
|
+
private expanded;
|
|
9
|
+
private message;
|
|
10
|
+
private markdownTheme;
|
|
11
|
+
constructor(message: CompactionSummaryMessage, markdownTheme?: MarkdownTheme);
|
|
12
|
+
setExpanded(expanded: boolean): void;
|
|
13
|
+
invalidate(): void;
|
|
14
|
+
private updateDisplay;
|
|
15
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var n=Object.defineProperty;var o=(d,e)=>n(d,"name",{value:e,configurable:!0});import{Box as p,Markdown as r,Spacer as h,Text as m}from"@openadapter/koda-tui";import{getMarkdownTheme as c,theme as s}from"../theme/theme.js";import{keyText as l}from"./keybinding-hints.js";class k extends p{static{o(this,"CompactionSummaryMessageComponent")}expanded=!1;message;markdownTheme;constructor(e,t=c()){super(1,1,a=>s.bg("customMessageBg",a)),this.message=e,this.markdownTheme=t,this.updateDisplay()}setExpanded(e){this.expanded=e,this.updateDisplay()}invalidate(){super.invalidate(),this.updateDisplay()}updateDisplay(){this.clear();const e=this.message.tokensBefore.toLocaleString(),t=s.fg("customMessageLabel","\x1B[1m[compaction]\x1B[22m");if(this.addChild(new m(t,0,0)),this.addChild(new h(1)),this.expanded){const a=`**Compacted from ${e} tokens**
|
|
2
|
+
|
|
3
|
+
`;this.addChild(new r(a+this.message.summary,0,0,this.markdownTheme,{color:o(i=>s.fg("customMessageText",i),"color")}))}else this.addChild(new m(s.fg("customMessageText",`Compacted from ${e} tokens (`)+s.fg("dim",l("app.tools.expand"))+s.fg("customMessageText"," to expand)"),0,0))}}export{k as CompactionSummaryMessageComponent};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI component for managing package resources (enable/disable)
|
|
3
|
+
*/
|
|
4
|
+
import { type Component, Container, type Focusable } from "@openadapter/koda-tui";
|
|
5
|
+
import type { PathMetadata, ResolvedPaths } from "../../../core/package-manager.ts";
|
|
6
|
+
import type { SettingsManager } from "../../../core/settings-manager.ts";
|
|
7
|
+
type ResourceType = "extensions" | "skills" | "prompts" | "themes";
|
|
8
|
+
interface ResourceItem {
|
|
9
|
+
path: string;
|
|
10
|
+
enabled: boolean;
|
|
11
|
+
metadata: PathMetadata;
|
|
12
|
+
resourceType: ResourceType;
|
|
13
|
+
displayName: string;
|
|
14
|
+
groupKey: string;
|
|
15
|
+
subgroupKey: string;
|
|
16
|
+
}
|
|
17
|
+
interface ResourceSubgroup {
|
|
18
|
+
type: ResourceType;
|
|
19
|
+
label: string;
|
|
20
|
+
items: ResourceItem[];
|
|
21
|
+
}
|
|
22
|
+
interface ResourceGroup {
|
|
23
|
+
key: string;
|
|
24
|
+
label: string;
|
|
25
|
+
scope: "user" | "project" | "temporary";
|
|
26
|
+
origin: "package" | "top-level";
|
|
27
|
+
source: string;
|
|
28
|
+
subgroups: ResourceSubgroup[];
|
|
29
|
+
}
|
|
30
|
+
declare class ResourceList implements Component, Focusable {
|
|
31
|
+
private groups;
|
|
32
|
+
private flatItems;
|
|
33
|
+
private filteredItems;
|
|
34
|
+
private selectedIndex;
|
|
35
|
+
private searchInput;
|
|
36
|
+
private maxVisible;
|
|
37
|
+
private settingsManager;
|
|
38
|
+
private cwd;
|
|
39
|
+
private agentDir;
|
|
40
|
+
onCancel?: () => void;
|
|
41
|
+
onExit?: () => void;
|
|
42
|
+
onToggle?: (item: ResourceItem, newEnabled: boolean) => void;
|
|
43
|
+
private _focused;
|
|
44
|
+
get focused(): boolean;
|
|
45
|
+
set focused(value: boolean);
|
|
46
|
+
constructor(groups: ResourceGroup[], settingsManager: SettingsManager, cwd: string, agentDir: string, terminalHeight?: number);
|
|
47
|
+
private buildFlatList;
|
|
48
|
+
private findNextItem;
|
|
49
|
+
private filterItems;
|
|
50
|
+
private selectFirstItem;
|
|
51
|
+
updateItem(item: ResourceItem, enabled: boolean): void;
|
|
52
|
+
invalidate(): void;
|
|
53
|
+
render(width: number): string[];
|
|
54
|
+
handleInput(data: string): void;
|
|
55
|
+
private toggleResource;
|
|
56
|
+
private toggleTopLevelResource;
|
|
57
|
+
private togglePackageResource;
|
|
58
|
+
private getTopLevelBaseDir;
|
|
59
|
+
private getResourcePattern;
|
|
60
|
+
private getPackageResourcePattern;
|
|
61
|
+
}
|
|
62
|
+
export declare class ConfigSelectorComponent extends Container implements Focusable {
|
|
63
|
+
private resourceList;
|
|
64
|
+
private _focused;
|
|
65
|
+
get focused(): boolean;
|
|
66
|
+
set focused(value: boolean);
|
|
67
|
+
constructor(resolvedPaths: ResolvedPaths, settingsManager: SettingsManager, cwd: string, agentDir: string, onClose: () => void, onExit: () => void, requestRender: () => void, terminalHeight?: number);
|
|
68
|
+
getResourceList(): ResourceList;
|
|
69
|
+
}
|
|
70
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var R=Object.defineProperty;var f=(c,e)=>R(c,"name",{value:e,configurable:!0});import{homedir as D}from"node:os";import{basename as $,dirname as L,join as T,relative as M}from"node:path";import{Container as N,getKeybindings as E,Input as W,matchesKey as _,Spacer as y,truncateToWidth as P,visibleWidth as C}from"@openadapter/koda-tui";import{CONFIG_DIR_NAME as F}from"../../../config.js";import{theme as p}from"../theme/theme.js";import{DynamicBorder as k}from"./dynamic-border.js";import{rawKeyHint as w}from"./keybinding-hints.js";const K={extensions:"Extensions",skills:"Skills",prompts:"Prompts",themes:"Themes"};function S(c){const e=D();let t;return c===e?t="~":c.startsWith(e)?t=`~${c.slice(e.length).replace(/\\/g,"/")}`:t=c.replace(/\\/g,"/"),t.endsWith("/")?t:`${t}/`}f(S,"formatBaseDir");function V(c){return c.origin==="package"?`${c.source} (${c.scope})`:c.source==="auto"?c.baseDir?c.scope==="user"?`User (${S(c.baseDir)})`:`Project (${S(c.baseDir)})`:c.scope==="user"?"User (~/.pi/agent/)":"Project (.pi/)":c.scope==="user"?"User settings":"Project settings"}f(V,"getGroupLabel");function G(c){const e=new Map,t=f((r,s)=>{for(const o of r){const{path:h,enabled:g,metadata:n}=o,a=`${n.origin}:${n.scope}:${n.source}:${n.baseDir??""}`;e.has(a)||e.set(a,{key:a,label:V(n),scope:n.scope,origin:n.origin,source:n.source,subgroups:[]});const m=e.get(a),d=`${a}:${s}`;let I=m.subgroups.find(j=>j.type===s);I||(I={type:s,label:K[s],items:[]},m.subgroups.push(I));const u=$(h),x=$(L(h));let b;s==="extensions"&&x!=="extensions"?b=`${x}/${u}`:s==="skills"&&u==="SKILL.md"?b=x:b=u,I.items.push({path:h,enabled:g,metadata:n,resourceType:s,displayName:b,groupKey:a,subgroupKey:d})}},"addToGroup");t(c.extensions,"extensions"),t(c.skills,"skills"),t(c.prompts,"prompts"),t(c.themes,"themes");const i=Array.from(e.values());i.sort((r,s)=>r.origin!==s.origin?r.origin==="package"?-1:1:r.scope!==s.scope?r.scope==="user"?-1:1:r.source.localeCompare(s.source));const l={extensions:0,skills:1,prompts:2,themes:3};for(const r of i){r.subgroups.sort((s,o)=>l[s.type]-l[o.type]);for(const s of r.subgroups)s.items.sort((o,h)=>o.displayName.localeCompare(h.displayName))}return i}f(G,"buildGroups");class v{static{f(this,"ConfigSelectorHeader")}invalidate(){}render(e){const t=p.bold("Resource Configuration"),i=p.fg("muted"," \xB7 "),l=w("space","toggle")+i+w("esc","close"),r=C(l),s=C(t),o=Math.max(1,e-s-r);return[P(`${t}${" ".repeat(o)}${l}`,e,""),p.fg("muted","Type to filter resources")]}}class B{static{f(this,"ResourceList")}groups;flatItems=[];filteredItems=[];selectedIndex=0;searchInput;maxVisible;settingsManager;cwd;agentDir;onCancel;onExit;onToggle;_focused=!1;get focused(){return this._focused}set focused(e){this._focused=e,this.searchInput.focused=e}constructor(e,t,i,l,r){this.groups=e,this.settingsManager=t,this.cwd=i,this.agentDir=l,this.searchInput=new W;const s=8;this.maxVisible=Math.max(5,(r??24)-s),this.buildFlatList(),this.filteredItems=[...this.flatItems]}buildFlatList(){this.flatItems=[];for(const e of this.groups){this.flatItems.push({type:"group",group:e});for(const t of e.subgroups){this.flatItems.push({type:"subgroup",subgroup:t,group:e});for(const i of t.items)this.flatItems.push({type:"item",item:i})}}this.selectedIndex=this.flatItems.findIndex(e=>e.type==="item"),this.selectedIndex<0&&(this.selectedIndex=0)}findNextItem(e,t){let i=e+t;for(;i>=0&&i<this.filteredItems.length;){if(this.filteredItems[i].type==="item")return i;i+=t}return e}filterItems(e){if(!e.trim()){this.filteredItems=[...this.flatItems],this.selectFirstItem();return}const t=e.toLowerCase(),i=new Set,l=new Set,r=new Set;for(const s of this.flatItems)if(s.type==="item"){const o=s.item;(o.displayName.toLowerCase().includes(t)||o.resourceType.toLowerCase().includes(t)||o.path.toLowerCase().includes(t))&&i.add(o)}for(const s of this.groups)for(const o of s.subgroups)for(const h of o.items)i.has(h)&&(l.add(o),r.add(s));this.filteredItems=[];for(const s of this.flatItems)s.type==="group"&&r.has(s.group)?this.filteredItems.push(s):s.type==="subgroup"&&l.has(s.subgroup)?this.filteredItems.push(s):s.type==="item"&&i.has(s.item)&&this.filteredItems.push(s);this.selectFirstItem()}selectFirstItem(){const e=this.filteredItems.findIndex(t=>t.type==="item");this.selectedIndex=e>=0?e:0}updateItem(e,t){e.enabled=t;for(const i of this.groups)for(const l of i.subgroups){const r=l.items.find(s=>s.path===e.path&&s.resourceType===e.resourceType);if(r){r.enabled=t;return}}}invalidate(){}render(e){const t=[];if(t.push(...this.searchInput.render(e)),t.push(""),this.filteredItems.length===0)return t.push(p.fg("muted"," No resources found")),t;const i=Math.max(0,Math.min(this.selectedIndex-Math.floor(this.maxVisible/2),this.filteredItems.length-this.maxVisible)),l=Math.min(i+this.maxVisible,this.filteredItems.length);for(let r=i;r<l;r++){const s=this.filteredItems[r],o=r===this.selectedIndex;if(s.type==="group"){const h=p.fg("accent",p.bold(s.group.label));t.push(P(` ${h}`,e,""))}else if(s.type==="subgroup"){const h=p.fg("muted",s.subgroup.label);t.push(P(` ${h}`,e,""))}else{const h=s.item,g=o?"> ":" ",n=h.enabled?p.fg("success","[x]"):p.fg("dim","[ ]"),a=o?p.bold(h.displayName):h.displayName;t.push(P(`${g} ${n} ${a}`,e,"..."))}}if(i>0||l<this.filteredItems.length){const r=this.filteredItems.filter(o=>o.type==="item").length,s=this.filteredItems.slice(0,this.selectedIndex).filter(o=>o.type==="item").length+1;t.push(p.fg("dim",` (${s}/${r})`))}return t}handleInput(e){const t=E();if(t.matches(e,"tui.select.up")){this.selectedIndex=this.findNextItem(this.selectedIndex,-1);return}if(t.matches(e,"tui.select.down")){this.selectedIndex=this.findNextItem(this.selectedIndex,1);return}if(t.matches(e,"tui.select.pageUp")){let i=Math.max(0,this.selectedIndex-this.maxVisible);for(;i<this.filteredItems.length&&this.filteredItems[i].type!=="item";)i++;i<this.filteredItems.length&&(this.selectedIndex=i);return}if(t.matches(e,"tui.select.pageDown")){let i=Math.min(this.filteredItems.length-1,this.selectedIndex+this.maxVisible);for(;i>=0&&this.filteredItems[i].type!=="item";)i--;i>=0&&(this.selectedIndex=i);return}if(t.matches(e,"tui.select.cancel")){this.onCancel?.();return}if(_(e,"ctrl+c")){this.onExit?.();return}if(e===" "||t.matches(e,"tui.select.confirm")){const i=this.filteredItems[this.selectedIndex];if(i?.type==="item"){const l=!i.item.enabled;this.toggleResource(i.item,l),this.updateItem(i.item,l),this.onToggle?.(i.item,l)}return}this.searchInput.handleInput(e),this.filterItems(this.searchInput.getValue())}toggleResource(e,t){e.metadata.origin==="top-level"?this.toggleTopLevelResource(e,t):this.togglePackageResource(e,t)}toggleTopLevelResource(e,t){const i=e.metadata.scope,l=i==="project"?this.settingsManager.getProjectSettings():this.settingsManager.getGlobalSettings(),r=e.resourceType,s=l[r]??[],o=this.getResourcePattern(e),h=`-${o}`,g=`+${o}`,n=s.filter(a=>(a.startsWith("!")||a.startsWith("+")||a.startsWith("-")?a.slice(1):a)!==o);t?n.push(g):n.push(h),i==="project"?r==="extensions"?this.settingsManager.setProjectExtensionPaths(n):r==="skills"?this.settingsManager.setProjectSkillPaths(n):r==="prompts"?this.settingsManager.setProjectPromptTemplatePaths(n):r==="themes"&&this.settingsManager.setProjectThemePaths(n):r==="extensions"?this.settingsManager.setExtensionPaths(n):r==="skills"?this.settingsManager.setSkillPaths(n):r==="prompts"?this.settingsManager.setPromptTemplatePaths(n):r==="themes"&&this.settingsManager.setThemePaths(n)}togglePackageResource(e,t){const i=e.metadata.scope,r=[...(i==="project"?this.settingsManager.getProjectSettings():this.settingsManager.getGlobalSettings()).packages??[]],s=r.findIndex(u=>(typeof u=="string"?u:u.source)===e.metadata.source);if(s===-1)return;let o=r[s];typeof o=="string"&&(o={source:o},r[s]=o);const h=e.resourceType,g=o[h]??[],n=this.getPackageResourcePattern(e),a=`-${n}`,m=`+${n}`,d=g.filter(u=>(u.startsWith("!")||u.startsWith("+")||u.startsWith("-")?u.slice(1):u)!==n);t?d.push(m):d.push(a),o[h]=d.length>0?d:void 0,["extensions","skills","prompts","themes"].some(u=>o[u]!==void 0)||(r[s]=o.source),i==="project"?this.settingsManager.setProjectPackages(r):this.settingsManager.setPackages(r)}getTopLevelBaseDir(e){return e==="project"?T(this.cwd,F):this.agentDir}getResourcePattern(e){const t=e.metadata.scope,i=e.metadata.baseDir??this.getTopLevelBaseDir(t);return M(i,e.path)}getPackageResourcePattern(e){const t=e.metadata.baseDir??L(e.path);return M(t,e.path)}}class X extends N{static{f(this,"ConfigSelectorComponent")}resourceList;_focused=!1;get focused(){return this._focused}set focused(e){this._focused=e,this.resourceList.focused=e}constructor(e,t,i,l,r,s,o,h){super();const g=G(e);this.addChild(new y(1)),this.addChild(new k),this.addChild(new y(1)),this.addChild(new v),this.addChild(new y(1)),this.resourceList=new B(g,t,i,l,h),this.resourceList.onCancel=r,this.resourceList.onExit=s,this.resourceList.onToggle=()=>o(),this.addChild(this.resourceList),this.addChild(new y(1)),this.addChild(new k)}getResourceList(){return this.resourceList}}export{X as ConfigSelectorComponent};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reusable countdown timer for dialog components.
|
|
3
|
+
*/
|
|
4
|
+
import type { TUI } from "@openadapter/koda-tui";
|
|
5
|
+
export declare class CountdownTimer {
|
|
6
|
+
private intervalId;
|
|
7
|
+
private remainingSeconds;
|
|
8
|
+
private tui;
|
|
9
|
+
private onTick;
|
|
10
|
+
private onExpire;
|
|
11
|
+
constructor(timeoutMs: number, tui: TUI | undefined, onTick: (seconds: number) => void, onExpire: () => void);
|
|
12
|
+
dispose(): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var o=Object.defineProperty;var e=(n,i)=>o(n,"name",{value:i,configurable:!0});class d{static{e(this,"CountdownTimer")}intervalId;remainingSeconds;tui;onTick;onExpire;constructor(i,t,s,r){this.tui=t,this.onTick=s,this.onExpire=r,this.remainingSeconds=Math.ceil(i/1e3),this.onTick(this.remainingSeconds),this.intervalId=setInterval(()=>{this.remainingSeconds--,this.onTick(this.remainingSeconds),this.tui?.requestRender(),this.remainingSeconds<=0&&(this.dispose(),this.onExpire())},1e3)}dispose(){this.intervalId&&(clearInterval(this.intervalId),this.intervalId=void 0)}}export{d as CountdownTimer};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Editor, type EditorOptions, type EditorTheme, type TUI } from "@openadapter/koda-tui";
|
|
2
|
+
import type { AppKeybinding, KeybindingsManager } from "../../../core/keybindings.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Custom editor that handles app-level keybindings for coding-agent.
|
|
5
|
+
*/
|
|
6
|
+
export declare class CustomEditor extends Editor {
|
|
7
|
+
private keybindings;
|
|
8
|
+
actionHandlers: Map<AppKeybinding, () => void>;
|
|
9
|
+
onEscape?: () => void;
|
|
10
|
+
onCtrlD?: () => void;
|
|
11
|
+
onPasteImage?: () => void;
|
|
12
|
+
/** Handler for extension-registered shortcuts. Returns true if handled. */
|
|
13
|
+
onExtensionShortcut?: (data: string) => boolean;
|
|
14
|
+
constructor(tui: TUI, theme: EditorTheme, keybindings: KeybindingsManager, options?: EditorOptions);
|
|
15
|
+
/**
|
|
16
|
+
* Register a handler for an app action.
|
|
17
|
+
*/
|
|
18
|
+
onAction(action: AppKeybinding, handler: () => void): void;
|
|
19
|
+
handleInput(data: string): void;
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var o=Object.defineProperty;var s=(i,t)=>o(i,"name",{value:t,configurable:!0});import{Editor as p}from"@openadapter/koda-tui";class c extends p{static{s(this,"CustomEditor")}keybindings;actionHandlers=new Map;onEscape;onCtrlD;onPasteImage;onExtensionShortcut;constructor(t,n,e,r){super(t,n,r),this.keybindings=e}onAction(t,n){this.actionHandlers.set(t,n)}handleInput(t){if(!this.onExtensionShortcut?.(t)){if(this.keybindings.matches(t,"app.clipboard.pasteImage")){this.onPasteImage?.();return}if(this.keybindings.matches(t,"app.interrupt")){if(!this.isShowingAutocomplete()){const n=this.onEscape??this.actionHandlers.get("app.interrupt");if(n){n();return}}super.handleInput(t);return}if(this.keybindings.matches(t,"app.exit")&&this.getText().length===0){const n=this.onCtrlD??this.actionHandlers.get("app.exit");n&&n();return}for(const[n,e]of this.actionHandlers)if(n!=="app.interrupt"&&n!=="app.exit"&&this.keybindings.matches(t,n)){e();return}super.handleInput(t)}}}export{c as CustomEditor};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Container, type MarkdownTheme } from "@openadapter/koda-tui";
|
|
2
|
+
import type { MessageRenderer } from "../../../core/extensions/types.ts";
|
|
3
|
+
import type { CustomMessage } from "../../../core/messages.ts";
|
|
4
|
+
/**
|
|
5
|
+
* Component that renders a custom message entry from extensions.
|
|
6
|
+
* Uses distinct styling to differentiate from user messages.
|
|
7
|
+
*/
|
|
8
|
+
export declare class CustomMessageComponent extends Container {
|
|
9
|
+
private message;
|
|
10
|
+
private customRenderer?;
|
|
11
|
+
private box;
|
|
12
|
+
private customComponent?;
|
|
13
|
+
private markdownTheme;
|
|
14
|
+
private _expanded;
|
|
15
|
+
constructor(message: CustomMessage<unknown>, customRenderer?: MessageRenderer, markdownTheme?: MarkdownTheme);
|
|
16
|
+
setExpanded(expanded: boolean): void;
|
|
17
|
+
invalidate(): void;
|
|
18
|
+
private rebuild;
|
|
19
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var m=Object.defineProperty;var o=(n,t)=>m(n,"name",{value:t,configurable:!0});import{Box as a,Container as r,Markdown as c,Spacer as d,Text as l}from"@openadapter/koda-tui";import{getMarkdownTheme as u,theme as i}from"../theme/theme.js";class g extends r{static{o(this,"CustomMessageComponent")}message;customRenderer;box;customComponent;markdownTheme;_expanded=!1;constructor(t,s,e=u()){super(),this.message=t,this.customRenderer=s,this.markdownTheme=e,this.addChild(new d(1)),this.box=new a(1,1,h=>i.bg("customMessageBg",h)),this.rebuild()}setExpanded(t){this._expanded!==t&&(this._expanded=t,this.rebuild())}invalidate(){super.invalidate(),this.rebuild()}rebuild(){if(this.customComponent&&(this.removeChild(this.customComponent),this.customComponent=void 0),this.removeChild(this.box),this.customRenderer)try{const e=this.customRenderer(this.message,{expanded:this._expanded},i);if(e){this.customComponent=e,this.addChild(e);return}}catch{}this.addChild(this.box),this.box.clear();const t=i.fg("customMessageLabel",`\x1B[1m[${this.message.customType}]\x1B[22m`);this.box.addChild(new l(t,0,0)),this.box.addChild(new d(1));let s;typeof this.message.content=="string"?s=this.message.content:s=this.message.content.filter(e=>e.type==="text").map(e=>e.text).join(`
|
|
2
|
+
`),this.box.addChild(new c(s,0,0,this.markdownTheme,{color:o(e=>i.fg("customMessageText",e),"color")}))}}export{g as CustomMessageComponent};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* POWERED BY DAXNUTS - Easter egg for OpenCode + Kimi K2.5
|
|
3
|
+
*
|
|
4
|
+
* A heartfelt tribute to dax (@thdxr) for providing free Kimi K2.5 access via OpenCode.
|
|
5
|
+
*/
|
|
6
|
+
import type { Component, TUI } from "@openadapter/koda-tui";
|
|
7
|
+
export declare class DaxnutsComponent implements Component {
|
|
8
|
+
private ui;
|
|
9
|
+
private image;
|
|
10
|
+
private interval;
|
|
11
|
+
private tick;
|
|
12
|
+
private maxTicks;
|
|
13
|
+
private cachedLines;
|
|
14
|
+
private cachedWidth;
|
|
15
|
+
private cachedTick;
|
|
16
|
+
constructor(ui: TUI);
|
|
17
|
+
invalidate(): void;
|
|
18
|
+
private startAnimation;
|
|
19
|
+
private stopAnimation;
|
|
20
|
+
render(width: number): string[];
|
|
21
|
+
dispose(): void;
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var m=Object.defineProperty;var i=(d,c)=>m(d,"name",{value:c,configurable:!0});import{theme as x}from"../theme/theme.js";const o="bbbab8b9b9b6b9b8b5bcbbb8b8b7b4b7b5b2b6b5b2b8b7b4b7b6b3b6b4b1bdbcb8bab8b6bbb8b5b8b5b1bbb8b4c2bebbc1bebac0bdbabfbcb9c1bebabfbebbc0bfbcc0bdbabbb8b5c1bfbcbfbcb8bbb9b6bfbcb8c2bfbcc1bfbcbfbbb8bdb9b6b8b7b5b9b8b5b8b8b5b5b5b2b6b5b2b8b7b4b9b8b5b9b8b5b6b5b3bab8b5bcbab7bbb9b6bbb8b5bfb9b5bdb2abbcb0a8beb2aabeb5afbfbab6bebab7c0bfbcbebdbabebbb8c0bdbabfbebbc2bebbbdbab7c3c0bdc3c0bdc1bebbc2bebabfbcb8bab9b6b7b6b3b2b1aeb6b5b2b5b4b1b5b4b2b6b5b2b7b6b4b9b8b6b7b6b3bbbab7b2afaba5988fb49e90b09481b79a88b39683b09583b7a395bfb6b0c0bdbabdbbb8bebcb9c1bfbcc0bebbbdbab7bebbb8c2bfbcc0bdbac0bcb9bdb9b6c0bcb8b5b4b2b4b3b0bab9b6b9b9b6b5b4b1b5b4b1b6b5b3b9b8b5b9b8b6b9b8b6b2aeaa968174a6836eaa856eab846eaf8973ac8973b08f79b18f7ab39786b7a89dbbb3aebfbab6c2c0bdbebcb9bfbdbac3c1bdc2bebbc0bcb9bdb9b6c1bdbabfbbb8b4b3b0b9b8b5b8b7b5b4b3b1b5b4b1b8b7b4b8b7b5bab9b6bbbab7b1afad8c7a719d735ca47860a87d65a98069ae8972ae8c75af8d77aa826ba98067aa8974b39e90b6a79dbbb2adc0bdbac1bfbdbfbbb8c1bdb9bebab6c0bdb9bfbbb8c1bdbab4b2b0b7b6b4b7b6b3b4b2b0bab9b7b6b5b2b6b5b2bab9b6bab9b6958c87977663aa836bac8772b08f7aad8c77b2917db0917db0907cac8971a77d64a87f67ac8972b29887b8a89dbfbab5bfbdbac1bebac0bcb9c0bcb9c0bcb9c1bebabebab7b8b7b4b7b6b4b5b4b1b5b4b2b7b6b3b5b4b2bab9b7bab9b6b4b1ada88f7fad8973ae8d78b19684b19685b29786b69a89b29582b1917daa856ea87e66a97e66ad866ea9826baf9280b8ada6bdbbb8bebab7bfbbb8c1bdbabfbbb8bcb8b4bcb8b5b6b4b2b7b5b3b6b5b2b8b7b4b3b2afb8b7b4b6b5b2b3b2b0b3a59aab856fad8d78b0917eb19886b49b8bb49a89b39785b0917eaf8f7cab866fa77d65a77a61a87d64a9816ab08f79b5a296c1bcb8c3bfbcc2bebbbebab7bfbbb7bdbab6c2bebab8b7b4b7b6b4b6b5b3b7b6b3b6b5b2b9b8b6b4b3b1b6b1acac8f7ca9826bae8f7aaf9583b49c8cb49c8bb79d8cb59987b19380ad8e79ae8c77af8e78ac8771a3775faa826bae8972b39888bbb6b2bebbb8bfbbb8bfbbb8c0bdb9bebbb7c0bdb9b6b5b2b9b8b5b4b3b1b8b7b5b4b3b0b7b6b4b6b5b3b1a7a0aa8772a77d65a88570b49887b19b8d9c887c907a6d987f71aa907faf917daf8e7aad8c78ac8b77a8836ca9836cac8770b49b8abdb6b2c0bcb9c0bdb9bfbbb8bebab7bfbcb9bebab7b9b8b6b5b4b2b9b8b5b8b7b5b8b7b4b7b6b4b5b4b2b3a9a2ad8973a1755da9856fb398858c776a65544b776358725d526e594d9c7f6eb1907ba68672ad8e7aab8771ac856db18f79b3a092beb9b5c1bdbabdb9b5bebab7bfbbb7bebab7bcb9b6b7b6b4b6b6b3b8b7b4b5b4b2b8b6b4b7b6b3b4b3b0b4aba4a6826ba3775fb08e79b19584a88e7daa8e7db29481ad8f7c997e6da38674ac8d79ac8e7aae917f9a7c6a896a599a7c6ab3a398c1bdbabdb9b6bcb8b5bebab6bebab7bdb9b5bdb9b6b5b4b1b7b5b3b5b4b2b7b6b3b7b6b4b3b3b0b3b2b0b4aca5a7846fa97f68ae8f7bae9383b59c8bb2937fae8e79ac8b76af927eaf927eb29683b39885b2988891786a72594c6e594d978d86bdbab7bab7b3c0bcb9c0bcb9bebab7bebbb7bdb9b6b3b2b0b4b3b0b5b4b2b4b4b1b4b3b1b4b3b1b4b3b0b6ada5aa8670a57a62ad8e7ab29b8cb69d8dab856fa9826aa88069ab8771af907db49987b19684b29886b59987b39480b09787b5a9a1bcb8b5bebab7bdb9b5bebab7bfbbb8bfbbb7bbb7b4b3b2afb8b7b5b8b7b5b3b2b0b5b4b2b6b5b3b6b4b1afa299a98975a9826baf907cb39988b49a89af8e7aac8973aa856eaf8c74b1917dae907dac907db39988b29785b49785b7a090b9aca3bfbab7bcb8b5bdb9b6bcb8b4bcb8b5bdb9b5bcb8b4b5b4b2b6b5b3b4b3b0b4b3b0b9b8b5b8b6b4908b88887467aa8f7ea78976ad8973b08b74b59885b69e8eb29888b1917cb1917db1937fae907cb19686b39a8ab29886b59b8ab8a192b6aaa3b7b2afbcb8b4bcb8b5bbb7b4c0bcb9bebab7c0bcb9b6b5b2b6b5b3b4b3b0bab9b7b7b6b4b1b0ae7b716ba083709b806f716158967764b08870b29481b69b8ab69f8fb39a89b69f90b49d8db39a89b29988b49c8cb6a090b8a496baa49593867f8f8986bfbbb7bdb9b5bcb7b4bab6b3b9b5b2bab6b2b4b3b1b3b3b0b6b5b3b8b7b5b4b2b0a7a5a38f837dae917ea084725a504c63544da28370b39784b59e8db2a093a698909b918b998e8790857e95877dad998bb39c8cb5a091b9a2938d827c95908dbebab6bbb7b3bdbab7bbb7b4bdb9b6bbb7b4b4b3b0b5b4b1b8b7b5b6b5b3b8b8b5b4b2af968f8ab29a8bab9485544b483a323073655d96887f70655f61595547403e453e3c453f3d57504f655e5b90847db39c8db7a090b6a09189807aaba6a3bdb9b6c0bcb9bebab7bcb7b4bebab7bbb7b4b3b2b0b6b5b3b2b1afb7b6b4b8b7b4b5b4b1aeaba8b5a89fac998d4d44412d25244d46444e4744322b293a3230423937433a37352d2a59504c534b48524a48988a81b59f8fb19c8d827974b2afacbdb9b5bcb8b4bdb9b5bcb8b5bdb9b6bab6b2b8b7b5b5b4b2b6b6b3b9b8b5b7b6b3b6b5b2b8b6b3b9b4b1b2a9a26c64612d25242d2625312a28352d2c453d3a78675c8d7a6ea09792aea6a0615854332b29524a479f8e82b09d90a49b96c1bdb9bebab7bfbbb8bbb8b4b9b5b1b8b4b0b9b4b0b7b6b4b8b7b5b8b7b4b6b5b3b8b6b3bab9b6b9b8b5b4b3b0b7b5b2a5a29f453d3b261e1d261f1e2e2625413936857268977865b19482b5a69caca5a07c7572453d3b746963a0948cc5bfbbc0bbb8beb9b6bbb7b3bbb6b3b7b3afb8b4b0b9b5b1b7b6b3b6b5b3b5b4b2b5b4b2b7b6b3b7b6b3b8b6b3b4b2afb7b6b3b3b1ae6d6765251f1e1e18172a22212d2523443b3971625ab19888b09482a89182877e792c25243e3634766d6abeb9b5bfbbb7bebab6bcb7b3bbb6b3b9b5b1b7b3afb8b4b0b4b3b0b5b4b1b5b4b1b4b3b1b5b4b2b8b6b4b5b3b0b9b6b4b5b4b1b6b4b27f79762a2322221c1b2d2524221b1a443e3c47413f6f676281766f867971675e5a3e37352a222166605dbab7b3bdb9b5beb9b5bcb7b3bcb7b3b9b4b0bab6b2bab6b2b5b3b0b6b4b2b3b2afb7b6b3b4b4b1b4b3b0b6b4b1b5b4b1b4b3b0b9b6b29a8c8252474230292828201f181212322c2c231e1d1c16162c26252923222d26252d2523332b2a8e8885bcb8b5bcb7b3bbb6b2bcb7b3b9b4b1b9b5b1b7b2afb7b2ae7a838e9b9b9caeadacb3b2b0b3b2afb7b7b4b6b5b3b6b6b3b7b6b3b9ada4a991808e7b6f50453f2b24231a14142923221f19181d17161f18182620201d17162a22215d5654b7b3b0bbb7b3bbb6b2b8b4b0bab5b1bbb6b2bab5b1b8b4b0bab6b22c496b4c5d735f68766e727a828285929090adaba8b7b2aeb6a59ab39682a28470a387748e76674e403a1a14141d1716181211221c1c1f1918221c1b2f2827342d2c8d8884bab6b3b9b5b2bab5b1bab5b1b9b4b0bab6b2b8b4b0b9b4b0b7b2ae325e8b365f8a3a5d833f5b7a545f70646469706b6aa08f84b08e78b18e769f7e689e7f6b9e816d907766584940362d2a1c1615201b1a1a1413201a1a251e1d393331a39e9bbab5b1bcb7b3bab6b2b8b3afb8b4b0b9b4b0b9b4b1bab5b2b5b0ac3d6c9843729d44719c426e98415f805a64716f6a699d8677b1927eb3947faa89749d7a649f7f6ba487749e837186716454463f2c25231e181837302e3a33317a7471beb9b6bcb8b4bbb6b2b6b2aebab5b1b9b5b1b8b3afbab6b2b6b1adb5aeaa4877a14c7aa44e7ba345719a3a5d80586b7f767475927b6eb1927faf8e79b08e78a78169a07861a17f6aa58570a688749b83738270666f66618a8480a49e99b7b2aebab6b2bcb8b4b9b5b1b7b2aebab5b1b9b4b0b6b1aeb6b1adb2aca8b2aca84876a04a78a2517fa74771973a5d80405c7a6161677c695fac8a75b08d77b4917aaf8971ad876fa5816aa6846ea78670a98a76ac9484ab9f96b2aca8bdb8b4bcb7b3bcb8b4bcb8b4b8b3afb7b2aeb9b4b0b8b3afb8b2aeb6afabb3aeaab2aeaa4878a14b7aa34c7ba44a759b3d63873b5f825b67766f5f569c7e6caf8c77b18f79b28f78b5927caf8e78a98872aa8a76a98a76ac917fada199b7b0acb9b3afbfb9b5c1bab6bdb6b2b8b3afbab5b1b9b4b0b6afabb7b1adb3ada9b3aeaab0aba8",n=32,l=32;function g(){const d=[];for(let c=0;c<l;c++){const e=[];for(let b=0;b<n;b++){const a=(c*n+b)*6,t=parseInt(o.slice(a,a+2),16),s=parseInt(o.slice(a+2,a+4),16),f=parseInt(o.slice(a+4,a+6),16);e.push([t,s,f])}d.push(e)}return d}i(g,"parseImage");function r(d,c,e,b=!1){return`\x1B[${b?48:38};2;${d};${c};${e}m`}i(r,"rgb");const u="\x1B[0m";function k(){const d=g(),c=[];for(let e=0;e<l;e+=2){let b="";for(let a=0;a<n;a++){const t=d[e][a],s=d[e+1]?.[a]??t;b+=`${r(s[0],s[1],s[2])}${r(t[0],t[1],t[2],!0)}\u2584`}b+=u,c.push(b)}return c}i(k,"buildImage");class I{static{i(this,"DaxnutsComponent")}ui;image;interval=null;tick=0;maxTicks=25;cachedLines=[];cachedWidth=0;cachedTick=-1;constructor(c){this.ui=c,this.image=k(),this.startAnimation()}invalidate(){this.cachedWidth=0}startAnimation(){this.interval=setInterval(()=>{this.tick++,this.tick>=this.maxTicks&&this.stopAnimation(),this.cachedWidth=0,this.ui.requestRender()},80)}stopAnimation(){this.interval&&(clearInterval(this.interval),this.interval=null)}render(c){if(c===this.cachedWidth&&this.cachedTick===this.tick)return this.cachedLines;const e=x,b=[],a=i(f=>{const h=f.replace(/\x1b\[[0-9;]*m/g,"").length,p=Math.max(0,Math.floor((c-h)/2));return" ".repeat(p)+f},"center");b.push("");const t=Math.min(this.image.length,Math.floor(this.tick/this.maxTicks*(this.image.length+3)));for(let f=0;f<this.image.length;f++)if(f<t)b.push(a(this.image[f]));else if(f===t){const h="\u2593".repeat(n);b.push(a(r(100,200,255)+h+u))}else b.push(a(" ".repeat(n)));b.push("");const s=Math.max(0,this.tick-this.maxTicks*.6);return s>0||this.tick>=this.maxTicks?(b.push(a(e.fg("accent","Free Kimi K2.5 via OpenCode Zen"))),b.push(a(e.fg("success",'"Powered by daxnuts"'))),b.push(a(e.fg("muted","\u2014 @thdxr")))):(b.push(""),b.push(""),b.push("")),b.push(""),s>2||this.tick>=this.maxTicks?(b.push(a(e.fg("dim","Try OpenCode"))),b.push(a(e.fg("mdLink","https://mistral.ai/news/mistral-vibe-2-0")))):(b.push(""),b.push("")),b.push(""),this.cachedLines=b,this.cachedWidth=c,this.cachedTick=this.tick,b}dispose(){this.stopAnimation()}}export{I as DaxnutsComponent};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface RenderDiffOptions {
|
|
2
|
+
/** File path (unused, kept for API compatibility) */
|
|
3
|
+
filePath?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Render a diff string with colored lines and intra-line change highlighting.
|
|
7
|
+
* - Context lines: dim/gray
|
|
8
|
+
* - Removed lines: red, with inverse on changed tokens
|
|
9
|
+
* - Added lines: green, with inverse on changed tokens
|
|
10
|
+
*/
|
|
11
|
+
export declare function renderDiff(diffText: string, _options?: RenderDiffOptions): string;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var v=Object.defineProperty;var a=(l,s)=>v(l,"name",{value:s,configurable:!0});import*as $ from"diff";import{theme as r}from"../theme/theme.js";function m(l){const s=l.match(/^([+-\s])(\s*\d*)\s(.*)$/);return s?{prefix:s[1],lineNum:s[2],content:s[3]}:null}a(m,"parseDiffLine");function c(l){return l.replace(/\t/g," ")}a(c,"replaceTabs");function D(l,s){const d=$.diffWords(l,s);let i="",n="",u=!0,f=!0;for(const o of d)if(o.removed){let t=o.value;if(u){const e=t.match(/^(\s*)/)?.[1]||"";t=t.slice(e.length),i+=e,u=!1}t&&(i+=r.inverse(t))}else if(o.added){let t=o.value;if(f){const e=t.match(/^(\s*)/)?.[1]||"";t=t.slice(e.length),n+=e,f=!1}t&&(n+=r.inverse(t))}else i+=o.value,n+=o.value;return{removedLine:i,addedLine:n}}a(D,"renderIntraLineDiff");function L(l,s={}){const d=l.split(`
|
|
2
|
+
`),i=[];let n=0;for(;n<d.length;){const u=d[n],f=m(u);if(!f){i.push(r.fg("toolDiffContext",u)),n++;continue}if(f.prefix==="-"){const o=[];for(;n<d.length;){const e=m(d[n]);if(!e||e.prefix!=="-")break;o.push({lineNum:e.lineNum,content:e.content}),n++}const t=[];for(;n<d.length;){const e=m(d[n]);if(!e||e.prefix!=="+")break;t.push({lineNum:e.lineNum,content:e.content}),n++}if(o.length===1&&t.length===1){const e=o[0],p=t[0],{removedLine:h,addedLine:g}=D(c(e.content),c(p.content));i.push(r.fg("toolDiffRemoved",`-${e.lineNum} ${h}`)),i.push(r.fg("toolDiffAdded",`+${p.lineNum} ${g}`))}else{for(const e of o)i.push(r.fg("toolDiffRemoved",`-${e.lineNum} ${c(e.content)}`));for(const e of t)i.push(r.fg("toolDiffAdded",`+${e.lineNum} ${c(e.content)}`))}}else f.prefix==="+"?(i.push(r.fg("toolDiffAdded",`+${f.lineNum} ${c(f.content)}`)),n++):(i.push(r.fg("toolDiffContext",` ${f.lineNum} ${c(f.content)}`)),n++)}return i.join(`
|
|
3
|
+
`)}a(L,"renderDiff");export{L as renderDiff};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Component } from "@openadapter/koda-tui";
|
|
2
|
+
/**
|
|
3
|
+
* Dynamic border component that adjusts to viewport width.
|
|
4
|
+
*
|
|
5
|
+
* Note: When used from extensions loaded via jiti, the global `theme` may be undefined
|
|
6
|
+
* because jiti creates a separate module cache. Always pass an explicit color
|
|
7
|
+
* function when using DynamicBorder in components exported for extension use.
|
|
8
|
+
*/
|
|
9
|
+
export declare class DynamicBorder implements Component {
|
|
10
|
+
private color;
|
|
11
|
+
constructor(color?: (str: string) => string);
|
|
12
|
+
invalidate(): void;
|
|
13
|
+
render(width: number): string[];
|
|
14
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var a=Object.defineProperty;var e=(o,r)=>a(o,"name",{value:r,configurable:!0});import{theme as c}from"../theme/theme.js";class m{static{e(this,"DynamicBorder")}color;constructor(r=t=>c.fg("border",t)){this.color=r}invalidate(){}render(r){return[this.color("\u2500".repeat(Math.max(1,r)))]}}export{m as DynamicBorder};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var h=Object.defineProperty;var d=(s,a)=>h(s,"name",{value:a,configurable:!0});import*as c from"node:fs";import{Container as f,Image as g,Spacer as i,Text as o}from"@openadapter/koda-tui";import{getBundledInteractiveAssetPath as p}from"../../../config.js";import{theme as e}from"../theme/theme.js";import{DynamicBorder as r}from"./dynamic-border.js";const C="https://mariozechner.at/posts/2026-04-08-ive-sold-out/",l="clankolas.png";let n,m=!1;function u(){if(m)return n;m=!0;try{n=c.readFileSync(p(l)).toString("base64")}catch{n=void 0}return n}d(u,"loadImageBase64");class x extends f{static{d(this,"EarendilAnnouncementComponent")}constructor(){super(),this.addChild(new r(t=>e.fg("accent",t))),this.addChild(new o(e.bold(e.fg("accent","Koda")),1,0)),this.addChild(new i(1)),this.addChild(new o(e.fg("muted","Read the blog post:"),1,0)),this.addChild(new o(e.fg("mdLink",C),1,0)),this.addChild(new i(1));const a=u();a&&(this.addChild(new g(a,"image/png",{fallbackColor:d(t=>e.fg("muted",t),"fallbackColor")},{maxWidthCells:56,filename:l})),this.addChild(new i(1))),this.addChild(new r(t=>e.fg("accent",t)))}}export{x as EarendilAnnouncementComponent};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-line editor component for extensions.
|
|
3
|
+
* Supports Ctrl+G for external editor.
|
|
4
|
+
*/
|
|
5
|
+
import { Container, type EditorOptions, type Focusable, type TUI } from "@openadapter/koda-tui";
|
|
6
|
+
import type { KeybindingsManager } from "../../../core/keybindings.ts";
|
|
7
|
+
export declare class ExtensionEditorComponent extends Container implements Focusable {
|
|
8
|
+
private editor;
|
|
9
|
+
private onSubmitCallback;
|
|
10
|
+
private onCancelCallback;
|
|
11
|
+
private tui;
|
|
12
|
+
private keybindings;
|
|
13
|
+
private _focused;
|
|
14
|
+
get focused(): boolean;
|
|
15
|
+
set focused(value: boolean);
|
|
16
|
+
constructor(tui: TUI, keybindings: KeybindingsManager, title: string, prefill: string | undefined, onSubmit: (value: string) => void, onCancel: () => void, options?: EditorOptions);
|
|
17
|
+
handleInput(keyData: string): void;
|
|
18
|
+
private openExternalEditor;
|
|
19
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var w=Object.defineProperty;var m=(l,t)=>w(l,"name",{value:t,configurable:!0});import{spawn as b}from"node:child_process";import*as h from"node:fs";import*as x from"node:os";import*as E from"node:path";import{Container as g,Editor as k,getKeybindings as y,Spacer as r,Text as p}from"@openadapter/koda-tui";import{getEditorTheme as S,theme as T}from"../theme/theme.js";import{DynamicBorder as f}from"./dynamic-border.js";import{keyHint as d}from"./keybinding-hints.js";class _ extends g{static{m(this,"ExtensionEditorComponent")}editor;onSubmitCallback;onCancelCallback;tui;keybindings;_focused=!1;get focused(){return this._focused}set focused(t){this._focused=t,this.editor.focused=t}constructor(t,n,e,s,c,u,i){super(),this.tui=t,this.keybindings=n,this.onSubmitCallback=c,this.onCancelCallback=u,this.addChild(new f),this.addChild(new r(1)),this.addChild(new p(T.fg("accent",e),1,0)),this.addChild(new r(1)),this.editor=new k(t,S(),i),s&&this.editor.setText(s),this.editor.onSubmit=C=>{this.onSubmitCallback(C)},this.addChild(this.editor),this.addChild(new r(1));const o=!!(process.env.VISUAL||process.env.EDITOR),a=d("tui.select.confirm","submit")+" "+d("tui.input.newLine","newline")+" "+d("tui.select.cancel","cancel")+(o?` ${d("app.editor.external","external editor")}`:"");this.addChild(new p(a,1,0)),this.addChild(new r(1)),this.addChild(new f)}handleInput(t){if(y().matches(t,"tui.select.cancel")){this.onCancelCallback();return}if(this.keybindings.matches(t,"app.editor.external")){this.openExternalEditor();return}this.editor.handleInput(t)}async openExternalEditor(){const t=process.env.VISUAL||process.env.EDITOR;if(!t)return;const n=this.editor.getText(),e=E.join(x.tmpdir(),`pi-extension-editor-${Date.now()}.md`);try{h.writeFileSync(e,n,"utf-8"),this.tui.stop();const[s,...c]=t.split(" ");if(process.stdout.write(`Launching external editor: ${t}
|
|
2
|
+
Pi will resume when the editor exits.
|
|
3
|
+
`),await new Promise(i=>{const o=b(s,[...c,e],{stdio:"inherit",shell:process.platform==="win32"});o.on("error",()=>i(null)),o.on("close",a=>i(a))})===0){const i=h.readFileSync(e,"utf-8").replace(/\n$/,"");this.editor.setText(i)}}finally{try{h.unlinkSync(e)}catch{}this.tui.start(),this.tui.requestRender(!0)}}}export{_ as ExtensionEditorComponent};
|