@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
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension loader - loads TypeScript extension modules using jiti.
|
|
3
|
+
*
|
|
4
|
+
*/
|
|
5
|
+
import { type EventBus } from "../event-bus.ts";
|
|
6
|
+
import type { Extension, ExtensionFactory, ExtensionRuntime, LoadExtensionsResult } from "./types.ts";
|
|
7
|
+
/**
|
|
8
|
+
* Create a runtime with throwing stubs for action methods.
|
|
9
|
+
* Runner.bindCore() replaces these with real implementations.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createExtensionRuntime(): ExtensionRuntime;
|
|
12
|
+
/**
|
|
13
|
+
* Create an Extension from an inline factory function.
|
|
14
|
+
*/
|
|
15
|
+
export declare function loadExtensionFromFactory(factory: ExtensionFactory, cwd: string, eventBus: EventBus, runtime: ExtensionRuntime, extensionPath?: string): Promise<Extension>;
|
|
16
|
+
/**
|
|
17
|
+
* Load extensions from paths.
|
|
18
|
+
*/
|
|
19
|
+
export declare function loadExtensions(paths: string[], cwd: string, eventBus?: EventBus): Promise<LoadExtensionsResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Discover and load extensions from standard locations.
|
|
22
|
+
*/
|
|
23
|
+
export declare function discoverAndLoadExtensions(configuredPaths: string[], cwd: string, agentDir?: string, eventBus?: EventBus): Promise<LoadExtensionsResult>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var _=Object.defineProperty;var a=(s,e)=>_(s,"name",{value:e,configurable:!0});import*as u from"node:fs";import{createRequire as R}from"node:module";import*as l from"node:path";import{fileURLToPath as E}from"node:url";import*as k from"@openadapter/koda-agent-core";import*as S from"@openadapter/koda-ai";import*as w from"@openadapter/koda-ai/oauth";import*as T from"@openadapter/koda-tui";import{createJiti as F}from"jiti/static";import*as M from"typebox";import*as P from"typebox/compile";import*as j from"typebox/value";import{CONFIG_DIR_NAME as D,getAgentDir as N,isBunBinary as U}from"../../config.js";import*as C from"../../index.js";import{resolvePath as m}from"../../utils/paths.js";import{createEventBus as V}from"../event-bus.js";import{execCommand as O}from"../exec.js";import{createSyntheticSourceInfo as W}from"../source-info.js";const B={typebox:M,"typebox/compile":P,"typebox/value":j,"@sinclair/typebox":M,"@sinclair/typebox/compile":P,"@sinclair/typebox/value":j,"@openadapter/koda-agent-core":k,"@openadapter/koda-tui":T,"@openadapter/koda-ai":S,"@openadapter/koda-ai/oauth":w,"@openadapter/koda":C,"@mariozechner/pi-agent-core":k,"@mariozechner/pi-tui":T,"@mariozechner/pi-ai":S,"@mariozechner/pi-ai/oauth":w,"@mariozechner/pi-coding-agent":C},x=R(import.meta.url);let y=null;function J(){if(y)return y;const s=l.dirname(E(import.meta.url)),e=l.resolve(s,"../..","index.js"),i=x.resolve("typebox"),n=x.resolve("typebox/compile"),r=x.resolve("typebox/value"),t=l.resolve(s,"../../../../"),o=a((p,v)=>{const b=l.join(t,p);return u.existsSync(b)?b:E(import.meta.resolve(v))},"resolveWorkspaceOrImport"),c=e,d=o("agent/dist/index.js","@openadapter/koda-agent-core"),f=o("tui/dist/index.js","@openadapter/koda-tui"),g=o("ai/dist/index.js","@openadapter/koda-ai"),h=o("ai/dist/oauth.js","@openadapter/koda-ai/oauth");return y={"@openadapter/koda":c,"@openadapter/koda-agent-core":d,"@openadapter/koda-tui":f,"@openadapter/koda-ai":g,"@openadapter/koda-ai/oauth":h,"@mariozechner/pi-coding-agent":c,"@mariozechner/pi-agent-core":d,"@mariozechner/pi-tui":f,"@mariozechner/pi-ai":g,"@mariozechner/pi-ai/oauth":h,typebox:i,"typebox/compile":n,"typebox/value":r,"@sinclair/typebox":i,"@sinclair/typebox/compile":n,"@sinclair/typebox/value":r},y}a(J,"getAliases");function q(){const s=a(()=>{throw new Error("Extension runtime not initialized. Action methods cannot be called during extension loading.")},"notInitialized"),e={},n={sendMessage:s,sendUserMessage:s,appendEntry:s,setSessionName:s,getSessionName:s,setLabel:s,getActiveTools:s,getAllTools:s,setActiveTools:s,refreshTools:a(()=>{},"refreshTools"),getCommands:s,setModel:a(()=>Promise.reject(new Error("Extension runtime not initialized")),"setModel"),getThinkingLevel:s,setThinkingLevel:s,flagValues:new Map,pendingProviderRegistrations:[],assertActive:a(()=>{if(e.staleMessage)throw new Error(e.staleMessage)},"assertActive"),invalidate:a(r=>{e.staleMessage??=r??"This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."},"invalidate"),registerProvider:a((r,t,o="<unknown>")=>{n.pendingProviderRegistrations.push({name:r,config:t,extensionPath:o})},"registerProvider"),unregisterProvider:a(r=>{n.pendingProviderRegistrations=n.pendingProviderRegistrations.filter(t=>t.name!==r)},"unregisterProvider")};return n}a(q,"createExtensionRuntime");function z(s,e,i,n){return{on(t,o){e.assertActive();const c=s.handlers.get(t)??[];c.push(o),s.handlers.set(t,c)},registerTool(t){e.assertActive(),s.tools.set(t.name,{definition:t,sourceInfo:s.sourceInfo}),e.refreshTools()},registerCommand(t,o){e.assertActive(),s.commands.set(t,{name:t,sourceInfo:s.sourceInfo,...o})},registerShortcut(t,o){e.assertActive(),s.shortcuts.set(t,{shortcut:t,extensionPath:s.path,...o})},registerFlag(t,o){e.assertActive(),s.flags.set(t,{name:t,extensionPath:s.path,...o}),o.default!==void 0&&!e.flagValues.has(t)&&e.flagValues.set(t,o.default)},registerMessageRenderer(t,o){e.assertActive(),s.messageRenderers.set(t,o)},getFlag(t){if(e.assertActive(),!!s.flags.has(t))return e.flagValues.get(t)},sendMessage(t,o){e.assertActive(),e.sendMessage(t,o)},sendUserMessage(t,o){e.assertActive(),e.sendUserMessage(t,o)},appendEntry(t,o){e.assertActive(),e.appendEntry(t,o)},setSessionName(t){e.assertActive(),e.setSessionName(t)},getSessionName(){return e.assertActive(),e.getSessionName()},setLabel(t,o){e.assertActive(),e.setLabel(t,o)},exec(t,o,c){return e.assertActive(),O(t,o,c?.cwd??i,c)},getActiveTools(){return e.assertActive(),e.getActiveTools()},getAllTools(){return e.assertActive(),e.getAllTools()},setActiveTools(t){e.assertActive(),e.setActiveTools(t)},getCommands(){return e.assertActive(),e.getCommands()},setModel(t){return e.assertActive(),e.setModel(t)},getThinkingLevel(){return e.assertActive(),e.getThinkingLevel()},setThinkingLevel(t){e.assertActive(),e.setThinkingLevel(t)},registerProvider(t,o){e.assertActive(),e.registerProvider(t,o,s.path)},unregisterProvider(t){e.assertActive(),e.unregisterProvider(t,s.path)},events:n}}a(z,"createExtensionAPI");async function $(s){const n=await F(import.meta.url,{moduleCache:!1,...U?{virtualModules:B,tryNative:!1}:{alias:J()}}).import(s,{default:!0});return typeof n!="function"?void 0:n}a($,"loadExtensionModule");function L(s,e){const i=s.startsWith("<")&&s.endsWith(">")?s.slice(1,-1).split(":")[0]||"temporary":"local",n=s.startsWith("<")?void 0:l.dirname(e);return{path:s,resolvedPath:e,sourceInfo:W(s,{source:i,baseDir:n}),handlers:new Map,tools:new Map,messageRenderers:new Map,commands:new Map,flags:new Map,shortcuts:new Map}}a(L,"createExtension");async function G(s,e,i,n){const r=m(s,e,{normalizeUnicodeSpaces:!0});try{const t=await $(r);if(!t)return{extension:null,error:`Extension does not export a valid factory function: ${s}`};const o=L(s,r),c=z(o,n,e,i);return await t(c),{extension:o,error:null}}catch(t){return{extension:null,error:`Failed to load extension: ${t instanceof Error?t.message:String(t)}`}}}a(G,"loadExtension");async function ie(s,e,i,n,r="<inline>"){const t=L(r,r),o=m(e),c=z(t,n,o,i);return await s(c),t}a(ie,"loadExtensionFromFactory");async function H(s,e,i){const n=[],r=[],t=m(e),o=i??V(),c=q();for(const d of s){const{extension:f,error:g}=await G(d,t,o,c);if(g){r.push({path:d,error:g});continue}f&&n.push(f)}return{extensions:n,errors:r,runtime:c}}a(H,"loadExtensions");function K(s){try{const e=u.readFileSync(s,"utf-8"),i=JSON.parse(e);return i.pi&&typeof i.pi=="object"?i.pi:null}catch{return null}}a(K,"readPiManifest");function Q(s){return s.endsWith(".ts")||s.endsWith(".js")}a(Q,"isExtensionFile");function I(s){const e=l.join(s,"package.json");if(u.existsSync(e)){const r=K(e);if(r?.extensions?.length){const t=[];for(const o of r.extensions){const c=l.resolve(s,o);u.existsSync(c)&&t.push(c)}if(t.length>0)return t}}const i=l.join(s,"index.ts"),n=l.join(s,"index.js");return u.existsSync(i)?[i]:u.existsSync(n)?[n]:null}a(I,"resolveExtensionEntries");function A(s){if(!u.existsSync(s))return[];const e=[];try{const i=u.readdirSync(s,{withFileTypes:!0});for(const n of i){const r=l.join(s,n.name);if((n.isFile()||n.isSymbolicLink())&&Q(n.name)){e.push(r);continue}if(n.isDirectory()||n.isSymbolicLink()){const t=I(r);t&&e.push(...t)}}}catch{return[]}return e}a(A,"discoverExtensionsInDir");async function ae(s,e,i=N(),n){const r=m(e),t=m(i),o=[],c=new Set,d=a(h=>{for(const p of h){const v=l.resolve(p);c.has(v)||(c.add(v),o.push(p))}},"addPaths"),f=l.join(r,D,"extensions");d(A(f));const g=l.join(t,"extensions");d(A(g));for(const h of s){const p=m(h,r,{normalizeUnicodeSpaces:!0});if(u.existsSync(p)&&u.statSync(p).isDirectory()){const v=I(p);if(v){d(v);continue}d(A(p));continue}d([p])}return H(o,r,n)}a(ae,"discoverAndLoadExtensions");export{q as createExtensionRuntime,ae as discoverAndLoadExtensions,ie as loadExtensionFromFactory,H as loadExtensions};
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension runner - executes extensions and manages their lifecycle.
|
|
3
|
+
*/
|
|
4
|
+
import type { AgentMessage } from "@openadapter/koda-agent-core";
|
|
5
|
+
import type { ImageContent } from "@openadapter/koda-ai";
|
|
6
|
+
import type { KeyId } from "@openadapter/koda-tui";
|
|
7
|
+
import type { ResourceDiagnostic } from "../diagnostics.ts";
|
|
8
|
+
import type { KeybindingsConfig } from "../keybindings.ts";
|
|
9
|
+
import type { ModelRegistry } from "../model-registry.ts";
|
|
10
|
+
import type { SessionManager } from "../session-manager.ts";
|
|
11
|
+
import type { BuildSystemPromptOptions } from "../system-prompt.ts";
|
|
12
|
+
import type { BeforeAgentStartEvent, BeforeAgentStartEventResult, BeforeProviderRequestEvent, ContextEvent, Extension, ExtensionActions, ExtensionCommandContext, ExtensionCommandContextActions, ExtensionContext, ExtensionContextActions, ExtensionError, ExtensionEvent, ExtensionFlag, ExtensionMode, ExtensionRuntime, ExtensionShortcut, ExtensionUIContext, InputEvent, InputEventResult, InputSource, MessageEndEvent, MessageRenderer, ProviderConfig, RegisteredTool, ReplacedSessionContext, ResolvedCommand, ResourcesDiscoverEvent, SessionBeforeCompactResult, SessionBeforeForkResult, SessionBeforeSwitchResult, SessionBeforeTreeResult, SessionShutdownEvent, ToolCallEvent, ToolCallEventResult, ToolResultEvent, ToolResultEventResult, UserBashEvent, UserBashEventResult } from "./types.ts";
|
|
13
|
+
/** Combined result from all before_agent_start handlers */
|
|
14
|
+
interface BeforeAgentStartCombinedResult {
|
|
15
|
+
messages?: NonNullable<BeforeAgentStartEventResult["message"]>[];
|
|
16
|
+
systemPrompt?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Events handled by the generic emit() method.
|
|
20
|
+
* Events with dedicated emitXxx() methods are excluded for stronger type safety.
|
|
21
|
+
*/
|
|
22
|
+
type RunnerEmitEvent = Exclude<ExtensionEvent, ToolCallEvent | ToolResultEvent | UserBashEvent | ContextEvent | BeforeProviderRequestEvent | BeforeAgentStartEvent | MessageEndEvent | ResourcesDiscoverEvent | InputEvent>;
|
|
23
|
+
type RunnerEmitResult<TEvent extends RunnerEmitEvent> = TEvent extends {
|
|
24
|
+
type: "session_before_switch";
|
|
25
|
+
} ? SessionBeforeSwitchResult | undefined : TEvent extends {
|
|
26
|
+
type: "session_before_fork";
|
|
27
|
+
} ? SessionBeforeForkResult | undefined : TEvent extends {
|
|
28
|
+
type: "session_before_compact";
|
|
29
|
+
} ? SessionBeforeCompactResult | undefined : TEvent extends {
|
|
30
|
+
type: "session_before_tree";
|
|
31
|
+
} ? SessionBeforeTreeResult | undefined : undefined;
|
|
32
|
+
export type ExtensionErrorListener = (error: ExtensionError) => void;
|
|
33
|
+
export type NewSessionHandler = (options?: {
|
|
34
|
+
parentSession?: string;
|
|
35
|
+
setup?: (sessionManager: SessionManager) => Promise<void>;
|
|
36
|
+
withSession?: (ctx: ReplacedSessionContext) => Promise<void>;
|
|
37
|
+
}) => Promise<{
|
|
38
|
+
cancelled: boolean;
|
|
39
|
+
}>;
|
|
40
|
+
export type ForkHandler = (entryId: string, options?: {
|
|
41
|
+
position?: "before" | "at";
|
|
42
|
+
withSession?: (ctx: ReplacedSessionContext) => Promise<void>;
|
|
43
|
+
}) => Promise<{
|
|
44
|
+
cancelled: boolean;
|
|
45
|
+
}>;
|
|
46
|
+
export type NavigateTreeHandler = (targetId: string, options?: {
|
|
47
|
+
summarize?: boolean;
|
|
48
|
+
customInstructions?: string;
|
|
49
|
+
replaceInstructions?: boolean;
|
|
50
|
+
label?: string;
|
|
51
|
+
}) => Promise<{
|
|
52
|
+
cancelled: boolean;
|
|
53
|
+
}>;
|
|
54
|
+
export type SwitchSessionHandler = (sessionPath: string, options?: {
|
|
55
|
+
withSession?: (ctx: ReplacedSessionContext) => Promise<void>;
|
|
56
|
+
}) => Promise<{
|
|
57
|
+
cancelled: boolean;
|
|
58
|
+
}>;
|
|
59
|
+
export type ReloadHandler = () => Promise<void>;
|
|
60
|
+
export type ShutdownHandler = () => void;
|
|
61
|
+
/**
|
|
62
|
+
* Helper function to emit session_shutdown event to extensions.
|
|
63
|
+
* Returns true if the event was emitted, false if there were no handlers.
|
|
64
|
+
*/
|
|
65
|
+
export declare function emitSessionShutdownEvent(extensionRunner: ExtensionRunner, event: SessionShutdownEvent): Promise<boolean>;
|
|
66
|
+
export declare class ExtensionRunner {
|
|
67
|
+
private extensions;
|
|
68
|
+
private runtime;
|
|
69
|
+
private uiContext;
|
|
70
|
+
private mode;
|
|
71
|
+
private cwd;
|
|
72
|
+
private sessionManager;
|
|
73
|
+
private modelRegistry;
|
|
74
|
+
private errorListeners;
|
|
75
|
+
private getModel;
|
|
76
|
+
private isIdleFn;
|
|
77
|
+
private getSignalFn;
|
|
78
|
+
private waitForIdleFn;
|
|
79
|
+
private abortFn;
|
|
80
|
+
private hasPendingMessagesFn;
|
|
81
|
+
private getContextUsageFn;
|
|
82
|
+
private compactFn;
|
|
83
|
+
private getSystemPromptFn;
|
|
84
|
+
private getSystemPromptOptionsFn;
|
|
85
|
+
private newSessionHandler;
|
|
86
|
+
private forkHandler;
|
|
87
|
+
private navigateTreeHandler;
|
|
88
|
+
private switchSessionHandler;
|
|
89
|
+
private reloadHandler;
|
|
90
|
+
private shutdownHandler;
|
|
91
|
+
private shortcutDiagnostics;
|
|
92
|
+
private commandDiagnostics;
|
|
93
|
+
private staleMessage;
|
|
94
|
+
constructor(extensions: Extension[], runtime: ExtensionRuntime, cwd: string, sessionManager: SessionManager, modelRegistry: ModelRegistry);
|
|
95
|
+
bindCore(actions: ExtensionActions, contextActions: ExtensionContextActions, providerActions?: {
|
|
96
|
+
registerProvider?: (name: string, config: ProviderConfig) => void;
|
|
97
|
+
unregisterProvider?: (name: string) => void;
|
|
98
|
+
}): void;
|
|
99
|
+
bindCommandContext(actions?: ExtensionCommandContextActions): void;
|
|
100
|
+
setUIContext(uiContext?: ExtensionUIContext, mode?: ExtensionMode): void;
|
|
101
|
+
getUIContext(): ExtensionUIContext;
|
|
102
|
+
hasUI(): boolean;
|
|
103
|
+
getExtensionPaths(): string[];
|
|
104
|
+
/** Get all registered tools from all extensions (first registration per name wins). */
|
|
105
|
+
getAllRegisteredTools(): RegisteredTool[];
|
|
106
|
+
/** Get a tool definition by name. Returns undefined if not found. */
|
|
107
|
+
getToolDefinition(toolName: string): RegisteredTool["definition"] | undefined;
|
|
108
|
+
getFlags(): Map<string, ExtensionFlag>;
|
|
109
|
+
setFlagValue(name: string, value: boolean | string): void;
|
|
110
|
+
getFlagValues(): Map<string, boolean | string>;
|
|
111
|
+
getShortcuts(resolvedKeybindings: KeybindingsConfig): Map<KeyId, ExtensionShortcut>;
|
|
112
|
+
getShortcutDiagnostics(): ResourceDiagnostic[];
|
|
113
|
+
invalidate(message?: string): void;
|
|
114
|
+
private assertActive;
|
|
115
|
+
onError(listener: ExtensionErrorListener): () => void;
|
|
116
|
+
emitError(error: ExtensionError): void;
|
|
117
|
+
hasHandlers(eventType: string): boolean;
|
|
118
|
+
getMessageRenderer(customType: string): MessageRenderer | undefined;
|
|
119
|
+
private resolveRegisteredCommands;
|
|
120
|
+
getRegisteredCommands(): ResolvedCommand[];
|
|
121
|
+
getCommandDiagnostics(): ResourceDiagnostic[];
|
|
122
|
+
getCommand(name: string): ResolvedCommand | undefined;
|
|
123
|
+
/**
|
|
124
|
+
* Request a graceful shutdown. Called by extension tools and event handlers.
|
|
125
|
+
* The actual shutdown behavior is provided by the mode via bindExtensions().
|
|
126
|
+
*/
|
|
127
|
+
shutdown(): void;
|
|
128
|
+
/**
|
|
129
|
+
* Create an ExtensionContext for use in event handlers and tool execution.
|
|
130
|
+
* Context values are resolved at call time, so changes via bindCore/bindUI are reflected.
|
|
131
|
+
*/
|
|
132
|
+
createContext(): ExtensionContext;
|
|
133
|
+
createCommandContext(): ExtensionCommandContext;
|
|
134
|
+
private isSessionBeforeEvent;
|
|
135
|
+
emit<TEvent extends RunnerEmitEvent>(event: TEvent): Promise<RunnerEmitResult<TEvent>>;
|
|
136
|
+
emitMessageEnd(event: MessageEndEvent): Promise<AgentMessage | undefined>;
|
|
137
|
+
emitToolResult(event: ToolResultEvent): Promise<ToolResultEventResult | undefined>;
|
|
138
|
+
emitToolCall(event: ToolCallEvent): Promise<ToolCallEventResult | undefined>;
|
|
139
|
+
emitUserBash(event: UserBashEvent): Promise<UserBashEventResult | undefined>;
|
|
140
|
+
emitContext(messages: AgentMessage[]): Promise<AgentMessage[]>;
|
|
141
|
+
emitBeforeProviderRequest(payload: unknown): Promise<unknown>;
|
|
142
|
+
emitBeforeAgentStart(prompt: string, images: ImageContent[] | undefined, systemPrompt: string, systemPromptOptions: BuildSystemPromptOptions): Promise<BeforeAgentStartCombinedResult | undefined>;
|
|
143
|
+
emitResourcesDiscover(cwd: string, reason: ResourcesDiscoverEvent["reason"]): Promise<{
|
|
144
|
+
skillPaths: Array<{
|
|
145
|
+
path: string;
|
|
146
|
+
extensionPath: string;
|
|
147
|
+
}>;
|
|
148
|
+
promptPaths: Array<{
|
|
149
|
+
path: string;
|
|
150
|
+
extensionPath: string;
|
|
151
|
+
}>;
|
|
152
|
+
themePaths: Array<{
|
|
153
|
+
path: string;
|
|
154
|
+
extensionPath: string;
|
|
155
|
+
}>;
|
|
156
|
+
}>;
|
|
157
|
+
/** Emit input event. Transforms chain, "handled" short-circuits. */
|
|
158
|
+
emitInput(text: string, images: ImageContent[] | undefined, source: InputSource, streamingBehavior?: "steer" | "followUp"): Promise<InputEventResult>;
|
|
159
|
+
}
|
|
160
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var x=Object.defineProperty;var o=(f,e)=>x(f,"name",{value:e,configurable:!0});import{theme as y}from"../../modes/interactive/theme/theme.js";const v=["app.interrupt","app.clear","app.exit","app.suspend","app.thinking.cycle","app.model.cycleForward","app.model.cycleBackward","app.model.select","app.tools.expand","app.thinking.toggle","app.editor.external","app.message.followUp","tui.input.submit","tui.select.confirm","tui.select.cancel","tui.input.copy","tui.editor.deleteToLineEnd"],w=o(f=>{const e={};for(const[n,t]of Object.entries(f)){if(t===void 0)continue;const c=Array.isArray(t)?t:[t],r=v.includes(n);for(const a of c){const s=a.toLowerCase();e[s]?.restrictOverride&&!r||(e[s]={keybinding:n,restrictOverride:r})}}return e},"buildBuiltinKeybindings");async function S(f,e){return f.hasHandlers("session_shutdown")?(await f.emit(e),!0):!1}o(S,"emitSessionShutdownEvent");const p={select:o(async()=>{},"select"),confirm:o(async()=>!1,"confirm"),input:o(async()=>{},"input"),notify:o(()=>{},"notify"),onTerminalInput:o(()=>()=>{},"onTerminalInput"),setStatus:o(()=>{},"setStatus"),setWorkingMessage:o(()=>{},"setWorkingMessage"),setWorkingVisible:o(()=>{},"setWorkingVisible"),setWorkingIndicator:o(()=>{},"setWorkingIndicator"),setHiddenThinkingLabel:o(()=>{},"setHiddenThinkingLabel"),setWidget:o(()=>{},"setWidget"),setFooter:o(()=>{},"setFooter"),setHeader:o(()=>{},"setHeader"),setTitle:o(()=>{},"setTitle"),custom:o(async()=>{},"custom"),pasteToEditor:o(()=>{},"pasteToEditor"),setEditorText:o(()=>{},"setEditorText"),getEditorText:o(()=>"","getEditorText"),editor:o(async()=>{},"editor"),addAutocompleteProvider:o(()=>{},"addAutocompleteProvider"),setEditorComponent:o(()=>{},"setEditorComponent"),getEditorComponent:o(()=>{},"getEditorComponent"),get theme(){return y},getAllThemes:o(()=>[],"getAllThemes"),getTheme:o(()=>{},"getTheme"),setTheme:o(f=>({success:!1,error:"UI not available"}),"setTheme"),getToolsExpanded:o(()=>!1,"getToolsExpanded"),setToolsExpanded:o(()=>{},"setToolsExpanded")};class k{static{o(this,"ExtensionRunner")}extensions;runtime;uiContext;mode="print";cwd;sessionManager;modelRegistry;errorListeners=new Set;getModel=o(()=>{},"getModel");isIdleFn=o(()=>!0,"isIdleFn");getSignalFn=o(()=>{},"getSignalFn");waitForIdleFn=o(async()=>{},"waitForIdleFn");abortFn=o(()=>{},"abortFn");hasPendingMessagesFn=o(()=>!1,"hasPendingMessagesFn");getContextUsageFn=o(()=>{},"getContextUsageFn");compactFn=o(()=>{},"compactFn");getSystemPromptFn=o(()=>"","getSystemPromptFn");getSystemPromptOptionsFn=o(()=>({cwd:this.cwd}),"getSystemPromptOptionsFn");newSessionHandler=o(async()=>({cancelled:!1}),"newSessionHandler");forkHandler=o(async()=>({cancelled:!1}),"forkHandler");navigateTreeHandler=o(async()=>({cancelled:!1}),"navigateTreeHandler");switchSessionHandler=o(async()=>({cancelled:!1}),"switchSessionHandler");reloadHandler=o(async()=>{},"reloadHandler");shutdownHandler=o(()=>{},"shutdownHandler");shortcutDiagnostics=[];commandDiagnostics=[];staleMessage;constructor(e,n,t,c,r){this.extensions=e,this.runtime=n,this.uiContext=p,this.cwd=t,this.sessionManager=c,this.modelRegistry=r}bindCore(e,n,t){this.runtime.sendMessage=e.sendMessage,this.runtime.sendUserMessage=e.sendUserMessage,this.runtime.appendEntry=e.appendEntry,this.runtime.setSessionName=e.setSessionName,this.runtime.getSessionName=e.getSessionName,this.runtime.setLabel=e.setLabel,this.runtime.getActiveTools=e.getActiveTools,this.runtime.getAllTools=e.getAllTools,this.runtime.setActiveTools=e.setActiveTools,this.runtime.refreshTools=e.refreshTools,this.runtime.getCommands=e.getCommands,this.runtime.setModel=e.setModel,this.runtime.getThinkingLevel=e.getThinkingLevel,this.runtime.setThinkingLevel=e.setThinkingLevel,this.getModel=n.getModel,this.isIdleFn=n.isIdle,this.getSignalFn=n.getSignal,this.abortFn=n.abort,this.hasPendingMessagesFn=n.hasPendingMessages,this.shutdownHandler=n.shutdown,this.getContextUsageFn=n.getContextUsage,this.compactFn=n.compact,this.getSystemPromptFn=n.getSystemPrompt,this.getSystemPromptOptionsFn=n.getSystemPromptOptions??(()=>({cwd:this.cwd}));for(const{name:c,config:r,extensionPath:a}of this.runtime.pendingProviderRegistrations)try{t?.registerProvider?t.registerProvider(c,r):this.modelRegistry.registerProvider(c,r)}catch(s){this.emitError({extensionPath:a,event:"register_provider",error:s instanceof Error?s.message:String(s),stack:s instanceof Error?s.stack:void 0})}this.runtime.pendingProviderRegistrations=[],this.runtime.registerProvider=(c,r)=>{if(t?.registerProvider){t.registerProvider(c,r);return}this.modelRegistry.registerProvider(c,r)},this.runtime.unregisterProvider=c=>{if(t?.unregisterProvider){t.unregisterProvider(c);return}this.modelRegistry.unregisterProvider(c)}}bindCommandContext(e){if(e){this.waitForIdleFn=e.waitForIdle,this.newSessionHandler=e.newSession,this.forkHandler=e.fork,this.navigateTreeHandler=e.navigateTree,this.switchSessionHandler=e.switchSession,this.reloadHandler=e.reload;return}this.waitForIdleFn=async()=>{},this.newSessionHandler=async()=>({cancelled:!1}),this.forkHandler=async()=>({cancelled:!1}),this.navigateTreeHandler=async()=>({cancelled:!1}),this.switchSessionHandler=async()=>({cancelled:!1}),this.reloadHandler=async()=>{}}setUIContext(e,n="print"){this.uiContext=e??p,this.mode=n}getUIContext(){return this.uiContext}hasUI(){return this.uiContext!==p}getExtensionPaths(){return this.extensions.map(e=>e.path)}getAllRegisteredTools(){const e=new Map;for(const n of this.extensions)for(const t of n.tools.values())e.has(t.definition.name)||e.set(t.definition.name,t);return Array.from(e.values())}getToolDefinition(e){for(const n of this.extensions){const t=n.tools.get(e);if(t)return t.definition}}getFlags(){const e=new Map;for(const n of this.extensions)for(const[t,c]of n.flags)e.has(t)||e.set(t,c);return e}setFlagValue(e,n){this.runtime.flagValues.set(e,n)}getFlagValues(){return new Map(this.runtime.flagValues)}getShortcuts(e){this.shortcutDiagnostics=[];const n=w(e),t=new Map,c=o((r,a)=>{this.shortcutDiagnostics.push({type:"warning",message:r,path:a}),this.hasUI()||console.warn(r)},"addDiagnostic");for(const r of this.extensions)for(const[a,s]of r.shortcuts){const i=a.toLowerCase(),d=n[i];if(d?.restrictOverride===!0){c(`Extension shortcut '${a}' from ${s.extensionPath} conflicts with built-in shortcut. Skipping.`,s.extensionPath);continue}d?.restrictOverride===!1&&c(`Extension shortcut conflict: '${a}' is built-in shortcut for ${d.keybinding} and ${s.extensionPath}. Using ${s.extensionPath}.`,s.extensionPath);const h=t.get(i);h&&c(`Extension shortcut conflict: '${a}' registered by both ${h.extensionPath} and ${s.extensionPath}. Using ${s.extensionPath}.`,s.extensionPath),t.set(i,s)}return t}getShortcutDiagnostics(){return this.shortcutDiagnostics}invalidate(e="This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload()."){this.staleMessage||(this.staleMessage=e,this.runtime.invalidate(e))}assertActive(){if(this.staleMessage)throw new Error(this.staleMessage)}onError(e){return this.errorListeners.add(e),()=>this.errorListeners.delete(e)}emitError(e){for(const n of this.errorListeners)n(e)}hasHandlers(e){for(const n of this.extensions){const t=n.handlers.get(e);if(t&&t.length>0)return!0}return!1}getMessageRenderer(e){for(const n of this.extensions){const t=n.messageRenderers.get(e);if(t)return t}}resolveRegisteredCommands(){const e=[],n=new Map;for(const r of this.extensions)for(const a of r.commands.values())e.push(a),n.set(a.name,(n.get(a.name)??0)+1);const t=new Map,c=new Set;return e.map(r=>{const a=(t.get(r.name)??0)+1;t.set(r.name,a);let s=(n.get(r.name)??0)>1?`${r.name}:${a}`:r.name;if(c.has(s)){let i=a;do i++,s=`${r.name}:${i}`;while(c.has(s))}return c.add(s),{...r,invocationName:s}})}getRegisteredCommands(){return this.commandDiagnostics=[],this.resolveRegisteredCommands()}getCommandDiagnostics(){return this.commandDiagnostics}getCommand(e){return this.resolveRegisteredCommands().find(n=>n.invocationName===e)}shutdown(){this.shutdownHandler()}createContext(){const e=this,n=this.getModel;return{get ui(){return e.assertActive(),e.uiContext},get mode(){return e.assertActive(),e.mode},get hasUI(){return e.assertActive(),e.hasUI()},get cwd(){return e.assertActive(),e.cwd},get sessionManager(){return e.assertActive(),e.sessionManager},get modelRegistry(){return e.assertActive(),e.modelRegistry},get model(){return e.assertActive(),n()},isIdle:o(()=>(e.assertActive(),e.isIdleFn()),"isIdle"),get signal(){return e.assertActive(),e.getSignalFn()},abort:o(()=>{e.assertActive(),e.abortFn()},"abort"),hasPendingMessages:o(()=>(e.assertActive(),e.hasPendingMessagesFn()),"hasPendingMessages"),shutdown:o(()=>{e.assertActive(),e.shutdownHandler()},"shutdown"),getContextUsage:o(()=>(e.assertActive(),e.getContextUsageFn()),"getContextUsage"),compact:o(t=>{e.assertActive(),e.compactFn(t)},"compact"),getSystemPrompt:o(()=>(e.assertActive(),e.getSystemPromptFn()),"getSystemPrompt")}}createCommandContext(){const e=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext()));return e.getSystemPromptOptions=()=>(this.assertActive(),this.getSystemPromptOptionsFn()),e.waitForIdle=()=>(this.assertActive(),this.waitForIdleFn()),e.newSession=n=>(this.assertActive(),this.newSessionHandler(n)),e.fork=(n,t)=>(this.assertActive(),this.forkHandler(n,t)),e.navigateTree=(n,t)=>(this.assertActive(),this.navigateTreeHandler(n,t)),e.switchSession=(n,t)=>(this.assertActive(),this.switchSessionHandler(n,t)),e.reload=()=>(this.assertActive(),this.reloadHandler()),e}isSessionBeforeEvent(e){return e.type==="session_before_switch"||e.type==="session_before_fork"||e.type==="session_before_compact"||e.type==="session_before_tree"}async emit(e){const n=this.createContext();let t;for(const c of this.extensions){const r=c.handlers.get(e.type);if(!(!r||r.length===0))for(const a of r)try{const s=await a(e,n);if(this.isSessionBeforeEvent(e)&&s&&(t=s,t.cancel))return t}catch(s){const i=s instanceof Error?s.message:String(s),d=s instanceof Error?s.stack:void 0;this.emitError({extensionPath:c.path,event:e.type,error:i,stack:d})}}return t}async emitMessageEnd(e){const n=this.createContext();let t=e.message,c=!1;for(const r of this.extensions){const a=r.handlers.get("message_end");if(!(!a||a.length===0))for(const s of a)try{const i={...e,message:t},d=await s(i,n);if(!d?.message)continue;if(d.message.role!==t.role){this.emitError({extensionPath:r.path,event:"message_end",error:"message_end handlers must return a message with the same role"});continue}t=d.message,c=!0}catch(i){const d=i instanceof Error?i.message:String(i),h=i instanceof Error?i.stack:void 0;this.emitError({extensionPath:r.path,event:"message_end",error:d,stack:h})}}return c?t:void 0}async emitToolResult(e){const n=this.createContext(),t={...e};let c=!1;for(const r of this.extensions){const a=r.handlers.get("tool_result");if(!(!a||a.length===0))for(const s of a)try{const i=await s(t,n);if(!i)continue;i.content!==void 0&&(t.content=i.content,c=!0),i.details!==void 0&&(t.details=i.details,c=!0),i.isError!==void 0&&(t.isError=i.isError,c=!0)}catch(i){const d=i instanceof Error?i.message:String(i),h=i instanceof Error?i.stack:void 0;this.emitError({extensionPath:r.path,event:"tool_result",error:d,stack:h})}}if(c)return{content:t.content,details:t.details,isError:t.isError}}async emitToolCall(e){const n=this.createContext();let t;for(const c of this.extensions){const r=c.handlers.get("tool_call");if(!(!r||r.length===0))for(const a of r){const s=await a(e,n);if(s&&(t=s,t.block))return t}}return t}async emitUserBash(e){const n=this.createContext();for(const t of this.extensions){const c=t.handlers.get("user_bash");if(!(!c||c.length===0))for(const r of c)try{const a=await r(e,n);if(a)return a}catch(a){const s=a instanceof Error?a.message:String(a),i=a instanceof Error?a.stack:void 0;this.emitError({extensionPath:t.path,event:"user_bash",error:s,stack:i})}}}async emitContext(e){const n=this.createContext();let t=structuredClone(e);for(const c of this.extensions){const r=c.handlers.get("context");if(!(!r||r.length===0))for(const a of r)try{const i=await a({type:"context",messages:t},n);i&&i.messages&&(t=i.messages)}catch(s){const i=s instanceof Error?s.message:String(s),d=s instanceof Error?s.stack:void 0;this.emitError({extensionPath:c.path,event:"context",error:i,stack:d})}}return t}async emitBeforeProviderRequest(e){const n=this.createContext();let t=e;for(const c of this.extensions){const r=c.handlers.get("before_provider_request");if(!(!r||r.length===0))for(const a of r)try{const i=await a({type:"before_provider_request",payload:t},n);i!==void 0&&(t=i)}catch(s){const i=s instanceof Error?s.message:String(s),d=s instanceof Error?s.stack:void 0;this.emitError({extensionPath:c.path,event:"before_provider_request",error:i,stack:d})}}return t}async emitBeforeAgentStart(e,n,t,c){let r=t;const a=Object.defineProperties({},Object.getOwnPropertyDescriptors(this.createContext()));a.getSystemPrompt=()=>(this.assertActive(),r);const s=[];let i=!1;for(const d of this.extensions){const h=d.handlers.get("before_agent_start");if(!(!h||h.length===0))for(const u of h)try{const g=await u({type:"before_agent_start",prompt:e,images:n,systemPrompt:r,systemPromptOptions:c},a);if(g){const m=g;m.message&&s.push(m.message),m.systemPrompt!==void 0&&(r=m.systemPrompt,i=!0)}}catch(l){const g=l instanceof Error?l.message:String(l),m=l instanceof Error?l.stack:void 0;this.emitError({extensionPath:d.path,event:"before_agent_start",error:g,stack:m})}}if(s.length>0||i)return{messages:s.length>0?s:void 0,systemPrompt:i?r:void 0}}async emitResourcesDiscover(e,n){const t=this.createContext(),c=[],r=[],a=[];for(const s of this.extensions){const i=s.handlers.get("resources_discover");if(!(!i||i.length===0))for(const d of i)try{const l=await d({type:"resources_discover",cwd:e,reason:n},t);l?.skillPaths?.length&&c.push(...l.skillPaths.map(g=>({path:g,extensionPath:s.path}))),l?.promptPaths?.length&&r.push(...l.promptPaths.map(g=>({path:g,extensionPath:s.path}))),l?.themePaths?.length&&a.push(...l.themePaths.map(g=>({path:g,extensionPath:s.path})))}catch(h){const u=h instanceof Error?h.message:String(h),l=h instanceof Error?h.stack:void 0;this.emitError({extensionPath:s.path,event:"resources_discover",error:u,stack:l})}}return{skillPaths:c,promptPaths:r,themePaths:a}}async emitInput(e,n,t,c){const r=this.createContext();let a=e,s=n;for(const i of this.extensions)for(const d of i.handlers.get("input")??[])try{const u=await d({type:"input",text:a,images:s,source:t,streamingBehavior:c},r);if(u?.action==="handled")return u;u?.action==="transform"&&(a=u.text,s=u.images??s)}catch(h){this.emitError({extensionPath:i.path,event:"input",error:h instanceof Error?h.message:String(h),stack:h instanceof Error?h.stack:void 0})}return a!==e||s!==n?{action:"transform",text:a,images:s}:{action:"continue"}}}export{k as ExtensionRunner,S as emitSessionShutdownEvent};
|