@jini-ai/ui 0.3.3 → 0.3.4
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/dist/features/execution/constants.d.ts +30 -0
- package/dist/features/execution/constants.d.ts.map +1 -1
- package/dist/features/execution/constants.js +45 -0
- package/dist/features/execution/constants.js.map +1 -1
- package/dist/features/execution/index.d.ts +3 -3
- package/dist/features/execution/index.d.ts.map +1 -1
- package/dist/features/execution/index.js +2 -2
- package/dist/features/execution/index.js.map +1 -1
- package/dist/features/execution/react/components/AgentCliEnvFields.d.ts.map +1 -1
- package/dist/features/execution/react/components/AgentCliEnvFields.js +8 -1
- package/dist/features/execution/react/components/AgentCliEnvFields.js.map +1 -1
- package/dist/features/execution/react/components/ByokProviderForm.d.ts +28 -1
- package/dist/features/execution/react/components/ByokProviderForm.d.ts.map +1 -1
- package/dist/features/execution/react/components/ByokProviderForm.js +40 -21
- package/dist/features/execution/react/components/ByokProviderForm.js.map +1 -1
- package/dist/features/execution/react/components/ExecutionTab.d.ts +2 -1
- package/dist/features/execution/react/components/ExecutionTab.d.ts.map +1 -1
- package/dist/features/execution/react/components/ExecutionTab.js +7 -3
- package/dist/features/execution/react/components/ExecutionTab.js.map +1 -1
- package/dist/features/execution/react/components/LocalCliAgentCard.d.ts.map +1 -1
- package/dist/features/execution/react/components/LocalCliAgentCard.js +17 -27
- package/dist/features/execution/react/components/LocalCliAgentCard.js.map +1 -1
- package/dist/features/execution/react/hooks/useReasoningControl.d.ts +72 -0
- package/dist/features/execution/react/hooks/useReasoningControl.d.ts.map +1 -0
- package/dist/features/execution/react/hooks/useReasoningControl.js +111 -0
- package/dist/features/execution/react/hooks/useReasoningControl.js.map +1 -0
- package/dist/features/execution/rules.d.ts +87 -1
- package/dist/features/execution/rules.d.ts.map +1 -1
- package/dist/features/execution/rules.js +210 -1
- package/dist/features/execution/rules.js.map +1 -1
- package/dist/features/execution/types.d.ts +82 -0
- package/dist/features/execution/types.d.ts.map +1 -1
- package/dist/features/mcp-ui/sandbox-proxy.d.ts +41 -0
- package/dist/features/mcp-ui/sandbox-proxy.d.ts.map +1 -1
- package/dist/features/mcp-ui/sandbox-proxy.js +88 -0
- package/dist/features/mcp-ui/sandbox-proxy.js.map +1 -1
- package/dist/features/media-providers/react/components/MediaProvidersTab.d.ts.map +1 -1
- package/dist/features/media-providers/react/components/MediaProvidersTab.js +6 -1
- package/dist/features/media-providers/react/components/MediaProvidersTab.js.map +1 -1
- package/dist/features/settings/dialog/styles/settings-dialog.css +53 -0
- package/package.json +1 -1
|
@@ -2,7 +2,8 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
|
|
|
2
2
|
import { useState } from 'react';
|
|
3
3
|
import { useT } from '../../../i18n/index.js';
|
|
4
4
|
import { CUSTOM_MODEL_SENTINEL, DEFAULT_AGENT_DESCRIPTIONS } from '../../constants.js';
|
|
5
|
-
import { agentExecutableRepairState, agentMetaLabel, agentModelSummary, binPathEnvField,
|
|
5
|
+
import { agentExecutableRepairState, agentMetaLabel, agentModelSummary, binPathEnvField, } from '../../rules.js';
|
|
6
|
+
import { useReasoningControl } from '../hooks/useReasoningControl.js';
|
|
6
7
|
import { AgentCliEnvFields } from './AgentCliEnvFields.js';
|
|
7
8
|
import { AgentDiagnosticRow } from './AgentDiagnosticRow.js';
|
|
8
9
|
import { SearchableModelSelect } from './SearchableModelSelect.js';
|
|
@@ -38,27 +39,8 @@ export function LocalCliAgentCard({ agent, config, selected, onSelect, onModelCh
|
|
|
38
39
|
installed: t('Installed'),
|
|
39
40
|
notInstalled: t('Not installed'),
|
|
40
41
|
});
|
|
41
|
-
const models = agent.models ?? [];
|
|
42
|
-
const hasModels = models.length > 0;
|
|
43
|
-
const reasoningOptions = agent.reasoningOptions ?? [];
|
|
44
|
-
const hasReasoning = reasoningOptions.length > 0;
|
|
45
|
-
const resolvedModel = selectedAgentModel(config, agent);
|
|
46
|
-
const rawModel = config.modelByAgentId?.[agent.id] ?? '';
|
|
47
42
|
const summary = agentModelSummary(config, agent);
|
|
48
|
-
const reasoningValue =
|
|
49
|
-
// Adapters opt out via `supportsCustomModel: false` when their CLI has no
|
|
50
|
-
// free-text model flag, or validates the id against a live catalog and
|
|
51
|
-
// rejects unknown ones. `undefined` allows it, matching every adapter's
|
|
52
|
-
// default before this field existed.
|
|
53
|
-
const allowCustomModel = agent.supportsCustomModel !== false;
|
|
54
|
-
const knownModelIds = models.map((model) => model.id);
|
|
55
|
-
const customActive = allowCustomModel && hasModels && shouldShowCustomModelInput(resolvedModel, knownModelIds, explicitCustomMode);
|
|
56
|
-
const selectValue = customActive ? CUSTOM_MODEL_SENTINEL : resolvedModel;
|
|
57
|
-
// While the custom box is open, the text field must show the operator's raw
|
|
58
|
-
// typed text (which may not resolve to anything yet) rather than the
|
|
59
|
-
// resolved-with-fallback value — otherwise every keystroke would show a
|
|
60
|
-
// stale fallback model instead of what was actually typed.
|
|
61
|
-
const customModelInputValue = explicitCustomMode ? rawModel : resolvedModel;
|
|
43
|
+
const { hasModels, reasoningOptions, hasReasoning, reasoningValue, reasoningDisabled, allowCustomModel, customActive, modelChoices, selectValue, customModelInputValue, resolveNextModelId, resolveReasoningModelId, } = useReasoningControl({ agent, config, explicitCustomMode });
|
|
62
44
|
// `modelsSource` is optional in the contract, so an absent value means the
|
|
63
45
|
// host did not say where the list came from — NOT that it came from a
|
|
64
46
|
// built-in fallback. Defaulting to 'fallback' rendered "Built-in list" over
|
|
@@ -107,15 +89,23 @@ export function LocalCliAgentCard({ agent, config, selected, onSelect, onModelCh
|
|
|
107
89
|
};
|
|
108
90
|
return (_jsxs("div", { className: 'jini-agent-card' +
|
|
109
91
|
(selected ? ' is-selected' : '') +
|
|
110
|
-
(agent.installed ? ' is-installed' : ' is-missing'), "data-testid": `jini-agent-card-${agent.id}`, children: [_jsxs("div", { className: "jini-agent-card-main", children: [_jsxs("button", { type: "button", className: "jini-agent-card-select", "data-testid": `jini-agent-select-${agent.id}`, "aria-pressed": selected, disabled: !agent.installed, onClick: () => onSelect(agent.id), children: [_jsx("span", { className: "jini-agent-card-icon", "aria-hidden": "true", children: renderIcon ? renderIcon(agent) : agent.label.slice(0, 1).toUpperCase() }), _jsxs("span", { className: "jini-agent-card-body", children: [_jsxs("span", { className: "jini-agent-card-name", children: [_jsx("span", { className: "jini-agent-card-title", children: agent.label }), description ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "jini-agent-card-name-divider", "aria-hidden": "true", children: "\u00B7" }), _jsx("span", { className: "jini-agent-card-tagline", children: description })] })) : null] }), agent.badges?.length ? (_jsx("span", { className: "jini-agent-card-badges", children: agent.badges.map((badge) => (_jsx("span", { className: "jini-agent-card-badge", children: badge }, badge))) })) : null, meta.text ? (_jsx("span", { className: "jini-agent-card-meta", children: _jsx("span", { title: meta.title || undefined, children: meta.text }) })) : null, !selected && summary ? (_jsxs("span", { className: "jini-agent-card-model-summary", children: [_jsx("span", { children: t('Model') }), _jsx("strong", { children: summary })] })) : null] })] }), selected && onTest ? (_jsx("button", { type: "button", className: 'jini-btn jini-agent-card-test' + (testing ? ' is-loading' : ''), "data-testid": `jini-agent-test-${agent.id}`, disabled: testing, onClick: () => onTest(agent), children: testing ? t('Testing…') : t('Test') })) : null] }), (agent.diagnostics ?? []).map((diagnostic, index) => (_jsx(AgentDiagnosticRow, { diagnostic: diagnostic, handlers: diagnosticHandlers }, `${diagnostic.reason}-${index}`))), selected && (hasModels || hasReasoning) ? (_jsxs("div", { className: "jini-agent-card-config", children: [hasModels ? (_jsxs(_Fragment, { children: [_jsxs("label", { className: "jini-field", children: [_jsxs("span", { className: "jini-field-label", children: [t('Model'), sourceLabel ? (_jsx("span", { className: `jini-agent-model-source ${source}`, children: sourceLabel })) : null] }), _jsx(SearchableModelSelect, { className: "jini-input jini-agent-model-select", ariaLabel: t('Model'), searchPlaceholder: t('Search models'), testId: `jini-agent-model-${agent.id}`, searchInputTestId: `jini-agent-model-search-${agent.id}`, value: selectValue, models:
|
|
92
|
+
(agent.installed ? ' is-installed' : ' is-missing'), "data-testid": `jini-agent-card-${agent.id}`, children: [_jsxs("div", { className: "jini-agent-card-main", children: [_jsxs("button", { type: "button", className: "jini-agent-card-select", "data-testid": `jini-agent-select-${agent.id}`, "aria-pressed": selected, disabled: !agent.installed, onClick: () => onSelect(agent.id), children: [_jsx("span", { className: "jini-agent-card-icon", "aria-hidden": "true", children: renderIcon ? renderIcon(agent) : agent.label.slice(0, 1).toUpperCase() }), _jsxs("span", { className: "jini-agent-card-body", children: [_jsxs("span", { className: "jini-agent-card-name", children: [_jsx("span", { className: "jini-agent-card-title", children: agent.label }), description ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "jini-agent-card-name-divider", "aria-hidden": "true", children: "\u00B7" }), _jsx("span", { className: "jini-agent-card-tagline", children: description })] })) : null] }), agent.badges?.length ? (_jsx("span", { className: "jini-agent-card-badges", children: agent.badges.map((badge) => (_jsx("span", { className: "jini-agent-card-badge", children: badge }, badge))) })) : null, meta.text ? (_jsx("span", { className: "jini-agent-card-meta", children: _jsx("span", { title: meta.title || undefined, children: meta.text }) })) : null, !selected && summary ? (_jsxs("span", { className: "jini-agent-card-model-summary", children: [_jsx("span", { children: t('Model') }), _jsx("strong", { children: summary })] })) : null] })] }), selected && onTest ? (_jsx("button", { type: "button", className: 'jini-btn jini-agent-card-test' + (testing ? ' is-loading' : ''), "data-testid": `jini-agent-test-${agent.id}`, disabled: testing, onClick: () => onTest(agent), children: testing ? t('Testing…') : t('Test') })) : null] }), (agent.diagnostics ?? []).map((diagnostic, index) => (_jsx(AgentDiagnosticRow, { diagnostic: diagnostic, handlers: diagnosticHandlers }, `${diagnostic.reason}-${index}`))), selected && (hasModels || hasReasoning) ? (_jsxs("div", { className: "jini-agent-card-config", children: [hasModels ? (_jsxs(_Fragment, { children: [_jsxs("label", { className: "jini-field", children: [_jsxs("span", { className: "jini-field-label", children: [t('Model'), sourceLabel ? (_jsx("span", { className: `jini-agent-model-source ${source}`, children: sourceLabel })) : null] }), _jsx(SearchableModelSelect, { className: "jini-input jini-agent-model-select", ariaLabel: t('Model'), searchPlaceholder: t('Search models'), testId: `jini-agent-model-${agent.id}`, searchInputTestId: `jini-agent-model-search-${agent.id}`, value: selectValue, models: modelChoices, additionalOptions: allowCustomModel ? [{ value: CUSTOM_MODEL_SENTINEL, label: t('Custom…') }] : undefined, onChange: (nextValue) => {
|
|
111
93
|
if (nextValue === CUSTOM_MODEL_SENTINEL) {
|
|
112
94
|
setExplicitCustomMode(true);
|
|
113
95
|
onModelChange(agent.id, '');
|
|
96
|
+
return;
|
|
114
97
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
98
|
+
setExplicitCustomMode(false);
|
|
99
|
+
onModelChange(agent.id, resolveNextModelId(nextValue));
|
|
100
|
+
} })] }), sourceHint ? _jsx("p", { className: "jini-field-hint", children: sourceHint }) : null] })) : null, customActive ? (_jsxs("label", { className: "jini-field", children: [_jsx("span", { className: "jini-field-label", children: t('Custom model id') }), _jsx("input", { className: "jini-input", type: "text", "data-testid": `jini-agent-model-custom-${agent.id}`, value: customModelInputValue, placeholder: t('e.g. my-fine-tuned-model'), spellCheck: false, onChange: (event) => onModelChange(agent.id, event.target.value.trim()) })] })) : null, hasReasoning ? (_jsxs("label", { className: "jini-field", children: [_jsx("span", { className: "jini-field-label", children: t('Reasoning effort') }), _jsx("select", { className: "jini-input", "data-testid": `jini-agent-reasoning-${agent.id}`, value: reasoningValue, disabled: reasoningDisabled, onChange: (event) => {
|
|
101
|
+
// A model-suffix agent has no reasoning value of its own to record: the choice
|
|
102
|
+
// is which model id runs, so it goes back out through `onModelChange`.
|
|
103
|
+
const suffixModelId = resolveReasoningModelId(event.target.value);
|
|
104
|
+
if (suffixModelId !== null) {
|
|
105
|
+
onModelChange(agent.id, suffixModelId);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
onReasoningChange(agent.id, event.target.value);
|
|
109
|
+
}, children: reasoningOptions.map((option) => (_jsx("option", { value: option.id, children: option.label }, option.id))) })] })) : null] })) : null, selected ? (_jsx(AgentCliEnvFields, { agentId: agent.id, fields: cliEnvFields, config: config, onChange: onEnvChange })) : null, result ? (_jsx("p", { className: 'jini-agent-card-test-result is-' + result.status, role: result.status === 'error' ? 'alert' : 'status', children: result.message ?? (result.status === 'ok' ? t('Agent is ready.') : t('Agent check failed')) })) : null, repair && repairField ? (_jsxs("div", { className: "jini-agent-card-path-repair", children: [_jsx("span", { className: "jini-field-hint", children: t('A custom path override did not work, so this used the automatically detected binary instead.') }), _jsxs("div", { className: "jini-agent-card-path-repair-actions", children: [repair.canUseDetected ? (_jsx("button", { type: "button", className: "jini-btn", "data-testid": `jini-agent-path-repair-use-${agent.id}`, onClick: () => onEnvChange(agent.id, repairField.envKey, repair.detectedPath), children: t('Use detected path') })) : null, _jsx("button", { type: "button", className: "jini-btn jini-btn-ghost", "data-testid": `jini-agent-path-repair-clear-${agent.id}`, onClick: () => onEnvChange(agent.id, repairField.envKey, ''), children: t('Clear custom path') })] })] })) : null] }));
|
|
120
110
|
}
|
|
121
111
|
//# sourceMappingURL=LocalCliAgentCard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalCliAgentCard.js","sourceRoot":"","sources":["../../../../../src/features/execution/react/components/LocalCliAgentCard.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,EACL,0BAA0B,EAC1B,cAAc,EACd,iBAAiB,EACjB,eAAe,
|
|
1
|
+
{"version":3,"file":"LocalCliAgentCard.js","sourceRoot":"","sources":["../../../../../src/features/execution/react/components/LocalCliAgentCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { AgentModelOption, DetectedAgent, LocalCliConfig, ReasoningModelGroup } from '../../types.js';
|
|
2
|
+
export interface UseReasoningControlOptions {
|
|
3
|
+
agent: DetectedAgent;
|
|
4
|
+
config: LocalCliConfig;
|
|
5
|
+
explicitCustomMode?: boolean | undefined;
|
|
6
|
+
}
|
|
7
|
+
export interface UseReasoningControlResult {
|
|
8
|
+
/** The agent's model list, or empty array if not defined. */
|
|
9
|
+
models: readonly AgentModelOption[];
|
|
10
|
+
/** Whether the agent has any models defined. */
|
|
11
|
+
hasModels: boolean;
|
|
12
|
+
/** The model that will run, with fallback to first model or empty string. */
|
|
13
|
+
resolvedModel: string;
|
|
14
|
+
/** The raw model string configured for this agent in `config.modelByAgentId`. */
|
|
15
|
+
rawModel: string;
|
|
16
|
+
/** Vocabulary of suffix levels declared in `agent.reasoningInModelId.levels`. */
|
|
17
|
+
suffixLevels: readonly AgentModelOption[];
|
|
18
|
+
/** IDs of the suffix levels. */
|
|
19
|
+
suffixLevelIds: readonly string[];
|
|
20
|
+
/** Model groups when `reasoningInModelId` is declared, or `null` otherwise. */
|
|
21
|
+
modelGroups: readonly ReasoningModelGroup[] | null;
|
|
22
|
+
/** Active group corresponding to the resolved model, or `null`. */
|
|
23
|
+
activeGroup: ReasoningModelGroup | null;
|
|
24
|
+
/** Active effort level split from the resolved model, or `null`. */
|
|
25
|
+
activeLevel: string | null;
|
|
26
|
+
/** Flat reasoning options declared in `agent.reasoningOptions`. */
|
|
27
|
+
flatReasoningOptions: readonly AgentModelOption[];
|
|
28
|
+
/** Effort options to render in the reasoning dropdown: either flat options or the active group's levels. */
|
|
29
|
+
reasoningOptions: readonly AgentModelOption[];
|
|
30
|
+
/** Whether reasoning effort controls should be displayed. */
|
|
31
|
+
hasReasoning: boolean;
|
|
32
|
+
/** Current value for the reasoning select input. */
|
|
33
|
+
reasoningValue: string;
|
|
34
|
+
/** Whether the reasoning select should be disabled (e.g. single-variant base model). */
|
|
35
|
+
reasoningDisabled: boolean;
|
|
36
|
+
/** Whether custom model free-text input is supported. */
|
|
37
|
+
allowCustomModel: boolean;
|
|
38
|
+
/** Known model IDs in the agent's catalog. */
|
|
39
|
+
knownModelIds: readonly string[];
|
|
40
|
+
/** Whether the custom model input is currently active. */
|
|
41
|
+
customActive: boolean;
|
|
42
|
+
/** Options for the model select: base models for suffix agents, or raw models list. */
|
|
43
|
+
modelChoices: readonly AgentModelOption[];
|
|
44
|
+
/** Selected value for the model select element. */
|
|
45
|
+
selectValue: string;
|
|
46
|
+
/** Display value for the custom model text input. */
|
|
47
|
+
customModelInputValue: string;
|
|
48
|
+
/**
|
|
49
|
+
* Resolves the next full model ID when the base model selection changes.
|
|
50
|
+
* For model-suffix agents, carries over the active level if supported by the new base,
|
|
51
|
+
* or falls back to a valid level for the target group.
|
|
52
|
+
*/
|
|
53
|
+
resolveNextModelId: (nextValue: string) => string;
|
|
54
|
+
/**
|
|
55
|
+
* Resolves the full model ID when a reasoning level is selected for a model-suffix agent.
|
|
56
|
+
* Returns `null` if the agent does not use suffix-in-model-id reasoning.
|
|
57
|
+
*/
|
|
58
|
+
resolveReasoningModelId: (level: string) => string | null;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Orchestrates reasoning-effort and model selection derivation for a local CLI agent.
|
|
62
|
+
*
|
|
63
|
+
* Supports two distinct reasoning shapes:
|
|
64
|
+
* 1. `reasoningOptions` — Flat vocabulary sent via dedicated CLI flags (`--effort high`).
|
|
65
|
+
* Persisted independently via `onReasoningChange`.
|
|
66
|
+
* 2. `reasoningInModelId` — Effort level is encoded as a model slug suffix (`gemini-3.1-pro-high`).
|
|
67
|
+
* The selection is recombined into the model ID itself via `onModelChange`, with base model
|
|
68
|
+
* and effort levels derived from the agent's model catalog via `reasoningModelGroups`.
|
|
69
|
+
*/
|
|
70
|
+
export declare function useReasoningControl(options: UseReasoningControlOptions): UseReasoningControlResult;
|
|
71
|
+
export declare function useReasoningControl(agent: DetectedAgent, config: LocalCliConfig, explicitCustomMode?: boolean): UseReasoningControlResult;
|
|
72
|
+
//# sourceMappingURL=useReasoningControl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useReasoningControl.d.ts","sourceRoot":"","sources":["../../../../../src/features/execution/react/hooks/useReasoningControl.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,cAAc,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC1C;AAED,MAAM,WAAW,yBAAyB;IACxC,6DAA6D;IAC7D,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACpC,gDAAgD;IAChD,SAAS,EAAE,OAAO,CAAC;IACnB,6EAA6E;IAC7E,aAAa,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,YAAY,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC1C,gCAAgC;IAChC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,+EAA+E;IAC/E,WAAW,EAAE,SAAS,mBAAmB,EAAE,GAAG,IAAI,CAAC;IACnD,mEAAmE;IACnE,WAAW,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACxC,oEAAoE;IACpE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,mEAAmE;IACnE,oBAAoB,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClD,4GAA4G;IAC5G,gBAAgB,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC9C,6DAA6D;IAC7D,YAAY,EAAE,OAAO,CAAC;IACtB,oDAAoD;IACpD,cAAc,EAAE,MAAM,CAAC;IACvB,wFAAwF;IACxF,iBAAiB,EAAE,OAAO,CAAC;IAC3B,yDAAyD;IACzD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,8CAA8C;IAC9C,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,0DAA0D;IAC1D,YAAY,EAAE,OAAO,CAAC;IACtB,uFAAuF;IACvF,YAAY,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC1C,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,qBAAqB,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IAClD;;;OAGG;IACH,uBAAuB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CAC3D;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,yBAAyB,CAAC;AACpG,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,cAAc,EACtB,kBAAkB,CAAC,EAAE,OAAO,GAC3B,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import { CUSTOM_MODEL_SENTINEL } from '../../constants.js';
|
|
3
|
+
import { modelIdForReasoningLevel, reasoningModelGroupFor, reasoningModelGroups, selectedAgentModel, selectedAgentReasoning, shouldShowCustomModelInput, splitReasoningModelId, } from '../../rules.js';
|
|
4
|
+
export function useReasoningControl(optionsOrAgent, maybeConfig, maybeExplicitCustomMode) {
|
|
5
|
+
const { agent, config, explicitCustomMode = false } = 'agent' in optionsOrAgent && 'config' in optionsOrAgent
|
|
6
|
+
? optionsOrAgent
|
|
7
|
+
: {
|
|
8
|
+
agent: optionsOrAgent,
|
|
9
|
+
config: maybeConfig,
|
|
10
|
+
explicitCustomMode: maybeExplicitCustomMode ?? false,
|
|
11
|
+
};
|
|
12
|
+
const models = agent.models ?? [];
|
|
13
|
+
const hasModels = models.length > 0;
|
|
14
|
+
const resolvedModel = selectedAgentModel(config, agent);
|
|
15
|
+
const rawModel = config.modelByAgentId?.[agent.id] ?? '';
|
|
16
|
+
// Two ways an agent can expose a reasoning-effort axis, and the card branches on the DECLARATION
|
|
17
|
+
// rather than on the agent's id — adding a third runtime with either shape is a def change, not
|
|
18
|
+
// an edit here.
|
|
19
|
+
//
|
|
20
|
+
// `reasoningOptions` — one flat vocabulary that travels to the CLI as its own flag
|
|
21
|
+
// (`claude --effort high`, codex's `-c model_reasoning_effort=...`).
|
|
22
|
+
// The choice is its own persisted value; `onReasoningChange` owns it.
|
|
23
|
+
// `reasoningInModelId` — no effort flag exists; the level is a suffix on the model id itself
|
|
24
|
+
// (antigravity's `gemini-3.1-pro-high`). The choice IS the model, so
|
|
25
|
+
// it goes through `onModelChange`, and the available levels are
|
|
26
|
+
// derived PER BASE MODEL from the agent's own catalog — they are not
|
|
27
|
+
// uniform (`gemini-3.1-pro` has no `-medium`, and `agy --model`
|
|
28
|
+
// rejects one), so a fixed dropdown would offer ids the CLI refuses.
|
|
29
|
+
const suffixLevels = agent.reasoningInModelId?.levels ?? [];
|
|
30
|
+
const suffixLevelIds = suffixLevels.map((level) => level.id);
|
|
31
|
+
const modelGroups = suffixLevels.length > 0 ? reasoningModelGroups(models, suffixLevels) : null;
|
|
32
|
+
const activeGroup = modelGroups ? reasoningModelGroupFor(modelGroups, resolvedModel, suffixLevelIds) : null;
|
|
33
|
+
const activeLevel = modelGroups ? splitReasoningModelId(resolvedModel, suffixLevelIds).level : null;
|
|
34
|
+
const flatReasoningOptions = agent.reasoningOptions ?? [];
|
|
35
|
+
// Exactly one effort control, whichever shape declared it. `reasoningOptions` wins if a def ever
|
|
36
|
+
// declares both, rather than rendering two controls that disagree about where the choice lands.
|
|
37
|
+
const reasoningOptions = flatReasoningOptions.length > 0 ? flatReasoningOptions : (activeGroup?.levels ?? []);
|
|
38
|
+
const hasReasoning = reasoningOptions.length > 0;
|
|
39
|
+
const reasoningValue = flatReasoningOptions.length > 0
|
|
40
|
+
? selectedAgentReasoning(config, agent)
|
|
41
|
+
: (activeLevel ?? reasoningOptions[0]?.id ?? '');
|
|
42
|
+
// A base model with exactly one variant has a real, fixed level worth showing — but nothing to
|
|
43
|
+
// choose between, so the control is shown disabled rather than offering an illusion of choice.
|
|
44
|
+
const reasoningDisabled = flatReasoningOptions.length === 0 && reasoningOptions.length < 2;
|
|
45
|
+
// Adapters opt out via `supportsCustomModel: false` when their CLI has no
|
|
46
|
+
// free-text model flag, or validates the id against a live catalog and
|
|
47
|
+
// rejects unknown ones. `undefined` allows it, matching every adapter's
|
|
48
|
+
// default before this field existed.
|
|
49
|
+
const allowCustomModel = agent.supportsCustomModel !== false && modelGroups === null;
|
|
50
|
+
const knownModelIds = models.map((model) => model.id);
|
|
51
|
+
const customActive = allowCustomModel && hasModels && shouldShowCustomModelInput(resolvedModel, knownModelIds, explicitCustomMode);
|
|
52
|
+
// A model-suffix agent picks a BASE model here; the effort control below supplies the rest of the
|
|
53
|
+
// id. Everything else about the field — search, labels, provenance badge — is unchanged.
|
|
54
|
+
const modelChoices = modelGroups
|
|
55
|
+
? modelGroups.map((group) => ({ id: group.baseId, label: group.label }))
|
|
56
|
+
: models;
|
|
57
|
+
const selectValue = customActive
|
|
58
|
+
? CUSTOM_MODEL_SENTINEL
|
|
59
|
+
: modelGroups
|
|
60
|
+
? (activeGroup?.baseId ?? '')
|
|
61
|
+
: resolvedModel;
|
|
62
|
+
// While the custom box is open, the text field must show the operator's raw
|
|
63
|
+
// typed text (which may not resolve to anything yet) rather than the
|
|
64
|
+
// resolved-with-fallback value — otherwise every keystroke would show a
|
|
65
|
+
// stale fallback model instead of what was actually typed.
|
|
66
|
+
const customModelInputValue = explicitCustomMode ? rawModel : resolvedModel;
|
|
67
|
+
const resolveNextModelId = useCallback((nextValue) => {
|
|
68
|
+
if (!modelGroups) {
|
|
69
|
+
return nextValue;
|
|
70
|
+
}
|
|
71
|
+
// Switching base carries the current effort level over when the new base
|
|
72
|
+
// really has it, and lands on one it does have otherwise — never composes a
|
|
73
|
+
// slug (see `modelIdForReasoningLevel`), so `gemini-3.1-pro-medium` cannot be
|
|
74
|
+
// produced from a `medium` carried off `gemini-3.8-flash`.
|
|
75
|
+
const nextGroup = modelGroups.find((group) => group.baseId === nextValue);
|
|
76
|
+
return nextGroup ? modelIdForReasoningLevel(nextGroup, activeLevel) : nextValue;
|
|
77
|
+
}, [modelGroups, activeLevel]);
|
|
78
|
+
const resolveReasoningModelId = useCallback((level) => {
|
|
79
|
+
// A model-suffix agent has no reasoning value of its own to record: the choice
|
|
80
|
+
// is which model id runs, so it goes back out through `onModelChange`.
|
|
81
|
+
if (activeGroup) {
|
|
82
|
+
return modelIdForReasoningLevel(activeGroup, level);
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}, [activeGroup]);
|
|
86
|
+
return {
|
|
87
|
+
models,
|
|
88
|
+
hasModels,
|
|
89
|
+
resolvedModel,
|
|
90
|
+
rawModel,
|
|
91
|
+
suffixLevels,
|
|
92
|
+
suffixLevelIds,
|
|
93
|
+
modelGroups,
|
|
94
|
+
activeGroup,
|
|
95
|
+
activeLevel,
|
|
96
|
+
flatReasoningOptions,
|
|
97
|
+
reasoningOptions,
|
|
98
|
+
hasReasoning,
|
|
99
|
+
reasoningValue,
|
|
100
|
+
reasoningDisabled,
|
|
101
|
+
allowCustomModel,
|
|
102
|
+
knownModelIds,
|
|
103
|
+
customActive,
|
|
104
|
+
modelChoices,
|
|
105
|
+
selectValue,
|
|
106
|
+
customModelInputValue,
|
|
107
|
+
resolveNextModelId,
|
|
108
|
+
resolveReasoningModelId,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=useReasoningControl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useReasoningControl.js","sourceRoot":"","sources":["../../../../../src/features/execution/react/hooks/useReasoningControl.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentCliEnvFieldSpec, AgentDiagnostic, AgentExecutableRepair, AgentExecutableSource, AgentModelOption, ByokConfig, ByokProviderCredentials, ByokRequiredField, DetectedAgent, ExecutionConfig, ExecutionMode, LocalCliConfig, ProviderPreset } from './types.js';
|
|
1
|
+
import type { AgentCliEnvFieldSpec, AgentDiagnostic, AgentExecutableRepair, AgentExecutableSource, AgentModelOption, ApiKeyWarning, ByokConfig, ByokProviderCredentials, ByokRequiredField, DetectedAgent, ExecutionConfig, ExecutionMode, LocalCliConfig, ProviderPreset, ReasoningModelGroup } from './types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Pure decision logic for the execution tab. Everything here is total and
|
|
4
4
|
* side-effect free so the React layer stays a thin renderer — same split the
|
|
@@ -47,6 +47,36 @@ export declare function showsBaseUrlField(preset: ProviderPreset | null): boolea
|
|
|
47
47
|
* so a caller can surface the first offender without re-sorting.
|
|
48
48
|
*/
|
|
49
49
|
export declare function missingRequiredFields(config: ByokConfig, preset: ProviderPreset | null): readonly ByokRequiredField[];
|
|
50
|
+
/**
|
|
51
|
+
* The advisory "that key looks wrong" remark for the current draft, or `null` for silence.
|
|
52
|
+
*
|
|
53
|
+
* Warns ONLY on what it can positively recognise as wrong, and there are exactly two such things:
|
|
54
|
+
* a key wearing another catalogued vendor's prefix (pasted into the wrong provider's field), and a
|
|
55
|
+
* key shorter than {@link MIN_PLAUSIBLE_API_KEY_LENGTH} (the reported Chrome-autofilled PASSWORD).
|
|
56
|
+
* Everything else — including every shape this package has never seen — is silence.
|
|
57
|
+
*
|
|
58
|
+
* That direction is the whole design, and it is the fix for a real reported defect. This function
|
|
59
|
+
* used to ask "does the key match the selected preset's pattern?" and warn when it did not: a
|
|
60
|
+
* positive allowlist, which false-positives the instant a vendor issues a shape the catalog has not
|
|
61
|
+
* been taught. That happened within hours of shipping — an operator pasted a working Google Gemini
|
|
62
|
+
* key and was told it did not look like a Google API key. A catalog can prove a string belongs to
|
|
63
|
+
* vendor X; it can never prove a string belongs to nobody. Do not re-derive an allowlist here, and
|
|
64
|
+
* do not add a per-provider branch: the conditions above are the only two that hold without one.
|
|
65
|
+
*
|
|
66
|
+
* ADVISORY ONLY, also by construction: this returns a message, not a validity verdict. No caller may
|
|
67
|
+
* use it to disable a control or gate a submit — a client-side guess must never be able to block a
|
|
68
|
+
* working credential. It is deliberately absent from {@link missingRequiredFields}, which IS a gate.
|
|
69
|
+
*
|
|
70
|
+
* @param config - The active BYOK draft; only `apiKey` is read.
|
|
71
|
+
* @param preset - The resolved preset, or `null` on custom/manual, which is exempt from the
|
|
72
|
+
* cross-vendor arm (see {@link foreignKeyOwner}) but not from the length floor.
|
|
73
|
+
* @param presets - The catalog to recognise foreign keys against. Defaults to empty, which is why
|
|
74
|
+
* omitting it costs the cross-vendor arm and gains nothing else: an under-informed rule must
|
|
75
|
+
* degrade toward silence, never toward guessing.
|
|
76
|
+
* @returns A translatable {@link ApiKeyWarning}, or `null` when there is nothing to say.
|
|
77
|
+
* @complexity O(n·m) via {@link foreignKeyOwner}; the length check is O(1).
|
|
78
|
+
*/
|
|
79
|
+
export declare function apiKeyFormatWarning(config: ByokConfig, preset: ProviderPreset | null, presets?: readonly ProviderPreset[]): ApiKeyWarning | null;
|
|
50
80
|
/**
|
|
51
81
|
* The credentials a given preset would use — the active selection's live
|
|
52
82
|
* top-level fields when `preset` IS the current selection, otherwise that
|
|
@@ -215,4 +245,60 @@ export declare function filterAgentModelOptions(options: readonly AgentModelOpti
|
|
|
215
245
|
* nothing beyond the always-visible one-line `message`. Origin: the
|
|
216
246
|
* `tooltip` computation inside `AgentDiagnosticRow`. */
|
|
217
247
|
export declare function agentDiagnosticTooltip(diagnostic: AgentDiagnostic): string;
|
|
248
|
+
/**
|
|
249
|
+
* Splits a model id into its base and its reasoning-effort suffix, for a runtime that encodes
|
|
250
|
+
* effort inside the id (`DetectedAgent.reasoningInModelId`).
|
|
251
|
+
*
|
|
252
|
+
* Only a trailing `-<token>` whose token appears in `levelIds` is a level. Everything else stays
|
|
253
|
+
* part of the base id — which is the whole point: `claude-opus-4-6-thinking` ends in `-thinking`,
|
|
254
|
+
* which LOOKS like a modifier and is not an effort level, and reading it as one would invent a
|
|
255
|
+
* `claude-opus-4-6` base that has no variants and a `thinking` level no control can render.
|
|
256
|
+
*
|
|
257
|
+
* @param modelId - A full model id from the agent's own catalog.
|
|
258
|
+
* @param levelIds - The declared effort vocabulary (`reasoningInModelId.levels`, ids only).
|
|
259
|
+
* @returns The base id and the level, or `level: null` when the id carries no recognized suffix.
|
|
260
|
+
* @complexity O(k) in `levelIds.length`.
|
|
261
|
+
*/
|
|
262
|
+
export declare function splitReasoningModelId(modelId: string, levelIds: readonly string[]): {
|
|
263
|
+
baseId: string;
|
|
264
|
+
level: string | null;
|
|
265
|
+
};
|
|
266
|
+
/**
|
|
267
|
+
* Groups an agent's model list by base model, recording for each base the effort levels it
|
|
268
|
+
* ACTUALLY has.
|
|
269
|
+
*
|
|
270
|
+
* Derived, never declared — that is the correctness property this function exists for. Verified
|
|
271
|
+
* against `agy models`' real output: `gemini-3.8-flash` has high/medium/low, `gemini-3.1-pro` has
|
|
272
|
+
* ONLY high and low, `gpt-oss-120b` only medium, and `claude-sonnet-4-6` none. A fixed
|
|
273
|
+
* high/medium/low control would offer `gemini-3.1-pro-medium`, which does not exist and which
|
|
274
|
+
* `agy --model` rejects outright. Running the same derivation over whichever list the host
|
|
275
|
+
* supplied — live from the CLI or the def's `fallbackModels` — is also what makes an offline
|
|
276
|
+
* degrade behave consistently rather than differently.
|
|
277
|
+
*
|
|
278
|
+
* @param models - The agent's model catalog, in the order it should be offered.
|
|
279
|
+
* @param levels - The declared effort vocabulary, in display order.
|
|
280
|
+
* @returns One group per base id, in first-appearance order. With an empty vocabulary every id is
|
|
281
|
+
* its own bare group, so a caller needs no special case for "this agent declares nothing".
|
|
282
|
+
* @complexity O(n * k) in the catalog size and the vocabulary size.
|
|
283
|
+
*/
|
|
284
|
+
export declare function reasoningModelGroups(models: readonly AgentModelOption[], levels: readonly AgentModelOption[]): ReasoningModelGroup[];
|
|
285
|
+
/** The group a full model id belongs to, or `null` when the id is not in this catalog at all — a
|
|
286
|
+
* saved pick from an older/different catalog must not be silently attached to some other base. */
|
|
287
|
+
export declare function reasoningModelGroupFor(groups: readonly ReasoningModelGroup[], modelId: string, levelIds: readonly string[]): ReasoningModelGroup | null;
|
|
288
|
+
/**
|
|
289
|
+
* Recombines a base model and an effort level back into one model id — the value `--model`
|
|
290
|
+
* actually receives.
|
|
291
|
+
*
|
|
292
|
+
* Never composes a string: every id it can return came out of the agent's own catalog. That is
|
|
293
|
+
* what makes "switch base while a level is selected" safe — carrying `medium` from
|
|
294
|
+
* `gemini-3.8-flash` over to `gemini-3.1-pro` cannot produce `gemini-3.1-pro-medium`, because
|
|
295
|
+
* that base's table has no `medium` entry and the fallback below lands on a level it does have.
|
|
296
|
+
*
|
|
297
|
+
* @param group - The target base's derived group.
|
|
298
|
+
* @param level - The level to prefer, or `null` for "no preference".
|
|
299
|
+
* @returns An id from the catalog: the requested level's, else the base's bare id, else its first
|
|
300
|
+
* available level's, else the bare base id (only reachable for a group built from nothing).
|
|
301
|
+
* @complexity O(1).
|
|
302
|
+
*/
|
|
303
|
+
export declare function modelIdForReasoningLevel(group: ReasoningModelGroup, level: string | null): string;
|
|
218
304
|
//# sourceMappingURL=rules.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/features/execution/rules.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/features/execution/rules.ts"],"names":[],"mappings":"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"}
|