@dexto/core 1.6.11 → 1.6.13
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/events/index.cjs +1 -0
- package/dist/events/index.d.ts +16 -2
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +1 -0
- package/dist/llm/executor/turn-executor.cjs +11 -1
- package/dist/llm/executor/turn-executor.d.ts +3 -1
- package/dist/llm/executor/turn-executor.d.ts.map +1 -1
- package/dist/llm/executor/turn-executor.js +11 -1
- package/dist/llm/index.cjs +16 -0
- package/dist/llm/index.d.ts +2 -0
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +18 -0
- package/dist/llm/providers/codex-app-server.cjs +1391 -0
- package/dist/llm/providers/codex-app-server.d.ts +150 -0
- package/dist/llm/providers/codex-app-server.d.ts.map +1 -0
- package/dist/llm/providers/codex-app-server.js +1367 -0
- package/dist/llm/providers/codex-base-url.cjs +97 -0
- package/dist/llm/providers/codex-base-url.d.ts +9 -0
- package/dist/llm/providers/codex-base-url.d.ts.map +1 -0
- package/dist/llm/providers/codex-base-url.js +70 -0
- package/dist/llm/services/factory.cjs +19 -1
- package/dist/llm/services/factory.d.ts +3 -0
- package/dist/llm/services/factory.d.ts.map +1 -1
- package/dist/llm/services/factory.js +21 -1
- package/dist/session/chat-session.cjs +17 -0
- package/dist/session/chat-session.d.ts +1 -0
- package/dist/session/chat-session.d.ts.map +1 -1
- package/dist/session/chat-session.js +17 -0
- package/dist/session/session-manager.cjs +27 -1
- package/dist/session/session-manager.d.ts +6 -0
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +27 -1
- package/dist/utils/result.cjs +3 -2
- package/dist/utils/result.d.ts.map +1 -1
- package/dist/utils/result.js +3 -2
- package/package.json +1 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var codex_base_url_exports = {};
|
|
20
|
+
__export(codex_base_url_exports, {
|
|
21
|
+
createCodexBaseURL: () => createCodexBaseURL,
|
|
22
|
+
getCodexAuthModeLabel: () => getCodexAuthModeLabel,
|
|
23
|
+
getCodexProviderDisplayName: () => getCodexProviderDisplayName,
|
|
24
|
+
isCodexBaseURL: () => isCodexBaseURL,
|
|
25
|
+
parseCodexBaseURL: () => parseCodexBaseURL
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(codex_base_url_exports);
|
|
28
|
+
const CODEX_BASE_URL_PROTOCOL = "codex:";
|
|
29
|
+
const CODEX_AUTH_MODES = ["auto", "apikey", "chatgpt"];
|
|
30
|
+
function normalizeCodexAuthMode(value) {
|
|
31
|
+
if (value === void 0) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const normalized = value.trim().toLowerCase();
|
|
35
|
+
if (normalized.length === 0) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
if (CODEX_AUTH_MODES.includes(normalized)) {
|
|
39
|
+
return normalized;
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
function createCodexBaseURL(mode = "chatgpt") {
|
|
44
|
+
return `codex://${mode}`;
|
|
45
|
+
}
|
|
46
|
+
function parseCodexBaseURL(value) {
|
|
47
|
+
if (!value) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
const parsed = new URL(value);
|
|
52
|
+
if (parsed.protocol !== CODEX_BASE_URL_PROTOCOL) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
const hostValue = parsed.host;
|
|
56
|
+
const pathValue = parsed.pathname.replace(/^\/+/, "");
|
|
57
|
+
const hostMode = normalizeCodexAuthMode(hostValue);
|
|
58
|
+
const pathMode = normalizeCodexAuthMode(pathValue);
|
|
59
|
+
if (hostValue.length > 0 && pathValue.length > 0) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
const authMode = hostMode ?? pathMode ?? (hostValue.length === 0 && pathValue.length === 0 ? "auto" : null);
|
|
63
|
+
if (!authMode) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
return { authMode };
|
|
67
|
+
} catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function isCodexBaseURL(value) {
|
|
72
|
+
return parseCodexBaseURL(value) !== null;
|
|
73
|
+
}
|
|
74
|
+
function getCodexAuthModeLabel(mode) {
|
|
75
|
+
switch (mode) {
|
|
76
|
+
case "chatgpt":
|
|
77
|
+
return "ChatGPT";
|
|
78
|
+
case "apikey":
|
|
79
|
+
return "API key";
|
|
80
|
+
default:
|
|
81
|
+
return "Auto";
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function getCodexProviderDisplayName(mode = "auto") {
|
|
85
|
+
if (mode === "auto" || mode === "chatgpt") {
|
|
86
|
+
return "ChatGPT Login";
|
|
87
|
+
}
|
|
88
|
+
return `ChatGPT Login (${getCodexAuthModeLabel(mode)})`;
|
|
89
|
+
}
|
|
90
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
91
|
+
0 && (module.exports = {
|
|
92
|
+
createCodexBaseURL,
|
|
93
|
+
getCodexAuthModeLabel,
|
|
94
|
+
getCodexProviderDisplayName,
|
|
95
|
+
isCodexBaseURL,
|
|
96
|
+
parseCodexBaseURL
|
|
97
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type CodexAuthMode = 'auto' | 'apikey' | 'chatgpt';
|
|
2
|
+
export declare function createCodexBaseURL(mode?: CodexAuthMode): string;
|
|
3
|
+
export declare function parseCodexBaseURL(value: string | undefined): {
|
|
4
|
+
authMode: CodexAuthMode;
|
|
5
|
+
} | null;
|
|
6
|
+
export declare function isCodexBaseURL(value: string | undefined): boolean;
|
|
7
|
+
export declare function getCodexAuthModeLabel(mode: CodexAuthMode): string;
|
|
8
|
+
export declare function getCodexProviderDisplayName(mode?: CodexAuthMode): string;
|
|
9
|
+
//# sourceMappingURL=codex-base-url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-base-url.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/codex-base-url.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAsB1D,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,aAAyB,GAAG,MAAM,CAE1E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,QAAQ,EAAE,aAAa,CAAA;CAAE,GAAG,IAAI,CAiC/F;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEjE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CASjE;AAED,wBAAgB,2BAA2B,CAAC,IAAI,GAAE,aAAsB,GAAG,MAAM,CAMhF"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import "../../chunk-PTJYTZNU.js";
|
|
2
|
+
const CODEX_BASE_URL_PROTOCOL = "codex:";
|
|
3
|
+
const CODEX_AUTH_MODES = ["auto", "apikey", "chatgpt"];
|
|
4
|
+
function normalizeCodexAuthMode(value) {
|
|
5
|
+
if (value === void 0) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
const normalized = value.trim().toLowerCase();
|
|
9
|
+
if (normalized.length === 0) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
if (CODEX_AUTH_MODES.includes(normalized)) {
|
|
13
|
+
return normalized;
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
function createCodexBaseURL(mode = "chatgpt") {
|
|
18
|
+
return `codex://${mode}`;
|
|
19
|
+
}
|
|
20
|
+
function parseCodexBaseURL(value) {
|
|
21
|
+
if (!value) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const parsed = new URL(value);
|
|
26
|
+
if (parsed.protocol !== CODEX_BASE_URL_PROTOCOL) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const hostValue = parsed.host;
|
|
30
|
+
const pathValue = parsed.pathname.replace(/^\/+/, "");
|
|
31
|
+
const hostMode = normalizeCodexAuthMode(hostValue);
|
|
32
|
+
const pathMode = normalizeCodexAuthMode(pathValue);
|
|
33
|
+
if (hostValue.length > 0 && pathValue.length > 0) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const authMode = hostMode ?? pathMode ?? (hostValue.length === 0 && pathValue.length === 0 ? "auto" : null);
|
|
37
|
+
if (!authMode) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
return { authMode };
|
|
41
|
+
} catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function isCodexBaseURL(value) {
|
|
46
|
+
return parseCodexBaseURL(value) !== null;
|
|
47
|
+
}
|
|
48
|
+
function getCodexAuthModeLabel(mode) {
|
|
49
|
+
switch (mode) {
|
|
50
|
+
case "chatgpt":
|
|
51
|
+
return "ChatGPT";
|
|
52
|
+
case "apikey":
|
|
53
|
+
return "API key";
|
|
54
|
+
default:
|
|
55
|
+
return "Auto";
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function getCodexProviderDisplayName(mode = "auto") {
|
|
59
|
+
if (mode === "auto" || mode === "chatgpt") {
|
|
60
|
+
return "ChatGPT Login";
|
|
61
|
+
}
|
|
62
|
+
return `ChatGPT Login (${getCodexAuthModeLabel(mode)})`;
|
|
63
|
+
}
|
|
64
|
+
export {
|
|
65
|
+
createCodexBaseURL,
|
|
66
|
+
getCodexAuthModeLabel,
|
|
67
|
+
getCodexProviderDisplayName,
|
|
68
|
+
isCodexBaseURL,
|
|
69
|
+
parseCodexBaseURL
|
|
70
|
+
};
|
|
@@ -38,6 +38,8 @@ var import_cohere = require("@ai-sdk/cohere");
|
|
|
38
38
|
var import_ai_sdk_adapter = require("../providers/local/ai-sdk-adapter.js");
|
|
39
39
|
var import_registry = require("../registry/index.js");
|
|
40
40
|
var import_api_key_resolver = require("../../utils/api-key-resolver.js");
|
|
41
|
+
var import_codex_app_server = require("../providers/codex-app-server.js");
|
|
42
|
+
var import_codex_base_url = require("../providers/codex-base-url.js");
|
|
41
43
|
var import_anthropic_betas = require("../reasoning/anthropic-betas.js");
|
|
42
44
|
var import_anthropic_thinking = require("../reasoning/anthropic-thinking.js");
|
|
43
45
|
function isLanguageModel(value) {
|
|
@@ -66,6 +68,13 @@ function createVercelModel(llmConfig, context) {
|
|
|
66
68
|
if (!compatibleBaseURL) {
|
|
67
69
|
throw import_errors.LLMError.baseUrlMissing("openai-compatible");
|
|
68
70
|
}
|
|
71
|
+
if ((0, import_codex_base_url.isCodexBaseURL)(compatibleBaseURL)) {
|
|
72
|
+
return (0, import_codex_app_server.createCodexLanguageModel)({
|
|
73
|
+
modelId: model,
|
|
74
|
+
baseURL: compatibleBaseURL,
|
|
75
|
+
...context?.onCodexRateLimitStatus ? { onRateLimitStatus: context.onCodexRateLimitStatus } : {}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
69
78
|
const provider2 = (0, import_openai_compatible.createOpenAICompatible)({
|
|
70
79
|
name: "openaiCompatible",
|
|
71
80
|
baseURL: compatibleBaseURL,
|
|
@@ -203,7 +212,16 @@ function createVercelModel(llmConfig, context) {
|
|
|
203
212
|
}
|
|
204
213
|
}
|
|
205
214
|
function createLLMService(config, toolManager, systemPromptManager, historyProvider, sessionEventBus, sessionId, resourceManager, logger, compactionStrategy) {
|
|
206
|
-
const model = createVercelModel(config, {
|
|
215
|
+
const model = createVercelModel(config, {
|
|
216
|
+
sessionId,
|
|
217
|
+
onCodexRateLimitStatus: (snapshot) => {
|
|
218
|
+
sessionEventBus.emit("llm:rate-limit-status", {
|
|
219
|
+
provider: config.provider,
|
|
220
|
+
model: config.model,
|
|
221
|
+
snapshot
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
});
|
|
207
225
|
return new import_vercel.VercelLLMService(
|
|
208
226
|
toolManager,
|
|
209
227
|
model,
|
|
@@ -6,6 +6,7 @@ import { SessionEventBus } from '../../events/index.js';
|
|
|
6
6
|
import type { ConversationHistoryProvider } from '../../session/history/types.js';
|
|
7
7
|
import type { SystemPromptManager } from '../../systemPrompt/manager.js';
|
|
8
8
|
import type { Logger } from '../../logger/v2/types.js';
|
|
9
|
+
import { type CodexRateLimitSnapshot } from '../providers/codex-app-server.js';
|
|
9
10
|
/**
|
|
10
11
|
* Context for model creation, including session info for usage tracking.
|
|
11
12
|
*/
|
|
@@ -14,6 +15,8 @@ export interface DextoProviderContext {
|
|
|
14
15
|
sessionId?: string;
|
|
15
16
|
/** Client source for usage attribution (cli, web, sdk) */
|
|
16
17
|
clientSource?: 'cli' | 'web' | 'sdk';
|
|
18
|
+
/** Optional callback for ChatGPT Login rate-limit status updates from Codex. */
|
|
19
|
+
onCodexRateLimitStatus?: (snapshot: CodexRateLimitSnapshot) => void;
|
|
17
20
|
}
|
|
18
21
|
/**
|
|
19
22
|
* Create a Vercel AI SDK LanguageModel from config.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/llm/services/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAYnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/llm/services/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAYnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAEH,KAAK,sBAAsB,EAC9B,MAAM,kCAAkC,CAAC;AAyB1C;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IACrC,gFAAgF;IAChF,sBAAsB,CAAC,EAAE,CAAC,QAAQ,EAAE,sBAAsB,KAAK,IAAI,CAAC;CACvE;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC7B,SAAS,EAAE,kBAAkB,EAC7B,OAAO,CAAC,EAAE,oBAAoB,GAC/B,aAAa,CAwOf;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAC5B,MAAM,EAAE,kBAAkB,EAC1B,WAAW,EAAE,WAAW,EACxB,mBAAmB,EAAE,mBAAmB,EACxC,eAAe,EAAE,2BAA2B,EAC5C,eAAe,EAAE,eAAe,EAChC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,OAAO,0BAA0B,EAAE,eAAe,EACnE,MAAM,EAAE,MAAM,EACd,kBAAkB,CAAC,EAAE,OAAO,mCAAmC,EAAE,kBAAkB,GAAG,IAAI,GAC3F,gBAAgB,CAwBlB"}
|
|
@@ -15,6 +15,10 @@ import { createCohere } from "@ai-sdk/cohere";
|
|
|
15
15
|
import { createLocalLanguageModel } from "../providers/local/ai-sdk-adapter.js";
|
|
16
16
|
import { requiresApiKey } from "../registry/index.js";
|
|
17
17
|
import { getPrimaryApiKeyEnvVar, resolveApiKeyForProvider } from "../../utils/api-key-resolver.js";
|
|
18
|
+
import {
|
|
19
|
+
createCodexLanguageModel
|
|
20
|
+
} from "../providers/codex-app-server.js";
|
|
21
|
+
import { isCodexBaseURL } from "../providers/codex-base-url.js";
|
|
18
22
|
import {
|
|
19
23
|
ANTHROPIC_BETA_HEADER,
|
|
20
24
|
ANTHROPIC_INTERLEAVED_THINKING_BETA
|
|
@@ -46,6 +50,13 @@ function createVercelModel(llmConfig, context) {
|
|
|
46
50
|
if (!compatibleBaseURL) {
|
|
47
51
|
throw LLMError.baseUrlMissing("openai-compatible");
|
|
48
52
|
}
|
|
53
|
+
if (isCodexBaseURL(compatibleBaseURL)) {
|
|
54
|
+
return createCodexLanguageModel({
|
|
55
|
+
modelId: model,
|
|
56
|
+
baseURL: compatibleBaseURL,
|
|
57
|
+
...context?.onCodexRateLimitStatus ? { onRateLimitStatus: context.onCodexRateLimitStatus } : {}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
49
60
|
const provider2 = createOpenAICompatible({
|
|
50
61
|
name: "openaiCompatible",
|
|
51
62
|
baseURL: compatibleBaseURL,
|
|
@@ -183,7 +194,16 @@ function createVercelModel(llmConfig, context) {
|
|
|
183
194
|
}
|
|
184
195
|
}
|
|
185
196
|
function createLLMService(config, toolManager, systemPromptManager, historyProvider, sessionEventBus, sessionId, resourceManager, logger, compactionStrategy) {
|
|
186
|
-
const model = createVercelModel(config, {
|
|
197
|
+
const model = createVercelModel(config, {
|
|
198
|
+
sessionId,
|
|
199
|
+
onCodexRateLimitStatus: (snapshot) => {
|
|
200
|
+
sessionEventBus.emit("llm:rate-limit-status", {
|
|
201
|
+
provider: config.provider,
|
|
202
|
+
model: config.model,
|
|
203
|
+
snapshot
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
});
|
|
187
207
|
return new VercelLLMService(
|
|
188
208
|
toolManager,
|
|
189
209
|
model,
|
|
@@ -28,6 +28,7 @@ var import_types = require("../logger/v2/types.js");
|
|
|
28
28
|
var import_errors = require("../errors/index.js");
|
|
29
29
|
var import_error_codes = require("../hooks/error-codes.js");
|
|
30
30
|
var import_registry = require("../llm/registry/index.js");
|
|
31
|
+
var import_codex_base_url = require("../llm/providers/codex-base-url.js");
|
|
31
32
|
class ChatSession {
|
|
32
33
|
/**
|
|
33
34
|
* Creates a new ChatSession instance.
|
|
@@ -87,6 +88,12 @@ class ChatSession {
|
|
|
87
88
|
* Calling cancel() aborts the in-flight LLM request and tool execution checks.
|
|
88
89
|
*/
|
|
89
90
|
currentRunController = null;
|
|
91
|
+
isMeaningfulTokenUsage(tokenUsage) {
|
|
92
|
+
if (!tokenUsage) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
return (tokenUsage.inputTokens ?? 0) > 0 || (tokenUsage.outputTokens ?? 0) > 0 || (tokenUsage.reasoningTokens ?? 0) > 0 || (tokenUsage.cacheReadTokens ?? 0) > 0 || (tokenUsage.cacheWriteTokens ?? 0) > 0 || (tokenUsage.totalTokens ?? 0) > 0;
|
|
96
|
+
}
|
|
90
97
|
logger;
|
|
91
98
|
/**
|
|
92
99
|
* Initialize the session services asynchronously.
|
|
@@ -125,6 +132,16 @@ class ChatSession {
|
|
|
125
132
|
this.tokenAccumulatorListener = (payload) => {
|
|
126
133
|
if (payload.tokenUsage) {
|
|
127
134
|
const llmConfig = this.services.stateManager.getLLMConfig(this.id);
|
|
135
|
+
const isChatGPTLogin = llmConfig.provider === "openai-compatible" && (0, import_codex_base_url.parseCodexBaseURL)(llmConfig.baseURL)?.authMode === "chatgpt";
|
|
136
|
+
const hasMeaningfulUsage = this.isMeaningfulTokenUsage(payload.tokenUsage);
|
|
137
|
+
if (isChatGPTLogin && !hasMeaningfulUsage) {
|
|
138
|
+
this.services.sessionManager.markUntrackedChatGPTLoginUsage(this.id).catch((err) => {
|
|
139
|
+
this.logger.warn(
|
|
140
|
+
`Failed to mark ChatGPT Login usage as untracked: ${err instanceof Error ? err.message : String(err)}`
|
|
141
|
+
);
|
|
142
|
+
});
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
128
145
|
const modelInfo = {
|
|
129
146
|
provider: payload.provider ?? llmConfig.provider,
|
|
130
147
|
model: payload.model ?? llmConfig.model
|
|
@@ -98,6 +98,7 @@ export declare class ChatSession {
|
|
|
98
98
|
* Calling cancel() aborts the in-flight LLM request and tool execution checks.
|
|
99
99
|
*/
|
|
100
100
|
private currentRunController;
|
|
101
|
+
private isMeaningfulTokenUsage;
|
|
101
102
|
readonly logger: Logger;
|
|
102
103
|
/**
|
|
103
104
|
* Creates a new ChatSession instance.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-session.d.ts","sourceRoot":"","sources":["../../src/session/chat-session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EACH,eAAe,EACf,aAAa,EAIhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAIpD,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,qBAAqB,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-session.d.ts","sourceRoot":"","sources":["../../src/session/chat-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import { DextoLogComponent } from "../logger/v2/types.js";
|
|
|
9
9
|
import { DextoRuntimeError, ErrorScope, ErrorType } from "../errors/index.js";
|
|
10
10
|
import { HookErrorCode } from "../hooks/error-codes.js";
|
|
11
11
|
import { getModelPricing, calculateCost } from "../llm/registry/index.js";
|
|
12
|
+
import { parseCodexBaseURL } from "../llm/providers/codex-base-url.js";
|
|
12
13
|
class ChatSession {
|
|
13
14
|
/**
|
|
14
15
|
* Creates a new ChatSession instance.
|
|
@@ -68,6 +69,12 @@ class ChatSession {
|
|
|
68
69
|
* Calling cancel() aborts the in-flight LLM request and tool execution checks.
|
|
69
70
|
*/
|
|
70
71
|
currentRunController = null;
|
|
72
|
+
isMeaningfulTokenUsage(tokenUsage) {
|
|
73
|
+
if (!tokenUsage) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
return (tokenUsage.inputTokens ?? 0) > 0 || (tokenUsage.outputTokens ?? 0) > 0 || (tokenUsage.reasoningTokens ?? 0) > 0 || (tokenUsage.cacheReadTokens ?? 0) > 0 || (tokenUsage.cacheWriteTokens ?? 0) > 0 || (tokenUsage.totalTokens ?? 0) > 0;
|
|
77
|
+
}
|
|
71
78
|
logger;
|
|
72
79
|
/**
|
|
73
80
|
* Initialize the session services asynchronously.
|
|
@@ -106,6 +113,16 @@ class ChatSession {
|
|
|
106
113
|
this.tokenAccumulatorListener = (payload) => {
|
|
107
114
|
if (payload.tokenUsage) {
|
|
108
115
|
const llmConfig = this.services.stateManager.getLLMConfig(this.id);
|
|
116
|
+
const isChatGPTLogin = llmConfig.provider === "openai-compatible" && parseCodexBaseURL(llmConfig.baseURL)?.authMode === "chatgpt";
|
|
117
|
+
const hasMeaningfulUsage = this.isMeaningfulTokenUsage(payload.tokenUsage);
|
|
118
|
+
if (isChatGPTLogin && !hasMeaningfulUsage) {
|
|
119
|
+
this.services.sessionManager.markUntrackedChatGPTLoginUsage(this.id).catch((err) => {
|
|
120
|
+
this.logger.warn(
|
|
121
|
+
`Failed to mark ChatGPT Login usage as untracked: ${err instanceof Error ? err.message : String(err)}`
|
|
122
|
+
);
|
|
123
|
+
});
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
109
126
|
const modelInfo = {
|
|
110
127
|
provider: payload.provider ?? llmConfig.provider,
|
|
111
128
|
model: payload.model ?? llmConfig.model
|
|
@@ -504,9 +504,35 @@ class SessionManager {
|
|
|
504
504
|
...sessionData.workspaceId && { workspaceId: sessionData.workspaceId },
|
|
505
505
|
...sessionData.parentSessionId !== void 0 && {
|
|
506
506
|
parentSessionId: sessionData.parentSessionId
|
|
507
|
-
}
|
|
507
|
+
},
|
|
508
|
+
...sessionData.usageTracking && { usageTracking: sessionData.usageTracking }
|
|
508
509
|
};
|
|
509
510
|
}
|
|
511
|
+
async markUntrackedChatGPTLoginUsage(sessionId) {
|
|
512
|
+
await this.ensureInitialized();
|
|
513
|
+
const sessionKey = `session:${sessionId}`;
|
|
514
|
+
const previousLock = this.tokenUsageLocks.get(sessionKey) ?? Promise.resolve();
|
|
515
|
+
const currentLock = previousLock.then(async () => {
|
|
516
|
+
const sessionData = await this.services.storageManager.getDatabase().get(sessionKey);
|
|
517
|
+
if (!sessionData || sessionData.usageTracking?.hasUntrackedChatGPTLoginUsage) {
|
|
518
|
+
return;
|
|
519
|
+
}
|
|
520
|
+
sessionData.usageTracking = {
|
|
521
|
+
...sessionData.usageTracking ?? {},
|
|
522
|
+
hasUntrackedChatGPTLoginUsage: true
|
|
523
|
+
};
|
|
524
|
+
await this.services.storageManager.getDatabase().set(sessionKey, sessionData);
|
|
525
|
+
await this.services.storageManager.getCache().set(sessionKey, sessionData, this.sessionTTL / 1e3);
|
|
526
|
+
});
|
|
527
|
+
this.tokenUsageLocks.set(sessionKey, currentLock);
|
|
528
|
+
try {
|
|
529
|
+
await currentLock;
|
|
530
|
+
} finally {
|
|
531
|
+
if (this.tokenUsageLocks.get(sessionKey) === currentLock) {
|
|
532
|
+
this.tokenUsageLocks.delete(sessionKey);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
510
536
|
/**
|
|
511
537
|
* Get the global session manager configuration.
|
|
512
538
|
*/
|
|
@@ -19,6 +19,9 @@ export type SessionLoggerFactory = (options: {
|
|
|
19
19
|
* All fields required since we track cumulative totals (defaulting to 0).
|
|
20
20
|
*/
|
|
21
21
|
export type SessionTokenUsage = Required<TokenUsage>;
|
|
22
|
+
export interface SessionUsageTracking {
|
|
23
|
+
hasUntrackedChatGPTLoginUsage?: boolean;
|
|
24
|
+
}
|
|
22
25
|
/**
|
|
23
26
|
* Per-model statistics for tracking usage across multiple models within a session.
|
|
24
27
|
*/
|
|
@@ -41,6 +44,7 @@ export interface SessionMetadata {
|
|
|
41
44
|
modelStats?: ModelStatistics[];
|
|
42
45
|
workspaceId?: string;
|
|
43
46
|
parentSessionId?: string;
|
|
47
|
+
usageTracking?: SessionUsageTracking;
|
|
44
48
|
}
|
|
45
49
|
export interface SessionManagerConfig {
|
|
46
50
|
maxSessions?: number;
|
|
@@ -61,6 +65,7 @@ export interface SessionData {
|
|
|
61
65
|
modelStats?: ModelStatistics[];
|
|
62
66
|
workspaceId?: string;
|
|
63
67
|
parentSessionId?: string;
|
|
68
|
+
usageTracking?: SessionUsageTracking;
|
|
64
69
|
/** Persisted LLM config override for this session */
|
|
65
70
|
llmOverride?: PersistedLLMConfig;
|
|
66
71
|
}
|
|
@@ -191,6 +196,7 @@ export declare class SessionManager {
|
|
|
191
196
|
* @returns Session metadata if found, undefined otherwise
|
|
192
197
|
*/
|
|
193
198
|
getSessionMetadata(sessionId: string): Promise<SessionMetadata | undefined>;
|
|
199
|
+
markUntrackedChatGPTLoginUsage(sessionId: string): Promise<void>;
|
|
194
200
|
/**
|
|
195
201
|
* Get the global session manager configuration.
|
|
196
202
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACrB,KAAK,MAAM,CAAC;AAYb;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -472,9 +472,35 @@ class SessionManager {
|
|
|
472
472
|
...sessionData.workspaceId && { workspaceId: sessionData.workspaceId },
|
|
473
473
|
...sessionData.parentSessionId !== void 0 && {
|
|
474
474
|
parentSessionId: sessionData.parentSessionId
|
|
475
|
-
}
|
|
475
|
+
},
|
|
476
|
+
...sessionData.usageTracking && { usageTracking: sessionData.usageTracking }
|
|
476
477
|
};
|
|
477
478
|
}
|
|
479
|
+
async markUntrackedChatGPTLoginUsage(sessionId) {
|
|
480
|
+
await this.ensureInitialized();
|
|
481
|
+
const sessionKey = `session:${sessionId}`;
|
|
482
|
+
const previousLock = this.tokenUsageLocks.get(sessionKey) ?? Promise.resolve();
|
|
483
|
+
const currentLock = previousLock.then(async () => {
|
|
484
|
+
const sessionData = await this.services.storageManager.getDatabase().get(sessionKey);
|
|
485
|
+
if (!sessionData || sessionData.usageTracking?.hasUntrackedChatGPTLoginUsage) {
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
488
|
+
sessionData.usageTracking = {
|
|
489
|
+
...sessionData.usageTracking ?? {},
|
|
490
|
+
hasUntrackedChatGPTLoginUsage: true
|
|
491
|
+
};
|
|
492
|
+
await this.services.storageManager.getDatabase().set(sessionKey, sessionData);
|
|
493
|
+
await this.services.storageManager.getCache().set(sessionKey, sessionData, this.sessionTTL / 1e3);
|
|
494
|
+
});
|
|
495
|
+
this.tokenUsageLocks.set(sessionKey, currentLock);
|
|
496
|
+
try {
|
|
497
|
+
await currentLock;
|
|
498
|
+
} finally {
|
|
499
|
+
if (this.tokenUsageLocks.get(sessionKey) === currentLock) {
|
|
500
|
+
this.tokenUsageLocks.delete(sessionKey);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
478
504
|
/**
|
|
479
505
|
* Get the global session manager configuration.
|
|
480
506
|
*/
|
package/dist/utils/result.cjs
CHANGED
|
@@ -33,10 +33,11 @@ module.exports = __toCommonJS(result_exports);
|
|
|
33
33
|
var import_zod = require("zod");
|
|
34
34
|
var import_types = require("../errors/types.js");
|
|
35
35
|
const NonEmptyTrimmed = import_zod.z.string().transform((s) => s.trim()).refine((s) => s.length > 0, { message: "Required" });
|
|
36
|
+
const ALLOWED_URL_PROTOCOLS = /* @__PURE__ */ new Set(["http:", "https:", "codex:"]);
|
|
36
37
|
function isValidUrl(s) {
|
|
37
38
|
try {
|
|
38
39
|
const u = new URL(s);
|
|
39
|
-
return
|
|
40
|
+
return ALLOWED_URL_PROTOCOLS.has(u.protocol);
|
|
40
41
|
} catch {
|
|
41
42
|
return false;
|
|
42
43
|
}
|
|
@@ -58,7 +59,7 @@ const RequiredEnvURL = (env) => EnvExpandedString(env).refine(
|
|
|
58
59
|
(s) => {
|
|
59
60
|
try {
|
|
60
61
|
const u = new URL(s);
|
|
61
|
-
return
|
|
62
|
+
return ALLOWED_URL_PROTOCOLS.has(u.protocol);
|
|
62
63
|
} catch {
|
|
63
64
|
return false;
|
|
64
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/utils/result.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,KAAK,QAAQ,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,KAAK,EAAkB,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAGhE,4CAA4C;AAC5C,eAAO,MAAM,eAAe,yEAG6B,CAAC;
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/utils/result.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,KAAK,QAAQ,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,KAAK,EAAkB,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAGhE,4CAA4C;AAC5C,eAAO,MAAM,eAAe,yEAG6B,CAAC;AAc1D,eAAO,MAAM,WAAW,kIAKT,CAAC;AAGhB,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,8CAUpE,CAAC;AAGP,eAAO,MAAM,yBAAyB,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,4EAG5E,CAAC;AAGP,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,4EAWlE,CAAC;AAEN;;;;;GAKG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,IAC3B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;CAAE,GACzC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;CAAE,CAAC;AAExC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,EAAE,GAAI,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,MAAM,CAAC,EAAE,SAAQ,KAAK,CAAC,CAAC,CAAC,EAAO,KAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAI/E,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,IAAI,GAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,KAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAG3E,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,WAE9C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE;;;EAKhD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,OAAO,EACnC,GAAG,EAAE,QAAQ,EACb,QAAQ,GAAE,OAAO,GAAG,SAAmB,GACxC,KAAK,CAAC,CAAC,CAAC,EAAE,CA8CZ"}
|
package/dist/utils/result.js
CHANGED
|
@@ -2,10 +2,11 @@ import "../chunk-PTJYTZNU.js";
|
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { ErrorScope, ErrorType } from "../errors/types.js";
|
|
4
4
|
const NonEmptyTrimmed = z.string().transform((s) => s.trim()).refine((s) => s.length > 0, { message: "Required" });
|
|
5
|
+
const ALLOWED_URL_PROTOCOLS = /* @__PURE__ */ new Set(["http:", "https:", "codex:"]);
|
|
5
6
|
function isValidUrl(s) {
|
|
6
7
|
try {
|
|
7
8
|
const u = new URL(s);
|
|
8
|
-
return
|
|
9
|
+
return ALLOWED_URL_PROTOCOLS.has(u.protocol);
|
|
9
10
|
} catch {
|
|
10
11
|
return false;
|
|
11
12
|
}
|
|
@@ -27,7 +28,7 @@ const RequiredEnvURL = (env) => EnvExpandedString(env).refine(
|
|
|
27
28
|
(s) => {
|
|
28
29
|
try {
|
|
29
30
|
const u = new URL(s);
|
|
30
|
-
return
|
|
31
|
+
return ALLOWED_URL_PROTOCOLS.has(u.protocol);
|
|
31
32
|
} catch {
|
|
32
33
|
return false;
|
|
33
34
|
}
|