pybao-cli 1.4.97 → 1.4.99
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/dist/REPL-KURZV7EW.js +49 -0
- package/dist/{acp-RCUUG4TE.js → acp-IIKBAJCJ.js} +30 -30
- package/dist/{agentsValidate-FOGGBCAM.js → agentsValidate-6CEARR6Z.js} +7 -7
- package/dist/{ask-Y7GSDBHR.js → ask-7NE7NVRN.js} +29 -29
- package/dist/{autoUpdater-I3LHHCHT.js → autoUpdater-LFOXQ3CV.js} +3 -3
- package/dist/{chunk-DODMRDRY.js → chunk-2CLRREZ5.js} +3 -3
- package/dist/{chunk-WSATR4WL.js → chunk-2IO7WUI7.js} +4 -4
- package/dist/{chunk-YIXTSVYD.js → chunk-3BPXWAOJ.js} +1 -1
- package/dist/{chunk-YIXTSVYD.js.map → chunk-3BPXWAOJ.js.map} +1 -1
- package/dist/{chunk-EVDTKHQS.js → chunk-4MZJNA2D.js} +2 -2
- package/dist/{chunk-AL6K5BMH.js → chunk-5TCQKGL7.js} +71 -35
- package/dist/chunk-5TCQKGL7.js.map +7 -0
- package/dist/{chunk-QMUFX7IJ.js → chunk-6E6QBP52.js} +1 -1
- package/dist/{chunk-HV4NI23F.js → chunk-6KPO3O64.js} +3 -3
- package/dist/{chunk-TCW74O5N.js → chunk-7KDTFITN.js} +3 -3
- package/dist/{chunk-EDTKZHPB.js → chunk-7QIWZIVM.js} +1 -1
- package/dist/{chunk-ZETRMTIG.js → chunk-7SDAA35I.js} +1 -1
- package/dist/{chunk-6AJ2CWOM.js → chunk-7SPP4L5F.js} +2 -2
- package/dist/{chunk-6TMRUFNH.js → chunk-A2IPV5PR.js} +2 -2
- package/dist/{chunk-4OHWJPFN.js → chunk-BBHKGKLF.js} +16 -24
- package/dist/{chunk-4OHWJPFN.js.map → chunk-BBHKGKLF.js.map} +2 -2
- package/dist/{chunk-RL64MB7U.js → chunk-D3SG4DHV.js} +3 -3
- package/dist/{chunk-LR2N7KMQ.js → chunk-DKQIGPXB.js} +1 -1
- package/dist/{chunk-VXUWHEDL.js → chunk-GIH6DDF7.js} +1 -1
- package/dist/{chunk-A6QAWMSQ.js → chunk-GNDMDOGM.js} +2 -2
- package/dist/{chunk-53JGT3P4.js → chunk-JEGVTLOH.js} +1 -1
- package/dist/{chunk-A53N6YJI.js → chunk-KK5DOHDD.js} +2 -2
- package/dist/{chunk-JKP2RIBC.js → chunk-KZ7I6E5P.js} +227 -106
- package/dist/chunk-KZ7I6E5P.js.map +7 -0
- package/dist/{chunk-JFQY2HV5.js → chunk-MMZ2MWHJ.js} +1 -1
- package/dist/{chunk-PZTJUV4A.js → chunk-NXLRKKFH.js} +1 -1
- package/dist/{chunk-TDEIIGZD.js → chunk-PDQTREWL.js} +2 -2
- package/dist/{chunk-JI7VDOMU.js → chunk-Q56IGZX5.js} +3 -3
- package/dist/{chunk-O7CYKDDE.js → chunk-TG2B47KG.js} +8 -76
- package/dist/chunk-TG2B47KG.js.map +7 -0
- package/dist/{chunk-RBT4E5DV.js → chunk-TYOT7UVX.js} +1 -1
- package/dist/{chunk-Y2CH5HCU.js → chunk-VKXOAPOS.js} +1 -1
- package/dist/{chunk-VPVZHCOG.js → chunk-WAQ72XDO.js} +3 -3
- package/dist/{chunk-JHCUUDEB.js → chunk-YH7ZOG3I.js} +4 -4
- package/dist/{chunk-6LUGSV66.js → chunk-ZXADEAK4.js} +4 -4
- package/dist/{chunk-I6JG3ZBH.js → chunk-ZXO6OMWV.js} +4 -4
- package/dist/{cli-2RUYT6CA.js → cli-B42Z5OSM.js} +89 -89
- package/dist/commands-MNUBXNIB.js +53 -0
- package/dist/{config-W6OYIJFP.js → config-ZC4PZWOC.js} +4 -4
- package/dist/{context-5VP2FZYF.js → context-MF3EKP4O.js} +6 -6
- package/dist/{conversationTracker-GOUWLXWN.js → conversationTracker-BM6KB27G.js} +3 -3
- package/dist/{customCommands-TDVISN2B.js → customCommands-63F72N5R.js} +4 -4
- package/dist/{env-DLGPG7EV.js → env-PGV75SHC.js} +2 -2
- package/dist/{file-TOOPTRF2.js → file-7NLJWX5W.js} +4 -4
- package/dist/index.js +3 -3
- package/dist/{llm-HPGYRNBC.js → llm-RCPJRG2F.js} +30 -30
- package/dist/{llmLazy-OKLOZGW7.js → llmLazy-C5G2MM53.js} +1 -1
- package/dist/{loader-BPVCWO3Q.js → loader-MPCV37S5.js} +4 -4
- package/dist/{lsp-Y5UU7OYG.js → lsp-7FPYFR6T.js} +6 -6
- package/dist/{lspAnchor-YNYJ7E7M.js → lspAnchor-C676SQ6E.js} +6 -6
- package/dist/{mcp-ZHOROUVO.js → mcp-VKKPULAR.js} +7 -7
- package/dist/{mentionProcessor-YA3PCQGC.js → mentionProcessor-LJHHC5H4.js} +5 -5
- package/dist/{messages-QE77NR42.js → messages-QSUEHIGU.js} +1 -1
- package/dist/{model-YUVFO4IF.js → model-AJTLB6V4.js} +7 -5
- package/dist/{openai-BYIA5SOE.js → openai-XIRY5EVT.js} +5 -5
- package/dist/{outputStyles-RUBJ56B2.js → outputStyles-OTRZEQSD.js} +4 -4
- package/dist/{pluginRuntime-TFQEES5T.js → pluginRuntime-NQ6GKMG6.js} +6 -6
- package/dist/{pluginValidation-H7X3X4KI.js → pluginValidation-AJUPAPU2.js} +6 -6
- package/dist/prompts-SWCPKXLQ.js +55 -0
- package/dist/{pybAgentSessionLoad-RGKKINBZ.js → pybAgentSessionLoad-MOZRT43D.js} +4 -4
- package/dist/{pybAgentSessionResume-KO5RTOM4.js → pybAgentSessionResume-S67UFBZF.js} +4 -4
- package/dist/{pybAgentStreamJsonSession-B2CP4XOB.js → pybAgentStreamJsonSession-UEEVKNIR.js} +1 -1
- package/dist/{pybHooks-CWI5I2PJ.js → pybHooks-UQQ6VWTB.js} +4 -4
- package/dist/query-ZKV22Q32.js +57 -0
- package/dist/{registry-W2TZF6IB.js → registry-VUAORMT6.js} +5 -5
- package/dist/{ripgrep-IBHLMEUX.js → ripgrep-H5HDDGEE.js} +3 -3
- package/dist/{skillMarketplace-XTB7FHYD.js → skillMarketplace-AD473TUO.js} +3 -3
- package/dist/{state-B5WH4G7E.js → state-6FI3TEMZ.js} +2 -2
- package/dist/{theme-DJXLBRJF.js → theme-4KO4JE7Q.js} +5 -5
- package/dist/{toolPermissionSettings-HRFFW2PV.js → toolPermissionSettings-5QUOY3OV.js} +6 -6
- package/dist/tools-DOBQ6YMO.js +54 -0
- package/dist/{userInput-7WNQPJKD.js → userInput-ZT3LIWGH.js} +31 -31
- package/package.json +1 -1
- package/dist/REPL-34JJO6P2.js +0 -49
- package/dist/chunk-AL6K5BMH.js.map +0 -7
- package/dist/chunk-JKP2RIBC.js.map +0 -7
- package/dist/chunk-O7CYKDDE.js.map +0 -7
- package/dist/commands-XCYMIIZG.js +0 -53
- package/dist/prompts-SMIDAJGI.js +0 -55
- package/dist/query-CXHDWKXY.js +0 -57
- package/dist/tools-ZTSUWCM4.js +0 -54
- /package/dist/{REPL-34JJO6P2.js.map → REPL-KURZV7EW.js.map} +0 -0
- /package/dist/{acp-RCUUG4TE.js.map → acp-IIKBAJCJ.js.map} +0 -0
- /package/dist/{agentsValidate-FOGGBCAM.js.map → agentsValidate-6CEARR6Z.js.map} +0 -0
- /package/dist/{ask-Y7GSDBHR.js.map → ask-7NE7NVRN.js.map} +0 -0
- /package/dist/{autoUpdater-I3LHHCHT.js.map → autoUpdater-LFOXQ3CV.js.map} +0 -0
- /package/dist/{chunk-DODMRDRY.js.map → chunk-2CLRREZ5.js.map} +0 -0
- /package/dist/{chunk-WSATR4WL.js.map → chunk-2IO7WUI7.js.map} +0 -0
- /package/dist/{chunk-EVDTKHQS.js.map → chunk-4MZJNA2D.js.map} +0 -0
- /package/dist/{chunk-QMUFX7IJ.js.map → chunk-6E6QBP52.js.map} +0 -0
- /package/dist/{chunk-HV4NI23F.js.map → chunk-6KPO3O64.js.map} +0 -0
- /package/dist/{chunk-TCW74O5N.js.map → chunk-7KDTFITN.js.map} +0 -0
- /package/dist/{chunk-EDTKZHPB.js.map → chunk-7QIWZIVM.js.map} +0 -0
- /package/dist/{chunk-ZETRMTIG.js.map → chunk-7SDAA35I.js.map} +0 -0
- /package/dist/{chunk-6AJ2CWOM.js.map → chunk-7SPP4L5F.js.map} +0 -0
- /package/dist/{chunk-6TMRUFNH.js.map → chunk-A2IPV5PR.js.map} +0 -0
- /package/dist/{chunk-RL64MB7U.js.map → chunk-D3SG4DHV.js.map} +0 -0
- /package/dist/{chunk-LR2N7KMQ.js.map → chunk-DKQIGPXB.js.map} +0 -0
- /package/dist/{chunk-VXUWHEDL.js.map → chunk-GIH6DDF7.js.map} +0 -0
- /package/dist/{chunk-A6QAWMSQ.js.map → chunk-GNDMDOGM.js.map} +0 -0
- /package/dist/{chunk-53JGT3P4.js.map → chunk-JEGVTLOH.js.map} +0 -0
- /package/dist/{chunk-A53N6YJI.js.map → chunk-KK5DOHDD.js.map} +0 -0
- /package/dist/{chunk-JFQY2HV5.js.map → chunk-MMZ2MWHJ.js.map} +0 -0
- /package/dist/{chunk-PZTJUV4A.js.map → chunk-NXLRKKFH.js.map} +0 -0
- /package/dist/{chunk-TDEIIGZD.js.map → chunk-PDQTREWL.js.map} +0 -0
- /package/dist/{chunk-JI7VDOMU.js.map → chunk-Q56IGZX5.js.map} +0 -0
- /package/dist/{chunk-RBT4E5DV.js.map → chunk-TYOT7UVX.js.map} +0 -0
- /package/dist/{chunk-Y2CH5HCU.js.map → chunk-VKXOAPOS.js.map} +0 -0
- /package/dist/{chunk-VPVZHCOG.js.map → chunk-WAQ72XDO.js.map} +0 -0
- /package/dist/{chunk-JHCUUDEB.js.map → chunk-YH7ZOG3I.js.map} +0 -0
- /package/dist/{chunk-6LUGSV66.js.map → chunk-ZXADEAK4.js.map} +0 -0
- /package/dist/{chunk-I6JG3ZBH.js.map → chunk-ZXO6OMWV.js.map} +0 -0
- /package/dist/{cli-2RUYT6CA.js.map → cli-B42Z5OSM.js.map} +0 -0
- /package/dist/{commands-XCYMIIZG.js.map → commands-MNUBXNIB.js.map} +0 -0
- /package/dist/{config-W6OYIJFP.js.map → config-ZC4PZWOC.js.map} +0 -0
- /package/dist/{context-5VP2FZYF.js.map → context-MF3EKP4O.js.map} +0 -0
- /package/dist/{conversationTracker-GOUWLXWN.js.map → conversationTracker-BM6KB27G.js.map} +0 -0
- /package/dist/{customCommands-TDVISN2B.js.map → customCommands-63F72N5R.js.map} +0 -0
- /package/dist/{env-DLGPG7EV.js.map → env-PGV75SHC.js.map} +0 -0
- /package/dist/{file-TOOPTRF2.js.map → file-7NLJWX5W.js.map} +0 -0
- /package/dist/{llm-HPGYRNBC.js.map → llm-RCPJRG2F.js.map} +0 -0
- /package/dist/{llmLazy-OKLOZGW7.js.map → llmLazy-C5G2MM53.js.map} +0 -0
- /package/dist/{loader-BPVCWO3Q.js.map → loader-MPCV37S5.js.map} +0 -0
- /package/dist/{lsp-Y5UU7OYG.js.map → lsp-7FPYFR6T.js.map} +0 -0
- /package/dist/{lspAnchor-YNYJ7E7M.js.map → lspAnchor-C676SQ6E.js.map} +0 -0
- /package/dist/{mcp-ZHOROUVO.js.map → mcp-VKKPULAR.js.map} +0 -0
- /package/dist/{mentionProcessor-YA3PCQGC.js.map → mentionProcessor-LJHHC5H4.js.map} +0 -0
- /package/dist/{messages-QE77NR42.js.map → messages-QSUEHIGU.js.map} +0 -0
- /package/dist/{model-YUVFO4IF.js.map → model-AJTLB6V4.js.map} +0 -0
- /package/dist/{openai-BYIA5SOE.js.map → openai-XIRY5EVT.js.map} +0 -0
- /package/dist/{outputStyles-RUBJ56B2.js.map → outputStyles-OTRZEQSD.js.map} +0 -0
- /package/dist/{pluginRuntime-TFQEES5T.js.map → pluginRuntime-NQ6GKMG6.js.map} +0 -0
- /package/dist/{pluginValidation-H7X3X4KI.js.map → pluginValidation-AJUPAPU2.js.map} +0 -0
- /package/dist/{prompts-SMIDAJGI.js.map → prompts-SWCPKXLQ.js.map} +0 -0
- /package/dist/{pybAgentSessionLoad-RGKKINBZ.js.map → pybAgentSessionLoad-MOZRT43D.js.map} +0 -0
- /package/dist/{pybAgentSessionResume-KO5RTOM4.js.map → pybAgentSessionResume-S67UFBZF.js.map} +0 -0
- /package/dist/{pybAgentStreamJsonSession-B2CP4XOB.js.map → pybAgentStreamJsonSession-UEEVKNIR.js.map} +0 -0
- /package/dist/{pybHooks-CWI5I2PJ.js.map → pybHooks-UQQ6VWTB.js.map} +0 -0
- /package/dist/{query-CXHDWKXY.js.map → query-ZKV22Q32.js.map} +0 -0
- /package/dist/{registry-W2TZF6IB.js.map → registry-VUAORMT6.js.map} +0 -0
- /package/dist/{ripgrep-IBHLMEUX.js.map → ripgrep-H5HDDGEE.js.map} +0 -0
- /package/dist/{skillMarketplace-XTB7FHYD.js.map → skillMarketplace-AD473TUO.js.map} +0 -0
- /package/dist/{state-B5WH4G7E.js.map → state-6FI3TEMZ.js.map} +0 -0
- /package/dist/{theme-DJXLBRJF.js.map → theme-4KO4JE7Q.js.map} +0 -0
- /package/dist/{toolPermissionSettings-HRFFW2PV.js.map → toolPermissionSettings-5QUOY3OV.js.map} +0 -0
- /package/dist/{tools-ZTSUWCM4.js.map → tools-DOBQ6YMO.js.map} +0 -0
- /package/dist/{userInput-7WNQPJKD.js.map → userInput-ZT3LIWGH.js.map} +0 -0
|
@@ -3,13 +3,13 @@ const require = __pybCreateRequire(import.meta.url);
|
|
|
3
3
|
import {
|
|
4
4
|
getGlobalConfig,
|
|
5
5
|
saveGlobalConfig
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-WAQ72XDO.js";
|
|
7
7
|
import {
|
|
8
8
|
debug
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-DKQIGPXB.js";
|
|
10
10
|
import {
|
|
11
11
|
logError
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-VKXOAPOS.js";
|
|
13
13
|
|
|
14
14
|
// src/utils/model/index.ts
|
|
15
15
|
import { memoize } from "lodash-es";
|
|
@@ -20,6 +20,12 @@ var DEFAULT_MODEL_CONFIG = {
|
|
|
20
20
|
vertex: "claude-3-7-sonnet@20250219",
|
|
21
21
|
firstParty: "claude-sonnet-4-20250514"
|
|
22
22
|
};
|
|
23
|
+
function normalizeProvider(provider) {
|
|
24
|
+
return String(provider).trim().toLowerCase();
|
|
25
|
+
}
|
|
26
|
+
function buildModelProfileKey(provider, modelName) {
|
|
27
|
+
return `${normalizeProvider(provider)}:${modelName}`;
|
|
28
|
+
}
|
|
23
29
|
async function getModelConfig() {
|
|
24
30
|
return DEFAULT_MODEL_CONFIG;
|
|
25
31
|
}
|
|
@@ -55,22 +61,16 @@ var ModelManager = class {
|
|
|
55
61
|
this.modelProfiles = config.modelProfiles || [];
|
|
56
62
|
}
|
|
57
63
|
getCurrentModel() {
|
|
58
|
-
const
|
|
59
|
-
if (
|
|
60
|
-
|
|
61
|
-
if (profile && profile.isActive) {
|
|
62
|
-
return profile.modelName;
|
|
63
|
-
}
|
|
64
|
+
const profile = this.resolvePointerProfile(this.config.modelPointers?.main);
|
|
65
|
+
if (profile && profile.isActive) {
|
|
66
|
+
return profile.modelName;
|
|
64
67
|
}
|
|
65
68
|
return this.getMainAgentModel();
|
|
66
69
|
}
|
|
67
70
|
getMainAgentModel() {
|
|
68
|
-
const
|
|
69
|
-
if (
|
|
70
|
-
|
|
71
|
-
if (profile && profile.isActive) {
|
|
72
|
-
return profile.modelName;
|
|
73
|
-
}
|
|
71
|
+
const profile = this.resolvePointerProfile(this.config.modelPointers?.main);
|
|
72
|
+
if (profile && profile.isActive) {
|
|
73
|
+
return profile.modelName;
|
|
74
74
|
}
|
|
75
75
|
const activeProfile = this.modelProfiles.find((p) => p.isActive);
|
|
76
76
|
if (activeProfile) {
|
|
@@ -79,12 +79,9 @@ var ModelManager = class {
|
|
|
79
79
|
return null;
|
|
80
80
|
}
|
|
81
81
|
getTaskToolModel() {
|
|
82
|
-
const
|
|
83
|
-
if (
|
|
84
|
-
|
|
85
|
-
if (profile && profile.isActive) {
|
|
86
|
-
return profile.modelName;
|
|
87
|
-
}
|
|
82
|
+
const profile = this.resolvePointerProfile(this.config.modelPointers?.task);
|
|
83
|
+
if (profile && profile.isActive) {
|
|
84
|
+
return profile.modelName;
|
|
88
85
|
}
|
|
89
86
|
return this.getMainAgentModel();
|
|
90
87
|
}
|
|
@@ -102,7 +99,7 @@ var ModelManager = class {
|
|
|
102
99
|
}
|
|
103
100
|
allProfiles.sort((a, b) => a.createdAt - b.createdAt);
|
|
104
101
|
const currentMainModelName = this.config.modelPointers?.main;
|
|
105
|
-
const currentModel =
|
|
102
|
+
const currentModel = this.resolvePointerProfile(currentMainModelName);
|
|
106
103
|
const previousModelName = currentModel?.name || null;
|
|
107
104
|
const budgetForModel = (model) => {
|
|
108
105
|
const contextLength = Number(model.contextLength);
|
|
@@ -117,7 +114,9 @@ var ModelManager = class {
|
|
|
117
114
|
compatible: budgetTokens > 0 ? currentContextTokens <= budgetTokens : true
|
|
118
115
|
};
|
|
119
116
|
};
|
|
120
|
-
const currentIndex =
|
|
117
|
+
const currentIndex = currentModel ? allProfiles.findIndex(
|
|
118
|
+
(p) => p.modelName === currentModel.modelName && normalizeProvider(p.provider) === normalizeProvider(currentModel.provider)
|
|
119
|
+
) : -1;
|
|
121
120
|
const startIndex = currentIndex >= 0 ? currentIndex : -1;
|
|
122
121
|
if (allProfiles.length === 1) {
|
|
123
122
|
return {
|
|
@@ -338,7 +337,7 @@ var ModelManager = class {
|
|
|
338
337
|
if (!pointerId) {
|
|
339
338
|
return this.getDefaultModel();
|
|
340
339
|
}
|
|
341
|
-
const profile = this.
|
|
340
|
+
const profile = this.resolvePointerProfile(pointerId);
|
|
342
341
|
return profile && profile.isActive ? profile : this.getDefaultModel();
|
|
343
342
|
}
|
|
344
343
|
getModelName(pointer) {
|
|
@@ -352,12 +351,13 @@ var ModelManager = class {
|
|
|
352
351
|
return this.getModelName("quick") || this.getModelName("task") || this.getModelName("main");
|
|
353
352
|
}
|
|
354
353
|
async addModel(config) {
|
|
355
|
-
const
|
|
356
|
-
|
|
354
|
+
const normalizedProvider = normalizeProvider(config.provider);
|
|
355
|
+
const existingByProviderAndModelName = this.modelProfiles.find(
|
|
356
|
+
(p) => p.modelName === config.modelName && String(p.provider).trim().toLowerCase() === normalizedProvider
|
|
357
357
|
);
|
|
358
|
-
if (
|
|
358
|
+
if (existingByProviderAndModelName) {
|
|
359
359
|
throw new Error(
|
|
360
|
-
`Model with modelName '${config.modelName}' already exists: ${
|
|
360
|
+
`Model with modelName '${config.modelName}' already exists: ${existingByProviderAndModelName.name}`
|
|
361
361
|
);
|
|
362
362
|
}
|
|
363
363
|
const existingByName = this.modelProfiles.find((p) => p.name === config.name);
|
|
@@ -394,7 +394,7 @@ var ModelManager = class {
|
|
|
394
394
|
return config.modelName;
|
|
395
395
|
}
|
|
396
396
|
setPointer(pointer, modelName) {
|
|
397
|
-
if (!this.findModelProfile(modelName)) {
|
|
397
|
+
if (!this.findModelProfile(modelName) && !this.resolveProviderQualifiedModel(modelName)) {
|
|
398
398
|
throw new Error(`Model '${modelName}' not found`);
|
|
399
399
|
}
|
|
400
400
|
if (!this.config.modelPointers) {
|
|
@@ -439,12 +439,28 @@ var ModelManager = class {
|
|
|
439
439
|
};
|
|
440
440
|
}
|
|
441
441
|
removeModel(modelName) {
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
442
|
+
const resolvedProfile = this.resolveProviderQualifiedModel(modelName);
|
|
443
|
+
if (resolvedProfile) {
|
|
444
|
+
const resolvedKey = buildModelProfileKey(
|
|
445
|
+
resolvedProfile.provider,
|
|
446
|
+
resolvedProfile.modelName
|
|
447
|
+
);
|
|
448
|
+
this.modelProfiles = this.modelProfiles.filter(
|
|
449
|
+
(p) => buildModelProfileKey(p.provider, p.modelName) !== resolvedKey
|
|
450
|
+
);
|
|
451
|
+
} else {
|
|
452
|
+
this.modelProfiles = this.modelProfiles.filter(
|
|
453
|
+
(p) => p.modelName !== modelName
|
|
454
|
+
);
|
|
455
|
+
}
|
|
445
456
|
if (this.config.modelPointers) {
|
|
446
457
|
Object.keys(this.config.modelPointers).forEach((pointer) => {
|
|
447
|
-
|
|
458
|
+
const pointerValue = this.config.modelPointers[pointer];
|
|
459
|
+
const pointerMatchesRemoved = pointerValue === modelName || resolvedProfile && pointerValue === buildModelProfileKey(
|
|
460
|
+
resolvedProfile.provider,
|
|
461
|
+
resolvedProfile.modelName
|
|
462
|
+
);
|
|
463
|
+
if (pointerMatchesRemoved) {
|
|
448
464
|
this.config.modelPointers[pointer] = this.config.defaultModelName || "";
|
|
449
465
|
}
|
|
450
466
|
});
|
|
@@ -481,6 +497,9 @@ var ModelManager = class {
|
|
|
481
497
|
if (!profile2) {
|
|
482
498
|
profile2 = this.findModelProfileByModelName(pointerId);
|
|
483
499
|
}
|
|
500
|
+
if (!profile2 && typeof pointerId === "string") {
|
|
501
|
+
profile2 = this.resolveProviderQualifiedModel(pointerId);
|
|
502
|
+
}
|
|
484
503
|
if (profile2 && profile2.isActive) {
|
|
485
504
|
return profile2;
|
|
486
505
|
}
|
|
@@ -522,6 +541,9 @@ var ModelManager = class {
|
|
|
522
541
|
if (!profile) {
|
|
523
542
|
profile = this.findModelProfileByModelName(pointerId);
|
|
524
543
|
}
|
|
544
|
+
if (!profile && typeof pointerId === "string") {
|
|
545
|
+
profile = this.resolveProviderQualifiedModel(pointerId);
|
|
546
|
+
}
|
|
525
547
|
if (!profile) {
|
|
526
548
|
return {
|
|
527
549
|
success: false,
|
|
@@ -575,11 +597,11 @@ var ModelManager = class {
|
|
|
575
597
|
const trimmed = input.trim();
|
|
576
598
|
const colonIndex = trimmed.indexOf(":");
|
|
577
599
|
if (colonIndex <= 0 || colonIndex >= trimmed.length - 1) return null;
|
|
578
|
-
const provider = trimmed.slice(0, colonIndex)
|
|
600
|
+
const provider = normalizeProvider(trimmed.slice(0, colonIndex));
|
|
579
601
|
const modelOrName = trimmed.slice(colonIndex + 1).trim();
|
|
580
602
|
if (!provider || !modelOrName) return null;
|
|
581
603
|
const providerProfiles = this.modelProfiles.filter(
|
|
582
|
-
(p) =>
|
|
604
|
+
(p) => normalizeProvider(p.provider) === provider
|
|
583
605
|
);
|
|
584
606
|
if (providerProfiles.length === 0) return null;
|
|
585
607
|
const byModelName = providerProfiles.find((p) => p.modelName === modelOrName);
|
|
@@ -589,6 +611,8 @@ var ModelManager = class {
|
|
|
589
611
|
return null;
|
|
590
612
|
}
|
|
591
613
|
findModelProfile(modelName) {
|
|
614
|
+
const qualified = this.resolveProviderQualifiedModel(modelName);
|
|
615
|
+
if (qualified) return qualified;
|
|
592
616
|
return this.modelProfiles.find((p) => p.modelName === modelName) || null;
|
|
593
617
|
}
|
|
594
618
|
findModelProfileByModelName(modelName) {
|
|
@@ -603,6 +627,17 @@ var ModelManager = class {
|
|
|
603
627
|
profile.lastUsed = Date.now();
|
|
604
628
|
}
|
|
605
629
|
}
|
|
630
|
+
resolvePointerProfile(pointerId) {
|
|
631
|
+
if (!pointerId) return null;
|
|
632
|
+
let profile = this.findModelProfile(pointerId);
|
|
633
|
+
if (!profile) {
|
|
634
|
+
profile = this.findModelProfileByModelName(pointerId);
|
|
635
|
+
}
|
|
636
|
+
if (!profile && typeof pointerId === "string") {
|
|
637
|
+
profile = this.resolveProviderQualifiedModel(pointerId);
|
|
638
|
+
}
|
|
639
|
+
return profile;
|
|
640
|
+
}
|
|
606
641
|
};
|
|
607
642
|
var globalModelManager = null;
|
|
608
643
|
var getModelManager = () => {
|
|
@@ -644,6 +679,7 @@ var getQuickModel = () => {
|
|
|
644
679
|
export {
|
|
645
680
|
USE_BEDROCK,
|
|
646
681
|
USE_VERTEX,
|
|
682
|
+
buildModelProfileKey,
|
|
647
683
|
getSlowAndCapableModel,
|
|
648
684
|
isDefaultSlowAndCapableModel,
|
|
649
685
|
getVertexRegionForModel,
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/model/index.ts"],
|
|
4
|
+
"sourcesContent": ["import { memoize } from 'lodash-es'\n\nimport { logError } from '@utils/log'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport {\n getGlobalConfig,\n ModelProfile,\n ModelPointerType,\n saveGlobalConfig,\n} from '@utils/config'\n\nexport const USE_BEDROCK = !!(\n process.env.PYB_USE_BEDROCK ?? process.env.CLAUDE_CODE_USE_BEDROCK\n)\nexport const USE_VERTEX = !!(\n process.env.PYB_USE_VERTEX ?? process.env.CLAUDE_CODE_USE_VERTEX\n)\n\nexport interface ModelConfig {\n bedrock: string\n vertex: string\n firstParty: string\n}\n\nconst DEFAULT_MODEL_CONFIG: ModelConfig = {\n bedrock: 'us.anthropic.claude-3-7-sonnet-20250219-v1:0',\n vertex: 'claude-3-7-sonnet@20250219',\n firstParty: 'claude-sonnet-4-20250514',\n}\n\nfunction normalizeProvider(provider: string): string {\n return String(provider).trim().toLowerCase()\n}\n\nexport function buildModelProfileKey(\n provider: string,\n modelName: string,\n): string {\n return `${normalizeProvider(provider)}:${modelName}`\n}\n\nasync function getModelConfig(): Promise<ModelConfig> {\n return DEFAULT_MODEL_CONFIG\n}\n\nexport const getSlowAndCapableModel = memoize(async (): Promise<string> => {\n const config = await getGlobalConfig()\n\n const modelManager = new ModelManager(config)\n const model = modelManager.getMainAgentModel()\n\n if (model) {\n return model\n }\n\n const modelConfig = await getModelConfig()\n if (USE_BEDROCK) return modelConfig.bedrock\n if (USE_VERTEX) return modelConfig.vertex\n return modelConfig.firstParty\n})\n\nexport async function isDefaultSlowAndCapableModel(): Promise<boolean> {\n return (\n !process.env.ANTHROPIC_MODEL ||\n process.env.ANTHROPIC_MODEL === (await getSlowAndCapableModel())\n )\n}\n\nexport function getVertexRegionForModel(\n model: string | undefined,\n): string | undefined {\n if (model?.startsWith('claude-3-5-haiku')) {\n return process.env.VERTEX_REGION_CLAUDE_3_5_HAIKU\n } else if (model?.startsWith('claude-3-5-sonnet')) {\n return process.env.VERTEX_REGION_CLAUDE_3_5_SONNET\n } else if (model?.startsWith('claude-3-7-sonnet')) {\n return process.env.VERTEX_REGION_CLAUDE_3_7_SONNET\n }\n}\n\nexport class ModelManager {\n private config: any\n private modelProfiles: ModelProfile[]\n\n constructor(config: any) {\n this.config = config\n this.modelProfiles = config.modelProfiles || []\n }\n\n getCurrentModel(): string | null {\n const profile = this.resolvePointerProfile(this.config.modelPointers?.main)\n if (profile && profile.isActive) {\n return profile.modelName\n }\n\n return this.getMainAgentModel()\n }\n\n getMainAgentModel(): string | null {\n const profile = this.resolvePointerProfile(this.config.modelPointers?.main)\n if (profile && profile.isActive) {\n return profile.modelName\n }\n\n const activeProfile = this.modelProfiles.find(p => p.isActive)\n if (activeProfile) {\n return activeProfile.modelName\n }\n\n return null\n }\n\n getTaskToolModel(): string | null {\n const profile = this.resolvePointerProfile(this.config.modelPointers?.task)\n if (profile && profile.isActive) {\n return profile.modelName\n }\n\n return this.getMainAgentModel()\n }\n\n switchToNextModelWithContextCheck(currentContextTokens: number = 0): {\n success: boolean\n modelName: string | null\n previousModelName: string | null\n contextOverflow: boolean\n usagePercentage: number\n currentContextTokens: number\n skippedModels?: Array<{\n name: string\n provider: string\n contextLength: number\n budgetTokens: number | null\n usagePercentage: number\n }>\n } {\n const allProfiles = this.getAllConfiguredModels()\n if (allProfiles.length === 0) {\n return {\n success: false,\n modelName: null,\n previousModelName: null,\n contextOverflow: false,\n usagePercentage: 0,\n currentContextTokens,\n }\n }\n\n allProfiles.sort((a, b) => a.createdAt - b.createdAt)\n\n const currentMainModelName = this.config.modelPointers?.main\n const currentModel = this.resolvePointerProfile(currentMainModelName)\n const previousModelName = currentModel?.name || null\n\n const budgetForModel = (\n model: ModelProfile,\n ): {\n budgetTokens: number | null\n usagePercentage: number\n compatible: boolean\n } => {\n const contextLength = Number(model.contextLength)\n if (!Number.isFinite(contextLength) || contextLength <= 0) {\n return { budgetTokens: null, usagePercentage: 0, compatible: true }\n }\n const budgetTokens = Math.floor(contextLength * 0.9)\n const usagePercentage =\n budgetTokens > 0 ? (currentContextTokens / budgetTokens) * 100 : 0\n return {\n budgetTokens,\n usagePercentage,\n compatible:\n budgetTokens > 0 ? currentContextTokens <= budgetTokens : true,\n }\n }\n\n const currentIndex = currentModel\n ? allProfiles.findIndex(\n p =>\n p.modelName === currentModel.modelName &&\n normalizeProvider(p.provider) === normalizeProvider(currentModel.provider),\n )\n : -1\n const startIndex = currentIndex >= 0 ? currentIndex : -1\n\n if (allProfiles.length === 1) {\n return {\n success: false,\n modelName: null,\n previousModelName,\n contextOverflow: false,\n usagePercentage: 0,\n currentContextTokens,\n }\n }\n\n const maxOffsets =\n startIndex === -1 ? allProfiles.length : allProfiles.length - 1\n const skippedModels: NonNullable<\n ReturnType<\n ModelManager['switchToNextModelWithContextCheck']\n >['skippedModels']\n > = []\n\n let selected: ModelProfile | null = null\n let selectedUsagePercentage = 0\n\n for (let offset = 1; offset <= maxOffsets; offset++) {\n const candidateIndex =\n (startIndex + offset + allProfiles.length) % allProfiles.length\n const candidate = allProfiles[candidateIndex]\n if (!candidate) continue\n\n const { budgetTokens, usagePercentage, compatible } =\n budgetForModel(candidate)\n if (compatible) {\n selected = candidate\n selectedUsagePercentage = usagePercentage\n break\n }\n skippedModels.push({\n name: candidate.name,\n provider: candidate.provider,\n contextLength: candidate.contextLength,\n budgetTokens,\n usagePercentage,\n })\n }\n\n if (!selected) {\n const firstSkipped = skippedModels[0]\n return {\n success: false,\n modelName: null,\n previousModelName,\n contextOverflow: true,\n usagePercentage: firstSkipped?.usagePercentage ?? 0,\n currentContextTokens,\n skippedModels,\n }\n }\n\n if (!selected.isActive) {\n selected.isActive = true\n }\n\n this.setPointer('main', selected.modelName)\n this.updateLastUsed(selected.modelName)\n\n return {\n success: true,\n modelName: selected.name,\n previousModelName,\n contextOverflow: false,\n usagePercentage: selectedUsagePercentage,\n currentContextTokens,\n skippedModels,\n }\n }\n\n switchToNextModel(currentContextTokens: number = 0): {\n success: boolean\n modelName: string | null\n blocked?: boolean\n message?: string\n } {\n const result = this.switchToNextModelWithContextCheck(currentContextTokens)\n\n const formatTokens = (tokens: number): string => {\n if (!Number.isFinite(tokens)) return 'unknown'\n if (tokens >= 1000) return `${Math.round(tokens / 1000)}k`\n return String(Math.round(tokens))\n }\n\n const allModels = this.getAllConfiguredModels()\n if (allModels.length === 0) {\n return {\n success: false,\n modelName: null,\n blocked: false,\n message: '\u274C No models configured. Use /model to add models.',\n }\n }\n if (allModels.length === 1) {\n return {\n success: false,\n modelName: null,\n blocked: false,\n message: `\u26A0\uFE0F Only one model configured (${allModels[0].modelName}). Use /model to add more models for switching.`,\n }\n }\n\n const currentModel = this.findModelProfile(this.config.modelPointers?.main)\n const modelsSorted = [...allModels].sort(\n (a, b) => a.createdAt - b.createdAt,\n )\n const currentIndex = modelsSorted.findIndex(\n m => m.modelName === currentModel?.modelName,\n )\n const totalModels = modelsSorted.length\n\n if (result.success && result.modelName) {\n const skippedCount = result.skippedModels?.length ?? 0\n const skippedSuffix =\n skippedCount > 0 ? ` \u00B7 skipped ${skippedCount} incompatible` : ''\n const contextSuffix =\n currentModel?.contextLength && result.currentContextTokens\n ? ` \u00B7 context ~${formatTokens(result.currentContextTokens)}/${formatTokens(currentModel.contextLength)}`\n : ''\n\n return {\n success: true,\n modelName: result.modelName,\n blocked: false,\n message: `\u2705 Switched to ${result.modelName} (${currentIndex + 1}/${totalModels})${currentModel?.provider ? ` [${currentModel.provider}]` : ''}${skippedSuffix}${contextSuffix}`,\n }\n }\n\n if (result.contextOverflow) {\n const attempted = result.skippedModels?.[0]\n const attemptedContext = attempted?.contextLength\n const attemptedBudget = attempted?.budgetTokens\n const currentLabel =\n currentModel?.name || currentModel?.modelName || 'current model'\n\n const attemptedText = attempted\n ? `Can't switch to ${attempted.name}: current ~${formatTokens(result.currentContextTokens)} tokens exceeds safe budget (~${formatTokens(attemptedBudget ?? 0)} tokens, 90% of ${formatTokens(attemptedContext ?? 0)}).`\n : `Can't switch models due to context size (~${formatTokens(result.currentContextTokens)} tokens).`\n\n return {\n success: false,\n modelName: null,\n blocked: true,\n message: `\u26A0\uFE0F ${attemptedText} Keeping ${currentLabel}.`,\n }\n }\n\n return {\n success: false,\n modelName: null,\n blocked: false,\n message: '\u274C Failed to switch models',\n }\n }\n\n revertToPreviousModel(previousModelName: string): boolean {\n const previousModel = this.modelProfiles.find(\n p => p.name === previousModelName && p.isActive,\n )\n if (!previousModel) {\n return false\n }\n\n this.setPointer('main', previousModel.modelName)\n this.updateLastUsed(previousModel.modelName)\n return true\n }\n\n analyzeContextCompatibility(\n model: ModelProfile,\n contextTokens: number,\n ): {\n compatible: boolean\n severity: 'safe' | 'warning' | 'critical'\n usagePercentage: number\n recommendation: string\n } {\n const usableContext = Math.floor(model.contextLength * 0.8)\n const usagePercentage = (contextTokens / usableContext) * 100\n\n if (usagePercentage <= 70) {\n return {\n compatible: true,\n severity: 'safe',\n usagePercentage,\n recommendation: 'Full context preserved',\n }\n } else if (usagePercentage <= 90) {\n return {\n compatible: true,\n severity: 'warning',\n usagePercentage,\n recommendation: 'Context usage high, consider compression',\n }\n } else {\n return {\n compatible: false,\n severity: 'critical',\n usagePercentage,\n recommendation: 'Auto-compression or message truncation required',\n }\n }\n }\n\n switchToNextModelWithAnalysis(currentContextTokens: number = 0): {\n modelName: string | null\n contextAnalysis: ReturnType<typeof this.analyzeContextCompatibility> | null\n requiresCompression: boolean\n estimatedTokensAfterSwitch: number\n } {\n const result = this.switchToNextModel(currentContextTokens)\n\n if (!result.success || !result.modelName) {\n return {\n modelName: null,\n contextAnalysis: null,\n requiresCompression: false,\n estimatedTokensAfterSwitch: 0,\n }\n }\n\n const newModel = this.getModel('main')\n if (!newModel) {\n return {\n modelName: result.modelName,\n contextAnalysis: null,\n requiresCompression: false,\n estimatedTokensAfterSwitch: currentContextTokens,\n }\n }\n\n const analysis = this.analyzeContextCompatibility(\n newModel,\n currentContextTokens,\n )\n\n return {\n modelName: result.modelName,\n contextAnalysis: analysis,\n requiresCompression: analysis.severity === 'critical',\n estimatedTokensAfterSwitch: currentContextTokens,\n }\n }\n\n canModelHandleContext(model: ModelProfile, contextTokens: number): boolean {\n const analysis = this.analyzeContextCompatibility(model, contextTokens)\n return analysis.compatible\n }\n\n findModelWithSufficientContext(\n models: ModelProfile[],\n contextTokens: number,\n ): ModelProfile | null {\n return (\n models.find(model => this.canModelHandleContext(model, contextTokens)) ||\n null\n )\n }\n\n getModelForContext(\n contextType: 'terminal' | 'main-agent' | 'task-tool',\n ): string | null {\n switch (contextType) {\n case 'terminal':\n return this.getCurrentModel()\n case 'main-agent':\n return this.getMainAgentModel()\n case 'task-tool':\n return this.getTaskToolModel()\n default:\n return this.getMainAgentModel()\n }\n }\n\n getActiveModelProfiles(): ModelProfile[] {\n return this.modelProfiles.filter(p => p.isActive)\n }\n\n hasConfiguredModels(): boolean {\n return this.getActiveModelProfiles().length > 0\n }\n\n\n getModel(pointer: ModelPointerType): ModelProfile | null {\n const pointerId = this.config.modelPointers?.[pointer]\n if (!pointerId) {\n return this.getDefaultModel()\n }\n\n const profile = this.resolvePointerProfile(pointerId)\n return profile && profile.isActive ? profile : this.getDefaultModel()\n }\n\n getModelName(pointer: ModelPointerType): string | null {\n const profile = this.getModel(pointer)\n return profile ? profile.modelName : null\n }\n\n getCompactModel(): string | null {\n return this.getModelName('compact') || this.getModelName('main')\n }\n\n getQuickModel(): string | null {\n return (\n this.getModelName('quick') ||\n this.getModelName('task') ||\n this.getModelName('main')\n )\n }\n\n async addModel(\n config: Omit<ModelProfile, 'createdAt' | 'isActive'>,\n ): Promise<string> {\n const normalizedProvider = normalizeProvider(config.provider)\n const existingByProviderAndModelName = this.modelProfiles.find(\n p =>\n p.modelName === config.modelName &&\n String(p.provider).trim().toLowerCase() === normalizedProvider,\n )\n if (existingByProviderAndModelName) {\n throw new Error(\n `Model with modelName '${config.modelName}' already exists: ${existingByProviderAndModelName.name}`,\n )\n }\n\n const existingByName = this.modelProfiles.find(p => p.name === config.name)\n if (existingByName) {\n throw new Error(`Model with name '${config.name}' already exists`)\n }\n\n const newModel: ModelProfile = {\n ...config,\n createdAt: Date.now(),\n isActive: true,\n }\n\n this.modelProfiles.push(newModel)\n\n if (this.modelProfiles.length === 1) {\n this.config.modelPointers = {\n main: config.modelName,\n task: config.modelName,\n compact: config.modelName,\n quick: config.modelName,\n }\n this.config.defaultModelName = config.modelName\n } else {\n if (!this.config.modelPointers) {\n this.config.modelPointers = {\n main: config.modelName,\n task: '',\n compact: '',\n quick: '',\n }\n } else {\n this.config.modelPointers.main = config.modelName\n }\n }\n\n this.saveConfig()\n return config.modelName\n }\n\n setPointer(pointer: ModelPointerType, modelName: string): void {\n if (\n !this.findModelProfile(modelName) &&\n !this.resolveProviderQualifiedModel(modelName)\n ) {\n throw new Error(`Model '${modelName}' not found`)\n }\n\n if (!this.config.modelPointers) {\n this.config.modelPointers = {\n main: '',\n task: '',\n compact: '',\n quick: '',\n }\n }\n\n this.config.modelPointers[pointer] = modelName\n this.saveConfig()\n }\n\n getAvailableModels(): ModelProfile[] {\n return this.modelProfiles.filter(p => p.isActive)\n }\n\n getAllConfiguredModels(): ModelProfile[] {\n return this.modelProfiles\n }\n\n getAllAvailableModelNames(): string[] {\n return this.getAvailableModels().map(p => p.modelName)\n }\n\n getAllConfiguredModelNames(): string[] {\n return this.getAllConfiguredModels().map(p => p.modelName)\n }\n\n getModelSwitchingDebugInfo(): {\n totalModels: number\n activeModels: number\n inactiveModels: number\n currentMainModel: string | null\n availableModels: Array<{\n name: string\n modelName: string\n provider: string\n isActive: boolean\n lastUsed?: number\n }>\n modelPointers: Record<string, string | undefined>\n } {\n const availableModels = this.getAvailableModels()\n const currentMainModelName = this.config.modelPointers?.main\n\n return {\n totalModels: this.modelProfiles.length,\n activeModels: availableModels.length,\n inactiveModels: this.modelProfiles.length - availableModels.length,\n currentMainModel: currentMainModelName || null,\n availableModels: this.modelProfiles.map(p => ({\n name: p.name,\n modelName: p.modelName,\n provider: p.provider,\n isActive: p.isActive,\n lastUsed: p.lastUsed,\n })),\n modelPointers: this.config.modelPointers || {},\n }\n }\n\n removeModel(modelName: string): void {\n const resolvedProfile = this.resolveProviderQualifiedModel(modelName)\n if (resolvedProfile) {\n const resolvedKey = buildModelProfileKey(\n resolvedProfile.provider,\n resolvedProfile.modelName,\n )\n this.modelProfiles = this.modelProfiles.filter(\n p => buildModelProfileKey(p.provider, p.modelName) !== resolvedKey,\n )\n } else {\n this.modelProfiles = this.modelProfiles.filter(\n p => p.modelName !== modelName,\n )\n }\n\n if (this.config.modelPointers) {\n Object.keys(this.config.modelPointers).forEach(pointer => {\n const pointerValue = this.config.modelPointers[pointer as ModelPointerType]\n const pointerMatchesRemoved =\n pointerValue === modelName ||\n (resolvedProfile &&\n pointerValue ===\n buildModelProfileKey(\n resolvedProfile.provider,\n resolvedProfile.modelName,\n ))\n if (\n pointerMatchesRemoved\n ) {\n this.config.modelPointers[pointer as ModelPointerType] =\n this.config.defaultModelName || ''\n }\n })\n }\n\n this.saveConfig()\n }\n\n private getDefaultModel(): ModelProfile | null {\n if (this.config.defaultModelId) {\n const profile = this.findModelProfile(this.config.defaultModelId)\n if (profile && profile.isActive) {\n return profile\n }\n }\n return this.modelProfiles.find(p => p.isActive) || null\n }\n\n private saveConfig(): void {\n const updatedConfig = {\n ...this.config,\n modelProfiles: this.modelProfiles,\n }\n saveGlobalConfig(updatedConfig)\n }\n\n async getFallbackModel(): Promise<string> {\n const modelConfig = await getModelConfig()\n if (USE_BEDROCK) return modelConfig.bedrock\n if (USE_VERTEX) return modelConfig.vertex\n return modelConfig.firstParty\n }\n\n resolveModel(modelParam: string | ModelPointerType): ModelProfile | null {\n if (['main', 'task', 'compact', 'quick'].includes(modelParam)) {\n const pointerId =\n this.config.modelPointers?.[modelParam as ModelPointerType]\n if (pointerId) {\n let profile = this.findModelProfile(pointerId)\n if (!profile) {\n profile = this.findModelProfileByModelName(pointerId)\n }\n if (!profile && typeof pointerId === 'string') {\n profile = this.resolveProviderQualifiedModel(pointerId)\n }\n if (profile && profile.isActive) {\n return profile\n }\n }\n return this.getDefaultModel()\n }\n\n let profile = this.findModelProfile(modelParam)\n if (profile && profile.isActive) {\n return profile\n }\n\n profile = this.findModelProfileByModelName(modelParam)\n if (profile && profile.isActive) {\n return profile\n }\n\n profile = this.findModelProfileByName(modelParam)\n if (profile && profile.isActive) {\n return profile\n }\n\n if (typeof modelParam === 'string') {\n const qualified = this.resolveProviderQualifiedModel(modelParam)\n if (qualified && qualified.isActive) {\n return qualified\n }\n }\n\n return this.getDefaultModel()\n }\n\n resolveModelWithInfo(modelParam: string | ModelPointerType): {\n success: boolean\n profile: ModelProfile | null\n error?: string\n } {\n const isPointer = ['main', 'task', 'compact', 'quick'].includes(modelParam)\n\n if (isPointer) {\n const pointerId =\n this.config.modelPointers?.[modelParam as ModelPointerType]\n if (!pointerId) {\n return {\n success: false,\n profile: null,\n error: `Model pointer '${modelParam}' is not configured. Use /model to set up models.`,\n }\n }\n\n let profile = this.findModelProfile(pointerId)\n if (!profile) {\n profile = this.findModelProfileByModelName(pointerId)\n }\n if (!profile && typeof pointerId === 'string') {\n profile = this.resolveProviderQualifiedModel(pointerId)\n }\n\n if (!profile) {\n return {\n success: false,\n profile: null,\n error: `Model pointer '${modelParam}' points to invalid model '${pointerId}'. Use /model to reconfigure.`,\n }\n }\n\n if (!profile.isActive) {\n return {\n success: false,\n profile: null,\n error: `Model '${profile.name}' (pointed by '${modelParam}') is inactive. Use /model to activate it.`,\n }\n }\n\n return {\n success: true,\n profile,\n }\n } else {\n let profile = this.findModelProfile(modelParam)\n if (!profile) {\n profile = this.findModelProfileByModelName(modelParam)\n }\n if (!profile) {\n profile = this.findModelProfileByName(modelParam)\n }\n\n if (!profile && typeof modelParam === 'string') {\n profile = this.resolveProviderQualifiedModel(modelParam)\n }\n\n if (!profile) {\n return {\n success: false,\n profile: null,\n error: `Model '${modelParam}' not found. Use /model to add models, or run 'pyb models list' to see configured profiles.`,\n }\n }\n\n if (!profile.isActive) {\n return {\n success: false,\n profile: null,\n error: `Model '${profile.name}' is inactive. Use /model to activate it.`,\n }\n }\n\n return {\n success: true,\n profile,\n }\n }\n }\n\n private resolveProviderQualifiedModel(input: string): ModelProfile | null {\n const trimmed = input.trim()\n const colonIndex = trimmed.indexOf(':')\n if (colonIndex <= 0 || colonIndex >= trimmed.length - 1) return null\n\n const provider = normalizeProvider(trimmed.slice(0, colonIndex))\n const modelOrName = trimmed.slice(colonIndex + 1).trim()\n if (!provider || !modelOrName) return null\n\n const providerProfiles = this.modelProfiles.filter(\n p => normalizeProvider(p.provider) === provider,\n )\n if (providerProfiles.length === 0) return null\n\n const byModelName = providerProfiles.find(p => p.modelName === modelOrName)\n if (byModelName) return byModelName\n\n const byName = providerProfiles.find(p => p.name === modelOrName)\n if (byName) return byName\n\n return null\n }\n\n private findModelProfile(modelName: string): ModelProfile | null {\n const qualified = this.resolveProviderQualifiedModel(modelName)\n if (qualified) return qualified\n return this.modelProfiles.find(p => p.modelName === modelName) || null\n }\n\n private findModelProfileByModelName(modelName: string): ModelProfile | null {\n return this.modelProfiles.find(p => p.modelName === modelName) || null\n }\n\n private findModelProfileByName(name: string): ModelProfile | null {\n return this.modelProfiles.find(p => p.name === name) || null\n }\n\n private updateLastUsed(modelName: string): void {\n const profile = this.findModelProfile(modelName)\n if (profile) {\n profile.lastUsed = Date.now()\n }\n }\n\n private resolvePointerProfile(pointerId?: string): ModelProfile | null {\n if (!pointerId) return null\n let profile = this.findModelProfile(pointerId)\n if (!profile) {\n profile = this.findModelProfileByModelName(pointerId)\n }\n if (!profile && typeof pointerId === 'string') {\n profile = this.resolveProviderQualifiedModel(pointerId)\n }\n return profile\n }\n}\n\nlet globalModelManager: ModelManager | null = null\n\nexport const getModelManager = (): ModelManager => {\n try {\n if (!globalModelManager) {\n const config = getGlobalConfig()\n if (!config) {\n debugLogger.warn('MODEL_MANAGER_GLOBAL_CONFIG_MISSING', {})\n globalModelManager = new ModelManager({\n modelProfiles: [],\n modelPointers: { main: '', task: '', compact: '', quick: '' },\n })\n } else {\n globalModelManager = new ModelManager(config)\n }\n }\n return globalModelManager\n } catch (error) {\n logError(error)\n debugLogger.error('MODEL_MANAGER_CREATE_FAILED', {\n error: error instanceof Error ? error.message : String(error),\n })\n return new ModelManager({\n modelProfiles: [],\n modelPointers: { main: '', task: '', compact: '', quick: '' },\n })\n }\n}\n\nexport const reloadModelManager = (): void => {\n globalModelManager = null\n getModelManager()\n}\n\nexport const getQuickModel = (): string => {\n const manager = getModelManager()\n const quickModel = manager.getModel('quick')\n return quickModel?.modelName || 'quick'\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["profile"]
|
|
7
|
+
}
|
|
@@ -5,14 +5,14 @@ import {
|
|
|
5
5
|
} from "./chunk-B6IMQJZM.js";
|
|
6
6
|
import {
|
|
7
7
|
loadSettingsWithLegacyFallback
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-7SDAA35I.js";
|
|
9
9
|
import {
|
|
10
10
|
getSessionPlugins
|
|
11
11
|
} from "./chunk-BJSWTHRM.js";
|
|
12
12
|
import {
|
|
13
13
|
getCwd,
|
|
14
14
|
logError
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-VKXOAPOS.js";
|
|
16
16
|
|
|
17
17
|
// src/utils/session/pybHooks.ts
|
|
18
18
|
import { spawn } from "child_process";
|
|
@@ -496,7 +496,7 @@ async function runPromptHook(args) {
|
|
|
496
496
|
fallbackTimeoutMs: args.fallbackTimeoutMs
|
|
497
497
|
});
|
|
498
498
|
try {
|
|
499
|
-
const { queryQuick } = await import("./llmLazy-
|
|
499
|
+
const { queryQuick } = await import("./llmLazy-C5G2MM53.js");
|
|
500
500
|
const systemPrompt = [
|
|
501
501
|
"You are executing a Pyb prompt hook.",
|
|
502
502
|
"Return a single JSON object only (no markdown, no prose).",
|
|
@@ -8,14 +8,14 @@ import {
|
|
|
8
8
|
getSettingsFileCandidates,
|
|
9
9
|
loadSettingsWithLegacyFallback,
|
|
10
10
|
saveSettingsToPrimaryAndSyncLegacy
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-7SDAA35I.js";
|
|
12
12
|
import {
|
|
13
13
|
getCurrentProjectConfig
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-WAQ72XDO.js";
|
|
15
15
|
import {
|
|
16
16
|
getCwd,
|
|
17
17
|
logError
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-VKXOAPOS.js";
|
|
19
19
|
|
|
20
20
|
// src/utils/permissions/toolPermissionSettings.ts
|
|
21
21
|
function uniqueStrings(value) {
|
|
@@ -471,7 +471,7 @@ function getLastAssistantMessageId(messages) {
|
|
|
471
471
|
|
|
472
472
|
// src/utils/messages/index.ts
|
|
473
473
|
async function processUserInput(input, mode, setToolJSX, context, pastedImages) {
|
|
474
|
-
const impl = await import("./userInput-
|
|
474
|
+
const impl = await import("./userInput-ZT3LIWGH.js");
|
|
475
475
|
return impl.processUserInput(input, mode, setToolJSX, context, pastedImages);
|
|
476
476
|
}
|
|
477
477
|
|
|
@@ -6,12 +6,12 @@ import {
|
|
|
6
6
|
} from "./chunk-XKYHFZEC.js";
|
|
7
7
|
import {
|
|
8
8
|
getGlobalConfig
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-WAQ72XDO.js";
|
|
10
10
|
import {
|
|
11
11
|
debug,
|
|
12
12
|
getCurrentRequest,
|
|
13
13
|
logAPIError
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-DKQIGPXB.js";
|
|
15
15
|
|
|
16
16
|
// src/services/ai/openai.ts
|
|
17
17
|
import { ProxyAgent, fetch } from "undici";
|
|
@@ -2,11 +2,11 @@ import { createRequire as __pybCreateRequire } from "node:module";
|
|
|
2
2
|
const require = __pybCreateRequire(import.meta.url);
|
|
3
3
|
import {
|
|
4
4
|
listAllContentFiles
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-TYOT7UVX.js";
|
|
6
6
|
import {
|
|
7
7
|
getCwd,
|
|
8
8
|
logError
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-VKXOAPOS.js";
|
|
10
10
|
|
|
11
11
|
// src/utils/fs/file.ts
|
|
12
12
|
import {
|
|
@@ -39,57 +39,57 @@ import {
|
|
|
39
39
|
runWithTaskListEnv,
|
|
40
40
|
runWithTaskListId,
|
|
41
41
|
updateTask
|
|
42
|
-
} from "./chunk-
|
|
42
|
+
} from "./chunk-KZ7I6E5P.js";
|
|
43
43
|
import {
|
|
44
44
|
queryLLM
|
|
45
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-ZXADEAK4.js";
|
|
46
46
|
import {
|
|
47
47
|
FallbackToolUseRejectedMessage,
|
|
48
48
|
MCPTool,
|
|
49
49
|
getClients,
|
|
50
50
|
getMCPTools
|
|
51
|
-
} from "./chunk-
|
|
51
|
+
} from "./chunk-YH7ZOG3I.js";
|
|
52
52
|
import {
|
|
53
53
|
emitReminderEvent
|
|
54
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-TG2B47KG.js";
|
|
55
55
|
import {
|
|
56
56
|
getActiveAgents,
|
|
57
57
|
getAgentByType,
|
|
58
58
|
getAvailableAgentTypes
|
|
59
|
-
} from "./chunk-
|
|
59
|
+
} from "./chunk-PDQTREWL.js";
|
|
60
60
|
import {
|
|
61
61
|
INTERRUPT_MESSAGE,
|
|
62
62
|
createAssistantMessage,
|
|
63
63
|
createUserMessage,
|
|
64
64
|
getLastAssistantMessageId
|
|
65
|
-
} from "./chunk-
|
|
65
|
+
} from "./chunk-7QIWZIVM.js";
|
|
66
66
|
import {
|
|
67
67
|
formatDuration,
|
|
68
68
|
formatNumber
|
|
69
69
|
} from "./chunk-OUXHGDLH.js";
|
|
70
70
|
import {
|
|
71
71
|
getAbsolutePath
|
|
72
|
-
} from "./chunk-
|
|
72
|
+
} from "./chunk-A2IPV5PR.js";
|
|
73
73
|
import {
|
|
74
74
|
LspFacade,
|
|
75
75
|
formatDiagnosticsPretty
|
|
76
|
-
} from "./chunk-
|
|
76
|
+
} from "./chunk-ZXO6OMWV.js";
|
|
77
77
|
import {
|
|
78
78
|
getModelManager
|
|
79
|
-
} from "./chunk-
|
|
79
|
+
} from "./chunk-5TCQKGL7.js";
|
|
80
80
|
import {
|
|
81
81
|
getContext
|
|
82
|
-
} from "./chunk-
|
|
82
|
+
} from "./chunk-2IO7WUI7.js";
|
|
83
83
|
import {
|
|
84
84
|
filesToTree,
|
|
85
85
|
ripGrepWithStatus
|
|
86
|
-
} from "./chunk-
|
|
86
|
+
} from "./chunk-TYOT7UVX.js";
|
|
87
87
|
import {
|
|
88
88
|
getTheme
|
|
89
|
-
} from "./chunk-
|
|
89
|
+
} from "./chunk-6E6QBP52.js";
|
|
90
90
|
import {
|
|
91
91
|
debug
|
|
92
|
-
} from "./chunk-
|
|
92
|
+
} from "./chunk-DKQIGPXB.js";
|
|
93
93
|
import {
|
|
94
94
|
BunShell,
|
|
95
95
|
MEMORY_DIR,
|
|
@@ -101,7 +101,7 @@ import {
|
|
|
101
101
|
overwriteLog,
|
|
102
102
|
readTaskOutput,
|
|
103
103
|
resolveXdgDataPath
|
|
104
|
-
} from "./chunk-
|
|
104
|
+
} from "./chunk-VKXOAPOS.js";
|
|
105
105
|
|
|
106
106
|
// src/tools/index.ts
|
|
107
107
|
import { memoize as memoize2 } from "lodash-es";
|
|
@@ -780,7 +780,7 @@ async function analyzeOutputWithLsp(output, exitCode) {
|
|
|
780
780
|
if (exitCode !== 0 || errorCount > 0 || warningCount > 0) {
|
|
781
781
|
try {
|
|
782
782
|
const { isAbsolute: isAbsolute3, resolve: resolve4 } = await import("path");
|
|
783
|
-
const { getSessionRoot: getSessionRoot2 } = await import("./state-
|
|
783
|
+
const { getSessionRoot: getSessionRoot2 } = await import("./state-6FI3TEMZ.js");
|
|
784
784
|
const lines = output.split("\n");
|
|
785
785
|
const uniqueFiles = /* @__PURE__ */ new Set();
|
|
786
786
|
const lspSuggestions = [];
|
|
@@ -1153,7 +1153,7 @@ var DeleteTool = {
|
|
|
1153
1153
|
}
|
|
1154
1154
|
if (!force) {
|
|
1155
1155
|
try {
|
|
1156
|
-
const { LspFacade: LspFacade2 } = await import("./lsp-
|
|
1156
|
+
const { LspFacade: LspFacade2 } = await import("./lsp-7FPYFR6T.js");
|
|
1157
1157
|
const referenceDetail = await LspFacade2.checkFileReferences(fullPath);
|
|
1158
1158
|
if (referenceDetail) {
|
|
1159
1159
|
failedItems.push(
|
|
@@ -3741,14 +3741,6 @@ var TaskUpdateTool = {
|
|
|
3741
3741
|
return task;
|
|
3742
3742
|
});
|
|
3743
3743
|
const candidateIds = new Set(candidateTasks.map((task) => task.id));
|
|
3744
|
-
if (tasks.length > 1 && tasks[0]?.id !== updatedTask.id && (updatedTask.blockedBy?.length ?? 0) === 0) {
|
|
3745
|
-
emitReminderEvent("task.dependency_chain_missing", {
|
|
3746
|
-
listId,
|
|
3747
|
-
taskId: updatedTask.id,
|
|
3748
|
-
blockedBy: updatedTask.blockedBy ?? [],
|
|
3749
|
-
timestamp: Date.now()
|
|
3750
|
-
});
|
|
3751
|
-
}
|
|
3752
3744
|
const missingBlockedBy = getMissingBlockedBy(
|
|
3753
3745
|
updatedTask.blockedBy,
|
|
3754
3746
|
candidateIds
|