fix: align sessions.patch and tui typing
This commit is contained in:
@@ -5578,6 +5578,83 @@ export async function startGatewayServer(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ("model" in p) {
|
||||||
|
const raw = p.model;
|
||||||
|
if (raw === null) {
|
||||||
|
delete next.providerOverride;
|
||||||
|
delete next.modelOverride;
|
||||||
|
} else if (raw !== undefined) {
|
||||||
|
const trimmed = String(raw).trim();
|
||||||
|
if (!trimmed) {
|
||||||
|
respond(
|
||||||
|
false,
|
||||||
|
undefined,
|
||||||
|
errorShape(
|
||||||
|
ErrorCodes.INVALID_REQUEST,
|
||||||
|
"invalid model: empty",
|
||||||
|
),
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
const resolvedDefault = resolveConfiguredModelRef({
|
||||||
|
cfg,
|
||||||
|
defaultProvider: DEFAULT_PROVIDER,
|
||||||
|
defaultModel: DEFAULT_MODEL,
|
||||||
|
});
|
||||||
|
const aliasIndex = buildModelAliasIndex({
|
||||||
|
cfg,
|
||||||
|
defaultProvider: resolvedDefault.provider,
|
||||||
|
});
|
||||||
|
const resolved = resolveModelRefFromString({
|
||||||
|
raw: trimmed,
|
||||||
|
defaultProvider: resolvedDefault.provider,
|
||||||
|
aliasIndex,
|
||||||
|
});
|
||||||
|
if (!resolved) {
|
||||||
|
respond(
|
||||||
|
false,
|
||||||
|
undefined,
|
||||||
|
errorShape(
|
||||||
|
ErrorCodes.INVALID_REQUEST,
|
||||||
|
`invalid model: ${trimmed}`,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
const catalog = await loadGatewayModelCatalog();
|
||||||
|
const allowed = buildAllowedModelSet({
|
||||||
|
cfg,
|
||||||
|
catalog,
|
||||||
|
defaultProvider: resolvedDefault.provider,
|
||||||
|
});
|
||||||
|
const key = modelKey(
|
||||||
|
resolved.ref.provider,
|
||||||
|
resolved.ref.model,
|
||||||
|
);
|
||||||
|
if (!allowed.allowAny && !allowed.allowedKeys.has(key)) {
|
||||||
|
respond(
|
||||||
|
false,
|
||||||
|
undefined,
|
||||||
|
errorShape(
|
||||||
|
ErrorCodes.INVALID_REQUEST,
|
||||||
|
`model not allowed: ${key}`,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
resolved.ref.provider === resolvedDefault.provider &&
|
||||||
|
resolved.ref.model === resolvedDefault.model
|
||||||
|
) {
|
||||||
|
delete next.providerOverride;
|
||||||
|
delete next.modelOverride;
|
||||||
|
} else {
|
||||||
|
next.providerOverride = resolved.ref.provider;
|
||||||
|
next.modelOverride = resolved.ref.model;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ("groupActivation" in p) {
|
if ("groupActivation" in p) {
|
||||||
const raw = p.groupActivation;
|
const raw = p.groupActivation;
|
||||||
if (raw === null) {
|
if (raw === null) {
|
||||||
|
|||||||
@@ -48,9 +48,9 @@ export function getSlashCommands(): SlashCommand[] {
|
|||||||
name: "activation",
|
name: "activation",
|
||||||
description: "Set group activation",
|
description: "Set group activation",
|
||||||
getArgumentCompletions: (prefix) =>
|
getArgumentCompletions: (prefix) =>
|
||||||
ACTIVATION_LEVELS.filter((v) =>
|
ACTIVATION_LEVELS.filter((v) => v.startsWith(prefix.toLowerCase())).map(
|
||||||
v.startsWith(prefix.toLowerCase()),
|
(value) => ({ value, label: value }),
|
||||||
).map((value) => ({ value, label: value })),
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "deliver",
|
name: "deliver",
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import { Container, Spacer, Text } from "@mariozechner/pi-tui";
|
import { Container, Spacer, Text } from "@mariozechner/pi-tui";
|
||||||
|
import { theme } from "../theme/theme.js";
|
||||||
import { AssistantMessageComponent } from "./assistant-message.js";
|
import { AssistantMessageComponent } from "./assistant-message.js";
|
||||||
import { ToolExecutionComponent } from "./tool-execution.js";
|
import { ToolExecutionComponent } from "./tool-execution.js";
|
||||||
import { UserMessageComponent } from "./user-message.js";
|
import { UserMessageComponent } from "./user-message.js";
|
||||||
import { theme } from "../theme/theme.js";
|
|
||||||
|
|
||||||
export class ChatLog extends Container {
|
export class ChatLog extends Container {
|
||||||
private toolById = new Map<string, ToolExecutionComponent>();
|
private toolById = new Map<string, ToolExecutionComponent>();
|
||||||
@@ -46,10 +46,7 @@ export class ChatLog extends Container {
|
|||||||
}
|
}
|
||||||
|
|
||||||
finalizeAssistant(text: string, runId?: string) {
|
finalizeAssistant(text: string, runId?: string) {
|
||||||
if (
|
if (this.streamingAssistant && (!runId || runId === this.streamingRunId)) {
|
||||||
this.streamingAssistant &&
|
|
||||||
(!runId || runId === this.streamingRunId)
|
|
||||||
) {
|
|
||||||
this.streamingAssistant.setText(text);
|
this.streamingAssistant.setText(text);
|
||||||
} else {
|
} else {
|
||||||
this.startAssistant(text, runId);
|
this.startAssistant(text, runId);
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import {
|
import {
|
||||||
SelectList,
|
|
||||||
type SelectItem,
|
type SelectItem,
|
||||||
SettingsList,
|
SelectList,
|
||||||
type SettingItem,
|
type SettingItem,
|
||||||
|
SettingsList,
|
||||||
} from "@mariozechner/pi-tui";
|
} from "@mariozechner/pi-tui";
|
||||||
import { selectListTheme, settingsListTheme } from "../theme/theme.js";
|
import { selectListTheme, settingsListTheme } from "../theme/theme.js";
|
||||||
|
|
||||||
|
|||||||
@@ -42,10 +42,18 @@ export type GatewaySessionList = {
|
|||||||
verboseLevel?: string;
|
verboseLevel?: string;
|
||||||
model?: string;
|
model?: string;
|
||||||
contextTokens?: number | null;
|
contextTokens?: number | null;
|
||||||
|
totalTokens?: number | null;
|
||||||
displayName?: string;
|
displayName?: string;
|
||||||
}>;
|
}>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type GatewayModelChoice = {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
provider: string;
|
||||||
|
contextWindow?: number;
|
||||||
|
};
|
||||||
|
|
||||||
export class GatewayChatClient {
|
export class GatewayChatClient {
|
||||||
private client: GatewayClient;
|
private client: GatewayClient;
|
||||||
private readyPromise: Promise<void>;
|
private readyPromise: Promise<void>;
|
||||||
@@ -161,16 +169,11 @@ export class GatewayChatClient {
|
|||||||
return await this.client.request("status");
|
return await this.client.request("status");
|
||||||
}
|
}
|
||||||
|
|
||||||
async listModels(): Promise<
|
async listModels(): Promise<GatewayModelChoice[]> {
|
||||||
Array<{
|
const res = await this.client.request<{ models?: GatewayModelChoice[] }>(
|
||||||
id: string;
|
"models.list",
|
||||||
name: string;
|
);
|
||||||
provider: string;
|
return Array.isArray(res?.models) ? res.models : [];
|
||||||
contextWindow?: number;
|
|
||||||
}>
|
|
||||||
> {
|
|
||||||
const res = await this.client.request<{ models?: unknown }>("models.list");
|
|
||||||
return Array.isArray(res?.models) ? (res.models as Array<any>) : [];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import chalk from "chalk";
|
|
||||||
import type {
|
import type {
|
||||||
EditorTheme,
|
EditorTheme,
|
||||||
MarkdownTheme,
|
MarkdownTheme,
|
||||||
SelectListTheme,
|
SelectListTheme,
|
||||||
SettingsListTheme,
|
SettingsListTheme,
|
||||||
} from "@mariozechner/pi-tui";
|
} from "@mariozechner/pi-tui";
|
||||||
|
import chalk from "chalk";
|
||||||
|
|
||||||
const palette = {
|
const palette = {
|
||||||
text: "#E8E3D5",
|
text: "#E8E3D5",
|
||||||
|
|||||||
@@ -1,16 +1,19 @@
|
|||||||
import {
|
import {
|
||||||
CombinedAutocompleteProvider,
|
CombinedAutocompleteProvider,
|
||||||
|
type Component,
|
||||||
Container,
|
Container,
|
||||||
ProcessTerminal,
|
ProcessTerminal,
|
||||||
Text,
|
Text,
|
||||||
TUI,
|
TUI,
|
||||||
type Component,
|
|
||||||
} from "@mariozechner/pi-tui";
|
} from "@mariozechner/pi-tui";
|
||||||
import { loadConfig } from "../config/config.js";
|
import { loadConfig } from "../config/config.js";
|
||||||
|
import { getSlashCommands, helpText, parseCommand } from "./commands.js";
|
||||||
import { ChatLog } from "./components/chat-log.js";
|
import { ChatLog } from "./components/chat-log.js";
|
||||||
import { CustomEditor } from "./components/custom-editor.js";
|
import { CustomEditor } from "./components/custom-editor.js";
|
||||||
import { createSelectList, createSettingsList } from "./components/selectors.js";
|
import {
|
||||||
import { getSlashCommands, helpText, parseCommand } from "./commands.js";
|
createSelectList,
|
||||||
|
createSettingsList,
|
||||||
|
} from "./components/selectors.js";
|
||||||
import { GatewayChatClient } from "./gateway-chat.js";
|
import { GatewayChatClient } from "./gateway-chat.js";
|
||||||
import { editorTheme, theme } from "./theme/theme.js";
|
import { editorTheme, theme } from "./theme/theme.js";
|
||||||
|
|
||||||
@@ -180,7 +183,9 @@ export async function runTui(opts: TuiOptions) {
|
|||||||
includeGlobal: false,
|
includeGlobal: false,
|
||||||
includeUnknown: false,
|
includeUnknown: false,
|
||||||
});
|
});
|
||||||
const entry = result.sessions.find((row) => row.key === currentSessionKey);
|
const entry = result.sessions.find(
|
||||||
|
(row) => row.key === currentSessionKey,
|
||||||
|
);
|
||||||
sessionInfo = {
|
sessionInfo = {
|
||||||
thinkingLevel: entry?.thinkingLevel,
|
thinkingLevel: entry?.thinkingLevel,
|
||||||
verboseLevel: entry?.verboseLevel,
|
verboseLevel: entry?.verboseLevel,
|
||||||
@@ -210,7 +215,8 @@ export async function runTui(opts: TuiOptions) {
|
|||||||
};
|
};
|
||||||
currentSessionId =
|
currentSessionId =
|
||||||
typeof record.sessionId === "string" ? record.sessionId : null;
|
typeof record.sessionId === "string" ? record.sessionId : null;
|
||||||
sessionInfo.thinkingLevel = record.thinkingLevel ?? sessionInfo.thinkingLevel;
|
sessionInfo.thinkingLevel =
|
||||||
|
record.thinkingLevel ?? sessionInfo.thinkingLevel;
|
||||||
chatLog.clearAll();
|
chatLog.clearAll();
|
||||||
chatLog.addSystem(`session ${currentSessionKey}`);
|
chatLog.addSystem(`session ${currentSessionKey}`);
|
||||||
for (const entry of record.messages ?? []) {
|
for (const entry of record.messages ?? []) {
|
||||||
|
|||||||
Reference in New Issue
Block a user