@iaforged/context-code 1.0.80 → 1.0.82

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 (35) hide show
  1. package/dist/src/components/LogoV2/FeedColumn.js +3 -4
  2. package/dist/src/components/LogoV2/LogoV2.js +10 -10
  3. package/dist/src/components/LogoV2/WelcomeV2.js +1 -1
  4. package/dist/src/components/agents/AgentDetail.js +19 -210
  5. package/dist/src/components/agents/AgentEditor.js +60 -70
  6. package/dist/src/components/agents/AgentsList.js +3 -2
  7. package/dist/src/components/agents/AgentsMenu.js +10 -10
  8. package/dist/src/components/agents/ColorPicker.js +2 -2
  9. package/dist/src/components/agents/ModelSelector.js +204 -52
  10. package/dist/src/components/agents/ToolSelector.js +13 -13
  11. package/dist/src/components/agents/agentFileUtils.js +12 -11
  12. package/dist/src/components/agents/new-agent-creation/CreateAgentWizard.js +1 -1
  13. package/dist/src/components/agents/new-agent-creation/types.js +1 -0
  14. package/dist/src/components/agents/new-agent-creation/wizard-steps/ColorStep.js +22 -68
  15. package/dist/src/components/agents/new-agent-creation/wizard-steps/ConfirmStep.js +30 -369
  16. package/dist/src/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.js +13 -15
  17. package/dist/src/components/agents/new-agent-creation/wizard-steps/DescriptionStep.js +4 -4
  18. package/dist/src/components/agents/new-agent-creation/wizard-steps/GenerateStep.js +15 -22
  19. package/dist/src/components/agents/new-agent-creation/wizard-steps/LocationStep.js +2 -2
  20. package/dist/src/components/agents/new-agent-creation/wizard-steps/MemoryStep.js +9 -9
  21. package/dist/src/components/agents/new-agent-creation/wizard-steps/MethodStep.js +3 -3
  22. package/dist/src/components/agents/new-agent-creation/wizard-steps/ModelStep.js +8 -38
  23. package/dist/src/components/agents/new-agent-creation/wizard-steps/PromptStep.js +4 -4
  24. package/dist/src/components/agents/new-agent-creation/wizard-steps/ToolsStep.js +1 -1
  25. package/dist/src/components/agents/new-agent-creation/wizard-steps/TypeStep.js +3 -3
  26. package/dist/src/components/agents/validateAgent.js +16 -16
  27. package/dist/src/services/compact/compact.js +22 -20
  28. package/dist/src/tools/AgentTool/AgentTool.js +12 -8
  29. package/dist/src/tools/AgentTool/agentDisplay.js +5 -2
  30. package/dist/src/tools/AgentTool/loadAgentsDir.js +36 -0
  31. package/dist/src/tools/AgentTool/resumeAgent.js +7 -3
  32. package/dist/src/utils/model/agent.js +12 -3
  33. package/dist/src/utils/model/providerOverrideContext.js +11 -0
  34. package/dist/src/utils/model/providers.js +14 -0
  35. package/package.json +1 -1
