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.
Files changed (240) hide show
  1. package/CHANGELOG.md +2249 -0
  2. package/README.md +546 -0
  3. package/dist/cli/args.js +282 -0
  4. package/dist/cli/config-selector.js +30 -0
  5. package/dist/cli/file-processor.js +78 -0
  6. package/dist/cli/list-models.js +91 -0
  7. package/dist/cli/session-picker.js +31 -0
  8. package/dist/cli.js +10 -0
  9. package/dist/config.js +158 -0
  10. package/dist/core/agent-session.js +2097 -0
  11. package/dist/core/auth-storage.js +278 -0
  12. package/dist/core/bash-executor.js +211 -0
  13. package/dist/core/compaction/branch-summarization.js +241 -0
  14. package/dist/core/compaction/compaction.js +606 -0
  15. package/dist/core/compaction/index.js +6 -0
  16. package/dist/core/compaction/utils.js +137 -0
  17. package/dist/core/diagnostics.js +1 -0
  18. package/dist/core/event-bus.js +24 -0
  19. package/dist/core/exec.js +70 -0
  20. package/dist/core/export-html/ansi-to-html.js +248 -0
  21. package/dist/core/export-html/index.js +221 -0
  22. package/dist/core/export-html/template.css +905 -0
  23. package/dist/core/export-html/template.html +54 -0
  24. package/dist/core/export-html/template.js +1549 -0
  25. package/dist/core/export-html/tool-renderer.js +56 -0
  26. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  27. package/dist/core/export-html/vendor/marked.min.js +6 -0
  28. package/dist/core/extensions/index.js +8 -0
  29. package/dist/core/extensions/loader.js +395 -0
  30. package/dist/core/extensions/runner.js +499 -0
  31. package/dist/core/extensions/types.js +31 -0
  32. package/dist/core/extensions/wrapper.js +101 -0
  33. package/dist/core/footer-data-provider.js +133 -0
  34. package/dist/core/index.js +8 -0
  35. package/dist/core/keybindings.js +140 -0
  36. package/dist/core/messages.js +122 -0
  37. package/dist/core/model-registry.js +454 -0
  38. package/dist/core/model-resolver.js +309 -0
  39. package/dist/core/package-manager.js +1142 -0
  40. package/dist/core/prompt-templates.js +250 -0
  41. package/dist/core/resource-loader.js +569 -0
  42. package/dist/core/sdk.js +225 -0
  43. package/dist/core/session-manager.js +1078 -0
  44. package/dist/core/settings-manager.js +430 -0
  45. package/dist/core/skills.js +339 -0
  46. package/dist/core/system-prompt.js +136 -0
  47. package/dist/core/timings.js +24 -0
  48. package/dist/core/tools/bash.js +226 -0
  49. package/dist/core/tools/edit-diff.js +242 -0
  50. package/dist/core/tools/edit.js +145 -0
  51. package/dist/core/tools/find.js +205 -0
  52. package/dist/core/tools/grep.js +238 -0
  53. package/dist/core/tools/index.js +60 -0
  54. package/dist/core/tools/ls.js +117 -0
  55. package/dist/core/tools/path-utils.js +52 -0
  56. package/dist/core/tools/read.js +165 -0
  57. package/dist/core/tools/truncate.js +204 -0
  58. package/dist/core/tools/write.js +77 -0
  59. package/dist/index.js +41 -0
  60. package/dist/main.js +565 -0
  61. package/dist/migrations.js +260 -0
  62. package/dist/modes/index.js +7 -0
  63. package/dist/modes/interactive/components/armin.js +328 -0
  64. package/dist/modes/interactive/components/assistant-message.js +86 -0
  65. package/dist/modes/interactive/components/bash-execution.js +155 -0
  66. package/dist/modes/interactive/components/bordered-loader.js +47 -0
  67. package/dist/modes/interactive/components/branch-summary-message.js +41 -0
  68. package/dist/modes/interactive/components/compaction-summary-message.js +42 -0
  69. package/dist/modes/interactive/components/config-selector.js +458 -0
  70. package/dist/modes/interactive/components/countdown-timer.js +27 -0
  71. package/dist/modes/interactive/components/custom-editor.js +61 -0
  72. package/dist/modes/interactive/components/custom-message.js +80 -0
  73. package/dist/modes/interactive/components/diff.js +132 -0
  74. package/dist/modes/interactive/components/dynamic-border.js +19 -0
  75. package/dist/modes/interactive/components/extension-editor.js +96 -0
  76. package/dist/modes/interactive/components/extension-input.js +54 -0
  77. package/dist/modes/interactive/components/extension-selector.js +70 -0
  78. package/dist/modes/interactive/components/footer.js +213 -0
  79. package/dist/modes/interactive/components/index.js +31 -0
  80. package/dist/modes/interactive/components/keybinding-hints.js +60 -0
  81. package/dist/modes/interactive/components/login-dialog.js +138 -0
  82. package/dist/modes/interactive/components/model-selector.js +253 -0
  83. package/dist/modes/interactive/components/oauth-selector.js +91 -0
  84. package/dist/modes/interactive/components/scoped-models-selector.js +262 -0
  85. package/dist/modes/interactive/components/session-selector-search.js +145 -0
  86. package/dist/modes/interactive/components/session-selector.js +698 -0
  87. package/dist/modes/interactive/components/settings-selector.js +250 -0
  88. package/dist/modes/interactive/components/show-images-selector.js +33 -0
  89. package/dist/modes/interactive/components/skill-invocation-message.js +44 -0
  90. package/dist/modes/interactive/components/theme-selector.js +43 -0
  91. package/dist/modes/interactive/components/thinking-selector.js +45 -0
  92. package/dist/modes/interactive/components/tool-execution.js +608 -0
  93. package/dist/modes/interactive/components/tree-selector.js +892 -0
  94. package/dist/modes/interactive/components/user-message-selector.js +109 -0
  95. package/dist/modes/interactive/components/user-message.js +15 -0
  96. package/dist/modes/interactive/components/visual-truncate.js +32 -0
  97. package/dist/modes/interactive/interactive-mode.js +3576 -0
  98. package/dist/modes/interactive/theme/dark.json +85 -0
  99. package/dist/modes/interactive/theme/light.json +84 -0
  100. package/dist/modes/interactive/theme/theme-schema.json +335 -0
  101. package/dist/modes/interactive/theme/theme.js +938 -0
  102. package/dist/modes/print-mode.js +96 -0
  103. package/dist/modes/rpc/rpc-client.js +390 -0
  104. package/dist/modes/rpc/rpc-mode.js +448 -0
  105. package/dist/modes/rpc/rpc-types.js +7 -0
  106. package/dist/utils/changelog.js +86 -0
  107. package/dist/utils/clipboard-image.js +116 -0
  108. package/dist/utils/clipboard.js +58 -0
  109. package/dist/utils/frontmatter.js +25 -0
  110. package/dist/utils/git.js +5 -0
  111. package/dist/utils/image-convert.js +34 -0
  112. package/dist/utils/image-resize.js +180 -0
  113. package/dist/utils/mime.js +25 -0
  114. package/dist/utils/photon.js +120 -0
  115. package/dist/utils/shell.js +164 -0
  116. package/dist/utils/sleep.js +16 -0
  117. package/dist/utils/tools-manager.js +186 -0
  118. package/docs/compaction.md +390 -0
  119. package/docs/custom-provider.md +538 -0
  120. package/docs/development.md +69 -0
  121. package/docs/extensions.md +1733 -0
  122. package/docs/images/doom-extension.png +0 -0
  123. package/docs/images/interactive-mode.png +0 -0
  124. package/docs/images/tree-view.png +0 -0
  125. package/docs/json.md +79 -0
  126. package/docs/keybindings.md +162 -0
  127. package/docs/models.md +193 -0
  128. package/docs/packages.md +163 -0
  129. package/docs/prompt-templates.md +67 -0
  130. package/docs/providers.md +147 -0
  131. package/docs/rpc.md +1048 -0
  132. package/docs/sdk.md +957 -0
  133. package/docs/session.md +412 -0
  134. package/docs/settings.md +216 -0
  135. package/docs/shell-aliases.md +13 -0
  136. package/docs/skills.md +226 -0
  137. package/docs/terminal-setup.md +65 -0
  138. package/docs/themes.md +295 -0
  139. package/docs/tree.md +219 -0
  140. package/docs/tui.md +887 -0
  141. package/docs/windows.md +17 -0
  142. package/examples/README.md +25 -0
  143. package/examples/extensions/README.md +192 -0
  144. package/examples/extensions/antigravity-image-gen.ts +414 -0
  145. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  146. package/examples/extensions/bookmark.ts +50 -0
  147. package/examples/extensions/claude-rules.ts +86 -0
  148. package/examples/extensions/confirm-destructive.ts +59 -0
  149. package/examples/extensions/custom-compaction.ts +115 -0
  150. package/examples/extensions/custom-footer.ts +65 -0
  151. package/examples/extensions/custom-header.ts +73 -0
  152. package/examples/extensions/custom-provider-anthropic/index.ts +605 -0
  153. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  154. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  155. package/examples/extensions/custom-provider-gitlab-duo/index.ts +350 -0
  156. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  157. package/examples/extensions/custom-provider-gitlab-duo/test.ts +83 -0
  158. package/examples/extensions/dirty-repo-guard.ts +56 -0
  159. package/examples/extensions/doom-overlay/README.md +46 -0
  160. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  161. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  162. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  163. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  164. package/examples/extensions/doom-overlay/doom-component.ts +133 -0
  165. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  166. package/examples/extensions/doom-overlay/doom-keys.ts +105 -0
  167. package/examples/extensions/doom-overlay/index.ts +74 -0
  168. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  169. package/examples/extensions/event-bus.ts +43 -0
  170. package/examples/extensions/file-trigger.ts +41 -0
  171. package/examples/extensions/git-checkpoint.ts +53 -0
  172. package/examples/extensions/handoff.ts +151 -0
  173. package/examples/extensions/hello.ts +25 -0
  174. package/examples/extensions/inline-bash.ts +94 -0
  175. package/examples/extensions/input-transform.ts +43 -0
  176. package/examples/extensions/interactive-shell.ts +196 -0
  177. package/examples/extensions/mac-system-theme.ts +47 -0
  178. package/examples/extensions/message-renderer.ts +60 -0
  179. package/examples/extensions/modal-editor.ts +86 -0
  180. package/examples/extensions/model-status.ts +31 -0
  181. package/examples/extensions/notify.ts +25 -0
  182. package/examples/extensions/overlay-qa-tests.ts +882 -0
  183. package/examples/extensions/overlay-test.ts +151 -0
  184. package/examples/extensions/permission-gate.ts +34 -0
  185. package/examples/extensions/pirate.ts +47 -0
  186. package/examples/extensions/plan-mode/README.md +65 -0
  187. package/examples/extensions/plan-mode/index.ts +341 -0
  188. package/examples/extensions/plan-mode/utils.ts +168 -0
  189. package/examples/extensions/preset.ts +399 -0
  190. package/examples/extensions/protected-paths.ts +30 -0
  191. package/examples/extensions/qna.ts +120 -0
  192. package/examples/extensions/question.ts +265 -0
  193. package/examples/extensions/questionnaire.ts +428 -0
  194. package/examples/extensions/rainbow-editor.ts +88 -0
  195. package/examples/extensions/sandbox/index.ts +318 -0
  196. package/examples/extensions/sandbox/package-lock.json +92 -0
  197. package/examples/extensions/sandbox/package.json +19 -0
  198. package/examples/extensions/send-user-message.ts +97 -0
  199. package/examples/extensions/session-name.ts +27 -0
  200. package/examples/extensions/shutdown-command.ts +63 -0
  201. package/examples/extensions/snake.ts +344 -0
  202. package/examples/extensions/space-invaders.ts +561 -0
  203. package/examples/extensions/ssh.ts +220 -0
  204. package/examples/extensions/status-line.ts +40 -0
  205. package/examples/extensions/subagent/README.md +172 -0
  206. package/examples/extensions/subagent/agents/planner.md +37 -0
  207. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  208. package/examples/extensions/subagent/agents/scout.md +50 -0
  209. package/examples/extensions/subagent/agents/worker.md +24 -0
  210. package/examples/extensions/subagent/agents.ts +127 -0
  211. package/examples/extensions/subagent/index.ts +964 -0
  212. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  213. package/examples/extensions/subagent/prompts/implement.md +10 -0
  214. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  215. package/examples/extensions/summarize.ts +196 -0
  216. package/examples/extensions/timed-confirm.ts +70 -0
  217. package/examples/extensions/todo.ts +300 -0
  218. package/examples/extensions/tool-override.ts +144 -0
  219. package/examples/extensions/tools.ts +147 -0
  220. package/examples/extensions/trigger-compact.ts +40 -0
  221. package/examples/extensions/truncated-tool.ts +193 -0
  222. package/examples/extensions/widget-placement.ts +17 -0
  223. package/examples/extensions/with-deps/index.ts +36 -0
  224. package/examples/extensions/with-deps/package-lock.json +31 -0
  225. package/examples/extensions/with-deps/package.json +22 -0
  226. package/examples/sdk/01-minimal.ts +22 -0
  227. package/examples/sdk/02-custom-model.ts +50 -0
  228. package/examples/sdk/03-custom-prompt.ts +55 -0
  229. package/examples/sdk/04-skills.ts +46 -0
  230. package/examples/sdk/05-tools.ts +56 -0
  231. package/examples/sdk/06-extensions.ts +88 -0
  232. package/examples/sdk/07-context-files.ts +40 -0
  233. package/examples/sdk/08-prompt-templates.ts +47 -0
  234. package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
  235. package/examples/sdk/10-settings.ts +38 -0
  236. package/examples/sdk/11-sessions.ts +48 -0
  237. package/examples/sdk/12-full-control.ts +82 -0
  238. package/examples/sdk/13-codex-oauth.ts +37 -0
  239. package/examples/sdk/README.md +144 -0
  240. package/package.json +85 -0
@@ -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
+ }