@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,51 @@
|
|
|
1
|
+
import { type SourceInfo } from "./source-info.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Represents a prompt template loaded from a markdown file
|
|
4
|
+
*/
|
|
5
|
+
export interface PromptTemplate {
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
argumentHint?: string;
|
|
9
|
+
content: string;
|
|
10
|
+
sourceInfo: SourceInfo;
|
|
11
|
+
filePath: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Parse command arguments respecting quoted strings (bash-style)
|
|
15
|
+
* Returns array of arguments
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseCommandArgs(argsString: string): string[];
|
|
18
|
+
/**
|
|
19
|
+
* Substitute argument placeholders in template content
|
|
20
|
+
* Supports:
|
|
21
|
+
* - $1, $2, ... for positional args
|
|
22
|
+
* - $@ and $ARGUMENTS for all args
|
|
23
|
+
* - ${@:N} for args from Nth onwards (bash-style slicing)
|
|
24
|
+
* - ${@:N:L} for L args starting from Nth
|
|
25
|
+
*
|
|
26
|
+
* Note: Replacement happens on the template string only. Argument values
|
|
27
|
+
* containing patterns like $1, $@, or $ARGUMENTS are NOT recursively substituted.
|
|
28
|
+
*/
|
|
29
|
+
export declare function substituteArgs(content: string, args: string[]): string;
|
|
30
|
+
export interface LoadPromptTemplatesOptions {
|
|
31
|
+
/** Working directory for project-local templates. */
|
|
32
|
+
cwd: string;
|
|
33
|
+
/** Agent config directory for global templates. */
|
|
34
|
+
agentDir: string;
|
|
35
|
+
/** Explicit prompt template paths (files or directories). */
|
|
36
|
+
promptPaths: string[];
|
|
37
|
+
/** Include default prompt directories. */
|
|
38
|
+
includeDefaults: boolean;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Load all prompt templates from:
|
|
42
|
+
* 1. Global: agentDir/prompts/
|
|
43
|
+
* 2. Project: cwd/{CONFIG_DIR_NAME}/prompts/
|
|
44
|
+
* 3. Explicit prompt paths
|
|
45
|
+
*/
|
|
46
|
+
export declare function loadPromptTemplates(options: LoadPromptTemplatesOptions): PromptTemplate[];
|
|
47
|
+
/**
|
|
48
|
+
* Expand a prompt template if it matches a template name.
|
|
49
|
+
* Returns the expanded content or the original text if not a template.
|
|
50
|
+
*/
|
|
51
|
+
export declare function expandPromptTemplate(text: string, templates: PromptTemplate[]): string;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var j=Object.defineProperty;var l=(r,s)=>j(r,"name",{value:s,configurable:!0});import{existsSync as F,readdirSync as A,readFileSync as T,statSync as h}from"fs";import{basename as w,dirname as W,join as S,resolve as b,sep as $}from"path";import{CONFIG_DIR_NAME as x}from"../config.js";import{parseFrontmatter as C}from"../utils/frontmatter.js";import{resolvePath as y}from"../utils/paths.js";import{createSyntheticSourceInfo as g}from"./source-info.js";function N(r){const s=[];let t="",o=null;for(let i=0;i<r.length;i++){const e=r[i];o?e===o?o=null:t+=e:e==='"'||e==="'"?o=e:/\s/.test(e)?t&&(s.push(t),t=""):t+=e}return t&&s.push(t),s}l(N,"parseCommandArgs");function _(r,s){let t=r;t=t.replace(/\$(\d+)/g,(i,e)=>{const n=parseInt(e,10)-1;return s[n]??""}),t=t.replace(/\$\{@:(\d+)(?::(\d+))?\}/g,(i,e,n)=>{let c=parseInt(e,10)-1;if(c<0&&(c=0),n){const m=parseInt(n,10);return s.slice(c,c+m).join(" ")}return s.slice(c).join(" ")});const o=s.join(" ");return t=t.replace(/\$ARGUMENTS/g,o),t=t.replace(/\$@/g,o),t}l(_,"substituteArgs");function I(r,s){try{const t=T(r,"utf-8"),{frontmatter:o,body:i}=C(t),e=w(r).replace(/\.md$/,"");let n=o.description||"";if(!n){const c=i.split(`
|
|
2
|
+
`).find(m=>m.trim());c&&(n=c.slice(0,60),c.length>60&&(n+="..."))}return{name:e,description:n,...o["argument-hint"]&&{argumentHint:o["argument-hint"]},content:i,sourceInfo:s,filePath:r}}catch{return null}}l(I,"loadTemplateFromFile");function D(r,s){const t=[];if(!F(r))return t;try{const o=A(r,{withFileTypes:!0});for(const i of o){const e=S(r,i.name);let n=i.isFile();if(i.isSymbolicLink())try{n=h(e).isFile()}catch{continue}if(n&&i.name.endsWith(".md")){const c=I(e,s(e));c&&t.push(c)}}}catch{return t}return t}l(D,"loadTemplatesFromDir");function k(r){const s=y(r.cwd),t=y(r.agentDir),o=r.promptPaths,i=r.includeDefaults,e=[],n=S(t,"prompts"),c=b(s,x,"prompts"),m=l((a,u)=>{const p=b(u);if(a===p)return!0;const d=p.endsWith($)?p:`${p}${$}`;return a.startsWith(d)},"isUnderPath"),f=l(a=>m(a,n)?g(a,{source:"local",scope:"user",baseDir:n}):m(a,c)?g(a,{source:"local",scope:"project",baseDir:c}):g(a,{source:"local",baseDir:h(a).isDirectory()?a:W(a)}),"getSourceInfo");i&&(e.push(...D(n,f)),e.push(...D(c,f)));for(const a of o){const u=y(a,s,{trim:!0});if(F(u))try{const p=h(u);if(p.isDirectory())e.push(...D(u,f));else if(p.isFile()&&u.endsWith(".md")){const d=I(u,f(u));d&&e.push(d)}}catch{}}return e}l(k,"loadPromptTemplates");function z(r,s){if(!r.startsWith("/"))return r;const t=r.match(/^\/([^\s]+)(?:\s+([\s\S]*))?$/);if(!t)return r;const o=t[1],i=t[2]??"",e=s.find(n=>n.name===o);if(e){const n=N(i);return _(e.content,n)}return r}l(z,"expandPromptTemplate");export{z as expandPromptTemplate,k as loadPromptTemplates,N as parseCommandArgs,_ as substituteArgs};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { Api, Model } from "@openadapter/koda-ai";
|
|
2
|
+
import type { SettingsManager } from "./settings-manager.ts";
|
|
3
|
+
export declare function mergeProviderAttributionHeaders(model: Model<Api>, settingsManager: SettingsManager, sessionId: string | undefined, ...headerSources: Array<Record<string, string> | undefined>): Record<string, string> | undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var c=Object.defineProperty;var n=(e,r)=>c(e,"name",{value:r,configurable:!0});import{isInstallTelemetryEnabled as s}from"./telemetry.js";const d="openrouter.ai",f="integrate.api.nvidia.com",p="api.cloudflare.com",l="gateway.ai.cloudflare.com",O="opencode.ai";function t(e,r){try{return new URL(e).hostname===r}catch{return!1}}n(t,"matchesHost");function g(e){return e.provider==="openrouter"||e.baseUrl.includes(d)}n(g,"isOpenRouterModel");function T(e){return e.provider==="nvidia"||t(e.baseUrl,f)}n(T,"isNvidiaNimModel");function b(e){return e.provider==="cloudflare-workers-ai"||e.provider==="cloudflare-ai-gateway"||t(e.baseUrl,p)||t(e.baseUrl,l)}n(b,"isCloudflareModel");function v(e,r){if(s(r)){if(g(e))return{"HTTP-Referer":"https://openadapter.in","X-OpenRouter-Title":"koda","X-OpenRouter-Categories":"cli-agent"};if(T(e))return{"X-BILLING-INVOKE-ORIGIN":"Koda"};if(b(e))return{"User-Agent":"pi-coding-agent"}}}n(v,"getDefaultAttributionHeaders");function A(e,r){if(r&&!(e.provider!=="opencode"&&e.provider!=="opencode-go"&&!t(e.baseUrl,O)))return{"x-opencode-session":r,"x-opencode-client":"pi"}}n(A,"getSessionHeaders");function R(e,r,a,...u){const i={...A(e,a),...v(e,r)};for(const o of u)o&&Object.assign(i,o);return Object.keys(i).length>0?i:void 0}n(R,"mergeProviderAttributionHeaders");export{R as mergeProviderAttributionHeaders};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const BUILT_IN_PROVIDER_DISPLAY_NAMES: Record<string, string>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e={anthropic:"Anthropic","amazon-bedrock":"Amazon Bedrock","azure-openai-responses":"Azure OpenAI Responses",cerebras:"Cerebras","cloudflare-ai-gateway":"Cloudflare AI Gateway","cloudflare-workers-ai":"Cloudflare Workers AI",deepseek:"DeepSeek",fireworks:"Fireworks",google:"Google Gemini","google-vertex":"Google Vertex AI",groq:"Groq",huggingface:"Hugging Face","kimi-coding":"Kimi For Coding",mistral:"Mistral",minimax:"MiniMax","minimax-cn":"MiniMax (China)",moonshotai:"Moonshot AI","moonshotai-cn":"Moonshot AI (China)",nvidia:"NVIDIA NIM",opencode:"OpenCode Zen","opencode-go":"OpenCode Go",openai:"OpenAI",openrouter:"OpenRouter",together:"Together AI","vercel-ai-gateway":"Vercel AI Gateway",xai:"xAI",zai:"ZAI",xiaomi:"Xiaomi MiMo","xiaomi-token-plan-cn":"Xiaomi MiMo Token Plan (China)","xiaomi-token-plan-ams":"Xiaomi MiMo Token Plan (Amsterdam)","xiaomi-token-plan-sgp":"Xiaomi MiMo Token Plan (Singapore)"};export{e as BUILT_IN_PROVIDER_DISPLAY_NAMES};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve configuration values that may be shell commands, environment variables, or literals.
|
|
3
|
+
* Used by auth-storage.ts and model-registry.ts.
|
|
4
|
+
*/
|
|
5
|
+
export declare function getConfigValueEnvVarName(config: string): string | undefined;
|
|
6
|
+
export declare function getConfigValueEnvVarNames(config: string): string[];
|
|
7
|
+
export declare function getMissingConfigValueEnvVarNames(config: string): string[];
|
|
8
|
+
export declare function isCommandConfigValue(config: string): boolean;
|
|
9
|
+
export declare function isConfigValueConfigured(config: string): boolean;
|
|
10
|
+
export declare function isLegacyEnvVarNameConfigValue(config: string): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Resolve a config value (API key, header value, etc.) to an actual value.
|
|
13
|
+
* - If starts with "!", executes the rest as a shell command and uses stdout (cached)
|
|
14
|
+
* - Interpolates "$ENV_VAR" or "${ENV_VAR}" references with the named environment variable
|
|
15
|
+
* - In non-command values, "$$" escapes a literal "$" and "$!" escapes a literal "!"
|
|
16
|
+
* - Otherwise treats the value as a literal
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveConfigValue(config: string): string | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Resolve all header values using the same resolution logic as API keys.
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveConfigValueUncached(config: string): string | undefined;
|
|
23
|
+
export declare function resolveConfigValueOrThrow(config: string, description: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Resolve all header values using the same resolution logic as API keys.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveHeaders(headers: Record<string, string> | undefined): Record<string, string> | undefined;
|
|
28
|
+
export declare function resolveHeadersOrThrow(headers: Record<string, string> | undefined, description: string): Record<string, string> | undefined;
|
|
29
|
+
/** Clear the config value command cache. Exported for testing. */
|
|
30
|
+
export declare function clearConfigValueCache(): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var g=Object.defineProperty;var o=(e,n)=>g(e,"name",{value:n,configurable:!0});import{execSync as x,spawnSync as V}from"child_process";import{getShellConfig as y}from"../utils/shell.js";const c=new Map,E=/^[A-Za-z_][A-Za-z0-9_]*$/,C=/^[A-Za-z_][A-Za-z0-9_]*/,_=/^[A-Z_][A-Z0-9_]*$/;function i(e,n){if(!n)return;const t=e[e.length-1];if(t?.type==="literal"){t.value+=n;return}e.push({type:"literal",value:n})}o(i,"appendLiteral");function w(e){const n=[];let t=0;for(;t<e.length;){const r=e.indexOf("$",t);if(r<0){i(n,e.slice(t));break}i(n,e.slice(t,r));const u=e[r+1];if(u==="$"||u==="!"){i(n,u),t=r+2;continue}if(u==="{"){const l=e.indexOf("}",r+2);if(l<0){i(n,"$"),t=r+1;continue}const f=e.slice(r+2,l);E.test(f)?n.push({type:"env",name:f}):i(n,e.slice(r,l+1)),t=l+1;continue}const a=e.slice(r+1).match(C);if(a){n.push({type:"env",name:a[0]}),t=r+1+a[0].length;continue}i(n,"$"),t=r+1}return n}o(w,"parseConfigValueTemplate");function s(e){return e.startsWith("!")?{type:"command",config:e}:{type:"template",parts:w(e)}}o(s,"parseConfigValueReference");function d(e){return process.env[e]||void 0}o(d,"resolveEnvConfigValue");function $(e){const n=[];for(const t of e)t.type!=="env"||n.includes(t.name)||n.push(t.name);return n}o($,"getTemplateEnvVarNames");function p(e){let n="";for(const t of e){if(t.type==="literal"){n+=t.value;continue}const r=d(t.name);if(r===void 0)return;n+=r}return n}o(p,"resolveTemplate");function F(e){const n=s(e);if(n.type==="template")return n.parts.length===1&&n.parts[0]?.type==="env"?n.parts[0].name:void 0}o(F,"getConfigValueEnvVarName");function A(e){const n=s(e);return n.type==="template"?$(n.parts):[]}o(A,"getConfigValueEnvVarNames");function m(e){return A(e).filter(n=>d(n)===void 0)}o(m,"getMissingConfigValueEnvVarNames");function M(e){return s(e).type==="command"}o(M,"isCommandConfigValue");function S(e){return m(e).length===0}o(S,"isConfigValueConfigured");function z(e){return _.test(e)}o(z,"isLegacyEnvVarNameConfigValue");function N(e){const n=s(e);return n.type==="command"?O(n.config):p(n.parts)}o(N,"resolveConfigValue");function R(e){try{const{shell:n,args:t}=y(),r=V(n,[...t,e],{encoding:"utf-8",timeout:1e4,stdio:["ignore","pipe","ignore"],shell:!1,windowsHide:!0});return r.error?r.error.code==="ENOENT"?{executed:!1,value:void 0}:{executed:!0,value:void 0}:r.status!==0?{executed:!0,value:void 0}:{executed:!0,value:(r.stdout??"").trim()||void 0}}catch{return{executed:!1,value:void 0}}}o(R,"executeWithConfiguredShell");function v(e){try{return x(e,{encoding:"utf-8",timeout:1e4,stdio:["ignore","pipe","ignore"]}).trim()||void 0}catch{return}}o(v,"executeWithDefaultShell");function h(e){const n=e.slice(1);return process.platform==="win32"?(()=>{const t=R(n);return t.executed?t.value:v(n)})():v(n)}o(h,"executeCommandUncached");function O(e){if(c.has(e))return c.get(e);const n=h(e);return c.set(e,n),n}o(O,"executeCommand");function b(e){const n=s(e);return n.type==="command"?h(n.config):p(n.parts)}o(b,"resolveConfigValueUncached");function T(e,n){const t=b(e);if(t!==void 0)return t;const r=s(e);if(r.type==="command")throw new Error(`Failed to resolve ${n} from shell command: ${r.config.slice(1)}`);if(r.type==="template"){const u=m(e);if(u.length===1)throw new Error(`Failed to resolve ${n} from environment variable: ${u[0]}`);if(u.length>1)throw new Error(`Failed to resolve ${n} from environment variables: ${u.join(", ")}`)}throw new Error(`Failed to resolve ${n}`)}o(T,"resolveConfigValueOrThrow");function H(e){if(!e)return;const n={};for(const[t,r]of Object.entries(e)){const u=N(r);u&&(n[t]=u)}return Object.keys(n).length>0?n:void 0}o(H,"resolveHeaders");function I(e,n){if(!e)return;const t={};for(const[r,u]of Object.entries(e))t[r]=T(u,`${n} header "${r}"`);return Object.keys(t).length>0?t:void 0}o(I,"resolveHeadersOrThrow");function L(){c.clear()}o(L,"clearConfigValueCache");export{L as clearConfigValueCache,F as getConfigValueEnvVarName,A as getConfigValueEnvVarNames,m as getMissingConfigValueEnvVarNames,M as isCommandConfigValue,S as isConfigValueConfigured,z as isLegacyEnvVarNameConfigValue,N as resolveConfigValue,T as resolveConfigValueOrThrow,b as resolveConfigValueUncached,H as resolveHeaders,I as resolveHeadersOrThrow};
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { type Theme } from "../modes/interactive/theme/theme.ts";
|
|
2
|
+
import type { ResourceDiagnostic } from "./diagnostics.ts";
|
|
3
|
+
export type { ResourceCollision, ResourceDiagnostic } from "./diagnostics.ts";
|
|
4
|
+
import { type EventBus } from "./event-bus.ts";
|
|
5
|
+
import type { ExtensionFactory, LoadExtensionsResult } from "./extensions/types.ts";
|
|
6
|
+
import { type PathMetadata } from "./package-manager.ts";
|
|
7
|
+
import type { PromptTemplate } from "./prompt-templates.ts";
|
|
8
|
+
import { SettingsManager } from "./settings-manager.ts";
|
|
9
|
+
import type { Skill } from "./skills.ts";
|
|
10
|
+
export interface ResourceExtensionPaths {
|
|
11
|
+
skillPaths?: Array<{
|
|
12
|
+
path: string;
|
|
13
|
+
metadata: PathMetadata;
|
|
14
|
+
}>;
|
|
15
|
+
promptPaths?: Array<{
|
|
16
|
+
path: string;
|
|
17
|
+
metadata: PathMetadata;
|
|
18
|
+
}>;
|
|
19
|
+
themePaths?: Array<{
|
|
20
|
+
path: string;
|
|
21
|
+
metadata: PathMetadata;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
export interface ResourceLoader {
|
|
25
|
+
getExtensions(): LoadExtensionsResult;
|
|
26
|
+
getSkills(): {
|
|
27
|
+
skills: Skill[];
|
|
28
|
+
diagnostics: ResourceDiagnostic[];
|
|
29
|
+
};
|
|
30
|
+
getPrompts(): {
|
|
31
|
+
prompts: PromptTemplate[];
|
|
32
|
+
diagnostics: ResourceDiagnostic[];
|
|
33
|
+
};
|
|
34
|
+
getThemes(): {
|
|
35
|
+
themes: Theme[];
|
|
36
|
+
diagnostics: ResourceDiagnostic[];
|
|
37
|
+
};
|
|
38
|
+
getAgentsFiles(): {
|
|
39
|
+
agentsFiles: Array<{
|
|
40
|
+
path: string;
|
|
41
|
+
content: string;
|
|
42
|
+
}>;
|
|
43
|
+
};
|
|
44
|
+
getSystemPrompt(): string | undefined;
|
|
45
|
+
getAppendSystemPrompt(): string[];
|
|
46
|
+
extendResources(paths: ResourceExtensionPaths): void;
|
|
47
|
+
reload(): Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
export declare function loadProjectContextFiles(options: {
|
|
50
|
+
cwd: string;
|
|
51
|
+
agentDir: string;
|
|
52
|
+
}): Array<{
|
|
53
|
+
path: string;
|
|
54
|
+
content: string;
|
|
55
|
+
}>;
|
|
56
|
+
export interface DefaultResourceLoaderOptions {
|
|
57
|
+
cwd: string;
|
|
58
|
+
agentDir: string;
|
|
59
|
+
settingsManager?: SettingsManager;
|
|
60
|
+
eventBus?: EventBus;
|
|
61
|
+
additionalExtensionPaths?: string[];
|
|
62
|
+
additionalSkillPaths?: string[];
|
|
63
|
+
additionalPromptTemplatePaths?: string[];
|
|
64
|
+
additionalThemePaths?: string[];
|
|
65
|
+
extensionFactories?: ExtensionFactory[];
|
|
66
|
+
noExtensions?: boolean;
|
|
67
|
+
noSkills?: boolean;
|
|
68
|
+
noPromptTemplates?: boolean;
|
|
69
|
+
noThemes?: boolean;
|
|
70
|
+
noContextFiles?: boolean;
|
|
71
|
+
systemPrompt?: string;
|
|
72
|
+
appendSystemPrompt?: string[];
|
|
73
|
+
extensionsOverride?: (base: LoadExtensionsResult) => LoadExtensionsResult;
|
|
74
|
+
skillsOverride?: (base: {
|
|
75
|
+
skills: Skill[];
|
|
76
|
+
diagnostics: ResourceDiagnostic[];
|
|
77
|
+
}) => {
|
|
78
|
+
skills: Skill[];
|
|
79
|
+
diagnostics: ResourceDiagnostic[];
|
|
80
|
+
};
|
|
81
|
+
promptsOverride?: (base: {
|
|
82
|
+
prompts: PromptTemplate[];
|
|
83
|
+
diagnostics: ResourceDiagnostic[];
|
|
84
|
+
}) => {
|
|
85
|
+
prompts: PromptTemplate[];
|
|
86
|
+
diagnostics: ResourceDiagnostic[];
|
|
87
|
+
};
|
|
88
|
+
themesOverride?: (base: {
|
|
89
|
+
themes: Theme[];
|
|
90
|
+
diagnostics: ResourceDiagnostic[];
|
|
91
|
+
}) => {
|
|
92
|
+
themes: Theme[];
|
|
93
|
+
diagnostics: ResourceDiagnostic[];
|
|
94
|
+
};
|
|
95
|
+
agentsFilesOverride?: (base: {
|
|
96
|
+
agentsFiles: Array<{
|
|
97
|
+
path: string;
|
|
98
|
+
content: string;
|
|
99
|
+
}>;
|
|
100
|
+
}) => {
|
|
101
|
+
agentsFiles: Array<{
|
|
102
|
+
path: string;
|
|
103
|
+
content: string;
|
|
104
|
+
}>;
|
|
105
|
+
};
|
|
106
|
+
systemPromptOverride?: (base: string | undefined) => string | undefined;
|
|
107
|
+
appendSystemPromptOverride?: (base: string[]) => string[];
|
|
108
|
+
}
|
|
109
|
+
export declare class DefaultResourceLoader implements ResourceLoader {
|
|
110
|
+
private cwd;
|
|
111
|
+
private agentDir;
|
|
112
|
+
private settingsManager;
|
|
113
|
+
private eventBus;
|
|
114
|
+
private packageManager;
|
|
115
|
+
private additionalExtensionPaths;
|
|
116
|
+
private additionalSkillPaths;
|
|
117
|
+
private additionalPromptTemplatePaths;
|
|
118
|
+
private additionalThemePaths;
|
|
119
|
+
private extensionFactories;
|
|
120
|
+
private noExtensions;
|
|
121
|
+
private noSkills;
|
|
122
|
+
private noPromptTemplates;
|
|
123
|
+
private noThemes;
|
|
124
|
+
private noContextFiles;
|
|
125
|
+
private systemPromptSource?;
|
|
126
|
+
private appendSystemPromptSource?;
|
|
127
|
+
private extensionsOverride?;
|
|
128
|
+
private skillsOverride?;
|
|
129
|
+
private promptsOverride?;
|
|
130
|
+
private themesOverride?;
|
|
131
|
+
private agentsFilesOverride?;
|
|
132
|
+
private systemPromptOverride?;
|
|
133
|
+
private appendSystemPromptOverride?;
|
|
134
|
+
private extensionsResult;
|
|
135
|
+
private skills;
|
|
136
|
+
private skillDiagnostics;
|
|
137
|
+
private prompts;
|
|
138
|
+
private promptDiagnostics;
|
|
139
|
+
private themes;
|
|
140
|
+
private themeDiagnostics;
|
|
141
|
+
private agentsFiles;
|
|
142
|
+
private systemPrompt?;
|
|
143
|
+
private appendSystemPrompt;
|
|
144
|
+
private lastSkillPaths;
|
|
145
|
+
private extensionSkillSourceInfos;
|
|
146
|
+
private extensionPromptSourceInfos;
|
|
147
|
+
private extensionThemeSourceInfos;
|
|
148
|
+
private lastPromptPaths;
|
|
149
|
+
private lastThemePaths;
|
|
150
|
+
constructor(options: DefaultResourceLoaderOptions);
|
|
151
|
+
getExtensions(): LoadExtensionsResult;
|
|
152
|
+
getSkills(): {
|
|
153
|
+
skills: Skill[];
|
|
154
|
+
diagnostics: ResourceDiagnostic[];
|
|
155
|
+
};
|
|
156
|
+
getPrompts(): {
|
|
157
|
+
prompts: PromptTemplate[];
|
|
158
|
+
diagnostics: ResourceDiagnostic[];
|
|
159
|
+
};
|
|
160
|
+
getThemes(): {
|
|
161
|
+
themes: Theme[];
|
|
162
|
+
diagnostics: ResourceDiagnostic[];
|
|
163
|
+
};
|
|
164
|
+
getAgentsFiles(): {
|
|
165
|
+
agentsFiles: Array<{
|
|
166
|
+
path: string;
|
|
167
|
+
content: string;
|
|
168
|
+
}>;
|
|
169
|
+
};
|
|
170
|
+
getSystemPrompt(): string | undefined;
|
|
171
|
+
getAppendSystemPrompt(): string[];
|
|
172
|
+
extendResources(paths: ResourceExtensionPaths): void;
|
|
173
|
+
reload(): Promise<void>;
|
|
174
|
+
private normalizeExtensionPaths;
|
|
175
|
+
private updateSkillsFromPaths;
|
|
176
|
+
private updatePromptsFromPaths;
|
|
177
|
+
private updateThemesFromPaths;
|
|
178
|
+
private applyExtensionSourceInfo;
|
|
179
|
+
private findSourceInfoForPath;
|
|
180
|
+
private getDefaultSourceInfoForPath;
|
|
181
|
+
private mergePaths;
|
|
182
|
+
private resolveResourcePath;
|
|
183
|
+
private loadThemes;
|
|
184
|
+
private loadThemesFromDir;
|
|
185
|
+
private loadThemeFromFile;
|
|
186
|
+
private loadExtensionFactories;
|
|
187
|
+
private dedupePrompts;
|
|
188
|
+
private dedupeThemes;
|
|
189
|
+
private discoverSystemPromptFile;
|
|
190
|
+
private discoverAppendSystemPromptFile;
|
|
191
|
+
private isUnderPath;
|
|
192
|
+
private detectExtensionConflicts;
|
|
193
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var G=Object.defineProperty;var f=(c,t)=>G(c,"name",{value:t,configurable:!0});import{existsSync as m,readdirSync as K,readFileSync as T,statSync as D}from"node:fs";import{join as l,resolve as P,sep as k}from"node:path";import w from"chalk";import{CONFIG_DIR_NAME as g}from"../config.js";import{loadThemeFromPath as q}from"../modes/interactive/theme/theme.js";import{canonicalizePath as H,isLocalPath as E,resolvePath as y}from"../utils/paths.js";import{createEventBus as J}from"./event-bus.js";import{createExtensionRuntime as Q,loadExtensionFromFactory as V,loadExtensions as X}from"./extensions/loader.js";import{DefaultPackageManager as Z}from"./package-manager.js";import{loadPromptTemplates as tt}from"./prompt-templates.js";import{SettingsManager as et}from"./settings-manager.js";import{loadSkills as st}from"./skills.js";import{createSourceInfo as v}from"./source-info.js";function N(c,t){if(c){if(m(c))try{return T(c,"utf-8")}catch(o){return console.error(w.yellow(`Warning: Could not read ${t} file ${c}: ${o}`)),c}return c}}f(N,"resolvePromptInput");function L(c){const t=["AGENTS.md","AGENTS.MD","CLAUDE.md","CLAUDE.MD"];for(const o of t){const s=l(c,o);if(m(s))try{return{path:s,content:T(s,"utf-8")}}catch(i){console.error(w.yellow(`Warning: Could not read ${s}: ${i}`))}}return null}f(L,"loadContextFileFromDir");function U(c){const t=l(c,"koda-memory.md");if(m(t))try{const o=T(t,"utf-8").trim();if(o)return{path:t,content:o}}catch(o){console.error(w.yellow(`Warning: Could not read ${t}: ${o}`))}return null}f(U,"loadMemoryFromDir");function ot(c){const t=y(c.cwd),o=y(c.agentDir),s=[],i=new Set,e=f(p=>{p&&!i.has(p.path)&&(s.push(p),i.add(p.path))},"push");e(L(o)),e(U(o));const n=[];let a=t;const d=P("/");for(;;){const p=L(a);p&&!i.has(p.path)&&(n.unshift(p),i.add(p.path));const S=U(a);if(S&&!i.has(S.path)&&(n.unshift(S),i.add(S.path)),a===d)break;const F=P(a,"..");if(F===a)break;a=F}return s.push(...n),s}f(ot,"loadProjectContextFiles");class xt{static{f(this,"DefaultResourceLoader")}cwd;agentDir;settingsManager;eventBus;packageManager;additionalExtensionPaths;additionalSkillPaths;additionalPromptTemplatePaths;additionalThemePaths;extensionFactories;noExtensions;noSkills;noPromptTemplates;noThemes;noContextFiles;systemPromptSource;appendSystemPromptSource;extensionsOverride;skillsOverride;promptsOverride;themesOverride;agentsFilesOverride;systemPromptOverride;appendSystemPromptOverride;extensionsResult;skills;skillDiagnostics;prompts;promptDiagnostics;themes;themeDiagnostics;agentsFiles;systemPrompt;appendSystemPrompt;lastSkillPaths;extensionSkillSourceInfos;extensionPromptSourceInfos;extensionThemeSourceInfos;lastPromptPaths;lastThemePaths;constructor(t){this.cwd=y(t.cwd),this.agentDir=y(t.agentDir),this.settingsManager=t.settingsManager??et.create(this.cwd,this.agentDir),this.eventBus=t.eventBus??J(),this.packageManager=new Z({cwd:this.cwd,agentDir:this.agentDir,settingsManager:this.settingsManager}),this.additionalExtensionPaths=t.additionalExtensionPaths??[],this.additionalSkillPaths=t.additionalSkillPaths??[],this.additionalPromptTemplatePaths=t.additionalPromptTemplatePaths??[],this.additionalThemePaths=t.additionalThemePaths??[],this.extensionFactories=t.extensionFactories??[],this.noExtensions=t.noExtensions??!1,this.noSkills=t.noSkills??!1,this.noPromptTemplates=t.noPromptTemplates??!1,this.noThemes=t.noThemes??!1,this.noContextFiles=t.noContextFiles??!1,this.systemPromptSource=t.systemPrompt,this.appendSystemPromptSource=t.appendSystemPrompt,this.extensionsOverride=t.extensionsOverride,this.skillsOverride=t.skillsOverride,this.promptsOverride=t.promptsOverride,this.themesOverride=t.themesOverride,this.agentsFilesOverride=t.agentsFilesOverride,this.systemPromptOverride=t.systemPromptOverride,this.appendSystemPromptOverride=t.appendSystemPromptOverride,this.extensionsResult={extensions:[],errors:[],runtime:Q()},this.skills=[],this.skillDiagnostics=[],this.prompts=[],this.promptDiagnostics=[],this.themes=[],this.themeDiagnostics=[],this.agentsFiles=[],this.appendSystemPrompt=[],this.lastSkillPaths=[],this.extensionSkillSourceInfos=new Map,this.extensionPromptSourceInfos=new Map,this.extensionThemeSourceInfos=new Map,this.lastPromptPaths=[],this.lastThemePaths=[]}getExtensions(){return this.extensionsResult}getSkills(){return{skills:this.skills,diagnostics:this.skillDiagnostics}}getPrompts(){return{prompts:this.prompts,diagnostics:this.promptDiagnostics}}getThemes(){return{themes:this.themes,diagnostics:this.themeDiagnostics}}getAgentsFiles(){return{agentsFiles:this.agentsFiles}}getSystemPrompt(){return this.systemPrompt}getAppendSystemPrompt(){return this.appendSystemPrompt}extendResources(t){const o=this.normalizeExtensionPaths(t.skillPaths??[]),s=this.normalizeExtensionPaths(t.promptPaths??[]),i=this.normalizeExtensionPaths(t.themePaths??[]);for(const e of o)this.extensionSkillSourceInfos.set(e.path,v(e.path,e.metadata));for(const e of s)this.extensionPromptSourceInfos.set(e.path,v(e.path,e.metadata));for(const e of i)this.extensionThemeSourceInfos.set(e.path,v(e.path,e.metadata));o.length>0&&(this.lastSkillPaths=this.mergePaths(this.lastSkillPaths,o.map(e=>e.path)),this.updateSkillsFromPaths(this.lastSkillPaths)),s.length>0&&(this.lastPromptPaths=this.mergePaths(this.lastPromptPaths,s.map(e=>e.path)),this.updatePromptsFromPaths(this.lastPromptPaths)),i.length>0&&(this.lastThemePaths=this.mergePaths(this.lastThemePaths,i.map(e=>e.path)),this.updateThemesFromPaths(this.lastThemePaths))}async reload(){await this.settingsManager.reload();const t=await this.packageManager.resolve(),o=await this.packageManager.resolveExtensionSources(this.additionalExtensionPaths,{temporary:!0}),s=new Map;this.extensionSkillSourceInfos=new Map,this.extensionPromptSourceInfos=new Map,this.extensionThemeSourceInfos=new Map;const i=f(r=>{for(const h of r)s.has(h.path)||s.set(h.path,h.metadata);return r.filter(h=>h.enabled)},"getEnabledResources"),e=f(r=>i(r).map(h=>h.path),"getEnabledPaths"),n=e(t.extensions),a=i(t.skills),d=e(t.prompts),p=e(t.themes),S=f(r=>{if(r.metadata.source!=="auto"&&r.metadata.origin!=="package")return r.path;try{if(!D(r.path).isDirectory())return r.path}catch{return r.path}const h=l(r.path,"SKILL.md");return m(h)?(s.has(h)||s.set(h,r.metadata),h):r.path},"mapSkillPath"),F=a.map(S);for(const r of o.extensions)s.has(r.path)||s.set(r.path,{source:"cli",scope:"temporary",origin:"top-level"});for(const r of o.skills)s.has(r.path)||s.set(r.path,{source:"cli",scope:"temporary",origin:"top-level"});const I=e(o.extensions),O=e(o.skills),M=e(o.prompts),R=e(o.themes),B=this.noExtensions?I:this.mergePaths(I,n),u=await X(B,this.cwd,this.eventBus),b=await this.loadExtensionFactories(u.runtime);u.extensions.push(...b.extensions),u.errors.push(...b.errors);const Y=this.detectExtensionConflicts(u.extensions);for(const r of Y)u.errors.push({path:r.path,error:r.message});for(const r of this.additionalExtensionPaths)if(E(r)){const h=this.resolveResourcePath(r);m(h)||u.errors.push({path:h,error:`Extension path does not exist: ${h}`})}this.extensionsResult=this.extensionsOverride?this.extensionsOverride(u):u,this.applyExtensionSourceInfo(this.extensionsResult.extensions,s);const $=this.noSkills?this.mergePaths(O,this.additionalSkillPaths):this.mergePaths([...O,...F],this.additionalSkillPaths);this.lastSkillPaths=$,this.updateSkillsFromPaths($,s);for(const r of this.additionalSkillPaths)if(E(r)){const h=this.resolveResourcePath(r);!m(h)&&!this.skillDiagnostics.some(x=>x.path===h)&&this.skillDiagnostics.push({type:"error",message:"Skill path does not exist",path:h})}const A=this.noPromptTemplates?this.mergePaths(M,this.additionalPromptTemplatePaths):this.mergePaths([...M,...d],this.additionalPromptTemplatePaths);this.lastPromptPaths=A,this.updatePromptsFromPaths(A,s);for(const r of this.additionalPromptTemplatePaths)if(E(r)){const h=this.resolveResourcePath(r);!m(h)&&!this.promptDiagnostics.some(x=>x.path===h)&&this.promptDiagnostics.push({type:"error",message:"Prompt template path does not exist",path:h})}const C=this.noThemes?this.mergePaths(R,this.additionalThemePaths):this.mergePaths([...R,...p],this.additionalThemePaths);this.lastThemePaths=C,this.updateThemesFromPaths(C,s);for(const r of this.additionalThemePaths){const h=this.resolveResourcePath(r);!m(h)&&!this.themeDiagnostics.some(x=>x.path===h)&&this.themeDiagnostics.push({type:"error",message:"Theme path does not exist",path:h})}const W={agentsFiles:this.noContextFiles?[]:ot({cwd:this.cwd,agentDir:this.agentDir})},_=this.agentsFilesOverride?this.agentsFilesOverride(W):W;this.agentsFiles=_.agentsFiles;const z=N(this.systemPromptSource??this.discoverSystemPromptFile(),"system prompt");this.systemPrompt=this.systemPromptOverride?this.systemPromptOverride(z):z;const j=(this.appendSystemPromptSource??(this.discoverAppendSystemPromptFile()?[this.discoverAppendSystemPromptFile()]:[])).map(r=>N(r,"append system prompt")).filter(r=>r!==void 0);this.appendSystemPrompt=this.appendSystemPromptOverride?this.appendSystemPromptOverride(j):j}normalizeExtensionPaths(t){return t.map(o=>{const s=o.metadata.baseDir?{...o.metadata,baseDir:this.resolveResourcePath(o.metadata.baseDir)}:o.metadata;return{path:this.resolveResourcePath(o.path),metadata:s}})}updateSkillsFromPaths(t,o){let s;this.noSkills&&t.length===0?s={skills:[],diagnostics:[]}:s=st({cwd:this.cwd,agentDir:this.agentDir,skillPaths:t,includeDefaults:!1});const i=this.skillsOverride?this.skillsOverride(s):s;this.skills=i.skills.map(e=>({...e,sourceInfo:this.findSourceInfoForPath(e.filePath,this.extensionSkillSourceInfos,o)??e.sourceInfo??this.getDefaultSourceInfoForPath(e.filePath)})),this.skillDiagnostics=i.diagnostics}updatePromptsFromPaths(t,o){let s;if(this.noPromptTemplates&&t.length===0)s={prompts:[],diagnostics:[]};else{const e=tt({cwd:this.cwd,agentDir:this.agentDir,promptPaths:t,includeDefaults:!1});s=this.dedupePrompts(e)}const i=this.promptsOverride?this.promptsOverride(s):s;this.prompts=i.prompts.map(e=>({...e,sourceInfo:this.findSourceInfoForPath(e.filePath,this.extensionPromptSourceInfos,o)??e.sourceInfo??this.getDefaultSourceInfoForPath(e.filePath)})),this.promptDiagnostics=i.diagnostics}updateThemesFromPaths(t,o){let s;if(this.noThemes&&t.length===0)s={themes:[],diagnostics:[]};else{const e=this.loadThemes(t,!1),n=this.dedupeThemes(e.themes);s={themes:n.themes,diagnostics:[...e.diagnostics,...n.diagnostics]}}const i=this.themesOverride?this.themesOverride(s):s;this.themes=i.themes.map(e=>{const n=e.sourcePath;return e.sourceInfo=n?this.findSourceInfoForPath(n,this.extensionThemeSourceInfos,o)??e.sourceInfo??this.getDefaultSourceInfoForPath(n):e.sourceInfo,e}),this.themeDiagnostics=i.diagnostics}applyExtensionSourceInfo(t,o){for(const s of t){s.sourceInfo=this.findSourceInfoForPath(s.path,void 0,o)??this.getDefaultSourceInfoForPath(s.path);for(const i of s.commands.values())i.sourceInfo=s.sourceInfo;for(const i of s.tools.values())i.sourceInfo=s.sourceInfo}}findSourceInfoForPath(t,o,s){if(!t)return;if(t.startsWith("<"))return this.getDefaultSourceInfoForPath(t);const i=P(t);if(o)for(const[e,n]of o.entries()){const a=P(e);if(i===a||i.startsWith(`${a}${k}`))return{...n,path:t}}if(s){const e=s.get(i)??s.get(t);if(e)return v(t,e);for(const[n,a]of s.entries()){const d=P(n);if(i===d||i.startsWith(`${d}${k}`))return v(t,a)}}}getDefaultSourceInfoForPath(t){if(t.startsWith("<")&&t.endsWith(">"))return{path:t,source:t.slice(1,-1).split(":")[0]||"temporary",scope:"temporary",origin:"top-level"};const o=P(t),s=[l(this.agentDir,"skills"),l(this.agentDir,"prompts"),l(this.agentDir,"themes"),l(this.agentDir,"extensions")],i=[l(this.cwd,g,"skills"),l(this.cwd,g,"prompts"),l(this.cwd,g,"themes"),l(this.cwd,g,"extensions")];for(const e of s)if(this.isUnderPath(o,e))return{path:t,source:"local",scope:"user",origin:"top-level",baseDir:e};for(const e of i)if(this.isUnderPath(o,e))return{path:t,source:"local",scope:"project",origin:"top-level",baseDir:e};return{path:t,source:"local",scope:"temporary",origin:"top-level",baseDir:D(o).isDirectory()?o:P(o,"..")}}mergePaths(t,o){const s=[],i=new Set;for(const e of[...t,...o]){const n=this.resolveResourcePath(e),a=H(n);i.has(a)||(i.add(a),s.push(n))}return s}resolveResourcePath(t){return y(t,this.cwd,{trim:!0})}loadThemes(t,o=!0){const s=[],i=[];if(o){const e=[l(this.agentDir,"themes"),l(this.cwd,g,"themes")];for(const n of e)this.loadThemesFromDir(n,s,i)}for(const e of t){const n=this.resolveResourcePath(e);if(!m(n)){i.push({type:"warning",message:"theme path does not exist",path:n});continue}try{const a=D(n);a.isDirectory()?this.loadThemesFromDir(n,s,i):a.isFile()&&n.endsWith(".json")?this.loadThemeFromFile(n,s,i):i.push({type:"warning",message:"theme path is not a json file",path:n})}catch(a){const d=a instanceof Error?a.message:"failed to read theme path";i.push({type:"warning",message:d,path:n})}}return{themes:s,diagnostics:i}}loadThemesFromDir(t,o,s){if(m(t))try{const i=K(t,{withFileTypes:!0});for(const e of i){let n=e.isFile();if(e.isSymbolicLink())try{n=D(l(t,e.name)).isFile()}catch{continue}n&&e.name.endsWith(".json")&&this.loadThemeFromFile(l(t,e.name),o,s)}}catch(i){const e=i instanceof Error?i.message:"failed to read theme directory";s.push({type:"warning",message:e,path:t})}}loadThemeFromFile(t,o,s){try{o.push(q(t))}catch(i){const e=i instanceof Error?i.message:"failed to load theme";s.push({type:"warning",message:e,path:t})}}async loadExtensionFactories(t){const o=[],s=[];for(const[i,e]of this.extensionFactories.entries()){const n=`<inline:${i+1}>`;try{const a=await V(e,this.cwd,this.eventBus,t,n);o.push(a)}catch(a){const d=a instanceof Error?a.message:"failed to load extension";s.push({path:n,error:d})}}return{extensions:o,errors:s}}dedupePrompts(t){const o=new Map,s=[];for(const i of t){const e=o.get(i.name);e?s.push({type:"collision",message:`name "/${i.name}" collision`,path:i.filePath,collision:{resourceType:"prompt",name:i.name,winnerPath:e.filePath,loserPath:i.filePath}}):o.set(i.name,i)}return{prompts:Array.from(o.values()),diagnostics:s}}dedupeThemes(t){const o=new Map,s=[];for(const i of t){const e=i.name??"unnamed",n=o.get(e);n?s.push({type:"collision",message:`name "${e}" collision`,path:i.sourcePath,collision:{resourceType:"theme",name:e,winnerPath:n.sourcePath??"<builtin>",loserPath:i.sourcePath??"<builtin>"}}):o.set(e,i)}return{themes:Array.from(o.values()),diagnostics:s}}discoverSystemPromptFile(){const t=l(this.cwd,g,"SYSTEM.md");if(m(t))return t;const o=l(this.agentDir,"SYSTEM.md");if(m(o))return o}discoverAppendSystemPromptFile(){const t=l(this.cwd,g,"APPEND_SYSTEM.md");if(m(t))return t;const o=l(this.agentDir,"APPEND_SYSTEM.md");if(m(o))return o}isUnderPath(t,o){const s=P(o);if(t===s)return!0;const i=s.endsWith(k)?s:`${s}${k}`;return t.startsWith(i)}detectExtensionConflicts(t){const o=[],s=new Map,i=new Map;for(const e of t){for(const n of e.tools.keys()){const a=s.get(n);a&&a!==e.path?o.push({path:e.path,message:`Tool "${n}" conflicts with ${a}`}):s.set(n,e.path)}for(const n of e.flags.keys()){const a=i.get(n);a&&a!==e.path?o.push({path:e.path,message:`Flag "--${n}" conflicts with ${a}`}):i.set(n,e.path)}}return o}}export{xt as DefaultResourceLoader,ot as loadProjectContextFiles};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { type ThinkingLevel } from "@openadapter/koda-agent-core";
|
|
2
|
+
import { type Model } from "@openadapter/koda-ai";
|
|
3
|
+
import { AgentSession } from "./agent-session.ts";
|
|
4
|
+
import { AuthStorage } from "./auth-storage.ts";
|
|
5
|
+
import type { LoadExtensionsResult, SessionStartEvent, ToolDefinition } from "./extensions/index.ts";
|
|
6
|
+
import { ModelRegistry } from "./model-registry.ts";
|
|
7
|
+
import type { ResourceLoader } from "./resource-loader.ts";
|
|
8
|
+
import { SessionManager } from "./session-manager.ts";
|
|
9
|
+
import { SettingsManager } from "./settings-manager.ts";
|
|
10
|
+
import { createBashTool, createCodingTools, createEditTool, createFindTool, createGrepTool, createLsTool, createReadOnlyTools, createReadTool, createWriteTool, withFileMutationQueue } from "./tools/index.ts";
|
|
11
|
+
export interface CreateAgentSessionOptions {
|
|
12
|
+
/** Working directory for project-local discovery. Default: process.cwd() */
|
|
13
|
+
cwd?: string;
|
|
14
|
+
/** Global config directory. Default: ~/.pi/agent */
|
|
15
|
+
agentDir?: string;
|
|
16
|
+
/** Auth storage for credentials. Default: AuthStorage.create(agentDir/auth.json) */
|
|
17
|
+
authStorage?: AuthStorage;
|
|
18
|
+
/** Model registry. Default: ModelRegistry.create(authStorage, agentDir/models.json) */
|
|
19
|
+
modelRegistry?: ModelRegistry;
|
|
20
|
+
/** Model to use. Default: from settings, else first available */
|
|
21
|
+
model?: Model<any>;
|
|
22
|
+
/** Thinking level. Default: from settings, else 'medium' (clamped to model capabilities) */
|
|
23
|
+
thinkingLevel?: ThinkingLevel;
|
|
24
|
+
/** Models available for cycling (Ctrl+P in interactive mode) */
|
|
25
|
+
scopedModels?: Array<{
|
|
26
|
+
model: Model<any>;
|
|
27
|
+
thinkingLevel?: ThinkingLevel;
|
|
28
|
+
}>;
|
|
29
|
+
/**
|
|
30
|
+
* Optional default tool suppression mode when no explicit allowlist is provided.
|
|
31
|
+
*
|
|
32
|
+
* - "all": start with no tools enabled
|
|
33
|
+
* - "builtin": disable the default built-in tools (read, bash, edit, write)
|
|
34
|
+
* but keep extension/custom tools enabled
|
|
35
|
+
*/
|
|
36
|
+
noTools?: "all" | "builtin";
|
|
37
|
+
/**
|
|
38
|
+
* Optional allowlist of tool names.
|
|
39
|
+
*
|
|
40
|
+
* When omitted, pi enables the default built-in tools (read, bash, edit, write)
|
|
41
|
+
* and leaves extension/custom tools enabled unless `noTools` changes that default.
|
|
42
|
+
* When provided, only the listed tool names are enabled.
|
|
43
|
+
*/
|
|
44
|
+
tools?: string[];
|
|
45
|
+
/** Optional denylist of tool names to disable. Applies after `tools` when both are provided. */
|
|
46
|
+
excludeTools?: string[];
|
|
47
|
+
/** Custom tools to register (in addition to built-in tools). */
|
|
48
|
+
customTools?: ToolDefinition[];
|
|
49
|
+
/** Resource loader. When omitted, DefaultResourceLoader is used. */
|
|
50
|
+
resourceLoader?: ResourceLoader;
|
|
51
|
+
/** Session manager. Default: SessionManager.create(cwd) */
|
|
52
|
+
sessionManager?: SessionManager;
|
|
53
|
+
/** Settings manager. Default: SettingsManager.create(cwd, agentDir) */
|
|
54
|
+
settingsManager?: SettingsManager;
|
|
55
|
+
/** Session start event metadata for extension runtime startup. */
|
|
56
|
+
sessionStartEvent?: SessionStartEvent;
|
|
57
|
+
}
|
|
58
|
+
/** Result from createAgentSession */
|
|
59
|
+
export interface CreateAgentSessionResult {
|
|
60
|
+
/** The created session */
|
|
61
|
+
session: AgentSession;
|
|
62
|
+
/** Extensions result (for UI context setup in interactive mode) */
|
|
63
|
+
extensionsResult: LoadExtensionsResult;
|
|
64
|
+
/** Warning if session was restored with a different model than saved */
|
|
65
|
+
modelFallbackMessage?: string;
|
|
66
|
+
}
|
|
67
|
+
export * from "./agent-session-runtime.ts";
|
|
68
|
+
export type { ExtensionAPI, ExtensionCommandContext, ExtensionContext, ExtensionFactory, SlashCommandInfo, SlashCommandSource, ToolDefinition, } from "./extensions/index.ts";
|
|
69
|
+
export type { PromptTemplate } from "./prompt-templates.ts";
|
|
70
|
+
export type { Skill } from "./skills.ts";
|
|
71
|
+
export type { Tool } from "./tools/index.ts";
|
|
72
|
+
export { withFileMutationQueue, createCodingTools, createReadOnlyTools, createReadTool, createBashTool, createEditTool, createWriteTool, createGrepTool, createFindTool, createLsTool, };
|
|
73
|
+
/**
|
|
74
|
+
* Create an AgentSession with the specified options.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* // Minimal - uses defaults
|
|
79
|
+
* const { session } = await createAgentSession();
|
|
80
|
+
*
|
|
81
|
+
* // With explicit model
|
|
82
|
+
* import { getModel } from '@openadapter/koda-ai';
|
|
83
|
+
* const { session } = await createAgentSession({
|
|
84
|
+
* model: getModel('anthropic', 'claude-opus-4-5'),
|
|
85
|
+
* thinkingLevel: 'high',
|
|
86
|
+
* });
|
|
87
|
+
*
|
|
88
|
+
* // Continue previous session
|
|
89
|
+
* const { session, modelFallbackMessage } = await createAgentSession({
|
|
90
|
+
* continueSession: true,
|
|
91
|
+
* });
|
|
92
|
+
*
|
|
93
|
+
* // Full control
|
|
94
|
+
* const loader = new DefaultResourceLoader({
|
|
95
|
+
* cwd: process.cwd(),
|
|
96
|
+
* agentDir: getAgentDir(),
|
|
97
|
+
* settingsManager: SettingsManager.create(),
|
|
98
|
+
* });
|
|
99
|
+
* await loader.reload();
|
|
100
|
+
* const { session } = await createAgentSession({
|
|
101
|
+
* model: myModel,
|
|
102
|
+
* tools: ["read", "bash"],
|
|
103
|
+
* resourceLoader: loader,
|
|
104
|
+
* sessionManager: SessionManager.inMemory(),
|
|
105
|
+
* });
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
108
|
+
export declare function createAgentSession(options?: CreateAgentSessionOptions): Promise<CreateAgentSessionResult>;
|
package/dist/core/sdk.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var K=Object.defineProperty;var d=(e,m)=>K(e,"name",{value:m,configurable:!0});import{join as w}from"node:path";import{Agent as U}from"@openadapter/koda-agent-core";import{clampThinkingLevel as $,streamSimple as j}from"@openadapter/koda-ai";import{getAgentDir as W}from"../config.js";import{resolvePath as L}from"../utils/paths.js";import{AgentSession as q}from"./agent-session.js";import{formatNoModelsAvailableMessage as G}from"./auth-guidance.js";import{AuthStorage as O}from"./auth-storage.js";import{DEFAULT_THINKING_LEVEL as I}from"./defaults.js";import{convertToLlm as Q}from"./messages.js";import{ModelRegistry as V}from"./model-registry.js";import{findInitialModel as z}from"./model-resolver.js";import{mergeProviderAttributionHeaders as J}from"./provider-attribution.js";import{DefaultResourceLoader as X}from"./resource-loader.js";import{getDefaultSessionDir as Y,SessionManager as Z}from"./session-manager.js";import{SettingsManager as ee}from"./settings-manager.js";import{time as te}from"./timings.js";import{createBashTool as re,createCodingTools as oe,createEditTool as ne,createFindTool as se,createGrepTool as ie,createLsTool as ae,createReadOnlyTools as le,createReadTool as de,createWriteTool as me,withFileMutationQueue as ce}from"./tools/index.js";export*from"./agent-session-runtime.js";function ge(){return W()}d(ge,"getDefaultAgentDir");async function _e(e={}){const m=L(e.cwd??e.sessionManager?.getCwd()??process.cwd()),f=e.agentDir?L(e.agentDir):ge();let h=e.resourceLoader;const A=e.agentDir?w(f,"auth.json"):void 0,C=e.agentDir?w(f,"models.json"):void 0,b=e.authStorage??O.create(A),T=e.modelRegistry??V.create(b,C),o=e.settingsManager??ee.create(m,f),c=e.sessionManager??Z.create(m,Y(m,f));h||(h=new X({cwd:m,agentDir:f,settingsManager:o}),await h.reload(),te("resourceLoader.reload"));const a=c.buildSessionContext(),y=a.messages.length>0,k=c.getBranch().some(t=>t.type==="thinking_level_change");let n=e.model,M;if(!n&&y&&a.model){const t=T.find(a.model.provider,a.model.modelId);t&&T.hasConfiguredAuth(t)&&(n=t),n||(M=`Could not restore model ${a.model.provider}/${a.model.modelId}`)}n||(n=(await z({scopedModels:[],isContinuing:y,defaultProvider:o.getDefaultProvider(),defaultModelId:o.getDefaultModel(),defaultThinkingLevel:o.getDefaultThinkingLevel(),modelRegistry:T})).model,n?M&&(M+=`. Using ${n.provider}/${n.id}`):M=G());let s=e.thinkingLevel;s===void 0&&y&&(s=k?a.thinkingLevel:o.getDefaultThinkingLevel()??I),s===void 0&&(s=o.getDefaultThinkingLevel()??I),n?s=$(n,s):s="off";const _=["read","bash","edit","write"],P=e.tools??(e.noTools==="all"?[]:void 0),S=e.excludeTools,E=S?new Set(S):void 0,N=(e.tools?[...e.tools]:e.noTools?[]:_).filter(t=>!E?.has(t));let D;const B=d(t=>{const i=Q(t);return o.getBlockImages()?i.map(r=>{if(r.role==="user"||r.role==="toolResult"){const l=r.content;if(Array.isArray(l)&&l.some(u=>u.type==="image")){const u=l.map(g=>g.type==="image"?{type:"text",text:"Image reading is disabled."}:g).filter((g,v,R)=>!(g.type==="text"&&g.text==="Image reading is disabled."&&v>0&&R[v-1].type==="text"&&R[v-1].text==="Image reading is disabled."));return{...r,content:u}}}return r}):i},"convertToLlmWithBlockImages"),p={};D=new U({initialState:{systemPrompt:"",model:n,thinkingLevel:s,tools:[]},convertToLlm:B,streamFn:d(async(t,i,r)=>{const l=await T.getApiKeyAndHeaders(t);if(!l.ok)throw new Error(l.error);const x=o.getProviderRetrySettings(),u=o.getHttpIdleTimeoutMs(),g=u===0?2147483647:u,v=r?.timeoutMs??x.timeoutMs??g,R=r?.websocketConnectTimeoutMs??o.getWebSocketConnectTimeoutMs();return j(t,i,{...r,apiKey:l.apiKey,timeoutMs:v,websocketConnectTimeoutMs:R,maxRetries:r?.maxRetries??x.maxRetries,maxRetryDelayMs:r?.maxRetryDelayMs??x.maxRetryDelayMs,headers:J(t,o,r?.sessionId,l.headers,r?.headers)})},"streamFn"),onPayload:d(async(t,i)=>{const r=p.current;return r?.hasHandlers("before_provider_request")?r.emitBeforeProviderRequest(t):t},"onPayload"),onResponse:d(async(t,i)=>{const r=p.current;r?.hasHandlers("after_provider_response")&&await r.emit({type:"after_provider_response",status:t.status,headers:t.headers})},"onResponse"),sessionId:c.getSessionId(),transformContext:d(async t=>{const i=p.current;return i?i.emitContext(t):t},"transformContext"),steeringMode:o.getSteeringMode(),followUpMode:o.getFollowUpMode(),transport:o.getTransport(),thinkingBudgets:o.getThinkingBudgets(),maxRetryDelayMs:o.getProviderRetrySettings().maxRetryDelayMs}),y?(D.state.messages=a.messages,k||c.appendThinkingLevelChange(s)):(n&&c.appendModelChange(n.provider,n.id),c.appendThinkingLevelChange(s));const F=new q({agent:D,sessionManager:c,settingsManager:o,cwd:m,scopedModels:e.scopedModels,resourceLoader:h,customTools:e.customTools,modelRegistry:T,initialActiveToolNames:N,allowedToolNames:P,excludedToolNames:S,extensionRunnerRef:p,sessionStartEvent:e.sessionStartEvent}),H=h.getExtensions();return{session:F,extensionsResult:H,modelFallbackMessage:M}}d(_e,"createAgentSession");export{_e as createAgentSession,re as createBashTool,oe as createCodingTools,ne as createEditTool,se as createFindTool,ie as createGrepTool,ae as createLsTool,le as createReadOnlyTools,de as createReadTool,me as createWriteTool,ce as withFileMutationQueue};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface SessionCwdIssue {
|
|
2
|
+
sessionFile?: string;
|
|
3
|
+
sessionCwd: string;
|
|
4
|
+
fallbackCwd: string;
|
|
5
|
+
}
|
|
6
|
+
interface SessionCwdSource {
|
|
7
|
+
getCwd(): string;
|
|
8
|
+
getSessionFile(): string | undefined;
|
|
9
|
+
}
|
|
10
|
+
export declare function getMissingSessionCwdIssue(sessionManager: SessionCwdSource, fallbackCwd: string): SessionCwdIssue | undefined;
|
|
11
|
+
export declare function formatMissingSessionCwdError(issue: SessionCwdIssue): string;
|
|
12
|
+
export declare function formatMissingSessionCwdPrompt(issue: SessionCwdIssue): string;
|
|
13
|
+
export declare class MissingSessionCwdError extends Error {
|
|
14
|
+
readonly issue: SessionCwdIssue;
|
|
15
|
+
constructor(issue: SessionCwdIssue);
|
|
16
|
+
}
|
|
17
|
+
export declare function assertSessionCwdExists(sessionManager: SessionCwdSource, fallbackCwd: string): void;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
var r=Object.defineProperty;var e=(s,n)=>r(s,"name",{value:n,configurable:!0});import{existsSync as t}from"node:fs";function d(s,n){const i=s.getSessionFile();if(!i)return;const o=s.getCwd();if(!(!o||t(o)))return{sessionFile:i,sessionCwd:o,fallbackCwd:n}}e(d,"getMissingSessionCwdIssue");function c(s){const n=s.sessionFile?`
|
|
2
|
+
Session file: ${s.sessionFile}`:"";return`Stored session working directory does not exist: ${s.sessionCwd}${n}
|
|
3
|
+
Current working directory: ${s.fallbackCwd}`}e(c,"formatMissingSessionCwdError");function C(s){return`cwd from session file does not exist
|
|
4
|
+
${s.sessionCwd}
|
|
5
|
+
|
|
6
|
+
continue in current cwd
|
|
7
|
+
${s.fallbackCwd}`}e(C,"formatMissingSessionCwdPrompt");class w extends Error{static{e(this,"MissingSessionCwdError")}issue;constructor(n){super(c(n)),this.name="MissingSessionCwdError",this.issue=n}}function l(s,n){const i=d(s,n);if(i)throw new w(i)}e(l,"assertSessionCwdExists");export{w as MissingSessionCwdError,l as assertSessionCwdExists,c as formatMissingSessionCwdError,C as formatMissingSessionCwdPrompt,d as getMissingSessionCwdIssue};
|