@diegopetrucci/pi-extensions 0.1.65 → 0.1.67
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/.pi-fleet-tested-version +1 -1
- package/README.md +1 -1
- package/extensions/agent-workflow-audit/.pi-fleet-tested-version +1 -1
- package/extensions/agent-workflow-audit/package.json +1 -1
- package/extensions/annotate-git-diff/.pi-fleet-tested-version +1 -1
- package/extensions/annotate-git-diff/README.md +3 -0
- package/extensions/annotate-git-diff/index.ts +49 -5
- package/extensions/annotate-git-diff/package.json +2 -1
- package/extensions/annotate-git-diff/quiet-glimpse.ts +24 -3
- package/extensions/annotate-git-diff/review-server.ts +379 -0
- package/extensions/annotate-git-diff/ui.ts +17 -41
- package/extensions/annotate-last-message/.pi-fleet-tested-version +1 -1
- package/extensions/annotate-last-message/index.ts +28 -2
- package/extensions/annotate-last-message/package.json +1 -1
- package/extensions/annotate-last-message/quiet-glimpse.ts +24 -3
- package/extensions/brrr/.pi-fleet-tested-version +1 -1
- package/extensions/brrr/package.json +1 -1
- package/extensions/claude-fast/.pi-fleet-tested-version +1 -1
- package/extensions/claude-fast/package.json +1 -1
- package/extensions/code-reviewer/.pi-fleet-tested-version +1 -1
- package/extensions/code-reviewer/index.ts +3 -1
- package/extensions/code-reviewer/package.json +1 -1
- package/extensions/confirm-destructive/.pi-fleet-tested-version +1 -1
- package/extensions/confirm-destructive/package.json +1 -1
- package/extensions/context-cap/.pi-fleet-tested-version +1 -1
- package/extensions/context-cap/package.json +1 -1
- package/extensions/context-inspector/.pi-fleet-tested-version +1 -1
- package/extensions/context-inspector/package.json +1 -1
- package/extensions/contrarian/.pi-fleet-tested-version +1 -1
- package/extensions/contrarian/index.ts +50 -28
- package/extensions/contrarian/package.json +1 -1
- package/extensions/dirty-repo-guard/.pi-fleet-tested-version +1 -1
- package/extensions/dirty-repo-guard/package.json +1 -1
- package/extensions/dynamic-context-pruning/.pi-fleet-tested-version +1 -1
- package/extensions/dynamic-context-pruning/package.json +1 -1
- package/extensions/fast/.pi-fleet-tested-version +1 -1
- package/extensions/fast/package.json +1 -1
- package/extensions/git-footer/.pi-fleet-tested-version +1 -1
- package/extensions/git-footer/package.json +1 -1
- package/extensions/gnosis/.pi-fleet-tested-version +1 -1
- package/extensions/gnosis/package.json +1 -1
- package/extensions/illustrations-to-explain-things/.pi-fleet-tested-version +1 -1
- package/extensions/illustrations-to-explain-things/package.json +1 -1
- package/extensions/inline-bash/.pi-fleet-tested-version +1 -1
- package/extensions/inline-bash/package.json +1 -1
- package/extensions/librarian/.pi-fleet-tested-version +1 -1
- package/extensions/librarian/package.json +1 -1
- package/extensions/minimal-footer/.pi-fleet-tested-version +1 -1
- package/extensions/minimal-footer/package.json +1 -1
- package/extensions/notify/.pi-fleet-tested-version +1 -1
- package/extensions/notify/package.json +1 -1
- package/extensions/openai-fast/.pi-fleet-tested-version +1 -1
- package/extensions/openai-fast/package.json +1 -1
- package/extensions/oracle/.pi-fleet-tested-version +1 -1
- package/extensions/oracle/index.ts +49 -28
- package/extensions/oracle/package.json +1 -1
- package/extensions/permission-gate/.pi-fleet-tested-version +1 -1
- package/extensions/permission-gate/README.md +11 -3
- package/extensions/permission-gate/index.ts +70 -7
- package/extensions/permission-gate/package.json +4 -2
- package/extensions/permission-gate/powershell-safety.ts +1006 -0
- package/extensions/quiet-tools/.pi-fleet-tested-version +1 -1
- package/extensions/quiet-tools/package.json +1 -1
- package/extensions/review/.pi-fleet-tested-version +1 -1
- package/extensions/review/package.json +1 -1
- package/extensions/todo/.pi-fleet-tested-version +1 -1
- package/extensions/todo/package.json +1 -1
- package/extensions/triage-comments/.pi-fleet-tested-version +1 -1
- package/extensions/triage-comments/package.json +1 -1
- package/package.json +4 -4
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
|
-
import { createRequire } from "node:module";
|
|
3
2
|
import { dirname, join } from "node:path";
|
|
4
|
-
import { pathToFileURL } from "node:url";
|
|
5
3
|
import { fileURLToPath } from "node:url";
|
|
6
4
|
import type { ReviewWindowData } from "./types.js";
|
|
7
5
|
|
|
8
|
-
const require = createRequire(import.meta.url);
|
|
9
6
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
10
7
|
const webDir = join(__dirname, "web");
|
|
11
8
|
|
|
@@ -17,55 +14,34 @@ function escapeInlineScriptSource(value: string): string {
|
|
|
17
14
|
return value.replace(/<\/(script)/gi, "<\\/$1");
|
|
18
15
|
}
|
|
19
16
|
|
|
20
|
-
interface ReviewUiAssets {
|
|
17
|
+
export interface ReviewUiAssets {
|
|
21
18
|
tailwindBrowserJs: string;
|
|
22
19
|
monacoLoaderJs: string;
|
|
23
20
|
monacoVsBaseUrl: string;
|
|
24
|
-
bootstrapError: string | null;
|
|
25
21
|
}
|
|
26
22
|
|
|
27
|
-
function
|
|
28
|
-
return readFileSync(require.resolve(specifier), "utf8");
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function resolveReviewUiAssets(): ReviewUiAssets {
|
|
32
|
-
try {
|
|
33
|
-
const tailwindBrowserJs = safeReadResolvedAsset("@tailwindcss/browser");
|
|
34
|
-
const monacoLoaderPath = join(dirname(require.resolve("monaco-editor/package.json")), "min", "vs", "loader.js");
|
|
35
|
-
const monacoLoaderJs = readFileSync(monacoLoaderPath, "utf8");
|
|
36
|
-
const monacoVsBaseUrl = pathToFileURL(dirname(monacoLoaderPath)).href;
|
|
37
|
-
return {
|
|
38
|
-
tailwindBrowserJs,
|
|
39
|
-
monacoLoaderJs,
|
|
40
|
-
monacoVsBaseUrl,
|
|
41
|
-
bootstrapError: null,
|
|
42
|
-
};
|
|
43
|
-
} catch (error) {
|
|
44
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
45
|
-
return {
|
|
46
|
-
tailwindBrowserJs: "",
|
|
47
|
-
monacoLoaderJs: "",
|
|
48
|
-
monacoVsBaseUrl: "",
|
|
49
|
-
bootstrapError: `Unable to load packaged review UI assets: ${message}`,
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export function buildReviewHtml(data: ReviewWindowData): string {
|
|
23
|
+
export function buildReviewHtml(data: ReviewWindowData, assets: ReviewUiAssets): string {
|
|
55
24
|
const templateHtml = readFileSync(join(webDir, "index.html"), "utf8");
|
|
56
25
|
const appJs = escapeInlineScriptSource(readFileSync(join(webDir, "app.js"), "utf8"));
|
|
57
|
-
const assets = resolveReviewUiAssets();
|
|
58
26
|
const payload = escapeForInlineScript(JSON.stringify(data));
|
|
59
27
|
const assetConfig = escapeForInlineScript(
|
|
60
28
|
JSON.stringify({
|
|
61
29
|
monacoVsBaseUrl: assets.monacoVsBaseUrl,
|
|
62
|
-
bootstrapError:
|
|
30
|
+
bootstrapError: null,
|
|
63
31
|
}),
|
|
64
32
|
);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
33
|
+
const replacements = new Map([
|
|
34
|
+
['"__INLINE_DATA__"', payload],
|
|
35
|
+
["__INLINE_ASSET_CONFIG__", assetConfig],
|
|
36
|
+
["__INLINE_TAILWIND_JS__", escapeInlineScriptSource(assets.tailwindBrowserJs)],
|
|
37
|
+
["__INLINE_MONACO_LOADER_JS__", escapeInlineScriptSource(assets.monacoLoaderJs)],
|
|
38
|
+
["__INLINE_JS__", appJs],
|
|
39
|
+
]);
|
|
40
|
+
|
|
41
|
+
// Replace the original template in one pass so marker-like repository data
|
|
42
|
+
// or runtime source is never scanned as another template placeholder.
|
|
43
|
+
return templateHtml.replace(
|
|
44
|
+
/"__INLINE_DATA__"|__INLINE_ASSET_CONFIG__|__INLINE_TAILWIND_JS__|__INLINE_MONACO_LOADER_JS__|__INLINE_JS__/g,
|
|
45
|
+
(marker) => replacements.get(marker) ?? marker,
|
|
46
|
+
);
|
|
71
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.84.
|
|
1
|
+
0.84.4
|
|
@@ -21,12 +21,15 @@ function appendPrompt(ctx: ExtensionCommandContext, prompt: string): void {
|
|
|
21
21
|
|
|
22
22
|
export function registerAnnotateLastMessageCommand(pi: ExtensionAPI): void {
|
|
23
23
|
let activeWindow: QuietGlimpseWindow | null = null;
|
|
24
|
+
let annotationOpening = false;
|
|
25
|
+
let annotationAttempt = 0;
|
|
24
26
|
const suppressedWindows = new WeakSet<QuietGlimpseWindow>();
|
|
25
27
|
|
|
26
28
|
function closeActiveWindow(options: { suppressResults?: boolean } = {}): void {
|
|
27
|
-
|
|
29
|
+
annotationAttempt += 1;
|
|
28
30
|
const windowToClose = activeWindow;
|
|
29
31
|
activeWindow = null;
|
|
32
|
+
if (windowToClose == null) return;
|
|
30
33
|
if (options.suppressResults) {
|
|
31
34
|
suppressedWindows.add(windowToClose);
|
|
32
35
|
}
|
|
@@ -42,7 +45,7 @@ export function registerAnnotateLastMessageCommand(pi: ExtensionAPI): void {
|
|
|
42
45
|
ctx.ui.notify("annotate-last-message requires interactive mode.", "error");
|
|
43
46
|
return;
|
|
44
47
|
}
|
|
45
|
-
if (activeWindow != null) {
|
|
48
|
+
if (annotationOpening || activeWindow != null) {
|
|
46
49
|
ctx.ui.notify("A last-message annotation window is already open.", "warning");
|
|
47
50
|
return;
|
|
48
51
|
}
|
|
@@ -54,6 +57,8 @@ export function registerAnnotateLastMessageCommand(pi: ExtensionAPI): void {
|
|
|
54
57
|
}
|
|
55
58
|
|
|
56
59
|
const messageData = messageResult.data;
|
|
60
|
+
annotationOpening = true;
|
|
61
|
+
const attempt = ++annotationAttempt;
|
|
57
62
|
|
|
58
63
|
try {
|
|
59
64
|
const html = buildAnnotateLastMessageHtml(messageData);
|
|
@@ -62,13 +67,28 @@ export function registerAnnotateLastMessageCommand(pi: ExtensionAPI): void {
|
|
|
62
67
|
height: 980,
|
|
63
68
|
title: "annotate last message",
|
|
64
69
|
});
|
|
70
|
+
if (attempt !== annotationAttempt) {
|
|
71
|
+
suppressedWindows.add(window);
|
|
72
|
+
window.close();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
65
75
|
activeWindow = window;
|
|
76
|
+
if (window.failure != null) throw window.failure;
|
|
77
|
+
if (window.closed) throw new Error("Glimpse closed while the annotation window was starting.");
|
|
66
78
|
|
|
67
79
|
const terminalMessagePromise = new Promise<AnnotateLastMessageSubmitPayload | AnnotateLastMessageCancelPayload | null>(
|
|
68
80
|
(resolve, reject) => {
|
|
69
81
|
let settled = false;
|
|
70
82
|
let closeTimer: ReturnType<typeof setTimeout> | null = null;
|
|
71
83
|
|
|
84
|
+
const requestWindowClose = (): void => {
|
|
85
|
+
try {
|
|
86
|
+
window.close();
|
|
87
|
+
} catch {
|
|
88
|
+
// Ignore races when the native process has already exited.
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
72
92
|
const cleanup = (): void => {
|
|
73
93
|
if (closeTimer != null) {
|
|
74
94
|
clearTimeout(closeTimer);
|
|
@@ -91,6 +111,7 @@ export function registerAnnotateLastMessageCommand(pi: ExtensionAPI): void {
|
|
|
91
111
|
|
|
92
112
|
const onMessage = (data: unknown): void => {
|
|
93
113
|
if (isSubmitPayload(data) || isCancelPayload(data)) {
|
|
114
|
+
requestWindowClose();
|
|
94
115
|
settle(data);
|
|
95
116
|
}
|
|
96
117
|
};
|
|
@@ -106,6 +127,7 @@ export function registerAnnotateLastMessageCommand(pi: ExtensionAPI): void {
|
|
|
106
127
|
const onError = (error: Error): void => {
|
|
107
128
|
if (settled) return;
|
|
108
129
|
settled = true;
|
|
130
|
+
requestWindowClose();
|
|
109
131
|
cleanup();
|
|
110
132
|
reject(error);
|
|
111
133
|
};
|
|
@@ -113,6 +135,8 @@ export function registerAnnotateLastMessageCommand(pi: ExtensionAPI): void {
|
|
|
113
135
|
window.on("message", onMessage);
|
|
114
136
|
window.on("closed", onClosed);
|
|
115
137
|
window.on("error", onError);
|
|
138
|
+
if (window.failure != null) onError(window.failure);
|
|
139
|
+
else if (window.closed) onClosed();
|
|
116
140
|
},
|
|
117
141
|
);
|
|
118
142
|
|
|
@@ -145,6 +169,8 @@ export function registerAnnotateLastMessageCommand(pi: ExtensionAPI): void {
|
|
|
145
169
|
closeActiveWindow({ suppressResults: true });
|
|
146
170
|
const message = error instanceof Error ? error.message : String(error);
|
|
147
171
|
ctx.ui.notify(`Annotation failed: ${message}`, "error");
|
|
172
|
+
} finally {
|
|
173
|
+
annotationOpening = false;
|
|
148
174
|
}
|
|
149
175
|
}
|
|
150
176
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@diegopetrucci/pi-annotate-last-message",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"description": "A standalone pi extension that adds /annotate-last-message, a native Glimpse UI for annotating the latest assistant reply.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"pi-package",
|
|
@@ -23,6 +23,8 @@ interface GlimpseProtocolMessage {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
export interface QuietGlimpseWindow {
|
|
26
|
+
readonly closed: boolean;
|
|
27
|
+
readonly failure: Error | null;
|
|
26
28
|
on(event: "message", listener: (data: unknown) => void): this;
|
|
27
29
|
on(event: "closed", listener: () => void): this;
|
|
28
30
|
on(event: "error", listener: (error: Error) => void): this;
|
|
@@ -38,11 +40,15 @@ class QuietGlimpseWindowImpl extends EventEmitter implements QuietGlimpseWindow
|
|
|
38
40
|
#closed = false;
|
|
39
41
|
#pendingHTML: string | null;
|
|
40
42
|
#stderr = "";
|
|
43
|
+
#failure: Error | null = null;
|
|
41
44
|
|
|
42
45
|
constructor(proc: ChildProcessWithoutNullStreams, initialHTML: string) {
|
|
43
46
|
super();
|
|
44
47
|
this.#proc = proc;
|
|
45
48
|
this.#pendingHTML = initialHTML;
|
|
49
|
+
// EventEmitter treats an unobserved `error` as fatal. Keep a permanent
|
|
50
|
+
// fallback while callers attach and detach their lifecycle listeners.
|
|
51
|
+
this.on("error", () => {});
|
|
46
52
|
|
|
47
53
|
proc.stdin.on("error", () => {});
|
|
48
54
|
proc.stderr.on("data", (chunk) => {
|
|
@@ -55,7 +61,7 @@ class QuietGlimpseWindowImpl extends EventEmitter implements QuietGlimpseWindow
|
|
|
55
61
|
try {
|
|
56
62
|
message = JSON.parse(line) as GlimpseProtocolMessage;
|
|
57
63
|
} catch {
|
|
58
|
-
this
|
|
64
|
+
this.#reportError(new Error(`Malformed glimpse protocol line: ${line}`));
|
|
59
65
|
return;
|
|
60
66
|
}
|
|
61
67
|
|
|
@@ -77,16 +83,18 @@ class QuietGlimpseWindowImpl extends EventEmitter implements QuietGlimpseWindow
|
|
|
77
83
|
}
|
|
78
84
|
});
|
|
79
85
|
|
|
80
|
-
proc.on("error", (error) => this
|
|
86
|
+
proc.on("error", (error) => this.#reportError(error));
|
|
81
87
|
proc.on("exit", (code, signal) => {
|
|
82
88
|
const stderr = this.#stderr.trim();
|
|
83
89
|
const failed = signal != null || (code != null && code !== 0);
|
|
84
90
|
if (!this.#closed && failed) {
|
|
85
91
|
const message = stderr || `Glimpse process exited abnormally (code: ${code}, signal: ${signal}).`;
|
|
86
|
-
this
|
|
92
|
+
this.#reportError(new Error(message));
|
|
87
93
|
}
|
|
88
94
|
this.#markClosed();
|
|
89
95
|
});
|
|
96
|
+
// Spawn failures can emit `error` and then `close` without `exit`.
|
|
97
|
+
proc.on("close", () => this.#markClosed());
|
|
90
98
|
}
|
|
91
99
|
|
|
92
100
|
send(js: string): void {
|
|
@@ -97,6 +105,19 @@ class QuietGlimpseWindowImpl extends EventEmitter implements QuietGlimpseWindow
|
|
|
97
105
|
this.#write({ type: "close" });
|
|
98
106
|
}
|
|
99
107
|
|
|
108
|
+
get closed(): boolean {
|
|
109
|
+
return this.#closed;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
get failure(): Error | null {
|
|
113
|
+
return this.#failure;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
#reportError(error: Error): void {
|
|
117
|
+
this.#failure ??= error;
|
|
118
|
+
this.emit("error", error);
|
|
119
|
+
}
|
|
120
|
+
|
|
100
121
|
#markClosed(): void {
|
|
101
122
|
if (this.#closed) return;
|
|
102
123
|
this.#closed = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.84.
|
|
1
|
+
0.84.4
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.84.
|
|
1
|
+
0.84.4
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.84.
|
|
1
|
+
0.84.4
|
|
@@ -23,6 +23,7 @@ const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh", "ma
|
|
|
23
23
|
type ThinkingLevel = (typeof THINKING_LEVELS)[number];
|
|
24
24
|
type ThinkingLevelMap = Partial<Record<ThinkingLevel, unknown | null>>;
|
|
25
25
|
const CODE_REVIEWER_MODEL_PREFERENCES = [
|
|
26
|
+
"gpt-6-astra",
|
|
26
27
|
"gpt-5.6-sol",
|
|
27
28
|
"gpt-5.6-terra",
|
|
28
29
|
"gpt-5.6-luna",
|
|
@@ -56,8 +57,9 @@ const PROVIDER_MODEL_PREFERENCES: Record<string, string[]> = {
|
|
|
56
57
|
"claude-sonnet-4-6",
|
|
57
58
|
"claude-sonnet-4-5",
|
|
58
59
|
],
|
|
59
|
-
openai: ["gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-5.5", "gpt-5", "gpt-4.1", "o3", "o4-mini"],
|
|
60
|
+
openai: ["gpt-6-astra", "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-5.5", "gpt-5", "gpt-4.1", "o3", "o4-mini"],
|
|
60
61
|
"openai-codex": [
|
|
62
|
+
"gpt-6-astra",
|
|
61
63
|
"gpt-5.6-sol",
|
|
62
64
|
"gpt-5.6-terra",
|
|
63
65
|
"gpt-5.6-luna",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.84.
|
|
1
|
+
0.84.4
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.84.
|
|
1
|
+
0.84.4
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.84.
|
|
1
|
+
0.84.4
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.84.
|
|
1
|
+
0.84.4
|
|
@@ -105,6 +105,7 @@ const CONTRARIAN_STATUS_ID = "contrarian";
|
|
|
105
105
|
const CONTRARIAN_WIDGET_ID = "contrarian";
|
|
106
106
|
const CONTRARIAN_CONFIG_FILE = "contrarian.json";
|
|
107
107
|
const CONTRARIAN_MODEL_PREFERENCES = [
|
|
108
|
+
"gpt-6-astra",
|
|
108
109
|
"gpt-5.6-sol",
|
|
109
110
|
"gpt-5.6-terra",
|
|
110
111
|
"gpt-5.6-luna",
|
|
@@ -132,6 +133,9 @@ const PROVIDER_MODEL_PREFERENCES: Record<string, string[]> = {
|
|
|
132
133
|
"claude-opus-4-5",
|
|
133
134
|
"claude-opus-4-1",
|
|
134
135
|
"claude-opus-4",
|
|
136
|
+
"openai.gpt-5.6-sol",
|
|
137
|
+
"openai.gpt-5.6-terra",
|
|
138
|
+
"openai.gpt-5.6-luna",
|
|
135
139
|
"claude-sonnet-5",
|
|
136
140
|
"claude-sonnet-4-6",
|
|
137
141
|
"claude-sonnet-4-5",
|
|
@@ -142,6 +146,7 @@ const PROVIDER_MODEL_PREFERENCES: Record<string, string[]> = {
|
|
|
142
146
|
"minimax-m2.5",
|
|
143
147
|
"minimax-m2.1",
|
|
144
148
|
"zai.glm-5",
|
|
149
|
+
"xai.grok-4.6",
|
|
145
150
|
],
|
|
146
151
|
anthropic: [
|
|
147
152
|
"claude-opus-5",
|
|
@@ -177,6 +182,7 @@ const PROVIDER_MODEL_PREFERENCES: Record<string, string[]> = {
|
|
|
177
182
|
baseten: [
|
|
178
183
|
"moonshotai/Kimi-K3",
|
|
179
184
|
"moonshotai/Kimi-K2.7-Code",
|
|
185
|
+
"zai-org/GLM-5.3",
|
|
180
186
|
"deepseek-ai/DeepSeek-V4-Pro-0813",
|
|
181
187
|
"deepseek-ai/DeepSeek-V4-Pro",
|
|
182
188
|
"zai-org/GLM-5.2",
|
|
@@ -193,62 +199,67 @@ const PROVIDER_MODEL_PREFERENCES: Record<string, string[]> = {
|
|
|
193
199
|
"zai-org/GLM-5.2-Fast",
|
|
194
200
|
"zai-org/GLM-4.7",
|
|
195
201
|
],
|
|
196
|
-
cerebras: ["gpt-oss-120b", "
|
|
202
|
+
cerebras: ["gpt-oss-120b", "gemma-4-31b"],
|
|
197
203
|
"cloudflare-ai-gateway": [
|
|
198
204
|
"claude-fable-5",
|
|
199
|
-
"claude-opus-
|
|
200
|
-
"claude-opus-4
|
|
201
|
-
"claude-opus-4
|
|
205
|
+
"claude-opus-5",
|
|
206
|
+
"claude-opus-4.8",
|
|
207
|
+
"claude-opus-4.7",
|
|
208
|
+
"claude-opus-4.6",
|
|
209
|
+
"claude-opus-4.5",
|
|
202
210
|
"gpt-5.5",
|
|
203
211
|
"gpt-5.4",
|
|
204
|
-
"
|
|
212
|
+
"workers-ai/@cf/moonshotai/kimi-k2.7-code",
|
|
213
|
+
"workers-ai/@cf/deepseek-ai/deepseek-v4-pro-0813",
|
|
214
|
+
"workers-ai/@cf/zai-org/glm-5.3",
|
|
215
|
+
"workers-ai/@cf/zai-org/glm-5.2",
|
|
205
216
|
"workers-ai/@cf/moonshotai/kimi-k2.6",
|
|
206
217
|
"workers-ai/@cf/nvidia/nemotron-3-120b-a12b",
|
|
218
|
+
"workers-ai/@cf/openai/gpt-oss-120b",
|
|
207
219
|
"workers-ai/@cf/zai-org/glm-4.7-flash",
|
|
208
220
|
],
|
|
209
221
|
"cloudflare-workers-ai": [
|
|
210
222
|
"@cf/moonshotai/kimi-k2.7-code",
|
|
223
|
+
"@cf/deepseek-ai/deepseek-v4-pro-0813",
|
|
224
|
+
"@cf/zai-org/glm-5.3",
|
|
211
225
|
"@cf/zai-org/glm-5.2",
|
|
212
226
|
"@cf/moonshotai/kimi-k2.6",
|
|
213
227
|
"@cf/nvidia/nemotron-3-120b-a12b",
|
|
214
228
|
"@cf/openai/gpt-oss-120b",
|
|
229
|
+
"@cf/qwen/qwen3.8-27b",
|
|
215
230
|
"@cf/qwen/qwen3-30b-a3b-fp8",
|
|
216
231
|
"@cf/zai-org/glm-4.7-flash",
|
|
217
232
|
],
|
|
218
233
|
deepseek: ["deepseek-v4-pro", "deepseek-v4-flash"],
|
|
219
234
|
fireworks: [
|
|
235
|
+
"accounts/fireworks/models/kimi-k3",
|
|
236
|
+
"accounts/fireworks/routers/kimi-k3-fast",
|
|
220
237
|
"accounts/fireworks/models/deepseek-v4-pro",
|
|
221
238
|
"accounts/fireworks/models/kimi-k2p7-code",
|
|
222
|
-
"accounts/fireworks/routers/kimi-k2p7-code-fast",
|
|
223
239
|
"accounts/fireworks/models/glm-5p2",
|
|
224
240
|
"accounts/fireworks/routers/glm-5p2-fast",
|
|
225
241
|
"accounts/fireworks/models/minimax-m3",
|
|
226
242
|
"accounts/fireworks/models/kimi-k2p6",
|
|
227
|
-
"accounts/fireworks/routers/kimi-k2p6-turbo",
|
|
228
|
-
"accounts/fireworks/routers/kimi-k2p6-fast",
|
|
229
|
-
"accounts/fireworks/models/minimax-m2p7",
|
|
230
243
|
"accounts/fireworks/models/qwen3p7-plus",
|
|
231
244
|
"accounts/fireworks/models/gpt-oss-120b",
|
|
232
|
-
"accounts/fireworks/models/gpt-oss-20b",
|
|
233
245
|
],
|
|
234
246
|
"github-copilot": [
|
|
235
247
|
"claude-opus-5",
|
|
236
248
|
"claude-fable-5",
|
|
237
249
|
"claude-opus-4.8",
|
|
238
250
|
"claude-opus-4.7",
|
|
239
|
-
"
|
|
240
|
-
"
|
|
251
|
+
"gpt-6-astra",
|
|
252
|
+
"gpt-5.6-sol",
|
|
253
|
+
"gpt-5.6-terra",
|
|
254
|
+
"gpt-5.6-luna",
|
|
241
255
|
"gpt-5.5",
|
|
242
256
|
"gpt-5.4",
|
|
243
257
|
"gpt-5.3-codex",
|
|
244
|
-
"gpt-5.2-codex",
|
|
245
|
-
"gpt-5.2",
|
|
246
|
-
"gemini-3.1-pro-preview",
|
|
247
258
|
"gemini-3.5-flash",
|
|
248
259
|
"claude-sonnet-5",
|
|
249
260
|
"claude-sonnet-4.6",
|
|
250
|
-
"claude-sonnet-4.5",
|
|
251
261
|
"gpt-5-mini",
|
|
262
|
+
"kimi-k3",
|
|
252
263
|
"kimi-k2.7-code",
|
|
253
264
|
],
|
|
254
265
|
google: [
|
|
@@ -277,7 +288,10 @@ const PROVIDER_MODEL_PREFERENCES: Record<string, string[]> = {
|
|
|
277
288
|
"openai/gpt-oss-20b",
|
|
278
289
|
],
|
|
279
290
|
huggingface: [
|
|
291
|
+
"moonshotai/Kimi-K3",
|
|
280
292
|
"zai-org/GLM-5.1",
|
|
293
|
+
"zai-org/GLM-5.3-Flash",
|
|
294
|
+
"deepseek-ai/DeepSeek-V4-Pro-0813",
|
|
281
295
|
"deepseek-ai/DeepSeek-V4-Pro",
|
|
282
296
|
"moonshotai/Kimi-K2.6",
|
|
283
297
|
"MiniMaxAI/MiniMax-M2.7",
|
|
@@ -302,8 +316,10 @@ const PROVIDER_MODEL_PREFERENCES: Record<string, string[]> = {
|
|
|
302
316
|
"mistral-medium-2508",
|
|
303
317
|
"mistral-small-2603",
|
|
304
318
|
"devstral-2512",
|
|
319
|
+
"zai-glm-5-2",
|
|
305
320
|
],
|
|
306
321
|
openai: [
|
|
322
|
+
"gpt-6-astra",
|
|
307
323
|
"gpt-5.6-sol",
|
|
308
324
|
"gpt-5.6-terra",
|
|
309
325
|
"gpt-5.6-luna",
|
|
@@ -323,6 +339,7 @@ const PROVIDER_MODEL_PREFERENCES: Record<string, string[]> = {
|
|
|
323
339
|
"gpt-5-mini",
|
|
324
340
|
],
|
|
325
341
|
"openai-codex": [
|
|
342
|
+
"gpt-6-astra",
|
|
326
343
|
"gpt-5.6-sol",
|
|
327
344
|
"gpt-5.6-terra",
|
|
328
345
|
"gpt-5.6-luna",
|
|
@@ -351,6 +368,7 @@ const PROVIDER_MODEL_PREFERENCES: Record<string, string[]> = {
|
|
|
351
368
|
"glm-5.2",
|
|
352
369
|
"glm-5.1",
|
|
353
370
|
"glm-5",
|
|
371
|
+
"kimi-k3",
|
|
354
372
|
"kimi-k2.7-code",
|
|
355
373
|
"kimi-k2.6",
|
|
356
374
|
"kimi-k2.5",
|
|
@@ -361,6 +379,7 @@ const PROVIDER_MODEL_PREFERENCES: Record<string, string[]> = {
|
|
|
361
379
|
],
|
|
362
380
|
"opencode-go": [
|
|
363
381
|
"deepseek-v4-pro",
|
|
382
|
+
"glm-5.3",
|
|
364
383
|
"glm-5.2",
|
|
365
384
|
"glm-5.1",
|
|
366
385
|
"qwen3.7-max",
|
|
@@ -370,6 +389,7 @@ const PROVIDER_MODEL_PREFERENCES: Record<string, string[]> = {
|
|
|
370
389
|
"mimo-v2.5",
|
|
371
390
|
"minimax-m3",
|
|
372
391
|
"minimax-m2.7",
|
|
392
|
+
"kimi-k3",
|
|
373
393
|
"kimi-k2.7-code",
|
|
374
394
|
"kimi-k2.6",
|
|
375
395
|
],
|
|
@@ -378,9 +398,7 @@ const PROVIDER_MODEL_PREFERENCES: Record<string, string[]> = {
|
|
|
378
398
|
"anthropic/claude-fable-5",
|
|
379
399
|
"~anthropic/claude-fable-latest",
|
|
380
400
|
"anthropic/claude-opus-4.8",
|
|
381
|
-
"anthropic/claude-opus-4.8-fast",
|
|
382
401
|
"anthropic/claude-opus-4.7",
|
|
383
|
-
"anthropic/claude-opus-4.7-fast",
|
|
384
402
|
"anthropic/claude-opus-4.6",
|
|
385
403
|
"anthropic/claude-opus-4.5",
|
|
386
404
|
"anthropic/claude-opus-4.1",
|
|
@@ -398,6 +416,7 @@ const PROVIDER_MODEL_PREFERENCES: Record<string, string[]> = {
|
|
|
398
416
|
"~google/gemini-pro-latest",
|
|
399
417
|
"google/gemini-3.5-flash",
|
|
400
418
|
"google/gemini-2.5-pro",
|
|
419
|
+
"moonshotai/kimi-k3",
|
|
401
420
|
"moonshotai/kimi-k2.7-code",
|
|
402
421
|
"~moonshotai/kimi-latest",
|
|
403
422
|
"moonshotai/kimi-k2.6",
|
|
@@ -410,6 +429,7 @@ const PROVIDER_MODEL_PREFERENCES: Record<string, string[]> = {
|
|
|
410
429
|
"minimax/minimax-m3",
|
|
411
430
|
"minimax/minimax-m2.7",
|
|
412
431
|
"minimax/minimax-m2.1",
|
|
432
|
+
"z-ai/glm-5.3",
|
|
413
433
|
"z-ai/glm-5.2",
|
|
414
434
|
"z-ai/glm-5.1",
|
|
415
435
|
],
|
|
@@ -444,6 +464,8 @@ const PROVIDER_MODEL_PREFERENCES: Record<string, string[]> = {
|
|
|
444
464
|
],
|
|
445
465
|
together: [
|
|
446
466
|
"deepseek-ai/DeepSeek-V4-Pro",
|
|
467
|
+
"moonshotai/Kimi-K3",
|
|
468
|
+
"zai-org/GLM-5.3-Flash",
|
|
447
469
|
"zai-org/GLM-5.2",
|
|
448
470
|
"moonshotai/Kimi-K2.7-Code",
|
|
449
471
|
"moonshotai/Kimi-K2.6",
|
|
@@ -476,6 +498,7 @@ const PROVIDER_MODEL_PREFERENCES: Record<string, string[]> = {
|
|
|
476
498
|
"openai/gpt-5.2-codex",
|
|
477
499
|
"openai/gpt-5.1-codex",
|
|
478
500
|
"openai/gpt-5-codex",
|
|
501
|
+
"moonshotai/kimi-k3",
|
|
479
502
|
"moonshotai/kimi-k2.7-code",
|
|
480
503
|
"moonshotai/kimi-k2.7-code-highspeed",
|
|
481
504
|
"moonshotai/kimi-k2.6",
|
|
@@ -493,6 +516,7 @@ const PROVIDER_MODEL_PREFERENCES: Record<string, string[]> = {
|
|
|
493
516
|
"xai/grok-4.5",
|
|
494
517
|
"xai/grok-4.20-reasoning",
|
|
495
518
|
"minimax/minimax-m3",
|
|
519
|
+
"zai/glm-5.3",
|
|
496
520
|
"zai/glm-5.2",
|
|
497
521
|
"zai/glm-5.1",
|
|
498
522
|
],
|
|
@@ -500,21 +524,19 @@ const PROVIDER_MODEL_PREFERENCES: Record<string, string[]> = {
|
|
|
500
524
|
"grok-4.6",
|
|
501
525
|
"grok-4.5",
|
|
502
526
|
"grok-4.3",
|
|
503
|
-
"grok-build-0.1",
|
|
504
527
|
],
|
|
505
|
-
xiaomi: ["mimo-v2.5-pro", "mimo-v2.5
|
|
506
|
-
"xiaomi-token-plan-ams": ["mimo-v2.5-pro", "mimo-v2.5"
|
|
507
|
-
"xiaomi-token-plan-cn": ["mimo-v2.5-pro", "mimo-v2.5"
|
|
508
|
-
"xiaomi-token-plan-sgp": ["mimo-v2.5-pro", "mimo-v2.5"
|
|
528
|
+
xiaomi: ["mimo-v2.5-pro-ultraspeed", "mimo-v2.5-pro", "mimo-v2.5"],
|
|
529
|
+
"xiaomi-token-plan-ams": ["mimo-v2.5-pro", "mimo-v2.5"],
|
|
530
|
+
"xiaomi-token-plan-cn": ["mimo-v2.5-pro", "mimo-v2.5"],
|
|
531
|
+
"xiaomi-token-plan-sgp": ["mimo-v2.5-pro", "mimo-v2.5"],
|
|
509
532
|
nvidia: [
|
|
510
533
|
"nvidia/nemotron-3-ultra-550b-a55b",
|
|
511
534
|
"nvidia/nemotron-3-super-120b-a12b",
|
|
535
|
+
"moonshotai/kimi-k3",
|
|
536
|
+
"deepseek-ai/deepseek-v4-pro-0813",
|
|
512
537
|
"moonshotai/kimi-k2.6",
|
|
513
|
-
"z-ai/glm-5.2",
|
|
514
538
|
"minimaxai/minimax-m3",
|
|
515
|
-
"openai/gpt-oss-120b",
|
|
516
539
|
"nvidia/nemotron-3-nano-omni-30b-a3b-reasoning",
|
|
517
|
-
"nvidia/nemotron-3-nano-30b-a3b",
|
|
518
540
|
],
|
|
519
541
|
zai: [
|
|
520
542
|
"glm-5.3",
|
|
@@ -529,8 +551,8 @@ const PROVIDER_MODEL_PREFERENCES: Record<string, string[]> = {
|
|
|
529
551
|
"glm-5",
|
|
530
552
|
"glm-4.7",
|
|
531
553
|
],
|
|
532
|
-
moonshotai: ["kimi-k2.7-code", "kimi-k2.7-code-highspeed", "kimi-k2.6", "kimi-k2-thinking-turbo", "kimi-k2-thinking", "kimi-k2.5"],
|
|
533
|
-
"moonshotai-cn": ["kimi-k2.7-code", "kimi-k2.7-code-highspeed", "kimi-k2.6", "kimi-k2-thinking-turbo", "kimi-k2-thinking", "kimi-k2.5"],
|
|
554
|
+
moonshotai: ["kimi-k3", "kimi-k2.7-code", "kimi-k2.7-code-highspeed", "kimi-k2.6", "kimi-k2-thinking-turbo", "kimi-k2-thinking", "kimi-k2.5"],
|
|
555
|
+
"moonshotai-cn": ["kimi-k3", "kimi-k2.7-code", "kimi-k2.7-code-highspeed", "kimi-k2.6", "kimi-k2-thinking-turbo", "kimi-k2-thinking", "kimi-k2.5"],
|
|
534
556
|
};
|
|
535
557
|
|
|
536
558
|
const CONTRARIAN_SYSTEM_PROMPT = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.84.
|
|
1
|
+
0.84.4
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.84.
|
|
1
|
+
0.84.4
|