indusagi-coding-agent 0.1.0
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 +2249 -0
- package/README.md +546 -0
- package/dist/cli/args.js +282 -0
- package/dist/cli/config-selector.js +30 -0
- package/dist/cli/file-processor.js +78 -0
- package/dist/cli/list-models.js +91 -0
- package/dist/cli/session-picker.js +31 -0
- package/dist/cli.js +10 -0
- package/dist/config.js +158 -0
- package/dist/core/agent-session.js +2097 -0
- package/dist/core/auth-storage.js +278 -0
- package/dist/core/bash-executor.js +211 -0
- package/dist/core/compaction/branch-summarization.js +241 -0
- package/dist/core/compaction/compaction.js +606 -0
- package/dist/core/compaction/index.js +6 -0
- package/dist/core/compaction/utils.js +137 -0
- package/dist/core/diagnostics.js +1 -0
- package/dist/core/event-bus.js +24 -0
- package/dist/core/exec.js +70 -0
- package/dist/core/export-html/ansi-to-html.js +248 -0
- package/dist/core/export-html/index.js +221 -0
- package/dist/core/export-html/template.css +905 -0
- package/dist/core/export-html/template.html +54 -0
- package/dist/core/export-html/template.js +1549 -0
- package/dist/core/export-html/tool-renderer.js +56 -0
- package/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/dist/core/export-html/vendor/marked.min.js +6 -0
- package/dist/core/extensions/index.js +8 -0
- package/dist/core/extensions/loader.js +395 -0
- package/dist/core/extensions/runner.js +499 -0
- package/dist/core/extensions/types.js +31 -0
- package/dist/core/extensions/wrapper.js +101 -0
- package/dist/core/footer-data-provider.js +133 -0
- package/dist/core/index.js +8 -0
- package/dist/core/keybindings.js +140 -0
- package/dist/core/messages.js +122 -0
- package/dist/core/model-registry.js +454 -0
- package/dist/core/model-resolver.js +309 -0
- package/dist/core/package-manager.js +1142 -0
- package/dist/core/prompt-templates.js +250 -0
- package/dist/core/resource-loader.js +569 -0
- package/dist/core/sdk.js +225 -0
- package/dist/core/session-manager.js +1078 -0
- package/dist/core/settings-manager.js +430 -0
- package/dist/core/skills.js +339 -0
- package/dist/core/system-prompt.js +136 -0
- package/dist/core/timings.js +24 -0
- package/dist/core/tools/bash.js +226 -0
- package/dist/core/tools/edit-diff.js +242 -0
- package/dist/core/tools/edit.js +145 -0
- package/dist/core/tools/find.js +205 -0
- package/dist/core/tools/grep.js +238 -0
- package/dist/core/tools/index.js +60 -0
- package/dist/core/tools/ls.js +117 -0
- package/dist/core/tools/path-utils.js +52 -0
- package/dist/core/tools/read.js +165 -0
- package/dist/core/tools/truncate.js +204 -0
- package/dist/core/tools/write.js +77 -0
- package/dist/index.js +41 -0
- package/dist/main.js +565 -0
- package/dist/migrations.js +260 -0
- package/dist/modes/index.js +7 -0
- package/dist/modes/interactive/components/armin.js +328 -0
- package/dist/modes/interactive/components/assistant-message.js +86 -0
- package/dist/modes/interactive/components/bash-execution.js +155 -0
- package/dist/modes/interactive/components/bordered-loader.js +47 -0
- package/dist/modes/interactive/components/branch-summary-message.js +41 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +42 -0
- package/dist/modes/interactive/components/config-selector.js +458 -0
- package/dist/modes/interactive/components/countdown-timer.js +27 -0
- package/dist/modes/interactive/components/custom-editor.js +61 -0
- package/dist/modes/interactive/components/custom-message.js +80 -0
- package/dist/modes/interactive/components/diff.js +132 -0
- package/dist/modes/interactive/components/dynamic-border.js +19 -0
- package/dist/modes/interactive/components/extension-editor.js +96 -0
- package/dist/modes/interactive/components/extension-input.js +54 -0
- package/dist/modes/interactive/components/extension-selector.js +70 -0
- package/dist/modes/interactive/components/footer.js +213 -0
- package/dist/modes/interactive/components/index.js +31 -0
- package/dist/modes/interactive/components/keybinding-hints.js +60 -0
- package/dist/modes/interactive/components/login-dialog.js +138 -0
- package/dist/modes/interactive/components/model-selector.js +253 -0
- package/dist/modes/interactive/components/oauth-selector.js +91 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +262 -0
- package/dist/modes/interactive/components/session-selector-search.js +145 -0
- package/dist/modes/interactive/components/session-selector.js +698 -0
- package/dist/modes/interactive/components/settings-selector.js +250 -0
- package/dist/modes/interactive/components/show-images-selector.js +33 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +44 -0
- package/dist/modes/interactive/components/theme-selector.js +43 -0
- package/dist/modes/interactive/components/thinking-selector.js +45 -0
- package/dist/modes/interactive/components/tool-execution.js +608 -0
- package/dist/modes/interactive/components/tree-selector.js +892 -0
- package/dist/modes/interactive/components/user-message-selector.js +109 -0
- package/dist/modes/interactive/components/user-message.js +15 -0
- package/dist/modes/interactive/components/visual-truncate.js +32 -0
- package/dist/modes/interactive/interactive-mode.js +3576 -0
- package/dist/modes/interactive/theme/dark.json +85 -0
- package/dist/modes/interactive/theme/light.json +84 -0
- package/dist/modes/interactive/theme/theme-schema.json +335 -0
- package/dist/modes/interactive/theme/theme.js +938 -0
- package/dist/modes/print-mode.js +96 -0
- package/dist/modes/rpc/rpc-client.js +390 -0
- package/dist/modes/rpc/rpc-mode.js +448 -0
- package/dist/modes/rpc/rpc-types.js +7 -0
- package/dist/utils/changelog.js +86 -0
- package/dist/utils/clipboard-image.js +116 -0
- package/dist/utils/clipboard.js +58 -0
- package/dist/utils/frontmatter.js +25 -0
- package/dist/utils/git.js +5 -0
- package/dist/utils/image-convert.js +34 -0
- package/dist/utils/image-resize.js +180 -0
- package/dist/utils/mime.js +25 -0
- package/dist/utils/photon.js +120 -0
- package/dist/utils/shell.js +164 -0
- package/dist/utils/sleep.js +16 -0
- package/dist/utils/tools-manager.js +186 -0
- package/docs/compaction.md +390 -0
- package/docs/custom-provider.md +538 -0
- package/docs/development.md +69 -0
- package/docs/extensions.md +1733 -0
- package/docs/images/doom-extension.png +0 -0
- package/docs/images/interactive-mode.png +0 -0
- package/docs/images/tree-view.png +0 -0
- package/docs/json.md +79 -0
- package/docs/keybindings.md +162 -0
- package/docs/models.md +193 -0
- package/docs/packages.md +163 -0
- package/docs/prompt-templates.md +67 -0
- package/docs/providers.md +147 -0
- package/docs/rpc.md +1048 -0
- package/docs/sdk.md +957 -0
- package/docs/session.md +412 -0
- package/docs/settings.md +216 -0
- package/docs/shell-aliases.md +13 -0
- package/docs/skills.md +226 -0
- package/docs/terminal-setup.md +65 -0
- package/docs/themes.md +295 -0
- package/docs/tree.md +219 -0
- package/docs/tui.md +887 -0
- package/docs/windows.md +17 -0
- package/examples/README.md +25 -0
- package/examples/extensions/README.md +192 -0
- package/examples/extensions/antigravity-image-gen.ts +414 -0
- package/examples/extensions/auto-commit-on-exit.ts +49 -0
- package/examples/extensions/bookmark.ts +50 -0
- package/examples/extensions/claude-rules.ts +86 -0
- package/examples/extensions/confirm-destructive.ts +59 -0
- package/examples/extensions/custom-compaction.ts +115 -0
- package/examples/extensions/custom-footer.ts +65 -0
- package/examples/extensions/custom-header.ts +73 -0
- package/examples/extensions/custom-provider-anthropic/index.ts +605 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
- package/examples/extensions/custom-provider-anthropic/package.json +19 -0
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +350 -0
- package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +83 -0
- package/examples/extensions/dirty-repo-guard.ts +56 -0
- package/examples/extensions/doom-overlay/README.md +46 -0
- package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
- package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
- package/examples/extensions/doom-overlay/doom/build.sh +152 -0
- package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
- package/examples/extensions/doom-overlay/doom-component.ts +133 -0
- package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
- package/examples/extensions/doom-overlay/doom-keys.ts +105 -0
- package/examples/extensions/doom-overlay/index.ts +74 -0
- package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
- package/examples/extensions/event-bus.ts +43 -0
- package/examples/extensions/file-trigger.ts +41 -0
- package/examples/extensions/git-checkpoint.ts +53 -0
- package/examples/extensions/handoff.ts +151 -0
- package/examples/extensions/hello.ts +25 -0
- package/examples/extensions/inline-bash.ts +94 -0
- package/examples/extensions/input-transform.ts +43 -0
- package/examples/extensions/interactive-shell.ts +196 -0
- package/examples/extensions/mac-system-theme.ts +47 -0
- package/examples/extensions/message-renderer.ts +60 -0
- package/examples/extensions/modal-editor.ts +86 -0
- package/examples/extensions/model-status.ts +31 -0
- package/examples/extensions/notify.ts +25 -0
- package/examples/extensions/overlay-qa-tests.ts +882 -0
- package/examples/extensions/overlay-test.ts +151 -0
- package/examples/extensions/permission-gate.ts +34 -0
- package/examples/extensions/pirate.ts +47 -0
- package/examples/extensions/plan-mode/README.md +65 -0
- package/examples/extensions/plan-mode/index.ts +341 -0
- package/examples/extensions/plan-mode/utils.ts +168 -0
- package/examples/extensions/preset.ts +399 -0
- package/examples/extensions/protected-paths.ts +30 -0
- package/examples/extensions/qna.ts +120 -0
- package/examples/extensions/question.ts +265 -0
- package/examples/extensions/questionnaire.ts +428 -0
- package/examples/extensions/rainbow-editor.ts +88 -0
- package/examples/extensions/sandbox/index.ts +318 -0
- package/examples/extensions/sandbox/package-lock.json +92 -0
- package/examples/extensions/sandbox/package.json +19 -0
- package/examples/extensions/send-user-message.ts +97 -0
- package/examples/extensions/session-name.ts +27 -0
- package/examples/extensions/shutdown-command.ts +63 -0
- package/examples/extensions/snake.ts +344 -0
- package/examples/extensions/space-invaders.ts +561 -0
- package/examples/extensions/ssh.ts +220 -0
- package/examples/extensions/status-line.ts +40 -0
- package/examples/extensions/subagent/README.md +172 -0
- package/examples/extensions/subagent/agents/planner.md +37 -0
- package/examples/extensions/subagent/agents/reviewer.md +35 -0
- package/examples/extensions/subagent/agents/scout.md +50 -0
- package/examples/extensions/subagent/agents/worker.md +24 -0
- package/examples/extensions/subagent/agents.ts +127 -0
- package/examples/extensions/subagent/index.ts +964 -0
- package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
- package/examples/extensions/subagent/prompts/implement.md +10 -0
- package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
- package/examples/extensions/summarize.ts +196 -0
- package/examples/extensions/timed-confirm.ts +70 -0
- package/examples/extensions/todo.ts +300 -0
- package/examples/extensions/tool-override.ts +144 -0
- package/examples/extensions/tools.ts +147 -0
- package/examples/extensions/trigger-compact.ts +40 -0
- package/examples/extensions/truncated-tool.ts +193 -0
- package/examples/extensions/widget-placement.ts +17 -0
- package/examples/extensions/with-deps/index.ts +36 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +22 -0
- package/examples/sdk/01-minimal.ts +22 -0
- package/examples/sdk/02-custom-model.ts +50 -0
- package/examples/sdk/03-custom-prompt.ts +55 -0
- package/examples/sdk/04-skills.ts +46 -0
- package/examples/sdk/05-tools.ts +56 -0
- package/examples/sdk/06-extensions.ts +88 -0
- package/examples/sdk/07-context-files.ts +40 -0
- package/examples/sdk/08-prompt-templates.ts +47 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
- package/examples/sdk/10-settings.ts +38 -0
- package/examples/sdk/11-sessions.ts +48 -0
- package/examples/sdk/12-full-control.ts +82 -0
- package/examples/sdk/13-codex-oauth.ts +37 -0
- package/examples/sdk/README.md +144 -0
- package/package.json +85 -0
package/dist/core/sdk.js
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { Agent } from "indusagi/agent";
|
|
3
|
+
import { getAgentDir, getDocsPath } from "../config.js";
|
|
4
|
+
import { AgentSession } from "./agent-session.js";
|
|
5
|
+
import { AuthStorage } from "./auth-storage.js";
|
|
6
|
+
import { convertToLlm } from "./messages.js";
|
|
7
|
+
import { ModelRegistry } from "./model-registry.js";
|
|
8
|
+
import { findInitialModel } from "./model-resolver.js";
|
|
9
|
+
import { DefaultResourceLoader } from "./resource-loader.js";
|
|
10
|
+
import { SessionManager } from "./session-manager.js";
|
|
11
|
+
import { SettingsManager } from "./settings-manager.js";
|
|
12
|
+
import { time } from "./timings.js";
|
|
13
|
+
import { allTools, bashTool, codingTools, createBashTool, createCodingTools, createEditTool, createFindTool, createGrepTool, createLsTool, createReadOnlyTools, createReadTool, createWriteTool, editTool, findTool, grepTool, lsTool, readOnlyTools, readTool, writeTool, } from "./tools/index.js";
|
|
14
|
+
export {
|
|
15
|
+
// Pre-built tools (use process.cwd())
|
|
16
|
+
readTool, bashTool, editTool, writeTool, grepTool, findTool, lsTool, codingTools, readOnlyTools, allTools as allBuiltInTools,
|
|
17
|
+
// Tool factories (for custom cwd)
|
|
18
|
+
createCodingTools, createReadOnlyTools, createReadTool, createBashTool, createEditTool, createWriteTool, createGrepTool, createFindTool, createLsTool, };
|
|
19
|
+
// Helper Functions
|
|
20
|
+
function getDefaultAgentDir() {
|
|
21
|
+
return getAgentDir();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create an AgentSession with the specified options.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* // Minimal - uses defaults
|
|
29
|
+
* const { session } = await createAgentSession();
|
|
30
|
+
*
|
|
31
|
+
* // With explicit model
|
|
32
|
+
* import { getModel } from 'indusagi/ai';
|
|
33
|
+
* const { session } = await createAgentSession({
|
|
34
|
+
* model: getModel('anthropic', 'claude-opus-4-5'),
|
|
35
|
+
* thinkingLevel: 'high',
|
|
36
|
+
* });
|
|
37
|
+
*
|
|
38
|
+
* // Continue previous session
|
|
39
|
+
* const { session, modelFallbackMessage } = await createAgentSession({
|
|
40
|
+
* continueSession: true,
|
|
41
|
+
* });
|
|
42
|
+
*
|
|
43
|
+
* // Full control
|
|
44
|
+
* const loader = new DefaultResourceLoader({
|
|
45
|
+
* cwd: process.cwd(),
|
|
46
|
+
* agentDir: getAgentDir(),
|
|
47
|
+
* settingsManager: SettingsManager.create(),
|
|
48
|
+
* });
|
|
49
|
+
* await loader.reload();
|
|
50
|
+
* const { session } = await createAgentSession({
|
|
51
|
+
* model: myModel,
|
|
52
|
+
* tools: [readTool, bashTool],
|
|
53
|
+
* resourceLoader: loader,
|
|
54
|
+
* sessionManager: SessionManager.inMemory(),
|
|
55
|
+
* });
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export async function createAgentSession(options = {}) {
|
|
59
|
+
const cwd = options.cwd ?? process.cwd();
|
|
60
|
+
const agentDir = options.agentDir ?? getDefaultAgentDir();
|
|
61
|
+
let resourceLoader = options.resourceLoader;
|
|
62
|
+
// Use provided or create AuthStorage and ModelRegistry
|
|
63
|
+
const authPath = options.agentDir ? join(agentDir, "auth.json") : undefined;
|
|
64
|
+
const modelsPath = options.agentDir ? join(agentDir, "models.json") : undefined;
|
|
65
|
+
const authStorage = options.authStorage ?? new AuthStorage(authPath);
|
|
66
|
+
const modelRegistry = options.modelRegistry ?? new ModelRegistry(authStorage, modelsPath);
|
|
67
|
+
const settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);
|
|
68
|
+
const sessionManager = options.sessionManager ?? SessionManager.create(cwd);
|
|
69
|
+
if (!resourceLoader) {
|
|
70
|
+
resourceLoader = new DefaultResourceLoader({ cwd, agentDir, settingsManager });
|
|
71
|
+
await resourceLoader.reload();
|
|
72
|
+
time("resourceLoader.reload");
|
|
73
|
+
}
|
|
74
|
+
// Check if session has existing data to restore
|
|
75
|
+
const existingSession = sessionManager.buildSessionContext();
|
|
76
|
+
const hasExistingSession = existingSession.messages.length > 0;
|
|
77
|
+
let model = options.model;
|
|
78
|
+
let modelFallbackMessage;
|
|
79
|
+
// If session has data, try to restore model from it
|
|
80
|
+
if (!model && hasExistingSession && existingSession.model) {
|
|
81
|
+
const restoredModel = modelRegistry.find(existingSession.model.provider, existingSession.model.modelId);
|
|
82
|
+
if (restoredModel && (await modelRegistry.getApiKey(restoredModel))) {
|
|
83
|
+
model = restoredModel;
|
|
84
|
+
}
|
|
85
|
+
if (!model) {
|
|
86
|
+
modelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// If still no model, use findInitialModel (checks settings default, then provider defaults)
|
|
90
|
+
if (!model) {
|
|
91
|
+
const result = await findInitialModel({
|
|
92
|
+
scopedModels: [],
|
|
93
|
+
isContinuing: hasExistingSession,
|
|
94
|
+
defaultProvider: settingsManager.getDefaultProvider(),
|
|
95
|
+
defaultModelId: settingsManager.getDefaultModel(),
|
|
96
|
+
defaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),
|
|
97
|
+
modelRegistry,
|
|
98
|
+
});
|
|
99
|
+
model = result.model;
|
|
100
|
+
if (!model) {
|
|
101
|
+
modelFallbackMessage = `No models available. Use /login or set an API key environment variable. See ${join(getDocsPath(), "authentication.md")}. Then use /model to select a model.`;
|
|
102
|
+
}
|
|
103
|
+
else if (modelFallbackMessage) {
|
|
104
|
+
modelFallbackMessage += `. Using ${model.provider}/${model.id}`;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
let thinkingLevel = options.thinkingLevel;
|
|
108
|
+
// If session has data, restore thinking level from it
|
|
109
|
+
if (thinkingLevel === undefined && hasExistingSession) {
|
|
110
|
+
thinkingLevel = existingSession.thinkingLevel;
|
|
111
|
+
}
|
|
112
|
+
// Fall back to settings default
|
|
113
|
+
if (thinkingLevel === undefined) {
|
|
114
|
+
thinkingLevel = settingsManager.getDefaultThinkingLevel() ?? "off";
|
|
115
|
+
}
|
|
116
|
+
// Clamp to model capabilities
|
|
117
|
+
if (!model || !model.reasoning) {
|
|
118
|
+
thinkingLevel = "off";
|
|
119
|
+
}
|
|
120
|
+
const defaultActiveToolNames = ["read", "bash", "edit", "write"];
|
|
121
|
+
const initialActiveToolNames = options.tools
|
|
122
|
+
? options.tools.map((t) => t.name).filter((n) => n in allTools)
|
|
123
|
+
: defaultActiveToolNames;
|
|
124
|
+
let agent;
|
|
125
|
+
// Create convertToLlm wrapper that filters images if blockImages is enabled (defense-in-depth)
|
|
126
|
+
const convertToLlmWithBlockImages = (messages) => {
|
|
127
|
+
const converted = convertToLlm(messages);
|
|
128
|
+
// Check setting dynamically so mid-session changes take effect
|
|
129
|
+
if (!settingsManager.getBlockImages()) {
|
|
130
|
+
return converted;
|
|
131
|
+
}
|
|
132
|
+
// Filter out ImageContent from all messages, replacing with text placeholder
|
|
133
|
+
return converted.map((msg) => {
|
|
134
|
+
if (msg.role === "user" || msg.role === "toolResult") {
|
|
135
|
+
const content = msg.content;
|
|
136
|
+
if (Array.isArray(content)) {
|
|
137
|
+
const hasImages = content.some((c) => c.type === "image");
|
|
138
|
+
if (hasImages) {
|
|
139
|
+
const filteredContent = content
|
|
140
|
+
.map((c) => c.type === "image" ? { type: "text", text: "Image reading is disabled." } : c)
|
|
141
|
+
.filter((c, i, arr) =>
|
|
142
|
+
// Dedupe consecutive "Image reading is disabled." texts
|
|
143
|
+
!(c.type === "text" &&
|
|
144
|
+
c.text === "Image reading is disabled." &&
|
|
145
|
+
i > 0 &&
|
|
146
|
+
arr[i - 1].type === "text" &&
|
|
147
|
+
arr[i - 1].text === "Image reading is disabled."));
|
|
148
|
+
return { ...msg, content: filteredContent };
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return msg;
|
|
153
|
+
});
|
|
154
|
+
};
|
|
155
|
+
const extensionRunnerRef = {};
|
|
156
|
+
agent = new Agent({
|
|
157
|
+
initialState: {
|
|
158
|
+
systemPrompt: "",
|
|
159
|
+
model,
|
|
160
|
+
thinkingLevel,
|
|
161
|
+
tools: [],
|
|
162
|
+
},
|
|
163
|
+
convertToLlm: convertToLlmWithBlockImages,
|
|
164
|
+
sessionId: sessionManager.getSessionId(),
|
|
165
|
+
transformContext: async (messages) => {
|
|
166
|
+
const runner = extensionRunnerRef.current;
|
|
167
|
+
if (!runner)
|
|
168
|
+
return messages;
|
|
169
|
+
return runner.emitContext(messages);
|
|
170
|
+
},
|
|
171
|
+
steeringMode: settingsManager.getSteeringMode(),
|
|
172
|
+
followUpMode: settingsManager.getFollowUpMode(),
|
|
173
|
+
thinkingBudgets: settingsManager.getThinkingBudgets(),
|
|
174
|
+
getApiKey: async (provider) => {
|
|
175
|
+
// Use the provider argument from the in-flight request;
|
|
176
|
+
// agent.state.model may already be switched mid-turn.
|
|
177
|
+
const resolvedProvider = provider || agent.state.model?.provider;
|
|
178
|
+
if (!resolvedProvider) {
|
|
179
|
+
throw new Error("No model selected");
|
|
180
|
+
}
|
|
181
|
+
const key = await modelRegistry.getApiKeyForProvider(resolvedProvider);
|
|
182
|
+
if (!key) {
|
|
183
|
+
const model = agent.state.model;
|
|
184
|
+
const isOAuth = model && modelRegistry.isUsingOAuth(model);
|
|
185
|
+
if (isOAuth) {
|
|
186
|
+
throw new Error(`Authentication failed for "${resolvedProvider}". ` +
|
|
187
|
+
`Credentials may have expired or network is unavailable. ` +
|
|
188
|
+
`Run '/login ${resolvedProvider}' to re-authenticate.`);
|
|
189
|
+
}
|
|
190
|
+
throw new Error(`No API key found for "${resolvedProvider}". ` +
|
|
191
|
+
`Set an API key environment variable or run '/login ${resolvedProvider}'.`);
|
|
192
|
+
}
|
|
193
|
+
return key;
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
// Restore messages if session has existing data
|
|
197
|
+
if (hasExistingSession) {
|
|
198
|
+
agent.replaceMessages(existingSession.messages);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
// Save initial model and thinking level for new sessions so they can be restored on resume
|
|
202
|
+
if (model) {
|
|
203
|
+
sessionManager.appendModelChange(model.provider, model.id);
|
|
204
|
+
}
|
|
205
|
+
sessionManager.appendThinkingLevelChange(thinkingLevel);
|
|
206
|
+
}
|
|
207
|
+
const session = new AgentSession({
|
|
208
|
+
agent,
|
|
209
|
+
sessionManager,
|
|
210
|
+
settingsManager,
|
|
211
|
+
cwd,
|
|
212
|
+
scopedModels: options.scopedModels,
|
|
213
|
+
resourceLoader,
|
|
214
|
+
customTools: options.customTools,
|
|
215
|
+
modelRegistry,
|
|
216
|
+
initialActiveToolNames,
|
|
217
|
+
extensionRunnerRef,
|
|
218
|
+
});
|
|
219
|
+
const extensionsResult = resourceLoader.getExtensions();
|
|
220
|
+
return {
|
|
221
|
+
session,
|
|
222
|
+
extensionsResult,
|
|
223
|
+
modelFallbackMessage,
|
|
224
|
+
};
|
|
225
|
+
}
|