atom-lite 0.0.0-stage → 0.4.1
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/CHANGELOG.md +72 -0
- package/LICENSE +21 -0
- package/README.md +313 -2
- package/dist/agent/loop.d.ts +32 -0
- package/dist/agent/loop.js +204 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/types.d.ts +85 -0
- package/dist/agent/types.js +2 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli/activity.d.ts +45 -0
- package/dist/cli/activity.js +141 -0
- package/dist/cli/activity.js.map +1 -0
- package/dist/cli/app.d.ts +1 -0
- package/dist/cli/app.js +1576 -0
- package/dist/cli/app.js.map +1 -0
- package/dist/cli/approval-prompt.d.ts +24 -0
- package/dist/cli/approval-prompt.js +82 -0
- package/dist/cli/approval-prompt.js.map +1 -0
- package/dist/cli/approvals.d.ts +1 -0
- package/dist/cli/approvals.js +2 -0
- package/dist/cli/approvals.js.map +1 -0
- package/dist/cli/banner.d.ts +12 -0
- package/dist/cli/banner.js +35 -0
- package/dist/cli/banner.js.map +1 -0
- package/dist/cli/commands.d.ts +94 -0
- package/dist/cli/commands.js +324 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/diff.d.ts +1 -0
- package/dist/cli/diff.js +28 -0
- package/dist/cli/diff.js.map +1 -0
- package/dist/cli/input.d.ts +2 -0
- package/dist/cli/input.js +10 -0
- package/dist/cli/input.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +22 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/mouse.d.ts +54 -0
- package/dist/cli/mouse.js +83 -0
- package/dist/cli/mouse.js.map +1 -0
- package/dist/cli/palette.d.ts +41 -0
- package/dist/cli/palette.js +212 -0
- package/dist/cli/palette.js.map +1 -0
- package/dist/cli/panel.d.ts +29 -0
- package/dist/cli/panel.js +48 -0
- package/dist/cli/panel.js.map +1 -0
- package/dist/cli/picker.d.ts +34 -0
- package/dist/cli/picker.js +173 -0
- package/dist/cli/picker.js.map +1 -0
- package/dist/cli/renderer.d.ts +1 -0
- package/dist/cli/renderer.js +5 -0
- package/dist/cli/renderer.js.map +1 -0
- package/dist/cli/secret-input.d.ts +21 -0
- package/dist/cli/secret-input.js +101 -0
- package/dist/cli/secret-input.js.map +1 -0
- package/dist/cli/status-line.d.ts +24 -0
- package/dist/cli/status-line.js +49 -0
- package/dist/cli/status-line.js.map +1 -0
- package/dist/cli/stream-text.d.ts +18 -0
- package/dist/cli/stream-text.js +63 -0
- package/dist/cli/stream-text.js.map +1 -0
- package/dist/cli/theme.d.ts +48 -0
- package/dist/cli/theme.js +158 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/cli/tool-box.d.ts +41 -0
- package/dist/cli/tool-box.js +177 -0
- package/dist/cli/tool-box.js.map +1 -0
- package/dist/cli/transcript.d.ts +26 -0
- package/dist/cli/transcript.js +64 -0
- package/dist/cli/transcript.js.map +1 -0
- package/dist/config/credentials.d.ts +26 -0
- package/dist/config/credentials.js +79 -0
- package/dist/config/credentials.js.map +1 -0
- package/dist/config/defaults.d.ts +34 -0
- package/dist/config/defaults.js +35 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/load.d.ts +9 -0
- package/dist/config/load.js +137 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/paths.d.ts +4 -0
- package/dist/config/paths.js +14 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/schema.d.ts +132 -0
- package/dist/config/schema.js +83 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/write.d.ts +20 -0
- package/dist/config/write.js +70 -0
- package/dist/config/write.js.map +1 -0
- package/dist/context/budget.d.ts +2 -0
- package/dist/context/budget.js +13 -0
- package/dist/context/budget.js.map +1 -0
- package/dist/context/builder.d.ts +7 -0
- package/dist/context/builder.js +11 -0
- package/dist/context/builder.js.map +1 -0
- package/dist/context/compaction.d.ts +1 -0
- package/dist/context/compaction.js +5 -0
- package/dist/context/compaction.js.map +1 -0
- package/dist/context/instructions.d.ts +3 -0
- package/dist/context/instructions.js +30 -0
- package/dist/context/instructions.js.map +1 -0
- package/dist/context/manager.d.ts +29 -0
- package/dist/context/manager.js +122 -0
- package/dist/context/manager.js.map +1 -0
- package/dist/extensions/api.d.ts +51 -0
- package/dist/extensions/api.js +101 -0
- package/dist/extensions/api.js.map +1 -0
- package/dist/extensions/discovery.d.ts +26 -0
- package/dist/extensions/discovery.js +243 -0
- package/dist/extensions/discovery.js.map +1 -0
- package/dist/extensions/loader.d.ts +27 -0
- package/dist/extensions/loader.js +113 -0
- package/dist/extensions/loader.js.map +1 -0
- package/dist/extensions/trust.d.ts +4 -0
- package/dist/extensions/trust.js +40 -0
- package/dist/extensions/trust.js.map +1 -0
- package/dist/extensions/types.d.ts +52 -0
- package/dist/extensions/types.js +2 -0
- package/dist/extensions/types.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/client.d.ts +73 -0
- package/dist/mcp/client.js +363 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/format.d.ts +3 -0
- package/dist/mcp/format.js +37 -0
- package/dist/mcp/format.js.map +1 -0
- package/dist/mcp/index.d.ts +6 -0
- package/dist/mcp/index.js +7 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/manager.d.ts +53 -0
- package/dist/mcp/manager.js +349 -0
- package/dist/mcp/manager.js.map +1 -0
- package/dist/mcp/stdio-transport.d.ts +26 -0
- package/dist/mcp/stdio-transport.js +191 -0
- package/dist/mcp/stdio-transport.js.map +1 -0
- package/dist/mcp/tools.d.ts +22 -0
- package/dist/mcp/tools.js +162 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/types.d.ts +92 -0
- package/dist/mcp/types.js +2 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/providers/catalog.d.ts +60 -0
- package/dist/providers/catalog.js +289 -0
- package/dist/providers/catalog.js.map +1 -0
- package/dist/providers/context-window.d.ts +11 -0
- package/dist/providers/context-window.js +87 -0
- package/dist/providers/context-window.js.map +1 -0
- package/dist/providers/factory.d.ts +2 -0
- package/dist/providers/factory.js +55 -0
- package/dist/providers/factory.js.map +1 -0
- package/dist/providers/fake.d.ts +14 -0
- package/dist/providers/fake.js +23 -0
- package/dist/providers/fake.js.map +1 -0
- package/dist/providers/gemini.d.ts +24 -0
- package/dist/providers/gemini.js +228 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/index.js +4 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/ollama.d.ts +64 -0
- package/dist/providers/ollama.js +433 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai-compatible.d.ts +27 -0
- package/dist/providers/openai-compatible.js +282 -0
- package/dist/providers/openai-compatible.js.map +1 -0
- package/dist/providers/registry.d.ts +7 -0
- package/dist/providers/registry.js +13 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/tool-calls.d.ts +18 -0
- package/dist/providers/tool-calls.js +42 -0
- package/dist/providers/tool-calls.js.map +1 -0
- package/dist/providers/types.d.ts +16 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/runtime/approvals.d.ts +20 -0
- package/dist/runtime/approvals.js +20 -0
- package/dist/runtime/approvals.js.map +1 -0
- package/dist/runtime/executor.d.ts +2 -0
- package/dist/runtime/executor.js +4 -0
- package/dist/runtime/executor.js.map +1 -0
- package/dist/runtime/locks.d.ts +13 -0
- package/dist/runtime/locks.js +180 -0
- package/dist/runtime/locks.js.map +1 -0
- package/dist/runtime/scheduler.d.ts +7 -0
- package/dist/runtime/scheduler.js +110 -0
- package/dist/runtime/scheduler.js.map +1 -0
- package/dist/security/paths.d.ts +1 -0
- package/dist/security/paths.js +35 -0
- package/dist/security/paths.js.map +1 -0
- package/dist/security/process.d.ts +1 -0
- package/dist/security/process.js +8 -0
- package/dist/security/process.js.map +1 -0
- package/dist/security/redaction.d.ts +1 -0
- package/dist/security/redaction.js +4 -0
- package/dist/security/redaction.js.map +1 -0
- package/dist/sessions/events.d.ts +30 -0
- package/dist/sessions/events.js +92 -0
- package/dist/sessions/events.js.map +1 -0
- package/dist/sessions/history.d.ts +18 -0
- package/dist/sessions/history.js +76 -0
- package/dist/sessions/history.js.map +1 -0
- package/dist/sessions/index.d.ts +5 -0
- package/dist/sessions/index.js +6 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/sessions/recovery.d.ts +6 -0
- package/dist/sessions/recovery.js +35 -0
- package/dist/sessions/recovery.js.map +1 -0
- package/dist/sessions/search.d.ts +16 -0
- package/dist/sessions/search.js +136 -0
- package/dist/sessions/search.js.map +1 -0
- package/dist/sessions/store.d.ts +91 -0
- package/dist/sessions/store.js +360 -0
- package/dist/sessions/store.js.map +1 -0
- package/dist/skills/registry.d.ts +23 -0
- package/dist/skills/registry.js +129 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/tools/bash.d.ts +2 -0
- package/dist/tools/bash.js +159 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/diff.d.ts +7 -0
- package/dist/tools/diff.js +40 -0
- package/dist/tools/diff.js.map +1 -0
- package/dist/tools/edit.d.ts +2 -0
- package/dist/tools/edit.js +118 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/read.d.ts +2 -0
- package/dist/tools/read.js +138 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/registry.d.ts +7 -0
- package/dist/tools/registry.js +13 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +27 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/webfetch.d.ts +2 -0
- package/dist/tools/webfetch.js +97 -0
- package/dist/tools/webfetch.js.map +1 -0
- package/dist/tools/websearch.d.ts +2 -0
- package/dist/tools/websearch.js +88 -0
- package/dist/tools/websearch.js.map +1 -0
- package/dist/tools/write.d.ts +2 -0
- package/dist/tools/write.js +91 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/types.d.ts +84 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/package.json +74 -4
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { checkApproval } from "../runtime/approvals.js";
|
|
2
|
+
export const MCP_APPROVAL_REQUIRED = "MCP_APPROVAL_REQUIRED";
|
|
3
|
+
export const MCP_CALL_FAILED = "MCP_CALL_FAILED";
|
|
4
|
+
export const MCP_APPROVAL_PREFIX = "mcp";
|
|
5
|
+
/**
|
|
6
|
+
* Wrap one discovered MCP tool as an Atom-lite `Tool`. The execution path is
|
|
7
|
+
* the same as built-ins: it receives the normal context, honours approval
|
|
8
|
+
* policy, and returns the normal result shape.
|
|
9
|
+
*/
|
|
10
|
+
export class McpTool {
|
|
11
|
+
manager;
|
|
12
|
+
tool;
|
|
13
|
+
definition;
|
|
14
|
+
constructor(manager, tool) {
|
|
15
|
+
this.manager = manager;
|
|
16
|
+
this.tool = tool;
|
|
17
|
+
this.definition = {
|
|
18
|
+
name: tool.name,
|
|
19
|
+
description: tool.description,
|
|
20
|
+
parameters: tool.inputSchema,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
async execute(call, ctx) {
|
|
24
|
+
const args = (call.arguments ?? {});
|
|
25
|
+
const current = this.manager
|
|
26
|
+
.tools()
|
|
27
|
+
.find((t) => t.server === this.tool.server &&
|
|
28
|
+
t.remoteName === this.tool.remoteName);
|
|
29
|
+
const requiresApproval = current?.requiresApproval ?? this.tool.requiresApproval;
|
|
30
|
+
const callTimeoutMs = current?.callTimeoutMs ?? this.tool.callTimeoutMs;
|
|
31
|
+
if (requiresApproval) {
|
|
32
|
+
const approvals = ctx.approvals;
|
|
33
|
+
const request = {
|
|
34
|
+
command: `${MCP_APPROVAL_PREFIX} ${this.tool.server}/${this.tool.remoteName} ${JSON.stringify(args)}`,
|
|
35
|
+
cwd: ctx.workspace,
|
|
36
|
+
timeoutMs: callTimeoutMs,
|
|
37
|
+
sandboxed: true,
|
|
38
|
+
};
|
|
39
|
+
if (!approvals) {
|
|
40
|
+
return {
|
|
41
|
+
toolCallId: call.id,
|
|
42
|
+
name: this.tool.name,
|
|
43
|
+
content: `${MCP_APPROVAL_REQUIRED}: approvals unavailable`,
|
|
44
|
+
isError: true,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const decision = await checkApproval(approvals, request);
|
|
48
|
+
if (!decision.allowed) {
|
|
49
|
+
return {
|
|
50
|
+
toolCallId: call.id,
|
|
51
|
+
name: this.tool.name,
|
|
52
|
+
content: `${MCP_APPROVAL_REQUIRED}: ${this.tool.server}/${this.tool.remoteName}`,
|
|
53
|
+
isError: true,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const result = await this.manager.callTool(this.tool.server, this.tool.remoteName, args, { signal: ctx.signal });
|
|
59
|
+
return {
|
|
60
|
+
toolCallId: call.id,
|
|
61
|
+
name: this.tool.name,
|
|
62
|
+
content: summariseMcpResult(result),
|
|
63
|
+
isError: Boolean(result?.isError),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
68
|
+
if (message === "USER_CANCELLED") {
|
|
69
|
+
return {
|
|
70
|
+
toolCallId: call.id,
|
|
71
|
+
name: this.tool.name,
|
|
72
|
+
content: "USER_CANCELLED",
|
|
73
|
+
isError: true,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
toolCallId: call.id,
|
|
78
|
+
name: this.tool.name,
|
|
79
|
+
content: `${MCP_CALL_FAILED}: ${message}`,
|
|
80
|
+
isError: true,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export function createMcpTools(manager) {
|
|
86
|
+
return manager.tools().map((tool) => new McpTool(manager, tool));
|
|
87
|
+
}
|
|
88
|
+
/** Map an MCP tool result into the single string Atom-lite tools use. */
|
|
89
|
+
export function summariseMcpResult(result) {
|
|
90
|
+
if (result == null)
|
|
91
|
+
return "";
|
|
92
|
+
if (typeof result !== "object")
|
|
93
|
+
return String(result);
|
|
94
|
+
const record = result;
|
|
95
|
+
if (Array.isArray(record.content)) {
|
|
96
|
+
const parts = record.content.map((part) => {
|
|
97
|
+
if (!part || typeof part !== "object")
|
|
98
|
+
return String(part);
|
|
99
|
+
const typed = part;
|
|
100
|
+
if (typed.type === "text" && typeof typed.text === "string") {
|
|
101
|
+
return typed.text;
|
|
102
|
+
}
|
|
103
|
+
if (typed.type === "image") {
|
|
104
|
+
const mime = typeof typed.mimeType === "string" ? typed.mimeType : "image";
|
|
105
|
+
const bytes = byteLengthOf(typed.data);
|
|
106
|
+
return `[${mime} ${bytes} bytes]`;
|
|
107
|
+
}
|
|
108
|
+
if (typed.type === "audio") {
|
|
109
|
+
const mime = typeof typed.mimeType === "string" ? typed.mimeType : "audio";
|
|
110
|
+
const bytes = byteLengthOf(typed.data);
|
|
111
|
+
return `[${mime} ${bytes} bytes]`;
|
|
112
|
+
}
|
|
113
|
+
if (typed.type === "resource") {
|
|
114
|
+
const resource = typed.resource;
|
|
115
|
+
if (resource && typeof resource === "object") {
|
|
116
|
+
const r = resource;
|
|
117
|
+
const mime = typeof r.mimeType === "string" ? r.mimeType : "resource";
|
|
118
|
+
const bytes = byteLengthOf(r.blob);
|
|
119
|
+
return `[${mime} ${bytes} bytes]`;
|
|
120
|
+
}
|
|
121
|
+
return "[resource]";
|
|
122
|
+
}
|
|
123
|
+
if (typed.type === "resource_link") {
|
|
124
|
+
return typeof typed.uri === "string"
|
|
125
|
+
? `[resource_link ${typed.uri}]`
|
|
126
|
+
: "[resource_link]";
|
|
127
|
+
}
|
|
128
|
+
if (typeof typed.type === "string") {
|
|
129
|
+
const mime = typeof typed.mimeType === "string" ? typed.mimeType : typed.type;
|
|
130
|
+
const bytes = byteLengthOf(typed.data ?? typed.blob);
|
|
131
|
+
if (bytes > 0)
|
|
132
|
+
return `[${mime} ${bytes} bytes]`;
|
|
133
|
+
return `[${typed.type}]`;
|
|
134
|
+
}
|
|
135
|
+
return `[${JSON.stringify(typed).slice(0, 120)}]`;
|
|
136
|
+
});
|
|
137
|
+
return parts.join("\n").trim();
|
|
138
|
+
}
|
|
139
|
+
if (typeof record.result === "string")
|
|
140
|
+
return record.result;
|
|
141
|
+
try {
|
|
142
|
+
return JSON.stringify(record);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return String(record);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function byteLengthOf(value) {
|
|
149
|
+
if (typeof value === "string") {
|
|
150
|
+
// MCP image/audio data is base64.
|
|
151
|
+
try {
|
|
152
|
+
return Buffer.byteLength(value, "base64");
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return Buffer.byteLength(value, "utf8");
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (value instanceof Uint8Array)
|
|
159
|
+
return value.byteLength;
|
|
160
|
+
return 0;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { McpServerConfig } from "../config/schema.js";
|
|
2
|
+
export type { McpServerConfig };
|
|
3
|
+
export type JsonRpcId = number | string;
|
|
4
|
+
export interface JsonRpcRequest {
|
|
5
|
+
jsonrpc: "2.0";
|
|
6
|
+
id: JsonRpcId;
|
|
7
|
+
method: string;
|
|
8
|
+
params?: unknown;
|
|
9
|
+
}
|
|
10
|
+
export interface JsonRpcNotification {
|
|
11
|
+
jsonrpc: "2.0";
|
|
12
|
+
method: string;
|
|
13
|
+
params?: unknown;
|
|
14
|
+
}
|
|
15
|
+
export interface JsonRpcSuccess {
|
|
16
|
+
jsonrpc: "2.0";
|
|
17
|
+
id: JsonRpcId;
|
|
18
|
+
result: unknown;
|
|
19
|
+
}
|
|
20
|
+
export interface JsonRpcFailure {
|
|
21
|
+
jsonrpc: "2.0";
|
|
22
|
+
id: JsonRpcId;
|
|
23
|
+
error: {
|
|
24
|
+
code: number;
|
|
25
|
+
message: string;
|
|
26
|
+
data?: unknown;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export type JsonRpcMessage = JsonRpcRequest | JsonRpcNotification | JsonRpcSuccess | JsonRpcFailure;
|
|
30
|
+
export interface McpTransportCloseInfo {
|
|
31
|
+
code?: number | null;
|
|
32
|
+
signal?: string | null;
|
|
33
|
+
}
|
|
34
|
+
export interface McpTransportHandlers {
|
|
35
|
+
onMessage(message: unknown): void;
|
|
36
|
+
onError(error: Error): void;
|
|
37
|
+
onClose(info: McpTransportCloseInfo): void;
|
|
38
|
+
}
|
|
39
|
+
/** A bidirectional JSON-RPC carrier. Tests inject a fake; production uses stdio. */
|
|
40
|
+
export interface McpTransport {
|
|
41
|
+
start(): Promise<void>;
|
|
42
|
+
send(message: unknown): void;
|
|
43
|
+
close(): void | Promise<void>;
|
|
44
|
+
setHandlers(handlers: McpTransportHandlers): void;
|
|
45
|
+
/** Optional diagnostic text (stderr) for connection failures. */
|
|
46
|
+
stderrText?(): string;
|
|
47
|
+
}
|
|
48
|
+
export type McpTransportFactory = (serverName: string, config: McpServerConfig) => McpTransport;
|
|
49
|
+
export interface McpRemoteTool {
|
|
50
|
+
name: string;
|
|
51
|
+
description?: string;
|
|
52
|
+
inputSchema?: Record<string, unknown>;
|
|
53
|
+
}
|
|
54
|
+
/** A discovered tool after namespacing and policy decoration. */
|
|
55
|
+
export interface McpToolState {
|
|
56
|
+
server: string;
|
|
57
|
+
remoteName: string;
|
|
58
|
+
/** Namespaced model-facing name: `mcp__<server>__<tool>`. */
|
|
59
|
+
name: string;
|
|
60
|
+
description: string;
|
|
61
|
+
inputSchema: Record<string, unknown>;
|
|
62
|
+
requiresApproval: boolean;
|
|
63
|
+
callTimeoutMs: number;
|
|
64
|
+
}
|
|
65
|
+
export type McpServerState = "disabled" | "idle" | "connecting" | "ready" | "failed" | "closed";
|
|
66
|
+
export interface McpServerStatus {
|
|
67
|
+
name: string;
|
|
68
|
+
state: McpServerState;
|
|
69
|
+
enabled: boolean;
|
|
70
|
+
requiresApproval: boolean;
|
|
71
|
+
toolCount: number;
|
|
72
|
+
tools: string[];
|
|
73
|
+
lastError?: string;
|
|
74
|
+
}
|
|
75
|
+
export type McpEvent = {
|
|
76
|
+
type: "mcp_server_connected";
|
|
77
|
+
server: string;
|
|
78
|
+
toolCount: number;
|
|
79
|
+
} | {
|
|
80
|
+
type: "mcp_server_failed";
|
|
81
|
+
server: string;
|
|
82
|
+
error: string;
|
|
83
|
+
} | {
|
|
84
|
+
type: "mcp_tools_changed";
|
|
85
|
+
server: string;
|
|
86
|
+
toolCount: number;
|
|
87
|
+
};
|
|
88
|
+
export interface McpCallResult {
|
|
89
|
+
content?: unknown;
|
|
90
|
+
isError?: boolean;
|
|
91
|
+
[key: string]: unknown;
|
|
92
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { Config } from "../config/schema.js";
|
|
2
|
+
export type ProviderType = "openai-compatible" | "ollama" | "gemini";
|
|
3
|
+
export interface ProviderPreset {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
description: string;
|
|
7
|
+
type: ProviderType;
|
|
8
|
+
baseUrl?: string;
|
|
9
|
+
model: string;
|
|
10
|
+
/** True when the provider needs an API key before it can be used. */
|
|
11
|
+
requiresKey: boolean;
|
|
12
|
+
/** Conventional environment variable for the key. */
|
|
13
|
+
keyEnv?: string;
|
|
14
|
+
/** Where a user can create a key. */
|
|
15
|
+
keyUrl?: string;
|
|
16
|
+
headers?: Record<string, string>;
|
|
17
|
+
/** Shown before live model discovery completes (and as an offline fallback). */
|
|
18
|
+
fallbackModels: string[];
|
|
19
|
+
local?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Curated provider catalog. Hosted providers use the OpenAI-compatible adapter
|
|
23
|
+
* (Anthropic exposes an OpenAI-compatible endpoint); Gemini uses its native
|
|
24
|
+
* adapter; local runtimes are keyless.
|
|
25
|
+
*/
|
|
26
|
+
export declare const PROVIDER_PRESETS: ProviderPreset[];
|
|
27
|
+
export declare function getPreset(id: string): ProviderPreset | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Build the provider profile stored in config from a preset, preserving any
|
|
30
|
+
* model the user already chose.
|
|
31
|
+
*/
|
|
32
|
+
export declare function materializeProviderConfig(preset: ProviderPreset, existing?: Record<string, unknown>): Record<string, unknown>;
|
|
33
|
+
/**
|
|
34
|
+
* Provider profiles that should appear in `/model`: explicitly configured
|
|
35
|
+
* profiles, profiles with a stored credential, and presets whose key is in the
|
|
36
|
+
* environment.
|
|
37
|
+
*/
|
|
38
|
+
export declare function availableProviderNames(config: Config, credentialsPath?: string): string[];
|
|
39
|
+
export declare function providerLabel(id: string): string;
|
|
40
|
+
/** Filter out models that clearly cannot be used for a chat/tool call. */
|
|
41
|
+
export declare function isLikelyChatModel(id: string): boolean;
|
|
42
|
+
export declare function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T>;
|
|
43
|
+
/**
|
|
44
|
+
* Ask a configured provider for its models. Failures are returned as an empty
|
|
45
|
+
* list so callers can fall back to the configured model.
|
|
46
|
+
*/
|
|
47
|
+
export declare function listModelsForProvider(config: Config, profile: string, timeoutMs?: number): Promise<string[]>;
|
|
48
|
+
export interface KeyProbeResult {
|
|
49
|
+
ok: boolean;
|
|
50
|
+
/** Authentication was explicitly rejected (401/403). */
|
|
51
|
+
invalid: boolean;
|
|
52
|
+
models: string[];
|
|
53
|
+
error?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Validate an API key before persisting it. Reaches the provider's model list
|
|
57
|
+
* endpoint directly so auth failures are visible (the adapters intentionally
|
|
58
|
+
* swallow list errors and fall back to the configured model).
|
|
59
|
+
*/
|
|
60
|
+
export declare function probeApiKey(preset: ProviderPreset, apiKey: string, timeoutMs?: number): Promise<KeyProbeResult>;
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { loadCredentials } from "../config/credentials.js";
|
|
2
|
+
import { createProvider } from "./factory.js";
|
|
3
|
+
const GPT_FALLBACKS = [
|
|
4
|
+
"gpt-4o-mini",
|
|
5
|
+
"gpt-4o",
|
|
6
|
+
"gpt-4.1-mini",
|
|
7
|
+
"gpt-4.1",
|
|
8
|
+
"o4-mini",
|
|
9
|
+
"o3",
|
|
10
|
+
];
|
|
11
|
+
const CLAUDE_FALLBACKS = [
|
|
12
|
+
"claude-sonnet-4-20250514",
|
|
13
|
+
"claude-3-7-sonnet-latest",
|
|
14
|
+
"claude-3-5-haiku-latest",
|
|
15
|
+
];
|
|
16
|
+
const GEMINI_FALLBACKS = ["gemini-2.5-flash", "gemini-2.5-pro", "gemini-2.0-flash"];
|
|
17
|
+
/**
|
|
18
|
+
* Curated provider catalog. Hosted providers use the OpenAI-compatible adapter
|
|
19
|
+
* (Anthropic exposes an OpenAI-compatible endpoint); Gemini uses its native
|
|
20
|
+
* adapter; local runtimes are keyless.
|
|
21
|
+
*/
|
|
22
|
+
export const PROVIDER_PRESETS = [
|
|
23
|
+
{
|
|
24
|
+
id: "kilo",
|
|
25
|
+
label: "Kilo Gateway",
|
|
26
|
+
description: "Free hosted gateway (no key required)",
|
|
27
|
+
type: "openai-compatible",
|
|
28
|
+
baseUrl: "https://api.kilo.ai/api/gateway",
|
|
29
|
+
model: "kilo-auto/free",
|
|
30
|
+
requiresKey: false,
|
|
31
|
+
fallbackModels: ["kilo-auto/free"],
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: "openai",
|
|
35
|
+
label: "OpenAI",
|
|
36
|
+
description: "Official OpenAI API",
|
|
37
|
+
type: "openai-compatible",
|
|
38
|
+
baseUrl: "https://api.openai.com/v1",
|
|
39
|
+
model: "gpt-4o-mini",
|
|
40
|
+
requiresKey: true,
|
|
41
|
+
keyEnv: "OPENAI_API_KEY",
|
|
42
|
+
keyUrl: "https://platform.openai.com/api-keys",
|
|
43
|
+
fallbackModels: GPT_FALLBACKS,
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: "anthropic",
|
|
47
|
+
label: "Anthropic",
|
|
48
|
+
description: "Claude via Anthropic's OpenAI-compatible endpoint",
|
|
49
|
+
type: "openai-compatible",
|
|
50
|
+
baseUrl: "https://api.anthropic.com/v1",
|
|
51
|
+
model: "claude-sonnet-4-20250514",
|
|
52
|
+
requiresKey: true,
|
|
53
|
+
keyEnv: "ANTHROPIC_API_KEY",
|
|
54
|
+
keyUrl: "https://console.anthropic.com/settings/keys",
|
|
55
|
+
headers: { "anthropic-version": "2023-06-01" },
|
|
56
|
+
fallbackModels: CLAUDE_FALLBACKS,
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: "google",
|
|
60
|
+
label: "Google Gemini",
|
|
61
|
+
description: "Official Gemini API",
|
|
62
|
+
type: "gemini",
|
|
63
|
+
baseUrl: "https://generativelanguage.googleapis.com",
|
|
64
|
+
model: "gemini-2.5-flash",
|
|
65
|
+
requiresKey: true,
|
|
66
|
+
keyEnv: "GEMINI_API_KEY",
|
|
67
|
+
keyUrl: "https://aistudio.google.com/app/apikey",
|
|
68
|
+
fallbackModels: GEMINI_FALLBACKS,
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: "openrouter",
|
|
72
|
+
label: "OpenRouter",
|
|
73
|
+
description: "Many hosted models through one key",
|
|
74
|
+
type: "openai-compatible",
|
|
75
|
+
baseUrl: "https://openrouter.ai/api/v1",
|
|
76
|
+
model: "openai/gpt-4o-mini",
|
|
77
|
+
requiresKey: true,
|
|
78
|
+
keyEnv: "OPENROUTER_API_KEY",
|
|
79
|
+
keyUrl: "https://openrouter.ai/keys",
|
|
80
|
+
fallbackModels: ["openai/gpt-4o-mini", "anthropic/claude-sonnet-4", "google/gemini-2.5-flash"],
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
id: "groq",
|
|
84
|
+
label: "Groq",
|
|
85
|
+
description: "Fast hosted inference",
|
|
86
|
+
type: "openai-compatible",
|
|
87
|
+
baseUrl: "https://api.groq.com/openai/v1",
|
|
88
|
+
model: "llama-3.3-70b-versatile",
|
|
89
|
+
requiresKey: true,
|
|
90
|
+
keyEnv: "GROQ_API_KEY",
|
|
91
|
+
keyUrl: "https://console.groq.com/keys",
|
|
92
|
+
fallbackModels: ["llama-3.3-70b-versatile", "llama-3.1-8b-instant"],
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
id: "mistral",
|
|
96
|
+
label: "Mistral",
|
|
97
|
+
description: "Official Mistral API",
|
|
98
|
+
type: "openai-compatible",
|
|
99
|
+
baseUrl: "https://api.mistral.ai/v1",
|
|
100
|
+
model: "mistral-large-latest",
|
|
101
|
+
requiresKey: true,
|
|
102
|
+
keyEnv: "MISTRAL_API_KEY",
|
|
103
|
+
keyUrl: "https://console.mistral.ai/api-keys",
|
|
104
|
+
fallbackModels: ["mistral-large-latest", "mistral-small-latest", "codestral-latest"],
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
id: "xai",
|
|
108
|
+
label: "xAI",
|
|
109
|
+
description: "Grok models",
|
|
110
|
+
type: "openai-compatible",
|
|
111
|
+
baseUrl: "https://api.x.ai/v1",
|
|
112
|
+
model: "grok-3-mini",
|
|
113
|
+
requiresKey: true,
|
|
114
|
+
keyEnv: "XAI_API_KEY",
|
|
115
|
+
keyUrl: "https://console.x.ai",
|
|
116
|
+
fallbackModels: ["grok-3-mini", "grok-3", "grok-2-latest"],
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: "ollama",
|
|
120
|
+
label: "Ollama",
|
|
121
|
+
description: "Local Ollama runtime",
|
|
122
|
+
type: "ollama",
|
|
123
|
+
baseUrl: "http://127.0.0.1:11434",
|
|
124
|
+
model: "qwen2.5-coder:7b",
|
|
125
|
+
requiresKey: false,
|
|
126
|
+
local: true,
|
|
127
|
+
fallbackModels: ["qwen2.5-coder:7b", "llama3.2:3b"],
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
id: "lmstudio",
|
|
131
|
+
label: "LM Studio",
|
|
132
|
+
description: "Local OpenAI-compatible server",
|
|
133
|
+
type: "openai-compatible",
|
|
134
|
+
baseUrl: "http://127.0.0.1:1234/v1",
|
|
135
|
+
model: "local-model",
|
|
136
|
+
requiresKey: false,
|
|
137
|
+
local: true,
|
|
138
|
+
fallbackModels: ["local-model"],
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
id: "llamacpp",
|
|
142
|
+
label: "llama.cpp",
|
|
143
|
+
description: "Local llama-server endpoint",
|
|
144
|
+
type: "openai-compatible",
|
|
145
|
+
baseUrl: "http://127.0.0.1:8080/v1",
|
|
146
|
+
model: "local-model",
|
|
147
|
+
requiresKey: false,
|
|
148
|
+
local: true,
|
|
149
|
+
fallbackModels: ["local-model"],
|
|
150
|
+
},
|
|
151
|
+
];
|
|
152
|
+
export function getPreset(id) {
|
|
153
|
+
return PROVIDER_PRESETS.find((p) => p.id === id);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Build the provider profile stored in config from a preset, preserving any
|
|
157
|
+
* model the user already chose.
|
|
158
|
+
*/
|
|
159
|
+
export function materializeProviderConfig(preset, existing) {
|
|
160
|
+
const out = {
|
|
161
|
+
type: preset.type,
|
|
162
|
+
model: existing?.model ??
|
|
163
|
+
preset.model,
|
|
164
|
+
apiKeyEnv: preset.keyEnv ?? null,
|
|
165
|
+
};
|
|
166
|
+
if (preset.baseUrl)
|
|
167
|
+
out.baseUrl = existing?.baseUrl ?? preset.baseUrl;
|
|
168
|
+
if (preset.headers)
|
|
169
|
+
out.headers = { ...preset.headers, ...(existing?.headers ?? {}) };
|
|
170
|
+
return out;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Provider profiles that should appear in `/model`: explicitly configured
|
|
174
|
+
* profiles, profiles with a stored credential, and presets whose key is in the
|
|
175
|
+
* environment.
|
|
176
|
+
*/
|
|
177
|
+
export function availableProviderNames(config, credentialsPath) {
|
|
178
|
+
const names = new Set();
|
|
179
|
+
for (const [name, profile] of Object.entries(config.providers)) {
|
|
180
|
+
if (profile && typeof profile === "object")
|
|
181
|
+
names.add(name);
|
|
182
|
+
}
|
|
183
|
+
const creds = loadCredentials(credentialsPath);
|
|
184
|
+
for (const name of Object.keys(creds.apiKeys)) {
|
|
185
|
+
if (getPreset(name))
|
|
186
|
+
names.add(name);
|
|
187
|
+
}
|
|
188
|
+
for (const preset of PROVIDER_PRESETS) {
|
|
189
|
+
if (preset.keyEnv && process.env[preset.keyEnv])
|
|
190
|
+
names.add(preset.id);
|
|
191
|
+
}
|
|
192
|
+
return [...names];
|
|
193
|
+
}
|
|
194
|
+
export function providerLabel(id) {
|
|
195
|
+
return getPreset(id)?.label ?? id;
|
|
196
|
+
}
|
|
197
|
+
/** Filter out models that clearly cannot be used for a chat/tool call. */
|
|
198
|
+
export function isLikelyChatModel(id) {
|
|
199
|
+
return !/embedding|embed-|whisper|tts|dall-e|moderation|imagen|veo|audio|realtime|transcribe/i.test(id);
|
|
200
|
+
}
|
|
201
|
+
export async function withTimeout(promise, ms) {
|
|
202
|
+
let timer;
|
|
203
|
+
try {
|
|
204
|
+
return await Promise.race([
|
|
205
|
+
promise,
|
|
206
|
+
new Promise((_, reject) => {
|
|
207
|
+
timer = setTimeout(() => reject(new Error("TIMEOUT")), ms);
|
|
208
|
+
}),
|
|
209
|
+
]);
|
|
210
|
+
}
|
|
211
|
+
finally {
|
|
212
|
+
if (timer)
|
|
213
|
+
clearTimeout(timer);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Ask a configured provider for its models. Failures are returned as an empty
|
|
218
|
+
* list so callers can fall back to the configured model.
|
|
219
|
+
*/
|
|
220
|
+
export async function listModelsForProvider(config, profile, timeoutMs = 8000) {
|
|
221
|
+
try {
|
|
222
|
+
const adapter = createProvider(config, profile);
|
|
223
|
+
if (typeof adapter.listModels !== "function")
|
|
224
|
+
return [];
|
|
225
|
+
const models = (await withTimeout(adapter.listModels(), timeoutMs));
|
|
226
|
+
return models.filter((m) => typeof m === "string" && m && isLikelyChatModel(m));
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
return [];
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Validate an API key before persisting it. Reaches the provider's model list
|
|
234
|
+
* endpoint directly so auth failures are visible (the adapters intentionally
|
|
235
|
+
* swallow list errors and fall back to the configured model).
|
|
236
|
+
*/
|
|
237
|
+
export async function probeApiKey(preset, apiKey, timeoutMs = 10000) {
|
|
238
|
+
const controller = new AbortController();
|
|
239
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
240
|
+
try {
|
|
241
|
+
if (preset.type === "gemini") {
|
|
242
|
+
const base = (preset.baseUrl ?? "https://generativelanguage.googleapis.com").replace(/\/$/, "");
|
|
243
|
+
const res = await fetch(`${base}/v1beta/models?key=${encodeURIComponent(apiKey)}`, { signal: controller.signal });
|
|
244
|
+
if (res.status === 401 || res.status === 403) {
|
|
245
|
+
return { ok: false, invalid: true, models: [], error: `HTTP ${res.status}` };
|
|
246
|
+
}
|
|
247
|
+
if (!res.ok) {
|
|
248
|
+
return { ok: false, invalid: false, models: [], error: `HTTP ${res.status}` };
|
|
249
|
+
}
|
|
250
|
+
const json = (await res.json());
|
|
251
|
+
const models = (json.models ?? [])
|
|
252
|
+
.map((m) => String(m.name ?? "").replace(/^models\//, ""))
|
|
253
|
+
.filter((m) => m && isLikelyChatModel(m));
|
|
254
|
+
return { ok: true, invalid: false, models };
|
|
255
|
+
}
|
|
256
|
+
const base = (preset.baseUrl ?? "").replace(/\/$/, "");
|
|
257
|
+
const res = await fetch(`${base}/models`, {
|
|
258
|
+
headers: {
|
|
259
|
+
Authorization: `Bearer ${apiKey}`,
|
|
260
|
+
...(preset.headers ?? {}),
|
|
261
|
+
},
|
|
262
|
+
signal: controller.signal,
|
|
263
|
+
});
|
|
264
|
+
if (res.status === 401 || res.status === 403) {
|
|
265
|
+
return { ok: false, invalid: true, models: [], error: `HTTP ${res.status}` };
|
|
266
|
+
}
|
|
267
|
+
if (!res.ok) {
|
|
268
|
+
return { ok: false, invalid: false, models: [], error: `HTTP ${res.status}` };
|
|
269
|
+
}
|
|
270
|
+
const json = (await res.json());
|
|
271
|
+
const data = json.data ?? json.models ?? [];
|
|
272
|
+
const models = data
|
|
273
|
+
.map((m) => String(m.id ?? m.name ?? ""))
|
|
274
|
+
.filter((m) => m && isLikelyChatModel(m));
|
|
275
|
+
return { ok: true, invalid: false, models };
|
|
276
|
+
}
|
|
277
|
+
catch (err) {
|
|
278
|
+
return {
|
|
279
|
+
ok: false,
|
|
280
|
+
invalid: false,
|
|
281
|
+
models: [],
|
|
282
|
+
error: err instanceof Error ? err.message : String(err),
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
finally {
|
|
286
|
+
clearTimeout(timer);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/providers/catalog.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAuB9C,MAAM,aAAa,GAAG;IACpB,aAAa;IACb,QAAQ;IACR,cAAc;IACd,SAAS;IACT,SAAS;IACT,IAAI;CACL,CAAC;AAEF,MAAM,gBAAgB,GAAG;IACvB,0BAA0B;IAC1B,0BAA0B;IAC1B,yBAAyB;CAC1B,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;AAEpF;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAqB;IAChD;QACE,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,uCAAuC;QACpD,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,iCAAiC;QAC1C,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,KAAK;QAClB,cAAc,EAAE,CAAC,gBAAgB,CAAC;KACnC;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,qBAAqB;QAClC,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,2BAA2B;QACpC,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,gBAAgB;QACxB,MAAM,EAAE,sCAAsC;QAC9C,cAAc,EAAE,aAAa;KAC9B;IACD;QACE,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,mDAAmD;QAChE,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,8BAA8B;QACvC,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,6CAA6C;QACrD,OAAO,EAAE,EAAE,mBAAmB,EAAE,YAAY,EAAE;QAC9C,cAAc,EAAE,gBAAgB;KACjC;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,qBAAqB;QAClC,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,2CAA2C;QACpD,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,gBAAgB;QACxB,MAAM,EAAE,wCAAwC;QAChD,cAAc,EAAE,gBAAgB;KACjC;IACD;QACE,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,oCAAoC;QACjD,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,8BAA8B;QACvC,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,oBAAoB;QAC5B,MAAM,EAAE,4BAA4B;QACpC,cAAc,EAAE,CAAC,oBAAoB,EAAE,2BAA2B,EAAE,yBAAyB,CAAC;KAC/F;IACD;QACE,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,uBAAuB;QACpC,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,gCAAgC;QACzC,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,+BAA+B;QACvC,cAAc,EAAE,CAAC,yBAAyB,EAAE,sBAAsB,CAAC;KACpE;IACD;QACE,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,sBAAsB;QACnC,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,2BAA2B;QACpC,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,qCAAqC;QAC7C,cAAc,EAAE,CAAC,sBAAsB,EAAE,sBAAsB,EAAE,kBAAkB,CAAC;KACrF;IACD;QACE,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,aAAa;QAC1B,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,qBAAqB;QAC9B,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,sBAAsB;QAC9B,cAAc,EAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,eAAe,CAAC;KAC3D;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,sBAAsB;QACnC,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,wBAAwB;QACjC,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,KAAK;QAClB,KAAK,EAAE,IAAI;QACX,cAAc,EAAE,CAAC,kBAAkB,EAAE,aAAa,CAAC;KACpD;IACD;QACE,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,gCAAgC;QAC7C,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,0BAA0B;QACnC,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,KAAK;QAClB,KAAK,EAAE,IAAI;QACX,cAAc,EAAE,CAAC,aAAa,CAAC;KAChC;IACD;QACE,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,6BAA6B;QAC1C,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,0BAA0B;QACnC,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,KAAK;QAClB,KAAK,EAAE,IAAI;QACX,cAAc,EAAE,CAAC,aAAa,CAAC;KAChC;CACF,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,EAAU;IAClC,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAAsB,EACtB,QAAkC;IAElC,MAAM,GAAG,GAA4B;QACnC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EACF,QAAQ,EAAE,KAA4B;YACvC,MAAM,CAAC,KAAK;QACd,SAAS,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;KACjC,CAAC;IACF,IAAI,MAAM,CAAC,OAAO;QAAE,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;IACtE,IAAI,MAAM,CAAC,OAAO;QAAE,GAAG,CAAC,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAiB,IAAI,EAAE,CAAC,EAAE,CAAC;IAChG,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAc,EACd,eAAwB;IAExB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/D,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,KAAK,GAAG,eAAe,CAAC,eAAe,CAAC,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,IAAI,SAAS,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,OAAO,SAAS,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,iBAAiB,CAAC,EAAU;IAC1C,OAAO,CAAC,sFAAsF,CAAC,IAAI,CACjG,EAAE,CACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAmB,EACnB,EAAU;IAEV,IAAI,KAAgD,CAAC;IACrD,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,OAAO;YACP,IAAI,OAAO,CAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC3B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7D,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAc,EACd,OAAe,EACf,SAAS,GAAG,IAAI;IAEhB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,CAAQ,CAAC;QACvD,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,UAAU;YAAE,OAAO,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,SAAS,CAAC,CAAa,CAAC;QAChF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAUD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAsB,EACtB,MAAc,EACd,SAAS,GAAG,KAAK;IAEjB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,2CAA2C,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAChG,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,IAAI,sBAAsB,kBAAkB,CAAC,MAAM,CAAC,EAAE,EACzD,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAC9B,CAAC;YACF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC7C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/E,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YAChF,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAQ,CAAC;YACvC,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;iBAC/B,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;iBAC9D,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAC9C,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,SAAS,EAAE;YACxC,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,EAAE;gBACjC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;aAC1B;YACD,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC7C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QAChF,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAQ,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI;aAChB,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;aAC7C,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Extract a context window from an OpenAI-compatible /models entry. */
|
|
2
|
+
export declare function contextWindowFromModelEntry(entry: unknown): number | undefined;
|
|
3
|
+
/** Compact token count used by the status line: 999, 1.2k, 256k, 1M. */
|
|
4
|
+
export declare function formatTokenCount(count: number): string;
|
|
5
|
+
/**
|
|
6
|
+
* Render `used/window`, matching the compact peer style (`1.2k/256k`).
|
|
7
|
+
* Unknown values are shown as `?` rather than a fake number.
|
|
8
|
+
*/
|
|
9
|
+
export declare function formatContextUsage(used: number | undefined, window: number | undefined): string;
|
|
10
|
+
/** Guess a context window from the model id when no metadata is available. */
|
|
11
|
+
export declare function knownContextWindow(model: string | undefined): number | undefined;
|