dsh-agy-ui 0.1.0

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.
@@ -0,0 +1,62 @@
1
+ //#region src/interceptor.d.ts
2
+ declare const WRAPPED_FLAG: unique symbol;
3
+ interface LlmModelInfo {
4
+ provider: string;
5
+ id: string;
6
+ name: string;
7
+ description?: string;
8
+ inputModalities?: readonly string[];
9
+ }
10
+ interface LlmResolvedModelInfo {
11
+ provider: string;
12
+ id: string;
13
+ name: string;
14
+ description?: string;
15
+ inputModalities?: readonly string[];
16
+ context?: {
17
+ contextWindow: number;
18
+ };
19
+ defaultMaxTokens?: number;
20
+ reasoning?: {
21
+ efforts: Array<{
22
+ id: string;
23
+ name: string;
24
+ }>;
25
+ defaultEffort?: string;
26
+ };
27
+ }
28
+ /** Check if a model is an internal ghost model (chat_\d+ or tab_) */
29
+ declare function isGhostModel(modelId: string): boolean;
30
+ /** Format dynamic tiered model id to brand display name (e.g. 'gemini-3.8-flash-tiered' -> 'Gemini 3.8 Flash') */
31
+ declare function formatTieredModelName(modelId: string): string;
32
+ /** Standard Reasoning efforts for Level-thinking / Tiered models */
33
+ declare const STANDARD_REASONING: Readonly<{
34
+ efforts: readonly {
35
+ id: string;
36
+ name: string;
37
+ }[];
38
+ defaultEffort: "medium";
39
+ }>;
40
+ declare const PRO_REASONING: Readonly<{
41
+ efforts: readonly {
42
+ id: string;
43
+ name: string;
44
+ }[];
45
+ defaultEffort: "high";
46
+ }>;
47
+ /** Canonical friendly names */
48
+ declare const CANONICAL_NAMES: Record<string, string>;
49
+ /** Explicit priority ranking: 3.8 Flash -> 3.7 Flash -> 3.6 Flash -> 3.5 Flash -> 3 Flash -> 3.1 Flash Lite/Image -> 3.1 Pro -> 2.5 Series -> Claude -> GPT-OSS */
50
+ declare const MODEL_PRIORITY: Record<string, number>;
51
+ /** Check if this model is an expanded effort variant that should be folded */
52
+ declare function isFoldedVariant(modelId: string): boolean;
53
+ /** Wrap agy LlmAdapter with clean priority sorting, ghost filtering, folding, and tiered model enhancements */
54
+ declare function wrapAdapter(adapter: any, logger?: any): void;
55
+ //#endregion
56
+ //#region src/index.d.ts
57
+ declare const name = "dsh-agy-ui";
58
+ declare const inject: string[];
59
+ declare function apply(ctx: any): void;
60
+ //#endregion
61
+ export { CANONICAL_NAMES, LlmModelInfo, LlmResolvedModelInfo, MODEL_PRIORITY, PRO_REASONING, STANDARD_REASONING, WRAPPED_FLAG, apply, formatTieredModelName, inject, isFoldedVariant, isGhostModel, name, wrapAdapter };
62
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/interceptor.ts","../src/index.ts"],"mappings":";cAAa;UAEI;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;EACA;IAAY;;EACZ;EACA;IACE,SAAS;MAAQ;MAAY;;IAC7B;;;;iBAKY,aAAa;;iBAQb,sBAAsB;;cASzB,oBAAkB;;;;;;;cASlB,eAAa;;;;;;;;cASb,iBAAiB;;cAmBjB,gBAAgB;;iBAmBb,gBAAgB;;iBAiBhB,YAAY,cAAc;;;cChH7B;cACA;iBAEG,MAAM"}
package/dist/index.js ADDED
@@ -0,0 +1,277 @@
1
+ //#region src/interceptor.ts
2
+ const WRAPPED_FLAG = Symbol.for("dsh.agy-ui.wrapped");
3
+ /** Check if a model is an internal ghost model (chat_\d+ or tab_) */
4
+ function isGhostModel(modelId) {
5
+ if (!modelId || typeof modelId !== "string") return true;
6
+ if (/^chat_\d+$/.test(modelId)) return true;
7
+ if (/^tab_/.test(modelId)) return true;
8
+ return false;
9
+ }
10
+ /** Format dynamic tiered model id to brand display name (e.g. 'gemini-3.8-flash-tiered' -> 'Gemini 3.8 Flash') */
11
+ function formatTieredModelName(modelId) {
12
+ return modelId.replace(/-tiered$/, "").split("-").map((part) => /^\d+(\.\d+)*$/.test(part) ? part : part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
13
+ }
14
+ /** Standard Reasoning efforts for Level-thinking / Tiered models */
15
+ const STANDARD_REASONING = Object.freeze({
16
+ efforts: Object.freeze([
17
+ {
18
+ id: "low",
19
+ name: "Low"
20
+ },
21
+ {
22
+ id: "medium",
23
+ name: "Medium"
24
+ },
25
+ {
26
+ id: "high",
27
+ name: "High"
28
+ }
29
+ ]),
30
+ defaultEffort: "medium"
31
+ });
32
+ const PRO_REASONING = Object.freeze({
33
+ efforts: Object.freeze([{
34
+ id: "low",
35
+ name: "Low"
36
+ }, {
37
+ id: "high",
38
+ name: "High"
39
+ }]),
40
+ defaultEffort: "high"
41
+ });
42
+ /** Canonical friendly names */
43
+ const CANONICAL_NAMES = {
44
+ "gemini-3.8-flash-tiered": "Gemini 3.8 Flash",
45
+ "gemini-3.7-flash-tiered": "Gemini 3.7 Flash",
46
+ "gemini-3.6-flash-tiered": "Gemini 3.6 Flash",
47
+ "gemini-3.5-flash": "Gemini 3.5 Flash",
48
+ "gemini-3-flash": "Gemini 3 Flash",
49
+ "gemini-3.1-flash-lite": "Gemini 3.1 Flash Lite",
50
+ "gemini-3.1-flash-image": "Gemini 3.1 Flash Image",
51
+ "gemini-3.1-pro": "Gemini 3.1 Pro",
52
+ "gemini-2.5-pro": "Gemini 2.5 Pro",
53
+ "gemini-2.5-flash": "Gemini 2.5 Flash",
54
+ "gemini-2.5-flash-thinking": "Gemini 2.5 Flash Thinking",
55
+ "gemini-2.5-flash-lite": "Gemini 2.5 Flash Lite",
56
+ "claude-sonnet-4-6": "Claude Sonnet 4.6 (Thinking)",
57
+ "claude-opus-4-6-thinking": "Claude Opus 4.6 (Thinking)",
58
+ "gpt-oss-120b-medium": "GPT-OSS 120B (Medium)"
59
+ };
60
+ /** Explicit priority ranking: 3.8 Flash -> 3.7 Flash -> 3.6 Flash -> 3.5 Flash -> 3 Flash -> 3.1 Flash Lite/Image -> 3.1 Pro -> 2.5 Series -> Claude -> GPT-OSS */
61
+ const MODEL_PRIORITY = {
62
+ "gemini-3.8-flash-tiered": 10,
63
+ "gemini-3.7-flash-tiered": 20,
64
+ "gemini-3.6-flash-tiered": 30,
65
+ "gemini-3.5-flash": 40,
66
+ "gemini-3-flash": 50,
67
+ "gemini-3.1-flash-lite": 60,
68
+ "gemini-3.1-flash-image": 70,
69
+ "gemini-3.1-pro": 80,
70
+ "gemini-2.5-pro": 90,
71
+ "gemini-2.5-flash": 100,
72
+ "gemini-2.5-flash-thinking": 110,
73
+ "gemini-2.5-flash-lite": 120,
74
+ "claude-sonnet-4-6": 130,
75
+ "claude-opus-4-6-thinking": 140,
76
+ "gpt-oss-120b-medium": 150
77
+ };
78
+ /** Check if this model is an expanded effort variant that should be folded */
79
+ function isFoldedVariant(modelId) {
80
+ if (modelId.startsWith("gemini-")) {
81
+ if (modelId.endsWith("-low") || modelId.endsWith("-medium") || modelId.endsWith("-high") || modelId.endsWith("-extra-low") || modelId === "gemini-pro-agent" || modelId === "gemini-3-flash-agent") return true;
82
+ }
83
+ return false;
84
+ }
85
+ /** Wrap agy LlmAdapter with clean priority sorting, ghost filtering, folding, and tiered model enhancements */
86
+ function wrapAdapter(adapter, logger) {
87
+ if (!adapter || adapter[WRAPPED_FLAG]) return;
88
+ adapter[WRAPPED_FLAG] = true;
89
+ const originalListModels = adapter.listModels?.bind(adapter);
90
+ const originalResolveModel = adapter.resolveModel?.bind(adapter);
91
+ const originalStream = adapter.stream?.bind(adapter);
92
+ if (originalListModels) adapter.listModels = async function(provider) {
93
+ try {
94
+ const rawModels = await originalListModels(provider);
95
+ if (!Array.isArray(rawModels)) return rawModels;
96
+ const allIds = new Set(rawModels.map((m) => m.id));
97
+ const filtered = [];
98
+ const seen = /* @__PURE__ */ new Set();
99
+ if ((allIds.has("gemini-3.1-pro-low") || allIds.has("gemini-3.1-pro-high") || allIds.has("gemini-pro-agent")) && !seen.has("gemini-3.1-pro")) {
100
+ seen.add("gemini-3.1-pro");
101
+ filtered.push({
102
+ provider,
103
+ id: "gemini-3.1-pro",
104
+ name: "Gemini 3.1 Pro",
105
+ inputModalities: ["text", "image"]
106
+ });
107
+ }
108
+ if ((allIds.has("gemini-3.5-flash-low") || allIds.has("gemini-3.5-flash-extra-low") || allIds.has("gemini-3-flash-agent")) && !seen.has("gemini-3.5-flash")) {
109
+ seen.add("gemini-3.5-flash");
110
+ filtered.push({
111
+ provider,
112
+ id: "gemini-3.5-flash",
113
+ name: "Gemini 3.5 Flash",
114
+ inputModalities: ["text", "image"]
115
+ });
116
+ }
117
+ for (const m of rawModels) {
118
+ if (!m || typeof m.id !== "string") continue;
119
+ if (isGhostModel(m.id)) continue;
120
+ if (isFoldedVariant(m.id)) continue;
121
+ if (seen.has(m.id)) continue;
122
+ seen.add(m.id);
123
+ let displayName = m.name;
124
+ if (CANONICAL_NAMES[m.id]) displayName = CANONICAL_NAMES[m.id];
125
+ else if (m.id.endsWith("-tiered")) displayName = formatTieredModelName(m.id);
126
+ filtered.push({
127
+ ...m,
128
+ name: displayName
129
+ });
130
+ }
131
+ filtered.sort((a, b) => {
132
+ return (MODEL_PRIORITY[a.id] ?? 999) - (MODEL_PRIORITY[b.id] ?? 999);
133
+ });
134
+ return filtered;
135
+ } catch (err) {
136
+ logger?.warn?.("[dsh-agy-ui] listModels interceptor fallback on error:", err);
137
+ return originalListModels(provider);
138
+ }
139
+ };
140
+ if (originalResolveModel) adapter.resolveModel = async function(provider, model, signal) {
141
+ try {
142
+ if (model === "gemini-3.1-pro") {
143
+ let base;
144
+ try {
145
+ base = await originalResolveModel(provider, "gemini-pro-agent", signal);
146
+ } catch {
147
+ try {
148
+ base = await originalResolveModel(provider, "gemini-3.1-pro-low", signal);
149
+ } catch {}
150
+ }
151
+ return {
152
+ provider,
153
+ id: "gemini-3.1-pro",
154
+ name: "Gemini 3.1 Pro",
155
+ inputModalities: ["text", "image"],
156
+ context: base?.context ?? { contextWindow: 1048576 },
157
+ defaultMaxTokens: base?.defaultMaxTokens ?? 65535,
158
+ reasoning: {
159
+ ...PRO_REASONING,
160
+ efforts: [...PRO_REASONING.efforts]
161
+ }
162
+ };
163
+ }
164
+ if (model === "gemini-3.5-flash") {
165
+ let base;
166
+ try {
167
+ base = await originalResolveModel(provider, "gemini-3.5-flash-low", signal);
168
+ } catch {
169
+ try {
170
+ base = await originalResolveModel(provider, "gemini-3-flash-agent", signal);
171
+ } catch {}
172
+ }
173
+ return {
174
+ provider,
175
+ id: "gemini-3.5-flash",
176
+ name: "Gemini 3.5 Flash",
177
+ inputModalities: ["text", "image"],
178
+ context: base?.context ?? { contextWindow: 1048576 },
179
+ defaultMaxTokens: base?.defaultMaxTokens ?? 65536,
180
+ reasoning: {
181
+ ...STANDARD_REASONING,
182
+ efforts: [...STANDARD_REASONING.efforts]
183
+ }
184
+ };
185
+ }
186
+ let resolved;
187
+ try {
188
+ resolved = await originalResolveModel(provider, model, signal);
189
+ } catch (err) {
190
+ const match = model.match(/^(.*)-(low|medium|high|extra-low)$/);
191
+ if (match) {
192
+ const tieredId = `${match[1]}-tiered`;
193
+ resolved = {
194
+ ...await originalResolveModel(provider, tieredId, signal),
195
+ id: model,
196
+ name: `${formatTieredModelName(tieredId)} (${match[2].toUpperCase()})`
197
+ };
198
+ } else throw err;
199
+ }
200
+ if (model.endsWith("-tiered") || resolved.id?.endsWith("-tiered")) resolved = {
201
+ ...resolved,
202
+ name: formatTieredModelName(resolved.id),
203
+ reasoning: {
204
+ ...STANDARD_REASONING,
205
+ efforts: [...STANDARD_REASONING.efforts]
206
+ }
207
+ };
208
+ else if (CANONICAL_NAMES[resolved.id]) resolved = {
209
+ ...resolved,
210
+ name: CANONICAL_NAMES[resolved.id]
211
+ };
212
+ return resolved;
213
+ } catch (err) {
214
+ logger?.warn?.(`[dsh-agy-ui] resolveModel interceptor error for model "${model}":`, err);
215
+ return originalResolveModel(provider, model, signal);
216
+ }
217
+ };
218
+ if (originalStream) adapter.stream = async function* (options) {
219
+ let streamOptions = options;
220
+ if (options?.model) {
221
+ if (options.model === "gemini-3.1-pro") {
222
+ const targetModel = options.reasoningEffort?.toLowerCase() === "low" ? "gemini-3.1-pro-low" : "gemini-pro-agent";
223
+ streamOptions = {
224
+ ...options,
225
+ model: targetModel
226
+ };
227
+ } else if (options.model === "gemini-3.5-flash") {
228
+ const effort = options.reasoningEffort?.toLowerCase();
229
+ const targetModel = effort === "low" ? "gemini-3.5-flash-extra-low" : effort === "high" ? "gemini-3-flash-agent" : "gemini-3.5-flash-low";
230
+ streamOptions = {
231
+ ...options,
232
+ model: targetModel
233
+ };
234
+ } else {
235
+ const match = options.model.match(/^(.*)-(low|medium|high|extra-low)$/);
236
+ if (match && (match[1] === "gemini-3.6-flash" || match[1] === "gemini-3.7-flash" || match[1] === "gemini-3.8-flash")) {
237
+ const prefix = match[1];
238
+ const suffix = match[2];
239
+ const tieredId = `${prefix}-tiered`;
240
+ streamOptions = {
241
+ ...options,
242
+ model: tieredId,
243
+ reasoningEffort: options.reasoningEffort || (suffix === "extra-low" ? "low" : suffix)
244
+ };
245
+ }
246
+ }
247
+ }
248
+ yield* originalStream(streamOptions);
249
+ };
250
+ logger?.info?.("[dsh-agy-ui] Successfully wrapped agy LlmAdapter");
251
+ }
252
+ //#endregion
253
+ //#region src/index.ts
254
+ const name = "dsh-agy-ui";
255
+ const inject = ["llm"];
256
+ function apply(ctx) {
257
+ console.log("[dsh-agy-ui] apply called! Initializing plugin...");
258
+ ctx.logger?.info?.("[dsh-agy-ui] Initializing plugin...");
259
+ const tryWrap = () => {
260
+ const llmService = ctx.get("llm");
261
+ if (!llmService?.adapters) return false;
262
+ const agyReg = llmService.adapters.get("agy");
263
+ if (agyReg?.adapter) {
264
+ wrapAdapter(agyReg.adapter, ctx.logger);
265
+ return true;
266
+ }
267
+ return false;
268
+ };
269
+ if (!tryWrap()) ctx.logger.info("[dsh-agy-ui] agy adapter not found yet, listening for updates...");
270
+ ctx.on("llm/adapters-updated", () => {
271
+ tryWrap();
272
+ });
273
+ }
274
+ //#endregion
275
+ export { CANONICAL_NAMES, MODEL_PRIORITY, PRO_REASONING, STANDARD_REASONING, WRAPPED_FLAG, apply, formatTieredModelName, inject, isFoldedVariant, isGhostModel, name, wrapAdapter };
276
+
277
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/interceptor.ts","../src/index.ts"],"sourcesContent":["export const WRAPPED_FLAG = Symbol.for(\"dsh.agy-ui.wrapped\");\n\nexport interface LlmModelInfo {\n provider: string;\n id: string;\n name: string;\n description?: string;\n inputModalities?: readonly string[];\n}\n\nexport interface LlmResolvedModelInfo {\n provider: string;\n id: string;\n name: string;\n description?: string;\n inputModalities?: readonly string[];\n context?: { contextWindow: number };\n defaultMaxTokens?: number;\n reasoning?: {\n efforts: Array<{ id: string; name: string }>;\n defaultEffort?: string;\n };\n}\n\n/** Check if a model is an internal ghost model (chat_\\d+ or tab_) */\nexport function isGhostModel(modelId: string): boolean {\n if (!modelId || typeof modelId !== \"string\") return true;\n if (/^chat_\\d+$/.test(modelId)) return true;\n if (/^tab_/.test(modelId)) return true;\n return false;\n}\n\n/** Format dynamic tiered model id to brand display name (e.g. 'gemini-3.8-flash-tiered' -> 'Gemini 3.8 Flash') */\nexport function formatTieredModelName(modelId: string): string {\n const base = modelId.replace(/-tiered$/, \"\");\n return base\n .split(\"-\")\n .map(part => /^\\d+(\\.\\d+)*$/.test(part) ? part : part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\n/** Standard Reasoning efforts for Level-thinking / Tiered models */\nexport const STANDARD_REASONING = Object.freeze({\n efforts: Object.freeze([\n { id: \"low\", name: \"Low\" },\n { id: \"medium\", name: \"Medium\" },\n { id: \"high\", name: \"High\" }\n ]),\n defaultEffort: \"medium\"\n});\n\nexport const PRO_REASONING = Object.freeze({\n efforts: Object.freeze([\n { id: \"low\", name: \"Low\" },\n { id: \"high\", name: \"High\" }\n ]),\n defaultEffort: \"high\"\n});\n\n/** Canonical friendly names */\nexport const CANONICAL_NAMES: Record<string, string> = {\n \"gemini-3.8-flash-tiered\": \"Gemini 3.8 Flash\",\n \"gemini-3.7-flash-tiered\": \"Gemini 3.7 Flash\",\n \"gemini-3.6-flash-tiered\": \"Gemini 3.6 Flash\",\n \"gemini-3.5-flash\": \"Gemini 3.5 Flash\",\n \"gemini-3-flash\": \"Gemini 3 Flash\",\n \"gemini-3.1-flash-lite\": \"Gemini 3.1 Flash Lite\",\n \"gemini-3.1-flash-image\": \"Gemini 3.1 Flash Image\",\n \"gemini-3.1-pro\": \"Gemini 3.1 Pro\",\n \"gemini-2.5-pro\": \"Gemini 2.5 Pro\",\n \"gemini-2.5-flash\": \"Gemini 2.5 Flash\",\n \"gemini-2.5-flash-thinking\": \"Gemini 2.5 Flash Thinking\",\n \"gemini-2.5-flash-lite\": \"Gemini 2.5 Flash Lite\",\n \"claude-sonnet-4-6\": \"Claude Sonnet 4.6 (Thinking)\",\n \"claude-opus-4-6-thinking\": \"Claude Opus 4.6 (Thinking)\",\n \"gpt-oss-120b-medium\": \"GPT-OSS 120B (Medium)\"\n};\n\n/** Explicit priority ranking: 3.8 Flash -> 3.7 Flash -> 3.6 Flash -> 3.5 Flash -> 3 Flash -> 3.1 Flash Lite/Image -> 3.1 Pro -> 2.5 Series -> Claude -> GPT-OSS */\nexport const MODEL_PRIORITY: Record<string, number> = {\n \"gemini-3.8-flash-tiered\": 10,\n \"gemini-3.7-flash-tiered\": 20,\n \"gemini-3.6-flash-tiered\": 30,\n \"gemini-3.5-flash\": 40,\n \"gemini-3-flash\": 50,\n \"gemini-3.1-flash-lite\": 60,\n \"gemini-3.1-flash-image\": 70,\n \"gemini-3.1-pro\": 80,\n \"gemini-2.5-pro\": 90,\n \"gemini-2.5-flash\": 100,\n \"gemini-2.5-flash-thinking\": 110,\n \"gemini-2.5-flash-lite\": 120,\n \"claude-sonnet-4-6\": 130,\n \"claude-opus-4-6-thinking\": 140,\n \"gpt-oss-120b-medium\": 150\n};\n\n/** Check if this model is an expanded effort variant that should be folded */\nexport function isFoldedVariant(modelId: string): boolean {\n if (modelId.startsWith(\"gemini-\")) {\n if (\n modelId.endsWith(\"-low\") ||\n modelId.endsWith(\"-medium\") ||\n modelId.endsWith(\"-high\") ||\n modelId.endsWith(\"-extra-low\") ||\n modelId === \"gemini-pro-agent\" ||\n modelId === \"gemini-3-flash-agent\"\n ) {\n return true;\n }\n }\n return false;\n}\n\n/** Wrap agy LlmAdapter with clean priority sorting, ghost filtering, folding, and tiered model enhancements */\nexport function wrapAdapter(adapter: any, logger?: any) {\n if (!adapter || adapter[WRAPPED_FLAG]) return;\n adapter[WRAPPED_FLAG] = true;\n\n const originalListModels = adapter.listModels?.bind(adapter);\n const originalResolveModel = adapter.resolveModel?.bind(adapter);\n const originalStream = adapter.stream?.bind(adapter);\n\n if (originalListModels) {\n adapter.listModels = async function (provider: string): Promise<readonly LlmModelInfo[]> {\n try {\n const rawModels: LlmModelInfo[] = await originalListModels(provider);\n if (!Array.isArray(rawModels)) return rawModels;\n\n const allIds = new Set(rawModels.map(m => m.id));\n const filtered: LlmModelInfo[] = [];\n const seen = new Set<string>();\n\n // 1. Inject consolidated Gemini 3.1 Pro if its variants exist\n const has31ProVariants =\n allIds.has(\"gemini-3.1-pro-low\") ||\n allIds.has(\"gemini-3.1-pro-high\") ||\n allIds.has(\"gemini-pro-agent\");\n if (has31ProVariants && !seen.has(\"gemini-3.1-pro\")) {\n seen.add(\"gemini-3.1-pro\");\n filtered.push({\n provider,\n id: \"gemini-3.1-pro\",\n name: \"Gemini 3.1 Pro\",\n inputModalities: [\"text\", \"image\"]\n });\n }\n\n // 2. Inject consolidated Gemini 3.5 Flash if its variants exist\n const has35FlashVariants =\n allIds.has(\"gemini-3.5-flash-low\") ||\n allIds.has(\"gemini-3.5-flash-extra-low\") ||\n allIds.has(\"gemini-3-flash-agent\");\n if (has35FlashVariants && !seen.has(\"gemini-3.5-flash\")) {\n seen.add(\"gemini-3.5-flash\");\n filtered.push({\n provider,\n id: \"gemini-3.5-flash\",\n name: \"Gemini 3.5 Flash\",\n inputModalities: [\"text\", \"image\"]\n });\n }\n\n for (const m of rawModels) {\n if (!m || typeof m.id !== \"string\") continue;\n\n // Filter internal ghost models (chat_*, tab_*)\n if (isGhostModel(m.id)) continue;\n\n // Effort folding: skip scattered effort variants\n if (isFoldedVariant(m.id)) continue;\n\n if (seen.has(m.id)) continue;\n seen.add(m.id);\n\n // Canonical name formatting\n let displayName = m.name;\n if (CANONICAL_NAMES[m.id]) {\n displayName = CANONICAL_NAMES[m.id];\n } else if (m.id.endsWith(\"-tiered\")) {\n displayName = formatTieredModelName(m.id);\n }\n\n filtered.push({\n ...m,\n name: displayName\n });\n }\n\n // 3. Exact priority sort\n filtered.sort((a, b) => {\n const pA = MODEL_PRIORITY[a.id] ?? 999;\n const pB = MODEL_PRIORITY[b.id] ?? 999;\n return pA - pB;\n });\n\n return filtered;\n } catch (err) {\n logger?.warn?.(\"[dsh-agy-ui] listModels interceptor fallback on error:\", err);\n return originalListModels(provider);\n }\n };\n }\n\n if (originalResolveModel) {\n adapter.resolveModel = async function (provider: string, model: string, signal?: AbortSignal): Promise<LlmResolvedModelInfo> {\n try {\n // Consolidated Gemini 3.1 Pro\n if (model === \"gemini-3.1-pro\") {\n let base: LlmResolvedModelInfo | undefined;\n try {\n base = await originalResolveModel(provider, \"gemini-pro-agent\", signal);\n } catch {\n try {\n base = await originalResolveModel(provider, \"gemini-3.1-pro-low\", signal);\n } catch {\n // fallback\n }\n }\n return {\n provider,\n id: \"gemini-3.1-pro\",\n name: \"Gemini 3.1 Pro\",\n inputModalities: [\"text\", \"image\"],\n context: base?.context ?? { contextWindow: 1048576 },\n defaultMaxTokens: base?.defaultMaxTokens ?? 65535,\n reasoning: {\n ...PRO_REASONING,\n efforts: [...PRO_REASONING.efforts]\n }\n };\n }\n\n // Consolidated Gemini 3.5 Flash\n if (model === \"gemini-3.5-flash\") {\n let base: LlmResolvedModelInfo | undefined;\n try {\n base = await originalResolveModel(provider, \"gemini-3.5-flash-low\", signal);\n } catch {\n try {\n base = await originalResolveModel(provider, \"gemini-3-flash-agent\", signal);\n } catch {\n // fallback\n }\n }\n return {\n provider,\n id: \"gemini-3.5-flash\",\n name: \"Gemini 3.5 Flash\",\n inputModalities: [\"text\", \"image\"],\n context: base?.context ?? { contextWindow: 1048576 },\n defaultMaxTokens: base?.defaultMaxTokens ?? 65536,\n reasoning: {\n ...STANDARD_REASONING,\n efforts: [...STANDARD_REASONING.efforts]\n }\n };\n }\n\n let resolved: LlmResolvedModelInfo;\n try {\n resolved = await originalResolveModel(provider, model, signal);\n } catch (err) {\n // Backward compatibility: If original failed, try resolving tiered counterpart\n const match = model.match(/^(.*)-(low|medium|high|extra-low)$/);\n if (match) {\n const tieredId = `${match[1]}-tiered`;\n const fallbackResolved = await originalResolveModel(provider, tieredId, signal);\n resolved = {\n ...fallbackResolved,\n id: model,\n name: `${formatTieredModelName(tieredId)} (${match[2].toUpperCase()})`\n };\n } else {\n throw err;\n }\n }\n\n // Tiered models: ensure clean name and standard reasoning efforts\n if (model.endsWith(\"-tiered\") || resolved.id?.endsWith(\"-tiered\")) {\n resolved = {\n ...resolved,\n name: formatTieredModelName(resolved.id),\n reasoning: {\n ...STANDARD_REASONING,\n efforts: [...STANDARD_REASONING.efforts]\n }\n };\n } else if (CANONICAL_NAMES[resolved.id]) {\n resolved = {\n ...resolved,\n name: CANONICAL_NAMES[resolved.id]\n };\n }\n\n return resolved;\n } catch (err) {\n logger?.warn?.(`[dsh-agy-ui] resolveModel interceptor error for model \"${model}\":`, err);\n return originalResolveModel(provider, model, signal);\n }\n };\n }\n\n if (originalStream) {\n adapter.stream = async function* (options: any) {\n let streamOptions = options;\n if (options?.model) {\n // Consolidated Gemini 3.1 Pro dispatch\n if (options.model === \"gemini-3.1-pro\") {\n const effort = options.reasoningEffort?.toLowerCase();\n const targetModel = effort === \"low\" ? \"gemini-3.1-pro-low\" : \"gemini-pro-agent\";\n streamOptions = {\n ...options,\n model: targetModel\n };\n }\n // Consolidated Gemini 3.5 Flash dispatch\n else if (options.model === \"gemini-3.5-flash\") {\n const effort = options.reasoningEffort?.toLowerCase();\n const targetModel =\n effort === \"low\"\n ? \"gemini-3.5-flash-extra-low\"\n : effort === \"high\"\n ? \"gemini-3-flash-agent\"\n : \"gemini-3.5-flash-low\";\n streamOptions = {\n ...options,\n model: targetModel\n };\n }\n // Backward compatibility for tiered variants\n else {\n const match = options.model.match(/^(.*)-(low|medium|high|extra-low)$/);\n if (match && (match[1] === \"gemini-3.6-flash\" || match[1] === \"gemini-3.7-flash\" || match[1] === \"gemini-3.8-flash\")) {\n const prefix = match[1];\n const suffix = match[2];\n const tieredId = `${prefix}-tiered`;\n streamOptions = {\n ...options,\n model: tieredId,\n reasoningEffort: options.reasoningEffort || (suffix === \"extra-low\" ? \"low\" : suffix)\n };\n }\n }\n }\n yield* originalStream(streamOptions);\n };\n }\n\n logger?.info?.(\"[dsh-agy-ui] Successfully wrapped agy LlmAdapter\");\n}\n","import { wrapAdapter } from \"./interceptor.js\";\nexport * from \"./interceptor.js\";\n\nexport const name = \"dsh-agy-ui\";\nexport const inject = [\"llm\"];\n\nexport function apply(ctx: any) {\n console.log(\"[dsh-agy-ui] apply called! Initializing plugin...\");\n ctx.logger?.info?.(\"[dsh-agy-ui] Initializing plugin...\");\n\n const tryWrap = () => {\n const llmService = ctx.get(\"llm\");\n if (!llmService?.adapters) return false;\n const agyReg = llmService.adapters.get(\"agy\");\n if (agyReg?.adapter) {\n wrapAdapter(agyReg.adapter, ctx.logger);\n return true;\n }\n return false;\n };\n\n if (!tryWrap()) {\n ctx.logger.info(\"[dsh-agy-ui] agy adapter not found yet, listening for updates...\");\n }\n\n ctx.on(\"llm/adapters-updated\", () => {\n tryWrap();\n });\n}\n"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "dsh-agy-ui",
3
+ "version": "0.1.0",
4
+ "description": "DeepSeek Harness Antigravity UI & Experience Enhancement Plugin",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./client": "./dist/client.js",
14
+ "./cordis.patch.yml": "./cordis.patch.yml",
15
+ "./package.json": "./package.json"
16
+ },
17
+ "dsh": {
18
+ "bundle": {
19
+ "patch": "./cordis.patch.yml"
20
+ },
21
+ "client": {
22
+ "inject": [
23
+ "slots"
24
+ ],
25
+ "platform": "web"
26
+ }
27
+ },
28
+ "files": [
29
+ "dist",
30
+ "cordis.patch.yml",
31
+ "README.md",
32
+ "README.en.md",
33
+ "LICENSE"
34
+ ],
35
+ "scripts": {
36
+ "build": "tsdown",
37
+ "prepare": "tsdown",
38
+ "prepublishOnly": "npm run build",
39
+ "typecheck": "tsc --noEmit",
40
+ "test": "node test/interceptor.test.mjs"
41
+ },
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "git+https://github.com/Erick0412-dev/dsh-agy-ui.git"
45
+ },
46
+ "keywords": [
47
+ "deepseek-harness",
48
+ "dsh",
49
+ "antigravity",
50
+ "gemini",
51
+ "claude",
52
+ "dsh-plugin"
53
+ ],
54
+ "author": "Erick0412-dev",
55
+ "license": "MIT",
56
+ "peerDependencies": {
57
+ "@deepseek-ai/cordis": "*",
58
+ "@deepseek-ai/dsh-llm": "*",
59
+ "react": "^18.0.0"
60
+ },
61
+ "peerDependenciesMeta": {
62
+ "@deepseek-ai/cordis": {
63
+ "optional": true
64
+ },
65
+ "@deepseek-ai/dsh-llm": {
66
+ "optional": true
67
+ },
68
+ "react": {
69
+ "optional": true
70
+ }
71
+ },
72
+ "devDependencies": {
73
+ "@types/node": "^22.0.0",
74
+ "@types/react": "^18.3.0",
75
+ "@types/react-dom": "^18.3.0",
76
+ "react": "^18.3.1",
77
+ "react-dom": "^18.3.1",
78
+ "tsdown": "^0.22.14",
79
+ "typescript": "^5.8.0"
80
+ }
81
+ }