@agent-relay/dashboard 2.0.90 → 2.0.92
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/out/404.html +1 -1
- package/out/_next/static/chunks/5518-6d77237eefc8d5ae.js +1 -0
- package/out/_next/static/chunks/app/app/[[...slug]]/{page-4f01a33b51f23cea.js → page-c1376e695ba19e38.js} +1 -1
- package/out/_next/static/chunks/app/{page-2644ed4067d978e0.js → page-f2ebc7d0bc08e395.js} +1 -1
- package/out/about.html +1 -1
- package/out/about.txt +1 -1
- package/out/app/onboarding.html +1 -1
- package/out/app/onboarding.txt +1 -1
- package/out/app.html +1 -1
- package/out/app.txt +2 -2
- package/out/blog/go-to-bed-wake-up-to-a-finished-product.html +1 -1
- package/out/blog/go-to-bed-wake-up-to-a-finished-product.txt +1 -1
- package/out/blog/let-them-cook-multi-agent-orchestration.html +1 -1
- package/out/blog/let-them-cook-multi-agent-orchestration.txt +1 -1
- package/out/blog.html +1 -1
- package/out/blog.txt +1 -1
- package/out/careers.html +1 -1
- package/out/careers.txt +1 -1
- package/out/changelog.html +1 -1
- package/out/changelog.txt +1 -1
- package/out/cloud/link.html +1 -1
- package/out/cloud/link.txt +1 -1
- package/out/complete-profile.html +1 -1
- package/out/complete-profile.txt +1 -1
- package/out/connect-repos.html +1 -1
- package/out/connect-repos.txt +1 -1
- package/out/contact.html +1 -1
- package/out/contact.txt +1 -1
- package/out/dev/cli-tools.html +1 -1
- package/out/dev/cli-tools.txt +1 -1
- package/out/dev/log-viewer.html +1 -1
- package/out/dev/log-viewer.txt +1 -1
- package/out/docs.html +1 -1
- package/out/docs.txt +1 -1
- package/out/history.html +1 -1
- package/out/history.txt +1 -1
- package/out/index.html +1 -1
- package/out/index.txt +2 -2
- package/out/login.html +1 -1
- package/out/login.txt +1 -1
- package/out/metrics.html +1 -1
- package/out/metrics.txt +1 -1
- package/out/pricing.html +1 -1
- package/out/pricing.txt +1 -1
- package/out/privacy.html +1 -1
- package/out/privacy.txt +1 -1
- package/out/providers/setup/claude.html +1 -1
- package/out/providers/setup/claude.txt +1 -1
- package/out/providers/setup/codex.html +1 -1
- package/out/providers/setup/codex.txt +1 -1
- package/out/providers/setup/cursor.html +1 -1
- package/out/providers/setup/cursor.txt +1 -1
- package/out/providers.html +1 -1
- package/out/providers.txt +1 -1
- package/out/security.html +1 -1
- package/out/security.txt +1 -1
- package/out/signup.html +1 -1
- package/out/signup.txt +1 -1
- package/out/terms.html +1 -1
- package/out/terms.txt +1 -1
- package/package.json +1 -1
- package/src/components/App.tsx +6 -0
- package/src/components/SpawnModal.tsx +76 -171
- package/src/components/hooks/useMessages.test.ts +116 -0
- package/src/components/hooks/useMessages.ts +58 -4
- package/src/components/hooks/useModelOptions.ts +78 -0
- package/src/components/settings/SettingsPage.tsx +51 -105
- package/src/components/settings/types.ts +6 -9
- package/out/_next/static/chunks/9626-10e71fc51b892784.js +0 -1
- /package/out/_next/static/{pp6J1TkgtRc_o3BmtFoV0 → 5cqIVzlh9DbJT28EbNrcC}/_buildManifest.js +0 -0
- /package/out/_next/static/{pp6J1TkgtRc_o3BmtFoV0 → 5cqIVzlh9DbJT28EbNrcC}/_ssgManifest.js +0 -0
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
import React, { useState, useEffect, useCallback } from 'react';
|
|
14
14
|
import { useDashboardConfig, type DashboardFeatures } from '../../adapters';
|
|
15
15
|
import type { Settings, CliType } from './types';
|
|
16
|
-
import {
|
|
16
|
+
import type { ModelOption } from '../SpawnModal';
|
|
17
17
|
|
|
18
18
|
type SettingsTab = 'dashboard' | 'workspace' | 'team' | 'billing';
|
|
19
19
|
|
|
@@ -32,13 +32,12 @@ export interface SettingsPageProps {
|
|
|
32
32
|
activeWorkspaceId?: string | null;
|
|
33
33
|
/** Callback when repos are added/removed in workspace settings */
|
|
34
34
|
onReposChanged?: () => void;
|
|
35
|
-
/** Model options per agent type — provided by the host app */
|
|
35
|
+
/** Model options per agent type — provided by the host app (fetched from /api/models) */
|
|
36
36
|
modelOptions?: {
|
|
37
|
-
|
|
38
|
-
cursor?: ModelOption[];
|
|
39
|
-
codex?: ModelOption[];
|
|
40
|
-
gemini?: ModelOption[];
|
|
37
|
+
[cli: string]: ModelOption[];
|
|
41
38
|
};
|
|
39
|
+
/** Default model per CLI from cli-registry.yaml (fetched from /api/models) */
|
|
40
|
+
registryDefaultModels?: Record<string, string>;
|
|
42
41
|
}
|
|
43
42
|
|
|
44
43
|
interface WorkspaceSummary {
|
|
@@ -60,6 +59,16 @@ function resolveInitialTab(initialTab: SettingsTab, features: DashboardFeatures)
|
|
|
60
59
|
|
|
61
60
|
const EMPTY_MODEL_OPTIONS: ModelOption[] = [];
|
|
62
61
|
|
|
62
|
+
/** All CLIs that support model selection */
|
|
63
|
+
const MODEL_CLIS = [
|
|
64
|
+
{ id: 'claude', label: 'Claude' },
|
|
65
|
+
{ id: 'cursor', label: 'Cursor' },
|
|
66
|
+
{ id: 'codex', label: 'Codex' },
|
|
67
|
+
{ id: 'gemini', label: 'Gemini' },
|
|
68
|
+
{ id: 'opencode', label: 'OpenCode' },
|
|
69
|
+
{ id: 'droid', label: 'Droid' },
|
|
70
|
+
] as const;
|
|
71
|
+
|
|
63
72
|
export function SettingsPage({
|
|
64
73
|
initialTab = 'dashboard',
|
|
65
74
|
onClose,
|
|
@@ -67,14 +76,14 @@ export function SettingsPage({
|
|
|
67
76
|
onUpdateSettings,
|
|
68
77
|
activeWorkspaceId,
|
|
69
78
|
modelOptions,
|
|
79
|
+
registryDefaultModels,
|
|
70
80
|
}: SettingsPageProps) {
|
|
71
81
|
const config = useDashboardConfig();
|
|
72
82
|
const { features, api, settingsSlots } = config;
|
|
73
83
|
|
|
74
|
-
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
const geminiModels = modelOptions?.gemini ?? DEFAULT_MODEL_OPTIONS.gemini ?? EMPTY_MODEL_OPTIONS;
|
|
84
|
+
/** Resolve models for any CLI */
|
|
85
|
+
const getModelsForCli = (cli: string): ModelOption[] =>
|
|
86
|
+
modelOptions?.[cli] ?? EMPTY_MODEL_OPTIONS;
|
|
78
87
|
|
|
79
88
|
const [activeTab, setActiveTab] = useState<SettingsTab>(() =>
|
|
80
89
|
resolveInitialTab(initialTab, features)
|
|
@@ -384,106 +393,43 @@ export function SettingsPage({
|
|
|
384
393
|
<option value="claude">Claude</option>
|
|
385
394
|
<option value="codex">Codex</option>
|
|
386
395
|
<option value="gemini">Gemini</option>
|
|
396
|
+
<option value="opencode">OpenCode</option>
|
|
397
|
+
<option value="droid">Droid</option>
|
|
387
398
|
<option value="cursor">Cursor</option>
|
|
388
399
|
<option value="custom">Custom</option>
|
|
389
400
|
</select>
|
|
390
401
|
</SettingRow>
|
|
391
402
|
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
defaultModels
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
onChange={(e) => updateSettings((prev) => ({
|
|
423
|
-
...prev,
|
|
424
|
-
agentDefaults: {
|
|
425
|
-
...prev.agentDefaults,
|
|
426
|
-
defaultModels: {
|
|
427
|
-
...prev.agentDefaults?.defaultModels,
|
|
428
|
-
cursor: e.target.value,
|
|
429
|
-
},
|
|
430
|
-
},
|
|
431
|
-
}))}
|
|
432
|
-
className="px-4 py-2 bg-bg-tertiary border border-border-subtle rounded-lg text-sm text-text-primary focus:outline-none focus:border-accent-cyan"
|
|
433
|
-
>
|
|
434
|
-
{cursorModels.map((model) => (
|
|
435
|
-
<option key={model.value} value={model.value}>{model.label}</option>
|
|
436
|
-
))}
|
|
437
|
-
</select>
|
|
438
|
-
</SettingRow>
|
|
439
|
-
|
|
440
|
-
<SettingRow
|
|
441
|
-
label="Default Codex Model"
|
|
442
|
-
description="Default model when spawning Codex agents"
|
|
443
|
-
>
|
|
444
|
-
<select
|
|
445
|
-
value={settings.agentDefaults?.defaultModels?.codex ?? codexModels[0]?.value ?? ''}
|
|
446
|
-
onChange={(e) => updateSettings((prev) => ({
|
|
447
|
-
...prev,
|
|
448
|
-
agentDefaults: {
|
|
449
|
-
...prev.agentDefaults,
|
|
450
|
-
defaultModels: {
|
|
451
|
-
...prev.agentDefaults?.defaultModels,
|
|
452
|
-
codex: e.target.value,
|
|
453
|
-
},
|
|
454
|
-
},
|
|
455
|
-
}))}
|
|
456
|
-
className="px-4 py-2 bg-bg-tertiary border border-border-subtle rounded-lg text-sm text-text-primary focus:outline-none focus:border-accent-cyan"
|
|
457
|
-
>
|
|
458
|
-
{codexModels.map((model) => (
|
|
459
|
-
<option key={model.value} value={model.value}>{model.label}</option>
|
|
460
|
-
))}
|
|
461
|
-
</select>
|
|
462
|
-
</SettingRow>
|
|
463
|
-
|
|
464
|
-
<SettingRow
|
|
465
|
-
label="Default Gemini Model"
|
|
466
|
-
description="Default model when spawning Gemini agents"
|
|
467
|
-
>
|
|
468
|
-
<select
|
|
469
|
-
value={settings.agentDefaults?.defaultModels?.gemini ?? geminiModels[0]?.value ?? ''}
|
|
470
|
-
onChange={(e) => updateSettings((prev) => ({
|
|
471
|
-
...prev,
|
|
472
|
-
agentDefaults: {
|
|
473
|
-
...prev.agentDefaults,
|
|
474
|
-
defaultModels: {
|
|
475
|
-
...prev.agentDefaults?.defaultModels,
|
|
476
|
-
gemini: e.target.value,
|
|
477
|
-
},
|
|
478
|
-
},
|
|
479
|
-
}))}
|
|
480
|
-
className="px-4 py-2 bg-bg-tertiary border border-border-subtle rounded-lg text-sm text-text-primary focus:outline-none focus:border-accent-cyan"
|
|
481
|
-
>
|
|
482
|
-
{geminiModels.map((model) => (
|
|
483
|
-
<option key={model.value} value={model.value}>{model.label}</option>
|
|
484
|
-
))}
|
|
485
|
-
</select>
|
|
486
|
-
</SettingRow>
|
|
403
|
+
{MODEL_CLIS.map(({ id, label }) => {
|
|
404
|
+
const models = getModelsForCli(id);
|
|
405
|
+
if (models.length === 0) return null;
|
|
406
|
+
return (
|
|
407
|
+
<SettingRow
|
|
408
|
+
key={id}
|
|
409
|
+
label={`Default ${label} Model`}
|
|
410
|
+
description={`Default model when spawning ${label} agents`}
|
|
411
|
+
>
|
|
412
|
+
<select
|
|
413
|
+
value={settings.agentDefaults?.defaultModels?.[id] ?? registryDefaultModels?.[id] ?? models[0]?.value ?? ''}
|
|
414
|
+
onChange={(e) => updateSettings((prev) => ({
|
|
415
|
+
...prev,
|
|
416
|
+
agentDefaults: {
|
|
417
|
+
...prev.agentDefaults,
|
|
418
|
+
defaultModels: {
|
|
419
|
+
...prev.agentDefaults?.defaultModels,
|
|
420
|
+
[id]: e.target.value,
|
|
421
|
+
},
|
|
422
|
+
},
|
|
423
|
+
}))}
|
|
424
|
+
className="px-4 py-2 bg-bg-tertiary border border-border-subtle rounded-lg text-sm text-text-primary focus:outline-none focus:border-accent-cyan"
|
|
425
|
+
>
|
|
426
|
+
{models.map((model) => (
|
|
427
|
+
<option key={model.value} value={model.value}>{model.label}</option>
|
|
428
|
+
))}
|
|
429
|
+
</select>
|
|
430
|
+
</SettingRow>
|
|
431
|
+
);
|
|
432
|
+
})}
|
|
487
433
|
</SettingsSection>
|
|
488
434
|
</div>
|
|
489
435
|
)}
|
|
@@ -12,12 +12,7 @@ export interface AgentDefaults {
|
|
|
12
12
|
/** Default CLI type when opening spawn modal (null = show all templates) */
|
|
13
13
|
defaultCliType: CliType | null;
|
|
14
14
|
/** Default models for each CLI type that supports model selection */
|
|
15
|
-
defaultModels:
|
|
16
|
-
claude: string;
|
|
17
|
-
cursor: string;
|
|
18
|
-
codex: string;
|
|
19
|
-
gemini: string;
|
|
20
|
-
};
|
|
15
|
+
defaultModels: Record<string, string>;
|
|
21
16
|
}
|
|
22
17
|
|
|
23
18
|
export interface Settings {
|
|
@@ -71,9 +66,11 @@ export const defaultSettings: Settings = {
|
|
|
71
66
|
defaultCliType: null,
|
|
72
67
|
defaultModels: {
|
|
73
68
|
claude: 'sonnet',
|
|
74
|
-
cursor: 'opus-4.
|
|
75
|
-
codex: 'gpt-5.
|
|
76
|
-
gemini: 'gemini-
|
|
69
|
+
cursor: 'opus-4.6-thinking',
|
|
70
|
+
codex: 'gpt-5.4',
|
|
71
|
+
gemini: 'gemini-3.1-pro-preview',
|
|
72
|
+
opencode: 'openai/gpt-5.2',
|
|
73
|
+
droid: 'opus-4.6-fast',
|
|
77
74
|
},
|
|
78
75
|
},
|
|
79
76
|
};
|