@dexto/core 1.6.12 → 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.
Files changed (36) hide show
  1. package/dist/events/index.cjs +1 -0
  2. package/dist/events/index.d.ts +16 -2
  3. package/dist/events/index.d.ts.map +1 -1
  4. package/dist/events/index.js +1 -0
  5. package/dist/llm/executor/turn-executor.cjs +11 -1
  6. package/dist/llm/executor/turn-executor.d.ts +3 -1
  7. package/dist/llm/executor/turn-executor.d.ts.map +1 -1
  8. package/dist/llm/executor/turn-executor.js +11 -1
  9. package/dist/llm/index.cjs +16 -0
  10. package/dist/llm/index.d.ts +2 -0
  11. package/dist/llm/index.d.ts.map +1 -1
  12. package/dist/llm/index.js +18 -0
  13. package/dist/llm/providers/codex-app-server.cjs +1391 -0
  14. package/dist/llm/providers/codex-app-server.d.ts +150 -0
  15. package/dist/llm/providers/codex-app-server.d.ts.map +1 -0
  16. package/dist/llm/providers/codex-app-server.js +1367 -0
  17. package/dist/llm/providers/codex-base-url.cjs +97 -0
  18. package/dist/llm/providers/codex-base-url.d.ts +9 -0
  19. package/dist/llm/providers/codex-base-url.d.ts.map +1 -0
  20. package/dist/llm/providers/codex-base-url.js +70 -0
  21. package/dist/llm/services/factory.cjs +19 -1
  22. package/dist/llm/services/factory.d.ts +3 -0
  23. package/dist/llm/services/factory.d.ts.map +1 -1
  24. package/dist/llm/services/factory.js +21 -1
  25. package/dist/session/chat-session.cjs +17 -0
  26. package/dist/session/chat-session.d.ts +1 -0
  27. package/dist/session/chat-session.d.ts.map +1 -1
  28. package/dist/session/chat-session.js +17 -0
  29. package/dist/session/session-manager.cjs +27 -1
  30. package/dist/session/session-manager.d.ts +6 -0
  31. package/dist/session/session-manager.d.ts.map +1 -1
  32. package/dist/session/session-manager.js +27 -1
  33. package/dist/utils/result.cjs +3 -2
  34. package/dist/utils/result.d.ts.map +1 -1
  35. package/dist/utils/result.js +3 -2
  36. 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, { sessionId });
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;AA0BvD;;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;CACxC;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC7B,SAAS,EAAE,kBAAkB,EAC7B,OAAO,CAAC,EAAE,oBAAoB,GAC/B,aAAa,CA6Nf;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,CAelB"}
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, { sessionId });
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":"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"}
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":"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"}
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
  */
@@ -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 u.protocol === "http:" || u.protocol === "https:";
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 u.protocol === "http:" || u.protocol === "https:";
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;AAa1D,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"}
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"}
@@ -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 u.protocol === "http:" || u.protocol === "https:";
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 u.protocol === "http:" || u.protocol === "https:";
31
+ return ALLOWED_URL_PROTOCOLS.has(u.protocol);
31
32
  } catch {
32
33
  return false;
33
34
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dexto/core",
3
- "version": "1.6.12",
3
+ "version": "1.6.13",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",