waifu-code 1.0.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/README.md +51 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.js +188 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +35 -0
- package/dist/config.js +73 -0
- package/dist/config.js.map +1 -0
- package/dist/observer/eventDetector.d.ts +16 -0
- package/dist/observer/eventDetector.js +30 -0
- package/dist/observer/eventDetector.js.map +1 -0
- package/dist/observer/streamObserver.d.ts +8 -0
- package/dist/observer/streamObserver.js +24 -0
- package/dist/observer/streamObserver.js.map +1 -0
- package/dist/providers/converter.d.ts +18 -0
- package/dist/providers/converter.js +168 -0
- package/dist/providers/converter.js.map +1 -0
- package/dist/providers/nim.d.ts +23 -0
- package/dist/providers/nim.js +276 -0
- package/dist/providers/nim.js.map +1 -0
- package/dist/providers/sseBuilder.d.ts +53 -0
- package/dist/providers/sseBuilder.js +280 -0
- package/dist/providers/sseBuilder.js.map +1 -0
- package/dist/providers/thinkParser.d.ts +21 -0
- package/dist/providers/thinkParser.js +130 -0
- package/dist/providers/thinkParser.js.map +1 -0
- package/dist/providers/toolParser.d.ts +31 -0
- package/dist/providers/toolParser.js +163 -0
- package/dist/providers/toolParser.js.map +1 -0
- package/dist/providers/types.d.ts +57 -0
- package/dist/providers/types.js +20 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/proxy/auth.d.ts +13 -0
- package/dist/proxy/auth.js +37 -0
- package/dist/proxy/auth.js.map +1 -0
- package/dist/proxy/commandUtils.d.ts +15 -0
- package/dist/proxy/commandUtils.js +155 -0
- package/dist/proxy/commandUtils.js.map +1 -0
- package/dist/proxy/detection.d.ts +13 -0
- package/dist/proxy/detection.js +107 -0
- package/dist/proxy/detection.js.map +1 -0
- package/dist/proxy/optimizer.d.ts +14 -0
- package/dist/proxy/optimizer.js +56 -0
- package/dist/proxy/optimizer.js.map +1 -0
- package/dist/proxy/routes.d.ts +21 -0
- package/dist/proxy/routes.js +142 -0
- package/dist/proxy/routes.js.map +1 -0
- package/dist/proxy/server.d.ts +31 -0
- package/dist/proxy/server.js +87 -0
- package/dist/proxy/server.js.map +1 -0
- package/dist/proxy/tokenCounter.d.ts +12 -0
- package/dist/proxy/tokenCounter.js +91 -0
- package/dist/proxy/tokenCounter.js.map +1 -0
- package/dist/proxy/types.d.ts +89 -0
- package/dist/proxy/types.js +7 -0
- package/dist/proxy/types.js.map +1 -0
- package/dist/waifu/overlayRenderer.d.ts +14 -0
- package/dist/waifu/overlayRenderer.js +49 -0
- package/dist/waifu/overlayRenderer.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sseBuilder.js","sourceRoot":"","sources":["../../src/providers/sseBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming parser for <think>...</think> tags.
|
|
3
|
+
*
|
|
4
|
+
* Handles partial tags at chunk boundaries by buffering.
|
|
5
|
+
* Port of Python ThinkTagParser from the proxy server.
|
|
6
|
+
*/
|
|
7
|
+
import { ContentChunk } from "./types.js";
|
|
8
|
+
export declare class ThinkTagParser {
|
|
9
|
+
private buffer;
|
|
10
|
+
private inThinkTag;
|
|
11
|
+
get inThinkMode(): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Feed content and return parsed chunks.
|
|
14
|
+
* Handles partial tags by buffering content near potential tag boundaries.
|
|
15
|
+
*/
|
|
16
|
+
feed(content: string): Generator<ContentChunk>;
|
|
17
|
+
private parseOutsideThink;
|
|
18
|
+
private parseInsideThink;
|
|
19
|
+
/** Flush any remaining buffered content. */
|
|
20
|
+
flush(): ContentChunk | null;
|
|
21
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming parser for <think>...</think> tags.
|
|
3
|
+
*
|
|
4
|
+
* Handles partial tags at chunk boundaries by buffering.
|
|
5
|
+
* Port of Python ThinkTagParser from the proxy server.
|
|
6
|
+
*/
|
|
7
|
+
import { ContentType } from "./types.js";
|
|
8
|
+
const OPEN_TAG = "<think>";
|
|
9
|
+
const CLOSE_TAG = "</think>";
|
|
10
|
+
const OPEN_TAG_LEN = 7;
|
|
11
|
+
const CLOSE_TAG_LEN = 8;
|
|
12
|
+
export class ThinkTagParser {
|
|
13
|
+
buffer = "";
|
|
14
|
+
inThinkTag = false;
|
|
15
|
+
get inThinkMode() {
|
|
16
|
+
return this.inThinkTag;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Feed content and return parsed chunks.
|
|
20
|
+
* Handles partial tags by buffering content near potential tag boundaries.
|
|
21
|
+
*/
|
|
22
|
+
*feed(content) {
|
|
23
|
+
this.buffer += content;
|
|
24
|
+
while (this.buffer.length > 0) {
|
|
25
|
+
const prevLen = this.buffer.length;
|
|
26
|
+
const chunk = this.inThinkTag
|
|
27
|
+
? this.parseInsideThink()
|
|
28
|
+
: this.parseOutsideThink();
|
|
29
|
+
if (chunk) {
|
|
30
|
+
yield chunk;
|
|
31
|
+
}
|
|
32
|
+
else if (this.buffer.length === prevLen) {
|
|
33
|
+
// No progress: waiting for more data
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
parseOutsideThink() {
|
|
39
|
+
const thinkStart = this.buffer.indexOf(OPEN_TAG);
|
|
40
|
+
const orphanClose = this.buffer.indexOf(CLOSE_TAG);
|
|
41
|
+
// Handle orphan </think> — strip it
|
|
42
|
+
if (orphanClose !== -1 && (thinkStart === -1 || orphanClose < thinkStart)) {
|
|
43
|
+
const preOrphan = this.buffer.slice(0, orphanClose);
|
|
44
|
+
this.buffer = this.buffer.slice(orphanClose + CLOSE_TAG_LEN);
|
|
45
|
+
if (preOrphan) {
|
|
46
|
+
return { type: ContentType.TEXT, content: preOrphan };
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
if (thinkStart === -1) {
|
|
51
|
+
// No tag found — check for partial tag at end
|
|
52
|
+
const lastBracket = this.buffer.lastIndexOf("<");
|
|
53
|
+
if (lastBracket !== -1) {
|
|
54
|
+
const potentialTag = this.buffer.slice(lastBracket);
|
|
55
|
+
const tagLen = potentialTag.length;
|
|
56
|
+
if ((tagLen < OPEN_TAG_LEN && OPEN_TAG.startsWith(potentialTag)) ||
|
|
57
|
+
(tagLen < CLOSE_TAG_LEN && CLOSE_TAG.startsWith(potentialTag))) {
|
|
58
|
+
const emit = this.buffer.slice(0, lastBracket);
|
|
59
|
+
this.buffer = this.buffer.slice(lastBracket);
|
|
60
|
+
if (emit) {
|
|
61
|
+
return { type: ContentType.TEXT, content: emit };
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const emit = this.buffer;
|
|
67
|
+
this.buffer = "";
|
|
68
|
+
if (emit) {
|
|
69
|
+
return { type: ContentType.TEXT, content: emit };
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// Found <think> tag
|
|
75
|
+
const preThink = this.buffer.slice(0, thinkStart);
|
|
76
|
+
this.buffer = this.buffer.slice(thinkStart + OPEN_TAG_LEN);
|
|
77
|
+
this.inThinkTag = true;
|
|
78
|
+
if (preThink) {
|
|
79
|
+
return { type: ContentType.TEXT, content: preThink };
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
parseInsideThink() {
|
|
85
|
+
const thinkEnd = this.buffer.indexOf(CLOSE_TAG);
|
|
86
|
+
if (thinkEnd === -1) {
|
|
87
|
+
// No closing tag — check for partial at end
|
|
88
|
+
const lastBracket = this.buffer.lastIndexOf("<");
|
|
89
|
+
if (lastBracket !== -1 &&
|
|
90
|
+
this.buffer.length - lastBracket < CLOSE_TAG_LEN) {
|
|
91
|
+
const potentialTag = this.buffer.slice(lastBracket);
|
|
92
|
+
if (CLOSE_TAG.startsWith(potentialTag)) {
|
|
93
|
+
const emit = this.buffer.slice(0, lastBracket);
|
|
94
|
+
this.buffer = this.buffer.slice(lastBracket);
|
|
95
|
+
if (emit) {
|
|
96
|
+
return { type: ContentType.THINKING, content: emit };
|
|
97
|
+
}
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const emit = this.buffer;
|
|
102
|
+
this.buffer = "";
|
|
103
|
+
if (emit) {
|
|
104
|
+
return { type: ContentType.THINKING, content: emit };
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// Found </think> tag
|
|
110
|
+
const thinkingContent = this.buffer.slice(0, thinkEnd);
|
|
111
|
+
this.buffer = this.buffer.slice(thinkEnd + CLOSE_TAG_LEN);
|
|
112
|
+
this.inThinkTag = false;
|
|
113
|
+
if (thinkingContent) {
|
|
114
|
+
return { type: ContentType.THINKING, content: thinkingContent };
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/** Flush any remaining buffered content. */
|
|
120
|
+
flush() {
|
|
121
|
+
if (this.buffer) {
|
|
122
|
+
const chunkType = this.inThinkTag ? ContentType.THINKING : ContentType.TEXT;
|
|
123
|
+
const content = this.buffer;
|
|
124
|
+
this.buffer = "";
|
|
125
|
+
return { type: chunkType, content };
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=thinkParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinkParser.js","sourceRoot":"","sources":["../../src/providers/thinkParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heuristic tool call parser.
|
|
3
|
+
*
|
|
4
|
+
* Detects raw text tool calls in the format:
|
|
5
|
+
* ● <function=Name><parameter=key>value</parameter>...
|
|
6
|
+
*
|
|
7
|
+
* Also strips leaked control tokens like <|tool_call_end|>.
|
|
8
|
+
* Port of Python HeuristicToolParser from the proxy server.
|
|
9
|
+
*/
|
|
10
|
+
export interface DetectedToolCall {
|
|
11
|
+
type: "tool_use";
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
input: Record<string, string>;
|
|
15
|
+
}
|
|
16
|
+
export declare class HeuristicToolParser {
|
|
17
|
+
private state;
|
|
18
|
+
private buffer;
|
|
19
|
+
private currentToolId;
|
|
20
|
+
private currentFunctionName;
|
|
21
|
+
private currentParameters;
|
|
22
|
+
private stripControlTokens;
|
|
23
|
+
private splitIncompleteControlTokenTail;
|
|
24
|
+
/**
|
|
25
|
+
* Feed text into the parser.
|
|
26
|
+
* Returns [filteredText, detectedToolCalls].
|
|
27
|
+
*/
|
|
28
|
+
feed(text: string): [string, DetectedToolCall[]];
|
|
29
|
+
/** Flush any remaining tool calls in the buffer. */
|
|
30
|
+
flush(): DetectedToolCall[];
|
|
31
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heuristic tool call parser.
|
|
3
|
+
*
|
|
4
|
+
* Detects raw text tool calls in the format:
|
|
5
|
+
* ● <function=Name><parameter=key>value</parameter>...
|
|
6
|
+
*
|
|
7
|
+
* Also strips leaked control tokens like <|tool_call_end|>.
|
|
8
|
+
* Port of Python HeuristicToolParser from the proxy server.
|
|
9
|
+
*/
|
|
10
|
+
import { randomUUID } from "node:crypto";
|
|
11
|
+
var ParserState;
|
|
12
|
+
(function (ParserState) {
|
|
13
|
+
ParserState[ParserState["TEXT"] = 1] = "TEXT";
|
|
14
|
+
ParserState[ParserState["MATCHING_FUNCTION"] = 2] = "MATCHING_FUNCTION";
|
|
15
|
+
ParserState[ParserState["PARSING_PARAMETERS"] = 3] = "PARSING_PARAMETERS";
|
|
16
|
+
})(ParserState || (ParserState = {}));
|
|
17
|
+
const CONTROL_TOKEN_RE = /<\|[^|>]{1,80}\|>/g;
|
|
18
|
+
const CONTROL_TOKEN_START = "<|";
|
|
19
|
+
const CONTROL_TOKEN_END = "|>";
|
|
20
|
+
const FUNC_START_RE = /●\s*<function=([^>]+)>/;
|
|
21
|
+
const PARAM_RE = /<parameter=([^>]+)>(.*?)(?:<\/parameter>|$)/gs;
|
|
22
|
+
export class HeuristicToolParser {
|
|
23
|
+
state = ParserState.TEXT;
|
|
24
|
+
buffer = "";
|
|
25
|
+
currentToolId = null;
|
|
26
|
+
currentFunctionName = null;
|
|
27
|
+
currentParameters = {};
|
|
28
|
+
stripControlTokens(text) {
|
|
29
|
+
return text.replace(CONTROL_TOKEN_RE, "");
|
|
30
|
+
}
|
|
31
|
+
splitIncompleteControlTokenTail() {
|
|
32
|
+
const start = this.buffer.lastIndexOf(CONTROL_TOKEN_START);
|
|
33
|
+
if (start === -1)
|
|
34
|
+
return "";
|
|
35
|
+
const end = this.buffer.indexOf(CONTROL_TOKEN_END, start);
|
|
36
|
+
if (end !== -1)
|
|
37
|
+
return "";
|
|
38
|
+
const prefix = this.buffer.slice(0, start);
|
|
39
|
+
this.buffer = this.buffer.slice(start);
|
|
40
|
+
return prefix;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Feed text into the parser.
|
|
44
|
+
* Returns [filteredText, detectedToolCalls].
|
|
45
|
+
*/
|
|
46
|
+
feed(text) {
|
|
47
|
+
this.buffer += text;
|
|
48
|
+
this.buffer = this.stripControlTokens(this.buffer);
|
|
49
|
+
const detectedTools = [];
|
|
50
|
+
const filteredParts = [];
|
|
51
|
+
// eslint-disable-next-line no-constant-condition
|
|
52
|
+
while (true) {
|
|
53
|
+
if (this.state === ParserState.TEXT) {
|
|
54
|
+
if (this.buffer.includes("●")) {
|
|
55
|
+
const idx = this.buffer.indexOf("●");
|
|
56
|
+
filteredParts.push(this.buffer.slice(0, idx));
|
|
57
|
+
this.buffer = this.buffer.slice(idx);
|
|
58
|
+
this.state = ParserState.MATCHING_FUNCTION;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
const safePrefix = this.splitIncompleteControlTokenTail();
|
|
62
|
+
if (safePrefix) {
|
|
63
|
+
filteredParts.push(safePrefix);
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
filteredParts.push(this.buffer);
|
|
67
|
+
this.buffer = "";
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (this.state === ParserState.MATCHING_FUNCTION) {
|
|
72
|
+
const match = FUNC_START_RE.exec(this.buffer);
|
|
73
|
+
if (match) {
|
|
74
|
+
this.currentFunctionName = match[1].trim();
|
|
75
|
+
this.currentToolId = `toolu_heuristic_${randomUUID().replace(/-/g, "").slice(0, 8)}`;
|
|
76
|
+
this.currentParameters = {};
|
|
77
|
+
this.buffer = this.buffer.slice(match.index + match[0].length);
|
|
78
|
+
this.state = ParserState.PARSING_PARAMETERS;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
if (this.buffer.length > 100) {
|
|
82
|
+
filteredParts.push(this.buffer[0]);
|
|
83
|
+
this.buffer = this.buffer.slice(1);
|
|
84
|
+
this.state = ParserState.TEXT;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (this.state === ParserState.PARSING_PARAMETERS) {
|
|
92
|
+
let finishedToolCall = false;
|
|
93
|
+
// Extract complete parameters
|
|
94
|
+
// eslint-disable-next-line no-constant-condition
|
|
95
|
+
while (true) {
|
|
96
|
+
PARAM_RE.lastIndex = 0;
|
|
97
|
+
const paramMatch = PARAM_RE.exec(this.buffer);
|
|
98
|
+
if (paramMatch && paramMatch[0].includes("</parameter>")) {
|
|
99
|
+
const preMatch = this.buffer.slice(0, paramMatch.index);
|
|
100
|
+
if (preMatch)
|
|
101
|
+
filteredParts.push(preMatch);
|
|
102
|
+
this.currentParameters[paramMatch[1].trim()] = paramMatch[2].trim();
|
|
103
|
+
this.buffer = this.buffer.slice(paramMatch.index + paramMatch[0].length);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (this.buffer.includes("●")) {
|
|
110
|
+
const idx = this.buffer.indexOf("●");
|
|
111
|
+
if (idx > 0) {
|
|
112
|
+
filteredParts.push(this.buffer.slice(0, idx));
|
|
113
|
+
this.buffer = this.buffer.slice(idx);
|
|
114
|
+
}
|
|
115
|
+
finishedToolCall = true;
|
|
116
|
+
}
|
|
117
|
+
else if (this.buffer.length > 0 && !this.buffer.trim().startsWith("<")) {
|
|
118
|
+
if (!this.buffer.includes("<parameter=")) {
|
|
119
|
+
filteredParts.push(this.buffer);
|
|
120
|
+
this.buffer = "";
|
|
121
|
+
finishedToolCall = true;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (finishedToolCall) {
|
|
125
|
+
detectedTools.push({
|
|
126
|
+
type: "tool_use",
|
|
127
|
+
id: this.currentToolId,
|
|
128
|
+
name: this.currentFunctionName,
|
|
129
|
+
input: this.currentParameters,
|
|
130
|
+
});
|
|
131
|
+
this.state = ParserState.TEXT;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return [filteredParts.join(""), detectedTools];
|
|
139
|
+
}
|
|
140
|
+
/** Flush any remaining tool calls in the buffer. */
|
|
141
|
+
flush() {
|
|
142
|
+
this.buffer = this.stripControlTokens(this.buffer);
|
|
143
|
+
const detectedTools = [];
|
|
144
|
+
if (this.state === ParserState.PARSING_PARAMETERS) {
|
|
145
|
+
// Try to extract partial parameters
|
|
146
|
+
const partialRe = /<parameter=([^>]+)>(.*)$/gs;
|
|
147
|
+
let m;
|
|
148
|
+
while ((m = partialRe.exec(this.buffer)) !== null) {
|
|
149
|
+
this.currentParameters[m[1].trim()] = m[2].trim();
|
|
150
|
+
}
|
|
151
|
+
detectedTools.push({
|
|
152
|
+
type: "tool_use",
|
|
153
|
+
id: this.currentToolId,
|
|
154
|
+
name: this.currentFunctionName,
|
|
155
|
+
input: this.currentParameters,
|
|
156
|
+
});
|
|
157
|
+
this.state = ParserState.TEXT;
|
|
158
|
+
this.buffer = "";
|
|
159
|
+
}
|
|
160
|
+
return detectedTools;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=toolParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolParser.js","sourceRoot":"","sources":["../../src/providers/toolParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the provider layer.
|
|
3
|
+
*/
|
|
4
|
+
/** Content type enum for parsed content chunks. */
|
|
5
|
+
export declare enum ContentType {
|
|
6
|
+
TEXT = "text",
|
|
7
|
+
THINKING = "thinking"
|
|
8
|
+
}
|
|
9
|
+
/** A chunk of parsed content from the think tag parser. */
|
|
10
|
+
export interface ContentChunk {
|
|
11
|
+
type: ContentType;
|
|
12
|
+
content: string;
|
|
13
|
+
}
|
|
14
|
+
/** State for a single streaming tool call. */
|
|
15
|
+
export interface ToolCallState {
|
|
16
|
+
blockIndex: number;
|
|
17
|
+
toolId: string;
|
|
18
|
+
name: string;
|
|
19
|
+
contents: string[];
|
|
20
|
+
started: boolean;
|
|
21
|
+
taskArgBuffer: string;
|
|
22
|
+
taskArgsEmitted: boolean;
|
|
23
|
+
}
|
|
24
|
+
/** OpenAI-compatible chat completion chunk (subset of fields we use). */
|
|
25
|
+
export interface ChatCompletionChunk {
|
|
26
|
+
id: string;
|
|
27
|
+
object: string;
|
|
28
|
+
choices: ChatCompletionChoice[];
|
|
29
|
+
usage?: {
|
|
30
|
+
prompt_tokens?: number;
|
|
31
|
+
completion_tokens?: number;
|
|
32
|
+
total_tokens?: number;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export interface ChatCompletionChoice {
|
|
36
|
+
index: number;
|
|
37
|
+
delta: ChatCompletionDelta;
|
|
38
|
+
finish_reason: string | null;
|
|
39
|
+
}
|
|
40
|
+
export interface ChatCompletionDelta {
|
|
41
|
+
role?: string;
|
|
42
|
+
content?: string | null;
|
|
43
|
+
reasoning_content?: string | null;
|
|
44
|
+
tool_calls?: ToolCallDelta[];
|
|
45
|
+
}
|
|
46
|
+
export interface ToolCallDelta {
|
|
47
|
+
index: number;
|
|
48
|
+
id?: string;
|
|
49
|
+
type?: string;
|
|
50
|
+
function: {
|
|
51
|
+
name?: string;
|
|
52
|
+
arguments?: string;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/** OpenAI stop_reason → Anthropic stop_reason mapping. */
|
|
56
|
+
export declare const STOP_REASON_MAP: Record<string, string>;
|
|
57
|
+
export declare function mapStopReason(openaiReason: string | null | undefined): string;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the provider layer.
|
|
3
|
+
*/
|
|
4
|
+
/** Content type enum for parsed content chunks. */
|
|
5
|
+
export var ContentType;
|
|
6
|
+
(function (ContentType) {
|
|
7
|
+
ContentType["TEXT"] = "text";
|
|
8
|
+
ContentType["THINKING"] = "thinking";
|
|
9
|
+
})(ContentType || (ContentType = {}));
|
|
10
|
+
/** OpenAI stop_reason → Anthropic stop_reason mapping. */
|
|
11
|
+
export const STOP_REASON_MAP = {
|
|
12
|
+
stop: "end_turn",
|
|
13
|
+
length: "max_tokens",
|
|
14
|
+
tool_calls: "tool_use",
|
|
15
|
+
content_filter: "end_turn",
|
|
16
|
+
};
|
|
17
|
+
export function mapStopReason(openaiReason) {
|
|
18
|
+
return openaiReason ? STOP_REASON_MAP[openaiReason] ?? "end_turn" : "end_turn";
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,mDAAmD;AACnD,MAAM,CAAN,IAAY,WAGX;AAHD,WAAY,WAAW;IACrB,4BAAa,CAAA;IACb,oCAAqB,CAAA;AACvB,CAAC,EAHW,WAAW,KAAX,WAAW,QAGtB;AAsDD,0DAA0D;AAC1D,MAAM,CAAC,MAAM,eAAe,GAA2B;IACrD,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,YAAY;IACpB,UAAU,EAAE,UAAU;IACtB,cAAc,EAAE,UAAU;CAC3B,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,YAAuC;IACnE,OAAO,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth middleware for the proxy server.
|
|
3
|
+
*
|
|
4
|
+
* Validates API key in x-api-key header or Authorization Bearer token
|
|
5
|
+
* against the configured internal auth token.
|
|
6
|
+
*/
|
|
7
|
+
import type { IncomingMessage } from "node:http";
|
|
8
|
+
/**
|
|
9
|
+
* Validate the request's auth credentials against the expected token.
|
|
10
|
+
* Returns null if valid, or an error message string if invalid.
|
|
11
|
+
* If no token is configured, all requests are allowed.
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateAuth(req: IncomingMessage, expectedToken: string | undefined): string | null;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth middleware for the proxy server.
|
|
3
|
+
*
|
|
4
|
+
* Validates API key in x-api-key header or Authorization Bearer token
|
|
5
|
+
* against the configured internal auth token.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Validate the request's auth credentials against the expected token.
|
|
9
|
+
* Returns null if valid, or an error message string if invalid.
|
|
10
|
+
* If no token is configured, all requests are allowed.
|
|
11
|
+
*/
|
|
12
|
+
export function validateAuth(req, expectedToken) {
|
|
13
|
+
if (!expectedToken) {
|
|
14
|
+
return null; // No auth configured → allow all
|
|
15
|
+
}
|
|
16
|
+
const xApiKey = req.headers["x-api-key"];
|
|
17
|
+
const authorization = req.headers["authorization"];
|
|
18
|
+
const anthropicAuth = req.headers["anthropic-auth-token"];
|
|
19
|
+
const header = xApiKey ?? authorization ?? anthropicAuth;
|
|
20
|
+
if (!header) {
|
|
21
|
+
return "Missing API key";
|
|
22
|
+
}
|
|
23
|
+
let token = Array.isArray(header) ? header[0] : header;
|
|
24
|
+
// Support "Bearer <token>" format
|
|
25
|
+
if (token.toLowerCase().startsWith("bearer ")) {
|
|
26
|
+
token = token.slice(7);
|
|
27
|
+
}
|
|
28
|
+
// Strip anything after first colon (handles tokens with appended model names)
|
|
29
|
+
if (token.includes(":")) {
|
|
30
|
+
token = token.split(":")[0];
|
|
31
|
+
}
|
|
32
|
+
if (token !== expectedToken) {
|
|
33
|
+
return "Invalid API key";
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/proxy/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,GAAoB,EACpB,aAAiC;IAEjC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,CAAC,iCAAiC;IAChD,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAG,OAAO,IAAI,aAAa,IAAI,aAAa,CAAC;IACzD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,IAAI,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAExD,kCAAkC;IAClC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9C,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IAED,8EAA8E;IAC9E,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IAC/B,CAAC;IAED,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;QAC5B,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command parsing utilities for API optimizations.
|
|
3
|
+
* Port of Python command_utils.py from the proxy server.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Extract the command prefix for fast prefix detection.
|
|
7
|
+
* Returns the command prefix (e.g., "git", "git commit", "npm install")
|
|
8
|
+
* or "none" if no valid command found.
|
|
9
|
+
*/
|
|
10
|
+
export declare function extractCommandPrefix(command: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Extract file paths from a command locally.
|
|
13
|
+
* Returns filepath extraction result in <filepaths> format.
|
|
14
|
+
*/
|
|
15
|
+
export declare function extractFilepathsFromCommand(command: string, _output: string): string;
|