aemeathcli 1.0.9 → 1.0.11
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/LICENSE +21 -0
- package/README.md +609 -608
- package/dist/App-YAHJUWCX.js +4274 -0
- package/dist/App-YAHJUWCX.js.map +1 -0
- package/dist/agent-store/architect.md +32 -0
- package/dist/agent-store/debugger.md +32 -0
- package/dist/agent-store/developer.md +29 -0
- package/dist/agent-store/documenter.md +30 -0
- package/dist/agent-store/researcher.md +31 -0
- package/dist/agent-store/reviewer.md +28 -0
- package/dist/agent-store/supervisor.md +37 -0
- package/dist/agent-store/tester.md +30 -0
- package/dist/api-key-fallback-UN3TJEOO.js +11 -0
- package/dist/{api-key-fallback-YQQBOQIL.js.map → api-key-fallback-UN3TJEOO.js.map} +1 -1
- package/dist/auth-status-EIM5A5KL.js +13 -0
- package/dist/auth-status-EIM5A5KL.js.map +1 -0
- package/dist/{chunk-UY2SYSEZ.js → chunk-25UNNEHN.js} +32 -103
- package/dist/chunk-25UNNEHN.js.map +1 -0
- package/dist/{chunk-CYQNBB25.js → chunk-2GKOK6T7.js} +28 -5
- package/dist/chunk-2GKOK6T7.js.map +1 -0
- package/dist/{chunk-MFBHNWGV.js → chunk-2LF7ALGR.js} +12 -20
- package/dist/chunk-2LF7ALGR.js.map +1 -0
- package/dist/{chunk-H66O5Z2V.js → chunk-2NWNIKBK.js} +42 -7
- package/dist/chunk-2NWNIKBK.js.map +1 -0
- package/dist/chunk-3TSPZRGM.js +26 -0
- package/dist/chunk-3TSPZRGM.js.map +1 -0
- package/dist/{chunk-ZGOHARPV.js → chunk-473JN6M5.js} +2 -2
- package/dist/chunk-473JN6M5.js.map +1 -0
- package/dist/{chunk-IYW62KKR.js → chunk-5XFSV6PF.js} +66 -23
- package/dist/chunk-5XFSV6PF.js.map +1 -0
- package/dist/{chunk-HCIHOHLX.js → chunk-62HSGYQD.js} +2 -2
- package/dist/chunk-62HSGYQD.js.map +1 -0
- package/dist/{chunk-I5PZ4JTS.js → chunk-6GUD7QIM.js} +4 -4
- package/dist/chunk-6GUD7QIM.js.map +1 -0
- package/dist/{chunk-4IJD72YB.js → chunk-AQ23TYSQ.js} +7 -7
- package/dist/chunk-AQ23TYSQ.js.map +1 -0
- package/dist/{chunk-NBR3GHMT.js → chunk-BY4DAKUU.js} +39 -7
- package/dist/chunk-BY4DAKUU.js.map +1 -0
- package/dist/chunk-CC7MGWYY.js +12 -0
- package/dist/chunk-CC7MGWYY.js.map +1 -0
- package/dist/chunk-CTFZTARK.js +155 -0
- package/dist/chunk-CTFZTARK.js.map +1 -0
- package/dist/chunk-FIC7AK4Q.js +232 -0
- package/dist/chunk-FIC7AK4Q.js.map +1 -0
- package/dist/chunk-GU33WKPG.js +140 -0
- package/dist/chunk-GU33WKPG.js.map +1 -0
- package/dist/{chunk-VUG4IZ7J.js → chunk-H2SYKIMI.js} +10 -10
- package/dist/chunk-H2SYKIMI.js.map +1 -0
- package/dist/{chunk-JAXXTYID.js → chunk-HEKFAKVH.js} +2 -2
- package/dist/chunk-HEKFAKVH.js.map +1 -0
- package/dist/chunk-IARA5XYP.js +186 -0
- package/dist/chunk-IARA5XYP.js.map +1 -0
- package/dist/{chunk-HMJRPNPZ.js → chunk-LCYH4T6N.js} +95 -23
- package/dist/chunk-LCYH4T6N.js.map +1 -0
- package/dist/{chunk-CARHU3DO.js → chunk-LDVY5ELP.js} +66 -18
- package/dist/chunk-LDVY5ELP.js.map +1 -0
- package/dist/chunk-OCJPQFOR.js +88 -0
- package/dist/chunk-OCJPQFOR.js.map +1 -0
- package/dist/chunk-ODBY7S4X.js +141 -0
- package/dist/chunk-ODBY7S4X.js.map +1 -0
- package/dist/{chunk-DAHGLHNR.js → chunk-ONQ4WCUI.js} +7 -142
- package/dist/chunk-ONQ4WCUI.js.map +1 -0
- package/dist/{chunk-WPP3PEDE.js → chunk-P5TKZM3T.js} +32 -107
- package/dist/chunk-P5TKZM3T.js.map +1 -0
- package/dist/{chunk-ASGRGXYK.js → chunk-P66WDACW.js} +23 -22
- package/dist/chunk-P66WDACW.js.map +1 -0
- package/dist/{chunk-LSOYPSAT.js → chunk-QCRK4QEL.js} +4 -4
- package/dist/chunk-QCRK4QEL.js.map +1 -0
- package/dist/{chunk-YL5XFHR3.js → chunk-ROJPFPJ7.js} +2 -2
- package/dist/chunk-ROJPFPJ7.js.map +1 -0
- package/dist/chunk-RP2TAL3J.js +71 -0
- package/dist/chunk-RP2TAL3J.js.map +1 -0
- package/dist/{chunk-6PDJ45T4.js → chunk-RYOB3TLZ.js} +51 -26
- package/dist/chunk-RYOB3TLZ.js.map +1 -0
- package/dist/{chunk-Y5XVD2CD.js → chunk-SOQFMNQC.js} +110 -83
- package/dist/chunk-SOQFMNQC.js.map +1 -0
- package/dist/{chunk-TEVZS4FA.js → chunk-TDFTX32B.js} +16 -9
- package/dist/chunk-TDFTX32B.js.map +1 -0
- package/dist/chunk-VBLLDY4R.js +38 -0
- package/dist/chunk-VBLLDY4R.js.map +1 -0
- package/dist/{chunk-CGEV3ARR.js → chunk-VJNQJALF.js} +4 -4
- package/dist/chunk-VJNQJALF.js.map +1 -0
- package/dist/chunk-WAYSJMPS.js +26 -0
- package/dist/chunk-WAYSJMPS.js.map +1 -0
- package/dist/chunk-WC72BRHR.js +241 -0
- package/dist/chunk-WC72BRHR.js.map +1 -0
- package/dist/{chunk-MXZSI3AY.js → chunk-YPFOE2QJ.js} +43 -11
- package/dist/chunk-YPFOE2QJ.js.map +1 -0
- package/dist/claude-adapter-6P4SJH7P.js +7 -0
- package/dist/{claude-adapter-QMLFMSP3.js.map → claude-adapter-6P4SJH7P.js.map} +1 -1
- package/dist/{claude-login-5WELXPKT.js → claude-login-IS5WTBMP.js} +10 -10
- package/dist/claude-login-IS5WTBMP.js.map +1 -0
- package/dist/cli.js +371 -172
- package/dist/cli.js.map +1 -1
- package/dist/{codex-login-DDJBCT43.js → codex-login-GMPF64MR.js} +18 -17
- package/dist/codex-login-GMPF64MR.js.map +1 -0
- package/dist/config-store-POB6I37G.js +7 -0
- package/dist/{config-store-W6FBCQAQ.js.map → config-store-POB6I37G.js.map} +1 -1
- package/dist/conversation-store-PRBHWQMJ.js +4 -0
- package/dist/conversation-store-PRBHWQMJ.js.map +1 -0
- package/dist/detect-providers-C4SVQHFF.js +4 -0
- package/dist/detect-providers-C4SVQHFF.js.map +1 -0
- package/dist/executor-RUX7VK3T.js +4 -0
- package/dist/{executor-6RIKIGXK.js.map → executor-RUX7VK3T.js.map} +1 -1
- package/dist/first-run-GDEVRFPO.js +230 -0
- package/dist/first-run-GDEVRFPO.js.map +1 -0
- package/dist/gemini-adapter-MV3U4QFH.js +7 -0
- package/dist/{gemini-adapter-6JIHZ7WI.js.map → gemini-adapter-MV3U4QFH.js.map} +1 -1
- package/dist/{gemini-login-YEPK6GGW.js → gemini-login-KE224MSW.js} +13 -14
- package/dist/gemini-login-KE224MSW.js.map +1 -0
- package/dist/index.d.ts +47 -17
- package/dist/index.js +86 -471
- package/dist/index.js.map +1 -1
- package/dist/input-history-MIOO3FIW.js +57 -0
- package/dist/input-history-MIOO3FIW.js.map +1 -0
- package/dist/kimi-adapter-UODMNX6K.js +6 -0
- package/dist/{kimi-adapter-JN4HFFHU.js.map → kimi-adapter-UODMNX6K.js.map} +1 -1
- package/dist/{kimi-login-ZR74MIY4.js → kimi-login-DNT5YBKX.js} +18 -17
- package/dist/kimi-login-DNT5YBKX.js.map +1 -0
- package/dist/logger-PLPDWACQ.js +3 -0
- package/dist/logger-PLPDWACQ.js.map +1 -0
- package/dist/model-discovery-O64ZWPX5.js +6 -0
- package/dist/model-discovery-O64ZWPX5.js.map +1 -0
- package/dist/native-cli-adapters-JMZX2C2C.js +8 -0
- package/dist/{native-cli-adapters-OLW3XX57.js.map → native-cli-adapters-JMZX2C2C.js.map} +1 -1
- package/dist/ollama-adapter-GE67BNSS.js +5 -0
- package/dist/{ollama-adapter-OJQ3FKWK.js.map → ollama-adapter-GE67BNSS.js.map} +1 -1
- package/dist/openai-adapter-SHPLK77L.js +7 -0
- package/dist/{openai-adapter-XU46EN7B.js.map → openai-adapter-SHPLK77L.js.map} +1 -1
- package/dist/pathResolver-A6IXQQFE.js +3 -0
- package/dist/pathResolver-A6IXQQFE.js.map +1 -0
- package/dist/profile-loader-TNAXBLDX.js +162 -0
- package/dist/profile-loader-TNAXBLDX.js.map +1 -0
- package/dist/registry-3NHVCXCZ.js +6 -0
- package/dist/{registry-H7B3AHPQ.js.map → registry-3NHVCXCZ.js.map} +1 -1
- package/dist/registry-7CQ3NCAD.js +5 -0
- package/dist/{registry-OYWYT7WL.js.map → registry-7CQ3NCAD.js.map} +1 -1
- package/dist/server-manager-DES23IBQ.js +5 -0
- package/dist/{server-manager-PTGBHCLS.js.map → server-manager-DES23IBQ.js.map} +1 -1
- package/dist/session-manager-EHD7GWM2.js +12 -0
- package/dist/{session-manager-NYB2RKMS.js.map → session-manager-EHD7GWM2.js.map} +1 -1
- package/dist/skills/built-in/code-review/SKILL.md +85 -0
- package/dist/skills/built-in/commit/SKILL.md +83 -0
- package/dist/skills/built-in/debug/SKILL.md +119 -0
- package/dist/skills/built-in/plan/SKILL.md +123 -0
- package/dist/skills/built-in/refactor/SKILL.md +132 -0
- package/dist/skills/built-in/test/SKILL.md +128 -0
- package/dist/sqlite-store-7ZIVOUNI.js +5 -0
- package/dist/sqlite-store-7ZIVOUNI.js.map +1 -0
- package/dist/team-manager-6DCNLGTC.js +11 -0
- package/dist/{team-manager-HC4XGCFY.js.map → team-manager-6DCNLGTC.js.map} +1 -1
- package/dist/team-state-R2D7DT5M.js +3 -0
- package/dist/team-state-R2D7DT5M.js.map +1 -0
- package/dist/tmux-manager-WBKHUHDT.js +6 -0
- package/dist/{tmux-manager-GPYZ3WQH.js.map → tmux-manager-WBKHUHDT.js.map} +1 -1
- package/dist/tools-I6XCTEZY.js +6 -0
- package/dist/{tools-TSMXMHIF.js.map → tools-I6XCTEZY.js.map} +1 -1
- package/package.json +93 -89
- package/dist/App-TE3JJKOW.js +0 -2789
- package/dist/App-TE3JJKOW.js.map +0 -1
- package/dist/api-key-fallback-YQQBOQIL.js +0 -11
- package/dist/chunk-4IJD72YB.js.map +0 -1
- package/dist/chunk-6PDJ45T4.js.map +0 -1
- package/dist/chunk-ASGRGXYK.js.map +0 -1
- package/dist/chunk-CARHU3DO.js.map +0 -1
- package/dist/chunk-CGEV3ARR.js.map +0 -1
- package/dist/chunk-CS5X3BWX.js +0 -27
- package/dist/chunk-CS5X3BWX.js.map +0 -1
- package/dist/chunk-CYQNBB25.js.map +0 -1
- package/dist/chunk-DAHGLHNR.js.map +0 -1
- package/dist/chunk-H66O5Z2V.js.map +0 -1
- package/dist/chunk-HCIHOHLX.js.map +0 -1
- package/dist/chunk-HMJRPNPZ.js.map +0 -1
- package/dist/chunk-I5PZ4JTS.js.map +0 -1
- package/dist/chunk-IYW62KKR.js.map +0 -1
- package/dist/chunk-JAXXTYID.js.map +0 -1
- package/dist/chunk-LSOYPSAT.js.map +0 -1
- package/dist/chunk-MFBHNWGV.js.map +0 -1
- package/dist/chunk-MXZSI3AY.js.map +0 -1
- package/dist/chunk-NBR3GHMT.js.map +0 -1
- package/dist/chunk-TEVZS4FA.js.map +0 -1
- package/dist/chunk-UY2SYSEZ.js.map +0 -1
- package/dist/chunk-VUG4IZ7J.js.map +0 -1
- package/dist/chunk-WAHVZH7V.js +0 -260
- package/dist/chunk-WAHVZH7V.js.map +0 -1
- package/dist/chunk-WPP3PEDE.js.map +0 -1
- package/dist/chunk-Y5XVD2CD.js.map +0 -1
- package/dist/chunk-YL5XFHR3.js.map +0 -1
- package/dist/chunk-ZGOHARPV.js.map +0 -1
- package/dist/claude-adapter-QMLFMSP3.js +0 -6
- package/dist/claude-login-5WELXPKT.js.map +0 -1
- package/dist/codex-login-DDJBCT43.js.map +0 -1
- package/dist/config-store-W6FBCQAQ.js +0 -6
- package/dist/executor-6RIKIGXK.js +0 -4
- package/dist/gemini-adapter-6JIHZ7WI.js +0 -6
- package/dist/gemini-login-YEPK6GGW.js.map +0 -1
- package/dist/kimi-adapter-JN4HFFHU.js +0 -6
- package/dist/kimi-login-ZR74MIY4.js.map +0 -1
- package/dist/native-cli-adapters-OLW3XX57.js +0 -6
- package/dist/ollama-adapter-OJQ3FKWK.js +0 -6
- package/dist/openai-adapter-XU46EN7B.js +0 -6
- package/dist/registry-H7B3AHPQ.js +0 -5
- package/dist/registry-OYWYT7WL.js +0 -6
- package/dist/server-manager-PTGBHCLS.js +0 -5
- package/dist/session-manager-NYB2RKMS.js +0 -12
- package/dist/team-manager-HC4XGCFY.js +0 -11
- package/dist/tmux-manager-GPYZ3WQH.js +0 -6
- package/dist/tools-TSMXMHIF.js +0 -6
|
@@ -1,142 +1,7 @@
|
|
|
1
|
-
import { getEventBus } from './chunk-
|
|
2
|
-
import { estimateTokenCount, createTokenUsage, formatCost } from './chunk-
|
|
3
|
-
import { isCommandBlocked } from './chunk-
|
|
4
|
-
import {
|
|
5
|
-
import { ModelNotFoundError } from './chunk-ZGOHARPV.js';
|
|
6
|
-
import { logger } from './chunk-JAXXTYID.js';
|
|
7
|
-
|
|
8
|
-
// src/core/model-router.ts
|
|
9
|
-
var ModelRouter = class {
|
|
10
|
-
config;
|
|
11
|
-
userOverride;
|
|
12
|
-
constructor(config) {
|
|
13
|
-
this.config = config;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Set a temporary user override that takes highest priority.
|
|
17
|
-
*/
|
|
18
|
-
setUserOverride(modelId) {
|
|
19
|
-
if (modelId !== void 0) {
|
|
20
|
-
this.validateModel(modelId);
|
|
21
|
-
}
|
|
22
|
-
this.userOverride = modelId;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Resolve the best model for a given role through the priority pipeline.
|
|
26
|
-
*/
|
|
27
|
-
resolve(role) {
|
|
28
|
-
if (this.userOverride) {
|
|
29
|
-
const info = this.getModelInfo(this.userOverride);
|
|
30
|
-
return {
|
|
31
|
-
modelId: this.userOverride,
|
|
32
|
-
provider: info.provider,
|
|
33
|
-
source: "user_override",
|
|
34
|
-
role
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
if (role) {
|
|
38
|
-
const roleConfig = this.config.roles[role];
|
|
39
|
-
if (roleConfig) {
|
|
40
|
-
if (this.isModelAvailable(roleConfig.primary)) {
|
|
41
|
-
const info = this.getModelInfo(roleConfig.primary);
|
|
42
|
-
return {
|
|
43
|
-
modelId: roleConfig.primary,
|
|
44
|
-
provider: info.provider,
|
|
45
|
-
source: "role_config",
|
|
46
|
-
role
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
for (const fallbackModel of roleConfig.fallback) {
|
|
50
|
-
if (this.isModelAvailable(fallbackModel)) {
|
|
51
|
-
const info = this.getModelInfo(fallbackModel);
|
|
52
|
-
logger.info(
|
|
53
|
-
{ role, primary: roleConfig.primary, fallback: fallbackModel },
|
|
54
|
-
"Using fallback model for role"
|
|
55
|
-
);
|
|
56
|
-
return {
|
|
57
|
-
modelId: fallbackModel,
|
|
58
|
-
provider: info.provider,
|
|
59
|
-
source: "fallback_chain",
|
|
60
|
-
role
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
const defaultModel = this.config.defaultModel;
|
|
67
|
-
if (this.isModelAvailable(defaultModel)) {
|
|
68
|
-
const info = this.getModelInfo(defaultModel);
|
|
69
|
-
return {
|
|
70
|
-
modelId: defaultModel,
|
|
71
|
-
provider: info.provider,
|
|
72
|
-
source: "system_default",
|
|
73
|
-
role
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
const anyAvailable = this.getAvailableModels()[0];
|
|
77
|
-
if (anyAvailable) {
|
|
78
|
-
return {
|
|
79
|
-
modelId: anyAvailable.id,
|
|
80
|
-
provider: anyAvailable.provider,
|
|
81
|
-
source: "system_default",
|
|
82
|
-
role
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
throw new ModelNotFoundError(defaultModel);
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Check if a model is available (provider is enabled and model is known).
|
|
89
|
-
*/
|
|
90
|
-
isModelAvailable(modelId) {
|
|
91
|
-
const info = SUPPORTED_MODELS[modelId];
|
|
92
|
-
if (!info) {
|
|
93
|
-
return false;
|
|
94
|
-
}
|
|
95
|
-
return this.config.enabledProviders.includes(info.provider);
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Get model info by ID. Throws if not found.
|
|
99
|
-
*/
|
|
100
|
-
getModelInfo(modelId) {
|
|
101
|
-
const info = SUPPORTED_MODELS[modelId];
|
|
102
|
-
if (!info) {
|
|
103
|
-
throw new ModelNotFoundError(modelId);
|
|
104
|
-
}
|
|
105
|
-
return info;
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Get all available models (from enabled providers).
|
|
109
|
-
*/
|
|
110
|
-
getAvailableModels() {
|
|
111
|
-
return Object.values(SUPPORTED_MODELS).filter(
|
|
112
|
-
(model) => this.config.enabledProviders.includes(model.provider)
|
|
113
|
-
);
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* List models recommended for a specific role.
|
|
117
|
-
*/
|
|
118
|
-
getModelsForRole(role) {
|
|
119
|
-
return this.getAvailableModels().filter(
|
|
120
|
-
(model) => model.supportedRoles.includes(role)
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Validate that a model ID exists. Throws ModelNotFoundError if not.
|
|
125
|
-
*/
|
|
126
|
-
validateModel(modelId) {
|
|
127
|
-
if (!SUPPORTED_MODELS[modelId]) {
|
|
128
|
-
throw new ModelNotFoundError(modelId);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
};
|
|
132
|
-
function createModelRouter(config) {
|
|
133
|
-
const enabledProviders = Object.entries(config.providers).filter(([, providerConfig]) => providerConfig?.enabled).map(([name]) => name);
|
|
134
|
-
return new ModelRouter({
|
|
135
|
-
defaultModel: config.defaultModel,
|
|
136
|
-
roles: config.roles,
|
|
137
|
-
enabledProviders
|
|
138
|
-
});
|
|
139
|
-
}
|
|
1
|
+
import { getEventBus } from './chunk-ROJPFPJ7.js';
|
|
2
|
+
import { estimateTokenCount, createTokenUsage, formatCost } from './chunk-VJNQJALF.js';
|
|
3
|
+
import { isCommandBlocked } from './chunk-VBLLDY4R.js';
|
|
4
|
+
import { logger } from './chunk-HEKFAKVH.js';
|
|
140
5
|
|
|
141
6
|
// src/core/context-manager.ts
|
|
142
7
|
var CONTEXT_BUDGET_RATIO = 0.85;
|
|
@@ -652,6 +517,6 @@ var TaskOrchestrator = class {
|
|
|
652
517
|
}
|
|
653
518
|
};
|
|
654
519
|
|
|
655
|
-
export { ContextManager, CostTracker,
|
|
656
|
-
//# sourceMappingURL=chunk-
|
|
657
|
-
//# sourceMappingURL=chunk-
|
|
520
|
+
export { ContextManager, CostTracker, PermissionManager, TaskOrchestrator };
|
|
521
|
+
//# sourceMappingURL=chunk-ONQ4WCUI.js.map
|
|
522
|
+
//# sourceMappingURL=chunk-ONQ4WCUI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/context-manager.ts","../src/core/cost-tracker.ts","../src/core/permission-manager.ts","../src/core/task-orchestrator.ts"],"names":[],"mappings":"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","file":"chunk-ONQ4WCUI.js","sourcesContent":["/**\r\n * Context window management per PRD section 7.4\r\n * - Token budgeting: 85% conversation, 15% buffer\r\n * - Smart truncation: prioritize recent + system prompt\r\n * - Compression: summarize old messages when approaching limits\r\n * - File context tracking with LRU eviction\r\n */\r\n\r\nimport type { IChatMessage, IModelInfo } from \"../types/index.js\";\r\nimport { estimateTokenCount } from \"../utils/index.js\";\r\nimport { logger } from \"../utils/index.js\";\r\n\r\nconst CONTEXT_BUDGET_RATIO = 0.85;\r\nconst SYSTEM_PROMPT_RESERVE = 4_000;\r\n\r\ninterface IFileContextEntry {\r\n readonly filePath: string;\r\n readonly tokenCount: number;\r\n lastAccessedAt: number;\r\n}\r\n\r\nexport class ContextManager {\r\n private readonly maxTokens: number;\r\n private readonly budgetTokens: number;\r\n private readonly fileContext = new Map<string, IFileContextEntry>();\r\n private currentTokenCount = 0;\r\n\r\n constructor(modelInfo: IModelInfo) {\r\n this.maxTokens = modelInfo.contextWindow;\r\n this.budgetTokens = Math.floor(this.maxTokens * CONTEXT_BUDGET_RATIO);\r\n }\r\n\r\n /**\r\n * Get the available token budget for new content.\r\n */\r\n getAvailableBudget(): number {\r\n return Math.max(0, this.budgetTokens - this.currentTokenCount - SYSTEM_PROMPT_RESERVE);\r\n }\r\n\r\n /**\r\n * Get total context usage.\r\n */\r\n getUsage(): { used: number; budget: number; max: number; percentage: number } {\r\n return {\r\n used: this.currentTokenCount,\r\n budget: this.budgetTokens,\r\n max: this.maxTokens,\r\n percentage: Math.round((this.currentTokenCount / this.budgetTokens) * 100),\r\n };\r\n }\r\n\r\n /**\r\n * Trim messages to fit within the context window.\r\n * Preserves system prompt and most recent messages.\r\n */\r\n trimMessages(messages: readonly IChatMessage[], systemPrompt?: string): IChatMessage[] {\r\n const systemTokens = systemPrompt ? estimateTokenCount(systemPrompt) : 0;\r\n const availableTokens = this.budgetTokens - systemTokens - SYSTEM_PROMPT_RESERVE;\r\n\r\n if (availableTokens <= 0) {\r\n logger.warn(\"System prompt alone exceeds context budget\");\r\n return [];\r\n }\r\n\r\n // Work backwards from most recent, accumulating tokens\r\n const result: IChatMessage[] = [];\r\n let usedTokens = 0;\r\n\r\n for (let i = messages.length - 1; i >= 0; i--) {\r\n const msg = messages[i];\r\n if (!msg) {\r\n continue;\r\n }\r\n const msgTokens = estimateTokenCount(msg.content);\r\n\r\n if (usedTokens + msgTokens > availableTokens) {\r\n break;\r\n }\r\n\r\n result.unshift(msg);\r\n usedTokens += msgTokens;\r\n }\r\n\r\n this.currentTokenCount = usedTokens + systemTokens;\r\n\r\n if (result.length < messages.length) {\r\n logger.info(\r\n {\r\n original: messages.length,\r\n trimmed: result.length,\r\n droppedMessages: messages.length - result.length,\r\n },\r\n \"Trimmed conversation to fit context window\",\r\n );\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Track a file being added to context.\r\n */\r\n addFileContext(filePath: string, content: string): void {\r\n const tokenCount = estimateTokenCount(content);\r\n this.fileContext.set(filePath, {\r\n filePath,\r\n tokenCount,\r\n lastAccessedAt: Date.now(),\r\n });\r\n this.currentTokenCount += tokenCount;\r\n }\r\n\r\n /**\r\n * Touch a file (update last accessed time).\r\n */\r\n touchFile(filePath: string): void {\r\n const entry = this.fileContext.get(filePath);\r\n if (entry) {\r\n entry.lastAccessedAt = Date.now();\r\n }\r\n }\r\n\r\n /**\r\n * Remove a file from context.\r\n */\r\n removeFileContext(filePath: string): void {\r\n const entry = this.fileContext.get(filePath);\r\n if (entry) {\r\n this.currentTokenCount -= entry.tokenCount;\r\n this.fileContext.delete(filePath);\r\n }\r\n }\r\n\r\n /**\r\n * Evict least-recently-used files to free space.\r\n */\r\n evictLRU(tokensNeeded: number): string[] {\r\n const evicted: string[] = [];\r\n const sorted = [...this.fileContext.entries()].sort(\r\n ([, a], [, b]) => a.lastAccessedAt - b.lastAccessedAt,\r\n );\r\n\r\n let freedTokens = 0;\r\n for (const [filePath, entry] of sorted) {\r\n if (freedTokens >= tokensNeeded) {\r\n break;\r\n }\r\n this.removeFileContext(filePath);\r\n freedTokens += entry.tokenCount;\r\n evicted.push(filePath);\r\n }\r\n\r\n if (evicted.length > 0) {\r\n logger.info(\r\n { evicted, freedTokens },\r\n \"Evicted files from context to free space\",\r\n );\r\n }\r\n\r\n return evicted;\r\n }\r\n\r\n /**\r\n * Get all tracked files.\r\n */\r\n getTrackedFiles(): readonly IFileContextEntry[] {\r\n return [...this.fileContext.values()];\r\n }\r\n\r\n /**\r\n * Reset context tracking (for model switch).\r\n */\r\n reset(): void {\r\n this.fileContext.clear();\r\n this.currentTokenCount = 0;\r\n }\r\n}\r\n","/**\r\n * Real-time cost tracking per PRD section 7.5\r\n * - Per-request cost calculation\r\n * - Session total\r\n * - Breakdown by provider, model, and role\r\n * - Configurable budget alerts\r\n */\r\n\r\nimport type { ProviderName, ModelRole, ITokenUsage, ICostConfig } from \"../types/index.js\";\r\nimport { createTokenUsage, formatCost } from \"../utils/index.js\";\r\nimport { logger } from \"../utils/index.js\";\r\nimport { getEventBus } from \"./event-bus.js\";\r\n\r\ninterface ICostEntry {\r\n readonly provider: ProviderName;\r\n readonly model: string;\r\n readonly role?: ModelRole | undefined;\r\n readonly usage: ITokenUsage;\r\n readonly timestamp: Date;\r\n}\r\n\r\ninterface ICostBreakdown {\r\n readonly byProvider: Record<string, number>;\r\n readonly byModel: Record<string, number>;\r\n readonly byRole: Record<string, number>;\r\n}\r\n\r\nexport class CostTracker {\r\n private readonly entries: ICostEntry[] = [];\r\n private readonly budgetConfig: ICostConfig;\r\n private warningEmitted = false;\r\n\r\n constructor(budgetConfig: ICostConfig) {\r\n this.budgetConfig = budgetConfig;\r\n }\r\n\r\n /**\r\n * Record a cost entry from a model response.\r\n */\r\n record(\r\n provider: ProviderName,\r\n model: string,\r\n inputTokens: number,\r\n outputTokens: number,\r\n role?: ModelRole,\r\n ): ITokenUsage {\r\n const usage = createTokenUsage(model, inputTokens, outputTokens);\r\n\r\n const entry: ICostEntry = {\r\n provider,\r\n model,\r\n role,\r\n usage,\r\n timestamp: new Date(),\r\n };\r\n\r\n this.entries.push(entry);\r\n\r\n const total = this.getSessionTotal();\r\n const eventBus = getEventBus();\r\n\r\n eventBus.emit(\"cost:updated\", {\r\n total,\r\n provider,\r\n delta: usage.costUsd,\r\n });\r\n\r\n // Budget warning\r\n if (total >= this.budgetConfig.budgetWarning && !this.warningEmitted) {\r\n this.warningEmitted = true;\r\n eventBus.emit(\"cost:warning\", {\r\n current: total,\r\n limit: this.budgetConfig.budgetWarning,\r\n });\r\n logger.warn(\r\n { current: formatCost(total), warning: formatCost(this.budgetConfig.budgetWarning) },\r\n \"Budget warning threshold reached\",\r\n );\r\n }\r\n\r\n // Budget hard stop\r\n if (total >= this.budgetConfig.budgetHardStop) {\r\n eventBus.emit(\"cost:exceeded\", {\r\n current: total,\r\n limit: this.budgetConfig.budgetHardStop,\r\n });\r\n logger.error(\r\n { current: formatCost(total), limit: formatCost(this.budgetConfig.budgetHardStop) },\r\n \"Budget hard stop reached\",\r\n );\r\n }\r\n\r\n return usage;\r\n }\r\n\r\n /**\r\n * Get total session cost.\r\n */\r\n getSessionTotal(): number {\r\n return this.entries.reduce((sum, entry) => sum + entry.usage.costUsd, 0);\r\n }\r\n\r\n /**\r\n * Get total token counts.\r\n */\r\n getSessionTokens(): { input: number; output: number; total: number } {\r\n const input = this.entries.reduce((sum, e) => sum + e.usage.inputTokens, 0);\r\n const output = this.entries.reduce((sum, e) => sum + e.usage.outputTokens, 0);\r\n return { input, output, total: input + output };\r\n }\r\n\r\n /**\r\n * Get cost breakdown by provider, model, and role.\r\n */\r\n getBreakdown(): ICostBreakdown {\r\n const byProvider: Record<string, number> = {};\r\n const byModel: Record<string, number> = {};\r\n const byRole: Record<string, number> = {};\r\n\r\n for (const entry of this.entries) {\r\n byProvider[entry.provider] = (byProvider[entry.provider] ?? 0) + entry.usage.costUsd;\r\n byModel[entry.model] = (byModel[entry.model] ?? 0) + entry.usage.costUsd;\r\n if (entry.role) {\r\n byRole[entry.role] = (byRole[entry.role] ?? 0) + entry.usage.costUsd;\r\n }\r\n }\r\n\r\n return { byProvider, byModel, byRole };\r\n }\r\n\r\n /**\r\n * Check if budget hard stop has been exceeded.\r\n */\r\n isBudgetExceeded(): boolean {\r\n return this.getSessionTotal() >= this.budgetConfig.budgetHardStop;\r\n }\r\n\r\n /**\r\n * Get formatted session summary.\r\n */\r\n getSummary(): string {\r\n const total = this.getSessionTotal();\r\n const tokens = this.getSessionTokens();\r\n return `${formatCost(total)} (${tokens.total.toLocaleString()} tokens)`;\r\n }\r\n\r\n /**\r\n * Get all cost entries (for export).\r\n */\r\n getEntries(): readonly ICostEntry[] {\r\n return this.entries;\r\n }\r\n\r\n /**\r\n * Reset cost tracking for a new session.\r\n */\r\n reset(): void {\r\n this.entries.length = 0;\r\n this.warningEmitted = false;\r\n }\r\n}\r\n","/**\r\n * Tool permission management per PRD section 14.4\r\n * Permission modes: strict, standard, permissive\r\n */\r\n\r\nimport type { PermissionMode, ToolCategory } from \"../types/index.js\";\r\nimport { logger } from \"../utils/index.js\";\r\nimport { isCommandBlocked } from \"../utils/index.js\";\r\n\r\n// Commands that ALWAYS require confirmation regardless of mode\r\nconst DANGEROUS_COMMANDS = [\r\n \"rm -rf\",\r\n \"git push --force\",\r\n \"git reset --hard\",\r\n \"git checkout .\",\r\n \"git clean -f\",\r\n \"git branch -D\",\r\n \"drop table\",\r\n \"drop database\",\r\n \"truncate\",\r\n \"format c:\",\r\n \"del /f /s /q\",\r\n] as const;\r\n\r\nexport interface IPermissionRequest {\r\n readonly toolName: string;\r\n readonly category: ToolCategory;\r\n readonly operation: string;\r\n readonly resource?: string;\r\n readonly command?: string;\r\n}\r\n\r\nexport interface IPermissionResult {\r\n readonly allowed: boolean;\r\n readonly reason?: string;\r\n readonly requiresUserApproval: boolean;\r\n}\r\n\r\nexport class PermissionManager {\r\n private mode: PermissionMode;\r\n private readonly allowedPaths: readonly string[];\r\n private readonly blockedCommands: readonly string[];\r\n private readonly approvedOperations = new Set<string>();\r\n\r\n constructor(\r\n mode: PermissionMode,\r\n allowedPaths: readonly string[],\r\n blockedCommands: readonly string[],\r\n ) {\r\n this.mode = mode;\r\n this.allowedPaths = allowedPaths;\r\n this.blockedCommands = blockedCommands;\r\n }\r\n\r\n /**\r\n * Check if an operation is permitted.\r\n */\r\n check(request: IPermissionRequest): IPermissionResult {\r\n // Always-blocked operations\r\n if (request.command && this.isDangerousCommand(request.command)) {\r\n return {\r\n allowed: false,\r\n reason: `Dangerous command detected: \"${request.command}\"`,\r\n requiresUserApproval: true,\r\n };\r\n }\r\n\r\n // Check against blocked commands list\r\n if (request.command && isCommandBlocked(request.command, this.blockedCommands)) {\r\n return {\r\n allowed: false,\r\n reason: `Command is on the blocked list`,\r\n requiresUserApproval: true,\r\n };\r\n }\r\n\r\n // Previously approved operations\r\n const opKey = this.getOperationKey(request);\r\n if (this.approvedOperations.has(opKey)) {\r\n return { allowed: true, requiresUserApproval: false };\r\n }\r\n\r\n // Mode-based permissions\r\n switch (this.mode) {\r\n case \"permissive\":\r\n return { allowed: true, requiresUserApproval: false };\r\n\r\n case \"standard\":\r\n return this.checkStandardMode(request);\r\n\r\n case \"strict\":\r\n return this.checkStrictMode(request);\r\n }\r\n }\r\n\r\n /**\r\n * Record that the user has approved an operation.\r\n */\r\n approve(request: IPermissionRequest): void {\r\n const opKey = this.getOperationKey(request);\r\n this.approvedOperations.add(opKey);\r\n logger.info({ operation: opKey }, \"Operation approved by user\");\r\n }\r\n\r\n /**\r\n * Update permission mode.\r\n */\r\n setMode(mode: PermissionMode): void {\r\n this.mode = mode;\r\n this.approvedOperations.clear();\r\n logger.info({ mode }, \"Permission mode changed\");\r\n }\r\n\r\n /**\r\n * Get current mode.\r\n */\r\n getMode(): PermissionMode {\r\n return this.mode;\r\n }\r\n\r\n private checkStandardMode(request: IPermissionRequest): IPermissionResult {\r\n // Read operations auto-approved in standard mode\r\n if (this.isReadOperation(request)) {\r\n return { allowed: true, requiresUserApproval: false };\r\n }\r\n\r\n // Write and shell operations require approval\r\n return {\r\n allowed: false,\r\n reason: `${request.operation} requires approval in standard mode`,\r\n requiresUserApproval: true,\r\n };\r\n }\r\n\r\n private checkStrictMode(request: IPermissionRequest): IPermissionResult {\r\n // Everything requires approval in strict mode\r\n return {\r\n allowed: false,\r\n reason: `${request.operation} requires approval in strict mode`,\r\n requiresUserApproval: true,\r\n };\r\n }\r\n\r\n private isReadOperation(request: IPermissionRequest): boolean {\r\n const readTools = [\"read\", \"glob\", \"grep\", \"web-search\", \"web-fetch\"];\r\n return readTools.includes(request.toolName);\r\n }\r\n\r\n private isDangerousCommand(command: string): boolean {\r\n const lower = command.toLowerCase().trim();\r\n return DANGEROUS_COMMANDS.some((dangerous) => lower.includes(dangerous));\r\n }\r\n\r\n private getOperationKey(request: IPermissionRequest): string {\r\n return `${request.toolName}:${request.operation}:${request.resource ?? \"\"}`;\r\n }\r\n}\r\n","/**\r\n * Agent team task coordination per PRD section 8\r\n * Manages task creation, assignment, dependency resolution, and completion tracking.\r\n */\r\n\r\nimport type { ITask, TaskStatus, ModelRole } from \"../types/index.js\";\r\nimport { logger } from \"../utils/index.js\";\r\nimport { getEventBus } from \"./event-bus.js\";\r\n\r\nlet nextTaskId = 1;\r\n\r\nfunction generateTaskId(): string {\r\n return String(nextTaskId++);\r\n}\r\n\r\nexport class TaskOrchestrator {\r\n private readonly tasks = new Map<string, ITask>();\r\n\r\n /**\r\n * Create a new task.\r\n */\r\n createTask(\r\n subject: string,\r\n description: string,\r\n options?: {\r\n owner?: string;\r\n model?: string;\r\n role?: ModelRole;\r\n blockedBy?: string[];\r\n },\r\n ): ITask {\r\n const id = generateTaskId();\r\n const now = new Date();\r\n\r\n const task: ITask = {\r\n id,\r\n subject,\r\n description,\r\n status: \"pending\",\r\n owner: options?.owner,\r\n model: options?.model,\r\n role: options?.role,\r\n blocks: [],\r\n blockedBy: options?.blockedBy ? [...options.blockedBy] : [],\r\n createdAt: now,\r\n updatedAt: now,\r\n };\r\n\r\n this.tasks.set(id, task);\r\n\r\n // Set up reverse blocking relationships\r\n if (options?.blockedBy) {\r\n for (const blockerId of options.blockedBy) {\r\n const blocker = this.tasks.get(blockerId);\r\n if (blocker && !blocker.blocks.includes(id)) {\r\n blocker.blocks.push(id);\r\n }\r\n }\r\n }\r\n\r\n getEventBus().emit(\"task:created\", { taskId: id, subject });\r\n logger.info({ taskId: id, subject }, \"Task created\");\r\n\r\n return task;\r\n }\r\n\r\n /**\r\n * Update task status.\r\n */\r\n updateStatus(taskId: string, status: TaskStatus): void {\r\n const task = this.getTask(taskId);\r\n task.status = status;\r\n task.updatedAt = new Date();\r\n\r\n getEventBus().emit(\"task:updated\", { taskId, status });\r\n\r\n if (status === \"completed\") {\r\n getEventBus().emit(\"task:completed\", { taskId });\r\n this.resolveBlockedTasks(taskId);\r\n }\r\n\r\n logger.info({ taskId, status }, \"Task status updated\");\r\n }\r\n\r\n /**\r\n * Assign a task to an agent.\r\n */\r\n assignTask(taskId: string, owner: string, model?: string): void {\r\n const task = this.getTask(taskId);\r\n task.owner = owner;\r\n if (model) {\r\n (task as { model?: string }).model = model;\r\n }\r\n task.updatedAt = new Date();\r\n logger.info({ taskId, owner, model }, \"Task assigned\");\r\n }\r\n\r\n /**\r\n * Get a task by ID. Throws if not found.\r\n */\r\n getTask(taskId: string): ITask {\r\n const task = this.tasks.get(taskId);\r\n if (!task) {\r\n throw new Error(`Task not found: ${taskId}`);\r\n }\r\n return task;\r\n }\r\n\r\n /**\r\n * Get all tasks.\r\n */\r\n getAllTasks(): readonly ITask[] {\r\n return [...this.tasks.values()];\r\n }\r\n\r\n /**\r\n * Get tasks by status.\r\n */\r\n getTasksByStatus(status: TaskStatus): readonly ITask[] {\r\n return [...this.tasks.values()].filter((t) => t.status === status);\r\n }\r\n\r\n /**\r\n * Get tasks assigned to an agent.\r\n */\r\n getTasksByOwner(owner: string): readonly ITask[] {\r\n return [...this.tasks.values()].filter((t) => t.owner === owner);\r\n }\r\n\r\n /**\r\n * Get tasks that are ready to be worked on (pending, not blocked).\r\n */\r\n getAvailableTasks(): readonly ITask[] {\r\n return [...this.tasks.values()].filter(\r\n (t) =>\r\n t.status === \"pending\" &&\r\n !t.owner &&\r\n t.blockedBy.every((blockerId) => {\r\n const blocker = this.tasks.get(blockerId);\r\n return blocker?.status === \"completed\";\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Check if all tasks are completed.\r\n */\r\n isAllComplete(): boolean {\r\n return [...this.tasks.values()].every((t) => t.status === \"completed\");\r\n }\r\n\r\n /**\r\n * Get progress summary.\r\n */\r\n getProgress(): { total: number; completed: number; inProgress: number; pending: number; blocked: number } {\r\n const tasks = [...this.tasks.values()];\r\n return {\r\n total: tasks.length,\r\n completed: tasks.filter((t) => t.status === \"completed\").length,\r\n inProgress: tasks.filter((t) => t.status === \"in_progress\").length,\r\n pending: tasks.filter((t) => t.status === \"pending\").length,\r\n blocked: tasks.filter((t) => t.status === \"blocked\").length,\r\n };\r\n }\r\n\r\n /**\r\n * Delete a task.\r\n */\r\n deleteTask(taskId: string): void {\r\n const task = this.tasks.get(taskId);\r\n if (task) {\r\n // Remove from blockedBy references\r\n for (const [, otherTask] of this.tasks) {\r\n otherTask.blockedBy = otherTask.blockedBy.filter((id) => id !== taskId);\r\n otherTask.blocks = otherTask.blocks.filter((id) => id !== taskId);\r\n }\r\n this.tasks.delete(taskId);\r\n }\r\n }\r\n\r\n /**\r\n * When a task completes, check if any blocked tasks can now proceed.\r\n */\r\n private resolveBlockedTasks(completedTaskId: string): void {\r\n for (const [, task] of this.tasks) {\r\n if (task.status === \"blocked\" || task.status === \"pending\") {\r\n const allDepsComplete = task.blockedBy.every((depId) => {\r\n const dep = this.tasks.get(depId);\r\n return dep?.status === \"completed\";\r\n });\r\n\r\n if (allDepsComplete && task.status === \"blocked\") {\r\n task.status = \"pending\";\r\n task.updatedAt = new Date();\r\n logger.info(\r\n { taskId: task.id, unblockedBy: completedTaskId },\r\n \"Task unblocked\",\r\n );\r\n }\r\n }\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { ModelNotFoundError, AuthenticationError, RateLimitError } from './chunk-
|
|
3
|
-
import {
|
|
1
|
+
import { buildModelMessages, buildAiSdkTools, extractAiSdkToolCalls, buildTokenUsage, mapAiSdkFinishReason } from './chunk-ODBY7S4X.js';
|
|
2
|
+
import { ModelNotFoundError, AuthenticationError, RateLimitError } from './chunk-473JN6M5.js';
|
|
3
|
+
import { SUPPORTED_MODELS } from './chunk-62HSGYQD.js';
|
|
4
|
+
import { logger } from './chunk-HEKFAKVH.js';
|
|
4
5
|
import { generateText, streamText } from 'ai';
|
|
5
6
|
import { createOpenAI } from '@ai-sdk/openai';
|
|
6
7
|
|
|
@@ -14,50 +15,6 @@ var OPENAI_MODELS = [
|
|
|
14
15
|
"gpt-5.1-codex-mini"
|
|
15
16
|
];
|
|
16
17
|
var CHARS_PER_TOKEN_ESTIMATE = 4;
|
|
17
|
-
function convertTools(tools) {
|
|
18
|
-
if (tools === void 0 || tools.length === 0) {
|
|
19
|
-
return void 0;
|
|
20
|
-
}
|
|
21
|
-
const result = {};
|
|
22
|
-
for (const tool of tools) {
|
|
23
|
-
const properties = {};
|
|
24
|
-
const required = [];
|
|
25
|
-
for (const param of tool.parameters) {
|
|
26
|
-
const prop = {
|
|
27
|
-
type: param.type,
|
|
28
|
-
description: param.description
|
|
29
|
-
};
|
|
30
|
-
if (param.enum !== void 0) {
|
|
31
|
-
prop["enum"] = param.enum;
|
|
32
|
-
}
|
|
33
|
-
if (param.default !== void 0) {
|
|
34
|
-
prop["default"] = param.default;
|
|
35
|
-
}
|
|
36
|
-
properties[param.name] = prop;
|
|
37
|
-
if (param.required) {
|
|
38
|
-
required.push(param.name);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
result[tool.name] = {
|
|
42
|
-
description: tool.description,
|
|
43
|
-
parameters: {
|
|
44
|
-
type: "object",
|
|
45
|
-
properties,
|
|
46
|
-
required
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
return result;
|
|
51
|
-
}
|
|
52
|
-
function buildMessages(messages) {
|
|
53
|
-
return messages.map((msg) => ({
|
|
54
|
-
role: msg.role,
|
|
55
|
-
content: msg.content
|
|
56
|
-
}));
|
|
57
|
-
}
|
|
58
|
-
function computeCost(modelInfo, inputTokens, outputTokens) {
|
|
59
|
-
return inputTokens / 1e6 * modelInfo.inputPricePerMToken + outputTokens / 1e6 * modelInfo.outputPricePerMToken;
|
|
60
|
-
}
|
|
61
18
|
function classifyError(error, model) {
|
|
62
19
|
const message = error instanceof Error ? error.message : String(error);
|
|
63
20
|
const lower = message.toLowerCase();
|
|
@@ -77,6 +34,7 @@ function classifyError(error, model) {
|
|
|
77
34
|
var OpenAIAdapter = class {
|
|
78
35
|
name = PROVIDER_NAME;
|
|
79
36
|
supportedModels = OPENAI_MODELS;
|
|
37
|
+
supportsToolCalling = true;
|
|
80
38
|
openai;
|
|
81
39
|
apiKey;
|
|
82
40
|
baseUrl;
|
|
@@ -90,28 +48,21 @@ var OpenAIAdapter = class {
|
|
|
90
48
|
}
|
|
91
49
|
async chat(request) {
|
|
92
50
|
const modelInfo = this.getModelInfo(request.model);
|
|
93
|
-
const messages =
|
|
94
|
-
const tools =
|
|
51
|
+
const messages = buildModelMessages(request.messages);
|
|
52
|
+
const tools = buildAiSdkTools(request.tools);
|
|
95
53
|
try {
|
|
96
54
|
const result = await generateText({
|
|
97
55
|
model: this.openai(request.model),
|
|
98
56
|
messages,
|
|
99
57
|
...request.system !== void 0 ? { system: request.system } : {},
|
|
100
|
-
tools,
|
|
101
|
-
|
|
58
|
+
...tools !== void 0 ? { tools } : {},
|
|
59
|
+
maxOutputTokens: request.maxTokens ?? modelInfo.maxOutputTokens,
|
|
102
60
|
...request.temperature !== void 0 ? { temperature: request.temperature } : {}
|
|
103
61
|
});
|
|
104
|
-
const toolCalls =
|
|
105
|
-
const
|
|
106
|
-
const outputTokens = result.usage?.completionTokens ?? 0;
|
|
107
|
-
const usage = {
|
|
108
|
-
inputTokens,
|
|
109
|
-
outputTokens,
|
|
110
|
-
totalTokens: inputTokens + outputTokens,
|
|
111
|
-
costUsd: computeCost(modelInfo, inputTokens, outputTokens)
|
|
112
|
-
};
|
|
62
|
+
const toolCalls = extractAiSdkToolCalls(result.toolCalls);
|
|
63
|
+
const usage = buildTokenUsage(modelInfo, result.usage);
|
|
113
64
|
const responseMessage = {
|
|
114
|
-
id: result.response
|
|
65
|
+
id: result.response.id,
|
|
115
66
|
role: "assistant",
|
|
116
67
|
content: result.text,
|
|
117
68
|
model: request.model,
|
|
@@ -121,12 +72,12 @@ var OpenAIAdapter = class {
|
|
|
121
72
|
createdAt: /* @__PURE__ */ new Date()
|
|
122
73
|
};
|
|
123
74
|
return {
|
|
124
|
-
id: result.response
|
|
75
|
+
id: result.response.id,
|
|
125
76
|
model: request.model,
|
|
126
77
|
provider: PROVIDER_NAME,
|
|
127
78
|
message: responseMessage,
|
|
128
79
|
usage,
|
|
129
|
-
finishReason:
|
|
80
|
+
finishReason: mapAiSdkFinishReason(result.finishReason)
|
|
130
81
|
};
|
|
131
82
|
} catch (error) {
|
|
132
83
|
classifyError(error, request.model);
|
|
@@ -134,36 +85,32 @@ var OpenAIAdapter = class {
|
|
|
134
85
|
}
|
|
135
86
|
async *stream(request) {
|
|
136
87
|
const modelInfo = this.getModelInfo(request.model);
|
|
137
|
-
const messages =
|
|
138
|
-
const tools =
|
|
88
|
+
const messages = buildModelMessages(request.messages);
|
|
89
|
+
const tools = buildAiSdkTools(request.tools);
|
|
139
90
|
try {
|
|
140
91
|
const result = streamText({
|
|
141
92
|
model: this.openai(request.model),
|
|
142
93
|
messages,
|
|
143
94
|
...request.system !== void 0 ? { system: request.system } : {},
|
|
144
|
-
tools,
|
|
145
|
-
|
|
95
|
+
...tools !== void 0 ? { tools } : {},
|
|
96
|
+
maxOutputTokens: request.maxTokens ?? modelInfo.maxOutputTokens,
|
|
146
97
|
...request.temperature !== void 0 ? { temperature: request.temperature } : {}
|
|
147
98
|
});
|
|
148
99
|
for await (const part of result.fullStream) {
|
|
149
100
|
if (part.type === "text-delta") {
|
|
150
|
-
yield { type: "text", content: part.
|
|
101
|
+
yield { type: "text", content: part.text };
|
|
151
102
|
} else if (part.type === "tool-call") {
|
|
152
|
-
const toolCall = {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
};
|
|
103
|
+
const [toolCall] = extractAiSdkToolCalls([{
|
|
104
|
+
toolCallId: part.toolCallId,
|
|
105
|
+
toolName: part.toolName,
|
|
106
|
+
input: part.input
|
|
107
|
+
}]);
|
|
108
|
+
if (toolCall === void 0) {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
157
111
|
yield { type: "tool_call", toolCall };
|
|
158
112
|
} else if (part.type === "finish") {
|
|
159
|
-
const
|
|
160
|
-
const outputTokens = part.usage?.completionTokens ?? 0;
|
|
161
|
-
const usage = {
|
|
162
|
-
inputTokens,
|
|
163
|
-
outputTokens,
|
|
164
|
-
totalTokens: inputTokens + outputTokens,
|
|
165
|
-
costUsd: computeCost(modelInfo, inputTokens, outputTokens)
|
|
166
|
-
};
|
|
113
|
+
const usage = buildTokenUsage(modelInfo, part.totalUsage);
|
|
167
114
|
yield { type: "usage", usage };
|
|
168
115
|
} else if (part.type === "error") {
|
|
169
116
|
const errMsg = part.error instanceof Error ? part.error.message : String(part.error);
|
|
@@ -178,8 +125,8 @@ var OpenAIAdapter = class {
|
|
|
178
125
|
yield { type: "done" };
|
|
179
126
|
}
|
|
180
127
|
}
|
|
181
|
-
|
|
182
|
-
return Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE);
|
|
128
|
+
countTokens(text, _model) {
|
|
129
|
+
return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));
|
|
183
130
|
}
|
|
184
131
|
getModelInfo(model) {
|
|
185
132
|
const info = SUPPORTED_MODELS[model];
|
|
@@ -206,29 +153,7 @@ var OpenAIAdapter = class {
|
|
|
206
153
|
}
|
|
207
154
|
}
|
|
208
155
|
};
|
|
209
|
-
function extractToolCalls(result) {
|
|
210
|
-
if (result.toolCalls === void 0 || result.toolCalls.length === 0) {
|
|
211
|
-
return [];
|
|
212
|
-
}
|
|
213
|
-
return result.toolCalls.map((tc) => ({
|
|
214
|
-
id: tc.toolCallId,
|
|
215
|
-
name: tc.toolName,
|
|
216
|
-
arguments: tc.args
|
|
217
|
-
}));
|
|
218
|
-
}
|
|
219
|
-
function mapFinishReason(reason) {
|
|
220
|
-
switch (reason) {
|
|
221
|
-
case "stop":
|
|
222
|
-
return "stop";
|
|
223
|
-
case "tool-calls":
|
|
224
|
-
return "tool_calls";
|
|
225
|
-
case "length":
|
|
226
|
-
return "max_tokens";
|
|
227
|
-
default:
|
|
228
|
-
return "stop";
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
156
|
|
|
232
157
|
export { OpenAIAdapter };
|
|
233
|
-
//# sourceMappingURL=chunk-
|
|
234
|
-
//# sourceMappingURL=chunk-
|
|
158
|
+
//# sourceMappingURL=chunk-P5TKZM3T.js.map
|
|
159
|
+
//# sourceMappingURL=chunk-P5TKZM3T.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/openai-adapter.ts"],"names":[],"mappings":"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","file":"chunk-P5TKZM3T.js","sourcesContent":["/**\r\n * OpenAI adapter via Vercel AI SDK per PRD section 7.1\r\n * Supports GPT-5.3 Codex, GPT-5.2, GPT-5.1 Codex series\r\n */\r\n\r\nimport { generateText, streamText } from \"ai\";\r\nimport { createOpenAI } from \"@ai-sdk/openai\";\r\nimport { logger } from \"../utils/logger.js\";\r\nimport {\r\n AuthenticationError,\r\n RateLimitError,\r\n ModelNotFoundError,\r\n} from \"../types/errors.js\";\r\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\r\nimport type { IModelInfo, ProviderName } from \"../types/model.js\";\r\nimport type {\r\n IChatRequest,\r\n IChatResponse,\r\n IChatMessage,\r\n IStreamChunk,\r\n} from \"../types/message.js\";\r\nimport {\r\n buildAiSdkTools,\r\n buildModelMessages,\r\n buildTokenUsage,\r\n extractAiSdkToolCalls,\r\n mapAiSdkFinishReason,\r\n} from \"./ai-sdk-shared.js\";\r\nimport type { IModelProvider, IProviderOptions } from \"./types.js\";\r\n\r\nconst PROVIDER_NAME: ProviderName = \"openai\";\r\n\r\nconst OPENAI_MODELS: readonly string[] = [\r\n \"gpt-5.3-codex\",\r\n \"gpt-5.3-codex-spark\",\r\n \"gpt-5.2-codex\",\r\n \"gpt-5.1-codex-max\",\r\n \"gpt-5.2\",\r\n \"gpt-5.1-codex-mini\",\r\n] as const;\r\n\r\nconst CHARS_PER_TOKEN_ESTIMATE = 4;\r\n\r\nfunction classifyError(error: unknown, model: string): never {\r\n const message = error instanceof Error ? error.message : String(error);\r\n const lower = message.toLowerCase();\r\n\r\n if (lower.includes(\"401\") || lower.includes(\"unauthorized\") || lower.includes(\"invalid api key\")) {\r\n throw new AuthenticationError(PROVIDER_NAME, message);\r\n }\r\n if (lower.includes(\"429\") || lower.includes(\"rate limit\") || lower.includes(\"too many requests\")) {\r\n const match = /(\\d+)\\s*s/i.exec(message);\r\n const retryMs = match?.[1] !== undefined ? parseInt(match[1], 10) * 1000 : 60_000;\r\n throw new RateLimitError(PROVIDER_NAME, retryMs);\r\n }\r\n if (lower.includes(\"model\") && lower.includes(\"not found\")) {\r\n throw new ModelNotFoundError(model);\r\n }\r\n\r\n throw error instanceof Error ? error : new Error(message);\r\n}\r\n\r\nexport class OpenAIAdapter implements IModelProvider {\r\n readonly name = PROVIDER_NAME;\r\n readonly supportedModels = OPENAI_MODELS;\r\n readonly supportsToolCalling = true;\r\n\r\n private readonly openai: ReturnType<typeof createOpenAI>;\r\n private readonly apiKey: string | undefined;\r\n private readonly baseUrl: string | undefined;\r\n\r\n constructor(options?: IProviderOptions) {\r\n this.apiKey = options?.apiKey ?? process.env[\"OPENAI_API_KEY\"];\r\n this.baseUrl = options?.baseUrl;\r\n this.openai = createOpenAI({\r\n ...(this.apiKey !== undefined ? { apiKey: this.apiKey } : {}),\r\n ...(this.baseUrl !== undefined ? { baseURL: this.baseUrl } : {}),\r\n });\r\n }\r\n\r\n async chat(request: IChatRequest): Promise<IChatResponse> {\r\n const modelInfo = this.getModelInfo(request.model);\r\n const messages = buildModelMessages(request.messages);\r\n const tools = buildAiSdkTools(request.tools);\r\n\r\n try {\r\n const result = await generateText({\r\n model: this.openai(request.model),\r\n messages,\r\n ...(request.system !== undefined ? { system: request.system } : {}),\r\n ...(tools !== undefined ? { tools } : {}),\r\n maxOutputTokens: request.maxTokens ?? modelInfo.maxOutputTokens,\r\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\r\n });\r\n\r\n const toolCalls = extractAiSdkToolCalls(result.toolCalls);\r\n const usage = buildTokenUsage(modelInfo, result.usage);\r\n\r\n const responseMessage: IChatMessage = {\r\n id: result.response.id,\r\n role: \"assistant\",\r\n content: result.text,\r\n model: request.model,\r\n provider: PROVIDER_NAME,\r\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\r\n tokenUsage: usage,\r\n createdAt: new Date(),\r\n };\r\n\r\n return {\r\n id: result.response.id,\r\n model: request.model,\r\n provider: PROVIDER_NAME,\r\n message: responseMessage,\r\n usage,\r\n finishReason: mapAiSdkFinishReason(result.finishReason),\r\n };\r\n } catch (error: unknown) {\r\n classifyError(error, request.model);\r\n }\r\n }\r\n\r\n async *stream(request: IChatRequest): AsyncIterable<IStreamChunk> {\r\n const modelInfo = this.getModelInfo(request.model);\r\n const messages = buildModelMessages(request.messages);\r\n const tools = buildAiSdkTools(request.tools);\r\n\r\n try {\r\n const result = streamText({\r\n model: this.openai(request.model),\r\n messages,\r\n ...(request.system !== undefined ? { system: request.system } : {}),\r\n ...(tools !== undefined ? { tools } : {}),\r\n maxOutputTokens: request.maxTokens ?? modelInfo.maxOutputTokens,\r\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\r\n });\r\n\r\n for await (const part of result.fullStream) {\r\n if (part.type === \"text-delta\") {\r\n yield { type: \"text\", content: part.text };\r\n } else if (part.type === \"tool-call\") {\r\n const [toolCall] = extractAiSdkToolCalls([{\r\n toolCallId: part.toolCallId,\r\n toolName: part.toolName,\r\n input: part.input,\r\n }]);\r\n if (toolCall === undefined) {\r\n continue;\r\n }\r\n yield { type: \"tool_call\", toolCall };\r\n } else if (part.type === \"finish\") {\r\n const usage = buildTokenUsage(modelInfo, part.totalUsage);\r\n yield { type: \"usage\", usage };\r\n } else if (part.type === \"error\") {\r\n const errMsg = part.error instanceof Error ? part.error.message : String(part.error);\r\n yield { type: \"error\", error: errMsg };\r\n }\r\n }\r\n\r\n yield { type: \"done\" };\r\n } catch (error: unknown) {\r\n const errMsg = error instanceof Error ? error.message : String(error);\r\n logger.error({ error: errMsg, model: request.model }, \"OpenAI stream error\");\r\n yield { type: \"error\", error: errMsg };\r\n yield { type: \"done\" };\r\n }\r\n }\r\n\r\n countTokens(text: string, _model: string): Promise<number> {\r\n return Promise.resolve(Math.ceil(text.length / CHARS_PER_TOKEN_ESTIMATE));\r\n }\r\n\r\n getModelInfo(model: string): IModelInfo {\r\n const info = SUPPORTED_MODELS[model];\r\n if (info === undefined || info.provider !== PROVIDER_NAME) {\r\n throw new ModelNotFoundError(model);\r\n }\r\n return info;\r\n }\r\n\r\n async listAvailableModels(): Promise<readonly string[]> {\r\n if (!this.apiKey) return [...this.supportedModels];\r\n\r\n try {\r\n const base = this.baseUrl ?? \"https://api.openai.com/v1\";\r\n const response = await fetch(`${base}/models`, {\r\n headers: { Authorization: `Bearer ${this.apiKey}` },\r\n signal: AbortSignal.timeout(5000),\r\n });\r\n if (!response.ok) return [...this.supportedModels];\r\n\r\n const data = (await response.json()) as { data: Array<{ id: string }> };\r\n const chatPrefixes = [\"gpt-\", \"o1\", \"o3\", \"o4\", \"chatgpt-\"];\r\n const models = data.data\r\n .map((m) => m.id)\r\n .filter((id) => chatPrefixes.some((p) => id.startsWith(p)))\r\n .sort();\r\n return models.length > 0 ? models : [...this.supportedModels];\r\n } catch {\r\n return [...this.supportedModels];\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { logger } from './chunk-
|
|
1
|
+
import { ModelNotFoundError } from './chunk-473JN6M5.js';
|
|
2
|
+
import { SUPPORTED_MODELS } from './chunk-62HSGYQD.js';
|
|
3
|
+
import { logger } from './chunk-HEKFAKVH.js';
|
|
4
4
|
|
|
5
5
|
// src/providers/registry.ts
|
|
6
6
|
var ProviderRegistry = class {
|
|
@@ -119,20 +119,21 @@ var ProviderRegistry = class {
|
|
|
119
119
|
return result;
|
|
120
120
|
}
|
|
121
121
|
};
|
|
122
|
-
async function createDefaultRegistry() {
|
|
122
|
+
async function createDefaultRegistry(options = {}) {
|
|
123
123
|
const registry = new ProviderRegistry();
|
|
124
|
-
const { SessionManager } = await import('./session-manager-
|
|
124
|
+
const { SessionManager } = await import('./session-manager-EHD7GWM2.js');
|
|
125
125
|
const session = new SessionManager();
|
|
126
126
|
const { execa } = await import('execa');
|
|
127
|
-
const preferSdk = process.env["AEMEATHCLI_PREFER_SDK"] === "1";
|
|
127
|
+
const preferSdk = options.preferSdk ?? process.env["AEMEATHCLI_PREFER_SDK"] === "1";
|
|
128
128
|
const cliAvailability = /* @__PURE__ */ new Map();
|
|
129
129
|
const hasCli = async (command) => {
|
|
130
130
|
const cached = cliAvailability.get(command);
|
|
131
131
|
if (cached !== void 0) {
|
|
132
132
|
return cached;
|
|
133
133
|
}
|
|
134
|
+
const pathLookupCommand = process.platform === "win32" ? "where" : "which";
|
|
134
135
|
try {
|
|
135
|
-
await execa(
|
|
136
|
+
await execa(pathLookupCommand, [command], { timeout: 3e3 });
|
|
136
137
|
cliAvailability.set(command, true);
|
|
137
138
|
return true;
|
|
138
139
|
} catch {
|
|
@@ -141,14 +142,14 @@ async function createDefaultRegistry() {
|
|
|
141
142
|
}
|
|
142
143
|
};
|
|
143
144
|
const shouldUseNative = async (credential, cliCommand, envKeyName) => {
|
|
145
|
+
const hasApiKey = credential?.method === "api_key" || credential?.method === "env_variable" || process.env[envKeyName] !== void 0;
|
|
146
|
+
if (preferSdk && hasApiKey) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
144
149
|
if (credential?.method === "native_login") {
|
|
145
150
|
return await hasCli(cliCommand);
|
|
146
151
|
}
|
|
147
152
|
if (preferSdk) {
|
|
148
|
-
const hasApiKey = credential?.token !== void 0 || process.env[envKeyName] !== void 0;
|
|
149
|
-
if (hasApiKey) {
|
|
150
|
-
return false;
|
|
151
|
-
}
|
|
152
153
|
return await hasCli(cliCommand);
|
|
153
154
|
}
|
|
154
155
|
return credential === void 0 && await hasCli(cliCommand);
|
|
@@ -157,11 +158,11 @@ async function createDefaultRegistry() {
|
|
|
157
158
|
{
|
|
158
159
|
name: "anthropic",
|
|
159
160
|
load: async () => {
|
|
160
|
-
const { ClaudeAdapter } = await import('./claude-adapter-
|
|
161
|
+
const { ClaudeAdapter } = await import('./claude-adapter-6P4SJH7P.js');
|
|
161
162
|
const credential = await session.getActiveCredential("anthropic").catch(() => void 0);
|
|
162
163
|
const useNative = await shouldUseNative(credential, "claude", "ANTHROPIC_API_KEY");
|
|
163
164
|
if (useNative) {
|
|
164
|
-
const { ClaudeNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-
|
|
165
|
+
const { ClaudeNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-JMZX2C2C.js');
|
|
165
166
|
logNativeAdapterSelection("anthropic");
|
|
166
167
|
return new ClaudeNativeCLIAdapter();
|
|
167
168
|
}
|
|
@@ -173,11 +174,11 @@ async function createDefaultRegistry() {
|
|
|
173
174
|
{
|
|
174
175
|
name: "openai",
|
|
175
176
|
load: async () => {
|
|
176
|
-
const { OpenAIAdapter } = await import('./openai-adapter-
|
|
177
|
+
const { OpenAIAdapter } = await import('./openai-adapter-SHPLK77L.js');
|
|
177
178
|
const credential = await session.getActiveCredential("openai").catch(() => void 0);
|
|
178
179
|
const useNative = await shouldUseNative(credential, "codex", "OPENAI_API_KEY");
|
|
179
180
|
if (useNative) {
|
|
180
|
-
const { CodexNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-
|
|
181
|
+
const { CodexNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-JMZX2C2C.js');
|
|
181
182
|
logNativeAdapterSelection("openai");
|
|
182
183
|
return new CodexNativeCLIAdapter();
|
|
183
184
|
}
|
|
@@ -189,11 +190,11 @@ async function createDefaultRegistry() {
|
|
|
189
190
|
{
|
|
190
191
|
name: "google",
|
|
191
192
|
load: async () => {
|
|
192
|
-
const { GeminiAdapter } = await import('./gemini-adapter-
|
|
193
|
+
const { GeminiAdapter } = await import('./gemini-adapter-MV3U4QFH.js');
|
|
193
194
|
const credential = await session.getActiveCredential("google").catch(() => void 0);
|
|
194
195
|
const useNative = await shouldUseNative(credential, "gemini", "GOOGLE_API_KEY");
|
|
195
196
|
if (useNative) {
|
|
196
|
-
const { GeminiNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-
|
|
197
|
+
const { GeminiNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-JMZX2C2C.js');
|
|
197
198
|
logNativeAdapterSelection("google");
|
|
198
199
|
return new GeminiNativeCLIAdapter();
|
|
199
200
|
}
|
|
@@ -205,11 +206,11 @@ async function createDefaultRegistry() {
|
|
|
205
206
|
{
|
|
206
207
|
name: "kimi",
|
|
207
208
|
load: async () => {
|
|
208
|
-
const { KimiAdapter } = await import('./kimi-adapter-
|
|
209
|
+
const { KimiAdapter } = await import('./kimi-adapter-UODMNX6K.js');
|
|
209
210
|
const credential = await session.getActiveCredential("kimi").catch(() => void 0);
|
|
210
211
|
const useNative = await shouldUseNative(credential, "kimi", "MOONSHOT_API_KEY");
|
|
211
212
|
if (useNative) {
|
|
212
|
-
const { KimiNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-
|
|
213
|
+
const { KimiNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-JMZX2C2C.js');
|
|
213
214
|
logNativeAdapterSelection("kimi");
|
|
214
215
|
return new KimiNativeCLIAdapter();
|
|
215
216
|
}
|
|
@@ -221,7 +222,7 @@ async function createDefaultRegistry() {
|
|
|
221
222
|
];
|
|
222
223
|
const ollamaTask = (async () => {
|
|
223
224
|
try {
|
|
224
|
-
const { OllamaAdapter } = await import('./ollama-adapter-
|
|
225
|
+
const { OllamaAdapter } = await import('./ollama-adapter-GE67BNSS.js');
|
|
225
226
|
const ollama = new OllamaAdapter();
|
|
226
227
|
await ollama.refreshModels();
|
|
227
228
|
registry.register(ollama);
|
|
@@ -242,5 +243,5 @@ async function createDefaultRegistry() {
|
|
|
242
243
|
}
|
|
243
244
|
|
|
244
245
|
export { ProviderRegistry, createDefaultRegistry };
|
|
245
|
-
//# sourceMappingURL=chunk-
|
|
246
|
-
//# sourceMappingURL=chunk-
|
|
246
|
+
//# sourceMappingURL=chunk-P66WDACW.js.map
|
|
247
|
+
//# sourceMappingURL=chunk-P66WDACW.js.map
|