@@ -42,6 +42,19 @@ const AgentJsonSchema = lazySchema(() => z.object({
42
42
  .min(1, 'Model cannot be empty')
43
43
  .transform(m => (m.toLowerCase() === 'inherit' ? 'inherit' : m))
44
44
  .optional(),
45
+ provider: z
46
+ .enum([
47
+ 'claude',
48
+ 'openai',
49
+ 'openrouter',
50
+ 'ollama',
51
+ 'ollama-cloud',
52
+ 'gemini-api',
53
+ 'gemini-google',
54
+ 'zai',
55
+ 'minimax',
56
+ ])
57
+ .optional(),
45
58
  effort: z.union([z.enum(EFFORT_LEVELS), z.number().int()]).optional(),
46
59
  permissionMode: z.enum(PERMISSION_MODES).optional(),
47
60
  mcpServers: z.array(AgentMcpServerSpecSchema()).optional(),
@@ -285,6 +298,7 @@ export function parseAgentFromJson(name, definition, source = 'flagSettings') {
285
298
  },
286
299
  source,
287
300
  ...(parsed.model ? { model: parsed.model } : {}),
301
+ ...(parsed.provider ? { provider: parsed.provider } : {}),
288
302
  ...(parsed.effort !== undefined ? { effort: parsed.effort } : {}),
289
303
  ...(parsed.permissionMode
290
304
  ? { permissionMode: parsed.permissionMode }
@@ -347,6 +361,27 @@ export function parseAgentFromMarkdown(filePath, baseDir, frontmatter, content,
347
361
  // Unescape newlines in whenToUse that were escaped for YAML parsing
348
362
  whenToUse = whenToUse.replace(/\\n/g, '\n');
349
363
  const color = frontmatter['color'];
364
+ const providerRaw = frontmatter['provider'];
365
+ const VALID_PROVIDERS = [
366
+ 'claude',
367
+ 'openai',
368
+ 'openrouter',
369
+ 'ollama',
370
+ 'ollama-cloud',
371
+ 'gemini-api',
372
+ 'gemini-google',
373
+ 'zai',
374
+ 'minimax',
375
+ ];
376
+ let provider;
377
+ if (typeof providerRaw === 'string') {
378
+ if (VALID_PROVIDERS.includes(providerRaw)) {
379
+ provider = providerRaw;
380
+ }
381
+ else {
382
+ logForDebugging(`Agent file ${filePath} has invalid provider value '${providerRaw}'. Valid options: ${VALID_PROVIDERS.join(', ')}`);
383
+ }
384
+ }
350
385
  const modelRaw = frontmatter['model'];
351
386
  let model;
352
387
  if (typeof modelRaw === 'string' && modelRaw.trim().length > 0) {
@@ -477,6 +512,7 @@ export function parseAgentFromMarkdown(filePath, baseDir, frontmatter, content,
477
512
  ? { color }
478
513
  : {}),
479
514
  ...(model !== undefined ? { model } : {}),
515
+ ...(provider !== undefined ? { provider } : {}),
480
516
  ...(parsedEffort !== undefined ? { effort: parsedEffort } : {}),
481
517
  ...(isValidPermissionMode
482
518
  ? { permissionMode: permissionModeRaw }
@@ -10,6 +10,8 @@ import { runWithCwdOverride } from '../../utils/cwd.js';
10
10
  import { logForDebugging } from '../../utils/debug.js';
11
11
  import { createUserMessage, filterOrphanedThinkingOnlyMessages, filterUnresolvedToolUses, filterWhitespaceOnlyAssistantMessages, } from '../../utils/messages.js';
12
12
  import { getAgentModel } from '../../utils/model/agent.js';
13
+ import { runWithProviderOverride } from '../../utils/model/providerOverrideContext.js';
14
+ import { providerPreferenceToApiProvider } from '../../utils/model/providers.js';
13
15
  import { getQuerySourceForAgent } from '../../utils/promptCategory.js';
14
16
  import { getAgentTranscript, readAgentMetadata, } from '../../utils/sessionStorage.js';
15
17
  import { buildEffectiveSystemPrompt } from '../../utils/systemPrompt.js';
@@ -65,6 +67,8 @@ export async function resumeAgentBackground({ agentId, prompt, toolUseContext, c
65
67
  selectedAgent = GENERAL_PURPOSE_AGENT;
66
68
  }
67
69
  const uiDescription = meta?.description ?? '(resumed)';
70
+ const agentProviderOverride = providerPreferenceToApiProvider(selectedAgent.provider);
71
+ const withAgentProvider = (fn) => runWithProviderOverride(agentProviderOverride, fn);
68
72
  let forkParentSystemPrompt;
69
73
  if (isResumedFork) {
70
74
  if (toolUseContext.renderedSystemPrompt) {
@@ -89,7 +93,7 @@ export async function resumeAgentBackground({ agentId, prompt, toolUseContext, c
89
93
  }
90
94
  }
91
95
  // Resolve model for analytics metadata (runAgent resolves its own internally)
92
- const resolvedAgentModel = getAgentModel(selectedAgent.model, toolUseContext.options.mainLoopModel, undefined, permissionMode);
96
+ const resolvedAgentModel = withAgentProvider(() => getAgentModel(selectedAgent.model, toolUseContext.options.mainLoopModel, undefined, permissionMode));
93
97
  const workerPermissionContext = {
94
98
  ...appState.toolPermissionContext,
95
99
  mode: selectedAgent.permissionMode ?? 'acceptEdits',
@@ -152,7 +156,7 @@ export async function resumeAgentBackground({ agentId, prompt, toolUseContext, c
152
156
  invocationEmitted: false,
153
157
  };
154
158
  const wrapWithCwd = (fn) => resumedWorktreePath ? runWithCwdOverride(resumedWorktreePath, fn) : fn();
155
- void runWithAgentContext(asyncAgentContext, () => wrapWithCwd(() => runAsyncAgentLifecycle({
159
+ void withAgentProvider(() => runWithAgentContext(asyncAgentContext, () => wrapWithCwd(() => runAsyncAgentLifecycle({
156
160
  taskId: agentBackgroundTask.agentId,
157
161
  abortController: agentBackgroundTask.abortController,
158
162
  makeStream: onCacheSafeParams => runAgent({
@@ -173,7 +177,7 @@ export async function resumeAgentBackground({ agentId, prompt, toolUseContext, c
173
177
  isForkSubagentEnabled() ||
174
178
  getSdkAgentProgressSummariesEnabled(),
175
179
  getWorktreeResult: async () => resumedWorktreePath ? { worktreePath: resumedWorktreePath } : {},
176
- })));
180
+ }))));
177
181
  return {
178
182
  agentId,
179
183
  description: uiDescription,
@@ -2,6 +2,7 @@ import { capitalize } from '../stringUtils.js';
2
2
  import { MODEL_ALIASES } from './aliases.js';
3
3
  import { applyBedrockRegionPrefix, getBedrockRegionPrefix } from './bedrock.js';
4
4
  import { getCanonicalName, getRuntimeMainLoopModel, parseUserSpecifiedModel, } from './model.js';
5
+ import { getVisibleProvider } from './providerCatalog.js';
5
6
  import { getAPIProvider } from './providers.js';
6
7
  export const AGENT_MODEL_OPTIONS = [...MODEL_ALIASES, 'inherit'];
7
8
  /**
@@ -91,14 +92,22 @@ function aliasMatchesParentTier(alias, parentModel) {
91
92
  return false;
92
93
  }
93
94
  }
94
- export function getAgentModelDisplay(model) {
95
+ export function getAgentModelDisplay(model, provider) {
95
96
  // When model is omitted, getDefaultSubagentModel() returns 'inherit' at runtime
96
97
  if (!model)
97
- return 'Inherit from parent (default)';
98
+ return 'Heredar del padre (predeterminado)';
98
99
  if (model === 'inherit')
99
- return 'Inherit from parent';
100
+ return 'Heredar del padre';
101
+ if (provider && provider !== 'claude')
102
+ return model;
100
103
  return capitalize(model);
101
104
  }
105
+ export function getAgentProviderDisplay(provider) {
106
+ if (!provider) {
107
+ return 'Heredar del padre';
108
+ }
109
+ return getVisibleProvider(provider).label;
110
+ }
102
111
  /**
103
112
  * Get available model options for agents
104
113
  */
@@ -0,0 +1,11 @@
1
+ import { AsyncLocalStorage } from 'async_hooks';
2
+ const providerOverrideStorage = new AsyncLocalStorage();
3
+ export function getProviderOverride() {
4
+ return providerOverrideStorage.getStore();
5
+ }
6
+ export function runWithProviderOverride(provider, fn) {
7
+ if (!provider) {
8
+ return fn();
9
+ }
10
+ return providerOverrideStorage.run(provider, fn);
11
+ }
@@ -1,6 +1,7 @@
1
1
  import { isEnvTruthy } from '../envUtils.js';
2
2
  import { getSecureStorage } from '../secureStorage/index.js';
3
3
  import { isProviderBaseUrlCustomized } from './providerBaseUrls.js';
4
+ import { getProviderOverride } from './providerOverrideContext.js';
4
5
  import { getStoredActiveProviderPreference } from './providerProfilesDb.js';
5
6
  import { listProviderProfiles } from './providerProfiles.js';
6
7
  function hasStoredOpenAIOAuthToken() {
@@ -31,6 +32,15 @@ function hasStoredClaudeAIOAuthToken() {
31
32
  return false;
32
33
  }
33
34
  }
35
+ export function providerPreferenceToApiProvider(provider) {
36
+ if (!provider) {
37
+ return undefined;
38
+ }
39
+ if (provider === 'claude') {
40
+ return 'firstParty';
41
+ }
42
+ return provider;
43
+ }
34
44
  export function isOpenAIProviderConfigured() {
35
45
  return (isEnvTruthy(process.env.CLAUDE_CODE_USE_OPENAI) ||
36
46
  Boolean(process.env.OPENAI_API_KEY) ||
@@ -168,6 +178,10 @@ export function hasDualProviderSessions() {
168
178
  hasStoredClaudeAIOAuthToken());
169
179
  }
170
180
  export function getAPIProvider() {
181
+ const providerOverride = getProviderOverride();
182
+ if (providerOverride) {
183
+ return providerOverride;
184
+ }
171
185
  if (isEnvTruthy(process.env.CLAUDE_CODE_USE_BEDROCK)) {
172
186
  return 'bedrock';
173
187
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iaforged/context-code",
3
- "version": "1.0.80",
3
+ "version": "1.0.82",
4
4
  "description": "Context Code es un asistente de desarrollo para la terminal. Puede revisar tu proyecto, editar archivos, ejecutar comandos y apoyarte en tareas reales de programacion.",
5
5
  "author": "Context AI",
6
6
  "license": "MIT",