webaiapi 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +184 -2
  3. package/bin/webapi.mjs +45 -0
  4. package/dist/browser/auth-capture.d.ts +110 -0
  5. package/dist/browser/auth-capture.d.ts.map +1 -0
  6. package/dist/browser/auth-capture.js +487 -0
  7. package/dist/browser/auth-capture.js.map +1 -0
  8. package/dist/browser/credentials.d.ts +102 -0
  9. package/dist/browser/credentials.d.ts.map +1 -0
  10. package/dist/browser/credentials.js +209 -0
  11. package/dist/browser/credentials.js.map +1 -0
  12. package/dist/browser/js-eval.d.ts +44 -0
  13. package/dist/browser/js-eval.d.ts.map +1 -0
  14. package/dist/browser/js-eval.js +20 -0
  15. package/dist/browser/js-eval.js.map +1 -0
  16. package/dist/browser/login-flow.d.ts +171 -0
  17. package/dist/browser/login-flow.d.ts.map +1 -0
  18. package/dist/browser/login-flow.js +606 -0
  19. package/dist/browser/login-flow.js.map +1 -0
  20. package/dist/browser/manager.d.ts +144 -0
  21. package/dist/browser/manager.d.ts.map +1 -0
  22. package/dist/browser/manager.js +586 -0
  23. package/dist/browser/manager.js.map +1 -0
  24. package/dist/browser/platforms.d.ts +96 -0
  25. package/dist/browser/platforms.d.ts.map +1 -0
  26. package/dist/browser/platforms.js +288 -0
  27. package/dist/browser/platforms.js.map +1 -0
  28. package/dist/browser/sse-capture.d.ts +23 -0
  29. package/dist/browser/sse-capture.d.ts.map +1 -0
  30. package/dist/browser/sse-capture.js +199 -0
  31. package/dist/browser/sse-capture.js.map +1 -0
  32. package/dist/browser/stealth.d.ts +12 -0
  33. package/dist/browser/stealth.d.ts.map +1 -0
  34. package/dist/browser/stealth.js +12 -0
  35. package/dist/browser/stealth.js.map +1 -0
  36. package/dist/cli.d.ts +12 -0
  37. package/dist/cli.d.ts.map +1 -0
  38. package/dist/cli.js +441 -0
  39. package/dist/cli.js.map +1 -0
  40. package/dist/config.d.ts +90 -0
  41. package/dist/config.d.ts.map +1 -0
  42. package/dist/config.js +246 -0
  43. package/dist/config.js.map +1 -0
  44. package/dist/controllers/history-db.d.ts +56 -0
  45. package/dist/controllers/history-db.d.ts.map +1 -0
  46. package/dist/controllers/history-db.js +260 -0
  47. package/dist/controllers/history-db.js.map +1 -0
  48. package/dist/controllers/request-pool.d.ts +78 -0
  49. package/dist/controllers/request-pool.d.ts.map +1 -0
  50. package/dist/controllers/request-pool.js +222 -0
  51. package/dist/controllers/request-pool.js.map +1 -0
  52. package/dist/controllers/router.d.ts +172 -0
  53. package/dist/controllers/router.d.ts.map +1 -0
  54. package/dist/controllers/router.js +569 -0
  55. package/dist/controllers/router.js.map +1 -0
  56. package/dist/index.d.ts +72 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +61 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/log/api-logger.d.ts +55 -0
  61. package/dist/log/api-logger.d.ts.map +1 -0
  62. package/dist/log/api-logger.js +264 -0
  63. package/dist/log/api-logger.js.map +1 -0
  64. package/dist/log/debug-logger.d.ts +49 -0
  65. package/dist/log/debug-logger.d.ts.map +1 -0
  66. package/dist/log/debug-logger.js +285 -0
  67. package/dist/log/debug-logger.js.map +1 -0
  68. package/dist/log/logger.d.ts +16 -0
  69. package/dist/log/logger.d.ts.map +1 -0
  70. package/dist/log/logger.js +35 -0
  71. package/dist/log/logger.js.map +1 -0
  72. package/dist/postinstall.d.ts +3 -0
  73. package/dist/postinstall.d.ts.map +1 -0
  74. package/dist/postinstall.js +90 -0
  75. package/dist/postinstall.js.map +1 -0
  76. package/dist/providers/base.d.ts +83 -0
  77. package/dist/providers/base.d.ts.map +1 -0
  78. package/dist/providers/base.js +51 -0
  79. package/dist/providers/base.js.map +1 -0
  80. package/dist/providers/chatglm-dom-extract.d.ts +24 -0
  81. package/dist/providers/chatglm-dom-extract.d.ts.map +1 -0
  82. package/dist/providers/chatglm-dom-extract.js +175 -0
  83. package/dist/providers/chatglm-dom-extract.js.map +1 -0
  84. package/dist/providers/chatglm-dom.d.ts +110 -0
  85. package/dist/providers/chatglm-dom.d.ts.map +1 -0
  86. package/dist/providers/chatglm-dom.js +384 -0
  87. package/dist/providers/chatglm-dom.js.map +1 -0
  88. package/dist/providers/chatglm-sse.d.ts +119 -0
  89. package/dist/providers/chatglm-sse.d.ts.map +1 -0
  90. package/dist/providers/chatglm-sse.js +241 -0
  91. package/dist/providers/chatglm-sse.js.map +1 -0
  92. package/dist/providers/chatglm.d.ts +288 -0
  93. package/dist/providers/chatglm.d.ts.map +1 -0
  94. package/dist/providers/chatglm.js +1631 -0
  95. package/dist/providers/chatglm.js.map +1 -0
  96. package/dist/routes/chat.d.ts +117 -0
  97. package/dist/routes/chat.d.ts.map +1 -0
  98. package/dist/routes/chat.js +1346 -0
  99. package/dist/routes/chat.js.map +1 -0
  100. package/dist/routes/compress.d.ts +142 -0
  101. package/dist/routes/compress.d.ts.map +1 -0
  102. package/dist/routes/compress.js +551 -0
  103. package/dist/routes/compress.js.map +1 -0
  104. package/dist/routes/failover.d.ts +34 -0
  105. package/dist/routes/failover.d.ts.map +1 -0
  106. package/dist/routes/failover.js +221 -0
  107. package/dist/routes/failover.js.map +1 -0
  108. package/dist/routes/helpers.d.ts +174 -0
  109. package/dist/routes/helpers.d.ts.map +1 -0
  110. package/dist/routes/helpers.js +525 -0
  111. package/dist/routes/helpers.js.map +1 -0
  112. package/dist/routes/meta.d.ts +31 -0
  113. package/dist/routes/meta.d.ts.map +1 -0
  114. package/dist/routes/meta.js +184 -0
  115. package/dist/routes/meta.js.map +1 -0
  116. package/dist/routes/sse.d.ts +82 -0
  117. package/dist/routes/sse.d.ts.map +1 -0
  118. package/dist/routes/sse.js +77 -0
  119. package/dist/routes/sse.js.map +1 -0
  120. package/dist/server/app.d.ts +24 -0
  121. package/dist/server/app.d.ts.map +1 -0
  122. package/dist/server/app.js +292 -0
  123. package/dist/server/app.js.map +1 -0
  124. package/dist/server/middleware/api-key.d.ts +61 -0
  125. package/dist/server/middleware/api-key.d.ts.map +1 -0
  126. package/dist/server/middleware/api-key.js +95 -0
  127. package/dist/server/middleware/api-key.js.map +1 -0
  128. package/dist/server/middleware/rate-limit.d.ts +67 -0
  129. package/dist/server/middleware/rate-limit.d.ts.map +1 -0
  130. package/dist/server/middleware/rate-limit.js +134 -0
  131. package/dist/server/middleware/rate-limit.js.map +1 -0
  132. package/dist/server/middleware/timeout.d.ts +34 -0
  133. package/dist/server/middleware/timeout.d.ts.map +1 -0
  134. package/dist/server/middleware/timeout.js +64 -0
  135. package/dist/server/middleware/timeout.js.map +1 -0
  136. package/dist/server/types.d.ts +20 -0
  137. package/dist/server/types.d.ts.map +1 -0
  138. package/dist/server/types.js +2 -0
  139. package/dist/server/types.js.map +1 -0
  140. package/dist/tools/build.d.ts +14 -0
  141. package/dist/tools/build.d.ts.map +1 -0
  142. package/dist/tools/build.js +105 -0
  143. package/dist/tools/build.js.map +1 -0
  144. package/dist/tools/clean.d.ts +32 -0
  145. package/dist/tools/clean.d.ts.map +1 -0
  146. package/dist/tools/clean.js +65 -0
  147. package/dist/tools/clean.js.map +1 -0
  148. package/dist/tools/convert.d.ts +50 -0
  149. package/dist/tools/convert.d.ts.map +1 -0
  150. package/dist/tools/convert.js +289 -0
  151. package/dist/tools/convert.js.map +1 -0
  152. package/dist/tools/names.d.ts +138 -0
  153. package/dist/tools/names.d.ts.map +1 -0
  154. package/dist/tools/names.js +578 -0
  155. package/dist/tools/names.js.map +1 -0
  156. package/dist/tools/parse.d.ts +31 -0
  157. package/dist/tools/parse.d.ts.map +1 -0
  158. package/dist/tools/parse.js +273 -0
  159. package/dist/tools/parse.js.map +1 -0
  160. package/dist/tools/placeholder.d.ts +21 -0
  161. package/dist/tools/placeholder.d.ts.map +1 -0
  162. package/dist/tools/placeholder.js +135 -0
  163. package/dist/tools/placeholder.js.map +1 -0
  164. package/dist/tools/prompts.d.ts +42 -0
  165. package/dist/tools/prompts.d.ts.map +1 -0
  166. package/dist/tools/prompts.js +69 -0
  167. package/dist/tools/prompts.js.map +1 -0
  168. package/dist/tools/protocol.d.ts +58 -0
  169. package/dist/tools/protocol.d.ts.map +1 -0
  170. package/dist/tools/protocol.js +287 -0
  171. package/dist/tools/protocol.js.map +1 -0
  172. package/dist/tools/repair.d.ts +83 -0
  173. package/dist/tools/repair.d.ts.map +1 -0
  174. package/dist/tools/repair.js +510 -0
  175. package/dist/tools/repair.js.map +1 -0
  176. package/dist/tools/workspace.d.ts +40 -0
  177. package/dist/tools/workspace.d.ts.map +1 -0
  178. package/dist/tools/workspace.js +224 -0
  179. package/dist/tools/workspace.js.map +1 -0
  180. package/dist/types/message.d.ts +87 -0
  181. package/dist/types/message.d.ts.map +1 -0
  182. package/dist/types/message.js +85 -0
  183. package/dist/types/message.js.map +1 -0
  184. package/dist/types/openai.d.ts +100 -0
  185. package/dist/types/openai.d.ts.map +1 -0
  186. package/dist/types/openai.js +66 -0
  187. package/dist/types/openai.js.map +1 -0
  188. package/dist/utils/errors.d.ts +82 -0
  189. package/dist/utils/errors.d.ts.map +1 -0
  190. package/dist/utils/errors.js +115 -0
  191. package/dist/utils/errors.js.map +1 -0
  192. package/dist/utils/mutex.d.ts +31 -0
  193. package/dist/utils/mutex.d.ts.map +1 -0
  194. package/dist/utils/mutex.js +61 -0
  195. package/dist/utils/mutex.js.map +1 -0
  196. package/dist/utils/prompt.d.ts +150 -0
  197. package/dist/utils/prompt.d.ts.map +1 -0
  198. package/dist/utils/prompt.js +514 -0
  199. package/dist/utils/prompt.js.map +1 -0
  200. package/dist/utils/text.d.ts +30 -0
  201. package/dist/utils/text.d.ts.map +1 -0
  202. package/dist/utils/text.js +70 -0
  203. package/dist/utils/text.js.map +1 -0
  204. package/package.json +67 -4
  205. package/postinstall.mjs +34 -0
@@ -0,0 +1,72 @@
1
+ /**
2
+ * `webaiapi` 库入口。
3
+ *
4
+ * 当前进度见 `docs/migration-status.md`。
5
+ * 已可用的部分:配置层、类型层、工具调用协议层(M1)。
6
+ */
7
+ export type { Settings, LoadSettingsOptions } from './config.js';
8
+ export { settings, loadSettings, toBool, toInt, parseDotEnv, expandHome, getAvailableModelsList, getApiKeys, getDefaultWorkspacePaths, } from './config.js';
9
+ export type { ChatMessage, ContentPart, MessageContent, MessageDict, MessageRole, ToolCallPayload, ToolDefinition, } from './types/message.js';
10
+ export { ALLOWED_ROLES, getTextContent, messageToDict, toolNameOf, toolParamNames, toolRequiredParams, } from './types/message.js';
11
+ export type { ChatCompletionChoice, ChatCompletionRequest, HealthCheckResponse, ModelInfo, ModelListResponse, Usage, } from './types/openai.js';
12
+ export { buildOpenAiError, chatCompletionRequestSchema, makeModelInfo, messageSchema, nowSeconds, } from './types/openai.js';
13
+ export { logger, resolveLogLevel } from './log/logger.js';
14
+ export { cleanDomHtml, normalizeToolCallTags, stripLeftoverToolTags } from './tools/clean.js';
15
+ export { PLACEHOLDER_PATH_KEYS, PLACEHOLDER_TOOL_NAMES, PLACEHOLDER_VALUES, filterPlaceholderToolCalls, isPlaceholderToolCall, } from './tools/placeholder.js';
16
+ export { DOM_CORRUPTION_INDICATOR, DOM_PREVIEW_KEY_INDICATOR, escapeRegExp, extractComplexFieldFromCorrupted, extractPathFromCorrupted, extractToolCallByRegex, hasSmartQuotes, repairDomCorruptedJson, repairJson, tryParseJson, } from './tools/repair.js';
17
+ export { EMPTY_TOOL_MAPS, FILE_SYSTEM_TOOLS, PLATFORM_BUILTIN_TOOL_NAMES, TOOL_NAME_ALIASES, TRAE_INTERNAL_TOOLS, USER_INTERACTION_TOOLS, createToolMaps, detectToolNames, filterUnknownToolCalls, makeToolCallId, normalizeParamKey, normalizeToolArguments, normalizeToolName, repairToolCallBySignature, resolveToolName, } from './tools/names.js';
18
+ export type { SignatureReroute, ToolMaps } from './tools/names.js';
19
+ export { buildToolCall } from './tools/build.js';
20
+ export { parseToolCallsFromText, rawDecodeJson } from './tools/parse.js';
21
+ export type { ParseResult } from './tools/parse.js';
22
+ export { TOOL_CALL_CLOSE, TOOL_CALL_OPEN, TOOL_DESC_MAX_LEN, buildToolProtocol, formatMessagesAsText, formatToolsAsText, } from './tools/protocol.js';
23
+ export type { FormatToolsOptions, ToolProtocol } from './tools/protocol.js';
24
+ export { FABRICATED_PATH_PREFIXES, PATH_LINE_PATTERN, SELF_PROJECT_DIR, WORKSPACE_PATH_PATTERNS, extractFilePathsFromMessages, extractWorkspacePath, } from './tools/workspace.js';
25
+ export type { ExtractWorkspaceOptions } from './tools/workspace.js';
26
+ export { buildWriteArgs, collectFilePathsInText, convertTextToToolCalls, directConvertToToolCalls, inferFilename, looksLikeFileContent, looksLikeFilepath, } from './tools/convert.js';
27
+ export { RECOVERY_ANSWER_MAX_LEN, buildActionRecoveryPrompt } from './tools/prompts.js';
28
+ export type { BuildActionRecoveryPromptOptions } from './tools/prompts.js';
29
+ export { Mutex } from './utils/mutex.js';
30
+ export { computeIncremental, sanitizeMessage, truncateMessage } from './utils/text.js';
31
+ export { SSE_CAPTURE_JS } from './browser/sse-capture.js';
32
+ export { STEALTH_JS } from './browser/stealth.js';
33
+ export { authBaseDir, authFilePath, cookieFingerprint, decodeJwt, getCookieValue, isAuthAvailable, legacyAuthFilePath, listAccounts, loadAuth, normalizeCookies, } from './browser/credentials.js';
34
+ export type { AccountInfo, AuthRecord, CapturedCookie, PlatformApiPattern } from './browser/credentials.js';
35
+ export { PLATFORMS, PLATFORM_API_PATTERNS, PLATFORM_IDS, PLATFORM_LIST, PLATFORM_LOGIN_URLS, PLATFORM_NAMES, PLATFORMS_WITH_PROVIDER, extractAccountInfoSync, isKnownPlatform, platformDisplayName, } from './browser/platforms.js';
36
+ export type { PlatformSpec } from './browser/platforms.js';
37
+ export { accountCooldownRemaining, accountKey, browserState, clearAccountRole, closeBrowser, disposeAllChannels, disposeSharedBrowser, enterAccount, exitAccount, getAccountRole, getBrowser, getChannelPage, getPage, injectResponseJs, invalidateBrowser, isAccountBusy, isAccountCooling, loadCookies, markAccountCooldown, navigateTo, newWorkPage, peekPage, resetAccountState, setAccountRole, sweepOrphanBrowsers, transferAccountBusy, writeAuthFile, } from './browser/manager.js';
38
+ export type { SharedBrowser } from './browser/manager.js';
39
+ export { BaseProvider } from './providers/base.js';
40
+ export type { ChatRequest, ChatResponse } from './providers/base.js';
41
+ export { extractSseAll, extractSseAnswer, getLastRawSse, isBlankOrForeignUrl, isBrowserConnectionError, iterSseJson, logSseSummary, resetLastRawSse, safeIncremental, setLastRawSse, } from './providers/chatglm-sse.js';
42
+ export type { LastRawSse, SseExtractResult } from './providers/chatglm-sse.js';
43
+ export { ModelRouter, PLATFORM_MODEL_NAMES, PROVIDER_IMPLEMENTED_PLATFORMS, getModelRouter, __setModelRouterForTest, } from './controllers/router.js';
44
+ export type { AccountSummaryItem, MixCandidate } from './controllers/router.js';
45
+ export { HistoryDB, getHistoryDb, defaultHistoryDbPath } from './controllers/history-db.js';
46
+ export type { HistoryMessage, HistoryStats } from './controllers/history-db.js';
47
+ export { IntelligentScheduler, RequestPool, getRequestPool, getScheduler, } from './controllers/request-pool.js';
48
+ export type { PooledRequest, RequestPoolStatus, RequestStatus } from './controllers/request-pool.js';
49
+ export { apiLogPath, formatTimestamp, logAiPlatformRequest, logAiPlatformResponse, logAiPlatformResponseComplete, logApiError, logApiRequest, logApiResponse, logRoundStart, resetApiLog, } from './log/api-logger.js';
50
+ export { debugLogPath, logAiRequest, logAiResponse, logClientRequest, logClientResponse, logError, logToolCallResult, } from './log/debug-logger.js';
51
+ export { BROWSER_PROMPT_MAX_LEN, COMPRESS_MIN_BUDGET, TOOL_ROUND_LIMIT, TOTAL_TIME_BUDGET, buildUsage, detectMismatchedAnswer, estimateTokens, extractUserQuestion, formatHistoryContext, formatRecentProgress, getSessionDelta, isReadOnlyTool, looksUnfinishedAnswer, platformOf, rememberSessionSend, truncatePromptForBrowser, } from './routes/helpers.js';
52
+ export { buildReparseInput, extractPlatformName, streamWithFailover } from './routes/failover.js';
53
+ export { compressTextWithPage, precompressHistory, schedulePrecompress, shrinkPromptViaCompression, splitForCompression, summaryIsAbortable, summaryIsBad, waitForBackgroundTasks, } from './routes/compress.js';
54
+ export { DONE, contentChunk, roleChunk, sseData, toolCallsChunk } from './routes/sse.js';
55
+ export { nonStreamChatCompletion, parseAndRecoverToolCalls, preparePrompt, registerChatRoutes, streamChatCompletion, } from './routes/chat.js';
56
+ export type { PrepareResult, PreparedRequest } from './routes/chat.js';
57
+ export { registerMetaRoutes, runStartupTasks } from './routes/meta.js';
58
+ export { createApp, initApiKeys, startServer } from './server/app.js';
59
+ export { ApiKeyManager, extractApiKey, getApiKeyManager, verifyApiKey } from './server/middleware/api-key.js';
60
+ export { RateLimiter, TokenBucket, clientKeyOf } from './server/middleware/rate-limit.js';
61
+ export { makeTimeoutHook } from './server/middleware/timeout.js';
62
+ export { AuthCapture, capturePlatformAuth, fetchAccountInfo } from './browser/auth-capture.js';
63
+ export { deriveAccountId, detectDuplicate, readExistingAccounts, runLogin, runLogout, slugAccountId, toSlug, } from './browser/login-flow.js';
64
+ export type { DuplicateVerdict, ExistingAccount, IdentityPrint, LoginOptions, LogoutOptions, } from './browser/login-flow.js';
65
+ export { confirmYesNo, displayWidth, firstSelectableIndex, inputText, isInteractive, padDisplay, renderChoiceList, resolveChoiceInput, selectOne, supportsColor, tokenizeKeys, } from './utils/prompt.js';
66
+ export type { Choice, ChoiceResolution, KeyToken } from './utils/prompt.js';
67
+ export { helpText, parseArgs, runCli } from './cli.js';
68
+ export { ChatGLMBrowserProvider } from './providers/chatglm.js';
69
+ export type { ChatGLMProviderOptions } from './providers/chatglm.js';
70
+ export { DETECT_COMPLETION_JS, DETECT_THINKING_JS, HAS_INPUT_BOX_JS, PAGE_SHOWS_BUSY_JS, PROBE_LOGGED_IN_JS, READ_BUSY_NOTICE_JS, RESET_SSE_JS, SSE_GET_JS, } from './providers/chatglm-dom.js';
71
+ export { EXTRACT_RESPONSE_JS, FORCED_EXTRACT_JS } from './providers/chatglm-dom-extract.js';
72
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,MAAM,EACN,KAAK,EACL,WAAW,EACX,UAAU,EACV,sBAAsB,EACtB,UAAU,EACV,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACd,WAAW,EACX,WAAW,EACX,eAAe,EACf,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,EACb,cAAc,EACd,aAAa,EACb,UAAU,EACV,cAAc,EACd,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,SAAS,EACT,iBAAiB,EACjB,KAAK,GACN,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,gBAAgB,EAChB,2BAA2B,EAC3B,aAAa,EACb,aAAa,EACb,UAAU,GACX,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAI1D,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE9F,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,YAAY,EACZ,gCAAgC,EAChC,wBAAwB,EACxB,sBAAsB,EACtB,cAAc,EACd,sBAAsB,EACtB,UAAU,EACV,YAAY,GACb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,2BAA2B,EAC3B,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACzE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EACL,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE5E,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,4BAA4B,EAC5B,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,aAAa,EACb,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AACxF,YAAY,EAAE,gCAAgC,EAAE,MAAM,oBAAoB,CAAC;AAI3E,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvF,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EACL,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,QAAQ,EACR,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG5G,OAAO,EACL,SAAS,EACT,qBAAqB,EACrB,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,uBAAuB,EACvB,sBAAsB,EACtB,eAAe,EACf,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EACL,wBAAwB,EACxB,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,UAAU,EACV,cAAc,EACd,OAAO,EACP,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EACnB,UAAU,EACV,WAAW,EACX,QAAQ,EACR,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI1D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,wBAAwB,EACxB,WAAW,EACX,aAAa,EACb,eAAe,EACf,eAAe,EACf,aAAa,GACd,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAI/E,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,8BAA8B,EAC9B,cAAc,EACd,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEhF,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAC5F,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhF,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,YAAY,GACb,MAAM,+BAA+B,CAAC;AACvC,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAIrG,OAAO,EACL,UAAU,EACV,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,6BAA6B,EAC7B,WAAW,EACX,aAAa,EACb,cAAc,EACd,aAAa,EACb,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,sBAAsB,EACtB,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,UAAU,EACV,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACzF,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,aAAa,EACb,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAIvE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9G,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,QAAQ,EACR,SAAS,EACT,aAAa,EACb,MAAM,GACP,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,aAAa,GACd,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,SAAS,EACT,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,EACT,aAAa,EACb,YAAY,GACb,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE5E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAErE,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,UAAU,GACX,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,61 @@
1
+ /**
2
+ * `webaiapi` 库入口。
3
+ *
4
+ * 当前进度见 `docs/migration-status.md`。
5
+ * 已可用的部分:配置层、类型层、工具调用协议层(M1)。
6
+ */
7
+ export { settings, loadSettings, toBool, toInt, parseDotEnv, expandHome, getAvailableModelsList, getApiKeys, getDefaultWorkspacePaths, } from './config.js';
8
+ export { ALLOWED_ROLES, getTextContent, messageToDict, toolNameOf, toolParamNames, toolRequiredParams, } from './types/message.js';
9
+ export { buildOpenAiError, chatCompletionRequestSchema, makeModelInfo, messageSchema, nowSeconds, } from './types/openai.js';
10
+ export { logger, resolveLogLevel } from './log/logger.js';
11
+ /* ---------------- 工具调用协议层 ---------------- */
12
+ export { cleanDomHtml, normalizeToolCallTags, stripLeftoverToolTags } from './tools/clean.js';
13
+ export { PLACEHOLDER_PATH_KEYS, PLACEHOLDER_TOOL_NAMES, PLACEHOLDER_VALUES, filterPlaceholderToolCalls, isPlaceholderToolCall, } from './tools/placeholder.js';
14
+ export { DOM_CORRUPTION_INDICATOR, DOM_PREVIEW_KEY_INDICATOR, escapeRegExp, extractComplexFieldFromCorrupted, extractPathFromCorrupted, extractToolCallByRegex, hasSmartQuotes, repairDomCorruptedJson, repairJson, tryParseJson, } from './tools/repair.js';
15
+ export { EMPTY_TOOL_MAPS, FILE_SYSTEM_TOOLS, PLATFORM_BUILTIN_TOOL_NAMES, TOOL_NAME_ALIASES, TRAE_INTERNAL_TOOLS, USER_INTERACTION_TOOLS, createToolMaps, detectToolNames, filterUnknownToolCalls, makeToolCallId, normalizeParamKey, normalizeToolArguments, normalizeToolName, repairToolCallBySignature, resolveToolName, } from './tools/names.js';
16
+ export { buildToolCall } from './tools/build.js';
17
+ export { parseToolCallsFromText, rawDecodeJson } from './tools/parse.js';
18
+ export { TOOL_CALL_CLOSE, TOOL_CALL_OPEN, TOOL_DESC_MAX_LEN, buildToolProtocol, formatMessagesAsText, formatToolsAsText, } from './tools/protocol.js';
19
+ export { FABRICATED_PATH_PREFIXES, PATH_LINE_PATTERN, SELF_PROJECT_DIR, WORKSPACE_PATH_PATTERNS, extractFilePathsFromMessages, extractWorkspacePath, } from './tools/workspace.js';
20
+ export { buildWriteArgs, collectFilePathsInText, convertTextToToolCalls, directConvertToToolCalls, inferFilename, looksLikeFileContent, looksLikeFilepath, } from './tools/convert.js';
21
+ export { RECOVERY_ANSWER_MAX_LEN, buildActionRecoveryPrompt } from './tools/prompts.js';
22
+ /* ---------------- 浏览器层(M2) ---------------- */
23
+ export { Mutex } from './utils/mutex.js';
24
+ export { computeIncremental, sanitizeMessage, truncateMessage } from './utils/text.js';
25
+ export { SSE_CAPTURE_JS } from './browser/sse-capture.js';
26
+ export { STEALTH_JS } from './browser/stealth.js';
27
+ export { authBaseDir, authFilePath, cookieFingerprint, decodeJwt, getCookieValue, isAuthAvailable, legacyAuthFilePath, listAccounts, loadAuth, normalizeCookies, } from './browser/credentials.js';
28
+ /* 平台注册表(单一真相:加平台只改 `platforms.ts`) */
29
+ export { PLATFORMS, PLATFORM_API_PATTERNS, PLATFORM_IDS, PLATFORM_LIST, PLATFORM_LOGIN_URLS, PLATFORM_NAMES, PLATFORMS_WITH_PROVIDER, extractAccountInfoSync, isKnownPlatform, platformDisplayName, } from './browser/platforms.js';
30
+ export { accountCooldownRemaining, accountKey, browserState, clearAccountRole, closeBrowser, disposeAllChannels, disposeSharedBrowser, enterAccount, exitAccount, getAccountRole, getBrowser, getChannelPage, getPage, injectResponseJs, invalidateBrowser, isAccountBusy, isAccountCooling, loadCookies, markAccountCooldown, navigateTo, newWorkPage, peekPage, resetAccountState, setAccountRole, sweepOrphanBrowsers, transferAccountBusy, writeAuthFile, } from './browser/manager.js';
31
+ /* ---------------- Provider 层(M3) ---------------- */
32
+ export { BaseProvider } from './providers/base.js';
33
+ export { extractSseAll, extractSseAnswer, getLastRawSse, isBlankOrForeignUrl, isBrowserConnectionError, iterSseJson, logSseSummary, resetLastRawSse, safeIncremental, setLastRawSse, } from './providers/chatglm-sse.js';
34
+ /* ---------------- 控制器层(M4) ---------------- */
35
+ export { ModelRouter, PLATFORM_MODEL_NAMES, PROVIDER_IMPLEMENTED_PLATFORMS, getModelRouter, __setModelRouterForTest, } from './controllers/router.js';
36
+ export { HistoryDB, getHistoryDb, defaultHistoryDbPath } from './controllers/history-db.js';
37
+ export { IntelligentScheduler, RequestPool, getRequestPool, getScheduler, } from './controllers/request-pool.js';
38
+ /* ---------------- 日志(M4) ---------------- */
39
+ export { apiLogPath, formatTimestamp, logAiPlatformRequest, logAiPlatformResponse, logAiPlatformResponseComplete, logApiError, logApiRequest, logApiResponse, logRoundStart, resetApiLog, } from './log/api-logger.js';
40
+ export { debugLogPath, logAiRequest, logAiResponse, logClientRequest, logClientResponse, logError, logToolCallResult, } from './log/debug-logger.js';
41
+ /* ---------------- 路由辅助(M4) ---------------- */
42
+ export { BROWSER_PROMPT_MAX_LEN, COMPRESS_MIN_BUDGET, TOOL_ROUND_LIMIT, TOTAL_TIME_BUDGET, buildUsage, detectMismatchedAnswer, estimateTokens, extractUserQuestion, formatHistoryContext, formatRecentProgress, getSessionDelta, isReadOnlyTool, looksUnfinishedAnswer, platformOf, rememberSessionSend, truncatePromptForBrowser, } from './routes/helpers.js';
43
+ export { buildReparseInput, extractPlatformName, streamWithFailover } from './routes/failover.js';
44
+ export { compressTextWithPage, precompressHistory, schedulePrecompress, shrinkPromptViaCompression, splitForCompression, summaryIsAbortable, summaryIsBad, waitForBackgroundTasks, } from './routes/compress.js';
45
+ export { DONE, contentChunk, roleChunk, sseData, toolCallsChunk } from './routes/sse.js';
46
+ export { nonStreamChatCompletion, parseAndRecoverToolCalls, preparePrompt, registerChatRoutes, streamChatCompletion, } from './routes/chat.js';
47
+ export { registerMetaRoutes, runStartupTasks } from './routes/meta.js';
48
+ /* ---------------- 服务与 CLI(M4) ---------------- */
49
+ export { createApp, initApiKeys, startServer } from './server/app.js';
50
+ export { ApiKeyManager, extractApiKey, getApiKeyManager, verifyApiKey } from './server/middleware/api-key.js';
51
+ export { RateLimiter, TokenBucket, clientKeyOf } from './server/middleware/rate-limit.js';
52
+ export { makeTimeoutHook } from './server/middleware/timeout.js';
53
+ export { AuthCapture, capturePlatformAuth, fetchAccountInfo } from './browser/auth-capture.js';
54
+ export { deriveAccountId, detectDuplicate, readExistingAccounts, runLogin, runLogout, slugAccountId, toSlug, } from './browser/login-flow.js';
55
+ /* 交互式提问工具(菜单 / 输入 / 确认) */
56
+ export { confirmYesNo, displayWidth, firstSelectableIndex, inputText, isInteractive, padDisplay, renderChoiceList, resolveChoiceInput, selectOne, supportsColor, tokenizeKeys, } from './utils/prompt.js';
57
+ export { helpText, parseArgs, runCli } from './cli.js';
58
+ export { ChatGLMBrowserProvider } from './providers/chatglm.js';
59
+ export { DETECT_COMPLETION_JS, DETECT_THINKING_JS, HAS_INPUT_BOX_JS, PAGE_SHOWS_BUSY_JS, PROBE_LOGGED_IN_JS, READ_BUSY_NOTICE_JS, RESET_SSE_JS, SSE_GET_JS, } from './providers/chatglm-dom.js';
60
+ export { EXTRACT_RESPONSE_JS, FORCED_EXTRACT_JS } from './providers/chatglm-dom-extract.js';
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /** `logs/api_requests.log` 的绝对路径。 */
2
+ export declare function apiLogPath(): string;
3
+ /** `YYYY-MM-DD HH:mm:ss.SSS`(与 Python `%Y-%m-%d %H:%M:%S.%f` 取前 3 位一致)。 */
4
+ export declare function formatTimestamp(date?: Date): string;
5
+ /**
6
+ * 重置日志(**每次启动调用一次**)。
7
+ *
8
+ * 这是既定行为:`api_requests.log` 每次启动清空,只保留本次运行的记录,
9
+ * 避免排查时被历史轮次干扰。旧文件不备份(用户明确要求)。
10
+ */
11
+ export declare function resetApiLog(): void;
12
+ /** 记录 API 请求(客户端 → 网关)。消息列表**原样记录**,不做任何加工/截断。 */
13
+ export declare function logApiRequest(params: {
14
+ requestId: string;
15
+ model: string;
16
+ messages: Array<Record<string, unknown>>;
17
+ stream: boolean;
18
+ tools?: Array<Record<string, unknown>> | null;
19
+ workspacePath?: string;
20
+ }): void;
21
+ /** 记录第 N 轮交互开始(用户消息原文)。 */
22
+ export declare function logRoundStart(requestId: string, roundNum: number, userMessage: string): void;
23
+ /** 记录网页 AI 的完整回复(原始文本,逐行原样)。 */
24
+ export declare function logAiPlatformResponseComplete(params: {
25
+ requestId: string;
26
+ platform: string;
27
+ roundNum: number;
28
+ rawText: string;
29
+ }): void;
30
+ /** 记录网关返回给客户端的响应。 */
31
+ export declare function logApiResponse(params: {
32
+ requestId: string;
33
+ model: string;
34
+ content?: string | null;
35
+ toolCalls?: Array<Record<string, unknown>> | null;
36
+ finishReason?: string;
37
+ duration?: number;
38
+ }): void;
39
+ /** 记录发送给平台的内容。 */
40
+ export declare function logAiPlatformRequest(params: {
41
+ requestId: string;
42
+ platform: string;
43
+ messages: Array<Record<string, unknown>>;
44
+ }): void;
45
+ /** 记录平台的回复(原始文本 + 解析出的工具调用)。 */
46
+ export declare function logAiPlatformResponse(params: {
47
+ requestId: string;
48
+ platform: string;
49
+ rawText: string;
50
+ parsedToolCalls?: Array<Record<string, unknown>> | null;
51
+ duration?: number;
52
+ }): void;
53
+ /** 记录错误。 */
54
+ export declare function logApiError(requestId: string, error: string, context?: string): void;
55
+ //# sourceMappingURL=api-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-logger.d.ts","sourceRoot":"","sources":["../../src/log/api-logger.ts"],"names":[],"mappings":"AA0DA,qCAAqC;AACrC,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAQD,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAO/D;AAYD;;;;;GAKG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAOlC;AAqCD,kDAAkD;AAClD,wBAAgB,aAAa,CAAC,MAAM,EAAE;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACzC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAC9C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,IAAI,CAkCP;AAED,2BAA2B;AAC3B,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAQ5F;AAED,gCAAgC;AAChC,wBAAgB,6BAA6B,CAAC,MAAM,EAAE;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,IAAI,CAWP;AAED,qBAAqB;AACrB,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAmCP;AAED,kBAAkB;AAClB,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC1C,GAAG,IAAI,CAmBP;AAED,gCAAgC;AAChC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAyBP;AAED,YAAY;AACZ,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,SAAK,GAAG,IAAI,CAShF"}
@@ -0,0 +1,264 @@
1
+ /**
2
+ * API 请求/响应日志 —— `legacy-python/src/utils/api_logger.py` 的移植。
3
+ *
4
+ * ⚠️⚠️ **本文件的核心契约:原样记录、不加工、不截断**(用户明确要求)。
5
+ * 这里的每一行格式都被 `grep` 依赖过,改格式前请先读
6
+ * `docs/hard-constraints.md` 的「日志」一节。
7
+ *
8
+ * 输出文件:`<项目根>/logs/api_requests.log`,**每次启动重置**(见 {@link resetApiLog})。
9
+ *
10
+ * 格式:
11
+ * ```
12
+ * [时间戳] ========== 第 N 轮 [request_id] ==========
13
+ * [>>> USER] 第 N 轮收到用户消息:
14
+ * <用户消息原文,逐行缩进 4 空格>
15
+ *
16
+ * [时间戳] ========== 第 N 轮 [request_id] ==========
17
+ * [<<< AI] 第 N 轮网页回复消息:
18
+ * AI 平台: chatglm
19
+ * 原始文本长度: 1234
20
+ * <AI 原始回复,逐行缩进 4 空格>
21
+ * ```
22
+ *
23
+ * 方向标记:
24
+ * - `>>> USER` 用户发给网关的消息(原始)
25
+ * - `<<< AI` 网页 AI 的回复(原始)
26
+ * - `>>> REQUEST` / `<<< RESPONSE` 客户端请求 / 网关响应
27
+ * - `>>> AI` / `<<< AI` 发给平台 / 平台返回
28
+ * - `!!! ERROR` 错误
29
+ *
30
+ * 与原实现的差异:
31
+ * - `api_logger.py` 里有个 `_truncate_json()` **从未被调用**(死代码),不移植。
32
+ * - 日志目录:Python 写死 `<源码根>/logs`;TS 侧优先用 `settings.logDir`
33
+ * (绝对路径直接用,相对路径按项目根解析),默认值与 Python 一致。
34
+ * - 时间戳格式完全一致:`YYYY-MM-DD HH:mm:ss.SSS`(Python 是 `%f` 取前 3 位)。
35
+ */
36
+ import { appendFileSync, mkdirSync, writeFileSync } from 'node:fs';
37
+ import { dirname, isAbsolute, join } from 'node:path';
38
+ import { fileURLToPath } from 'node:url';
39
+ import { settings } from '../config.js';
40
+ /** 模块所在目录(`dist/log/` 或 `src/log/`),用于定位项目根。 */
41
+ const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
42
+ /** 项目根:`src/log/` 或 `dist/log/` 往上两级。 */
43
+ const PROJECT_ROOT = join(MODULE_DIR, '..', '..');
44
+ /**
45
+ * API 日志目录。
46
+ *
47
+ * 解析顺序:`settings.logDir` 为绝对路径则直接用;否则按项目根解析。
48
+ * 这与 Python 版「写死 `<源码根>/logs`」等价(默认 `logDir = "logs"`)。
49
+ */
50
+ function logDir() {
51
+ const configured = settings.logDir || 'logs';
52
+ return isAbsolute(configured) ? configured : join(PROJECT_ROOT, configured);
53
+ }
54
+ /** `logs/api_requests.log` 的绝对路径。 */
55
+ export function apiLogPath() {
56
+ return join(logDir(), 'api_requests.log');
57
+ }
58
+ function ensureDir() {
59
+ const dir = logDir();
60
+ mkdirSync(dir, { recursive: true });
61
+ return dir;
62
+ }
63
+ /** `YYYY-MM-DD HH:mm:ss.SSS`(与 Python `%Y-%m-%d %H:%M:%S.%f` 取前 3 位一致)。 */
64
+ export function formatTimestamp(date = new Date()) {
65
+ const p = (n, width = 2) => String(n).padStart(width, '0');
66
+ return (`${date.getFullYear()}-${p(date.getMonth() + 1)}-${p(date.getDate())} ` +
67
+ `${p(date.getHours())}:${p(date.getMinutes())}:${p(date.getSeconds())}.` +
68
+ `${p(date.getMilliseconds(), 3)}`);
69
+ }
70
+ /** 追加写(失败不影响主流程)。 */
71
+ function append(lines) {
72
+ try {
73
+ ensureDir();
74
+ appendFileSync(apiLogPath(), `${lines.join('\n')}\n`, 'utf8');
75
+ }
76
+ catch {
77
+ // 日志失败绝不能让请求失败
78
+ }
79
+ }
80
+ /**
81
+ * 重置日志(**每次启动调用一次**)。
82
+ *
83
+ * 这是既定行为:`api_requests.log` 每次启动清空,只保留本次运行的记录,
84
+ * 避免排查时被历史轮次干扰。旧文件不备份(用户明确要求)。
85
+ */
86
+ export function resetApiLog() {
87
+ try {
88
+ ensureDir();
89
+ writeFileSync(apiLogPath(), '', 'utf8');
90
+ }
91
+ catch {
92
+ // 忽略
93
+ }
94
+ }
95
+ /** 把多模态 content 取成纯文本(只取 `type=text` 项,与 Python 一致)。 */
96
+ function contentToText(content) {
97
+ if (Array.isArray(content)) {
98
+ const parts = [];
99
+ for (const item of content) {
100
+ if (item && typeof item === 'object') {
101
+ const rec = item;
102
+ if (rec['type'] === 'text')
103
+ parts.push(String(rec['text'] ?? ''));
104
+ }
105
+ }
106
+ return parts.join('\n');
107
+ }
108
+ if (content == null)
109
+ return '';
110
+ return String(content);
111
+ }
112
+ /** 逐行缩进(Python 里就是 `f" {_line}"`)。 */
113
+ function indent(text, prefix = ' ') {
114
+ return text.split('\n').map((line) => `${prefix}${line}`);
115
+ }
116
+ /** 取消息的 `tool_calls` 名字列表(容错,结构可能不规范)。 */
117
+ function toolCallNames(toolCalls) {
118
+ if (!Array.isArray(toolCalls))
119
+ return [];
120
+ return toolCalls.map((tc) => {
121
+ const fn = tc?.['function'];
122
+ const name = fn?.['name'];
123
+ return typeof name === 'string' ? name : '?';
124
+ });
125
+ }
126
+ /* ==================================================================== */
127
+ /* 公开接口 */
128
+ /* ==================================================================== */
129
+ /** 记录 API 请求(客户端 → 网关)。消息列表**原样记录**,不做任何加工/截断。 */
130
+ export function logApiRequest(params) {
131
+ const { requestId, model, messages, stream, tools, workspacePath } = params;
132
+ const timestamp = formatTimestamp();
133
+ const lines = [
134
+ `\n[${timestamp}] ========== API 请求 [${requestId}] ==========`,
135
+ '[>>> REQUEST]',
136
+ ` 模型: ${model}`,
137
+ ` 流式: ${stream}`,
138
+ ` 消息数: ${messages.length}`,
139
+ ];
140
+ if (tools && tools.length > 0) {
141
+ const names = tools.map((t) => {
142
+ const fn = t['function'];
143
+ return typeof fn?.['name'] === 'string' ? fn['name'] : '?';
144
+ });
145
+ lines.push(` 工具数: ${tools.length} | 工具: ${names.slice(0, 5).join(', ')}`);
146
+ }
147
+ if (workspacePath)
148
+ lines.push(` 工作目录: ${workspacePath}`);
149
+ // 原样记录,不截断
150
+ lines.push('\n [消息列表]:');
151
+ messages.forEach((msg, i) => {
152
+ const role = typeof msg['role'] === 'string' ? msg['role'] : '?';
153
+ const contentStr = contentToText(msg['content']);
154
+ const names = toolCallNames(msg['tool_calls']);
155
+ const tcInfo = names.length > 0 ? ` [工具调用: ${names.join(', ')}]` : '';
156
+ lines.push(` [${i}] ${role}${tcInfo}:`);
157
+ lines.push(...indent(contentStr, ' '));
158
+ });
159
+ append(lines);
160
+ }
161
+ /** 记录第 N 轮交互开始(用户消息原文)。 */
162
+ export function logRoundStart(requestId, roundNum, userMessage) {
163
+ const timestamp = formatTimestamp();
164
+ const lines = [
165
+ `\n[${timestamp}] ========== 第 ${roundNum} 轮 [${requestId}] ==========`,
166
+ `[>>> USER] 第 ${roundNum} 轮收到用户消息:`,
167
+ ...indent(String(userMessage)),
168
+ ];
169
+ append(lines);
170
+ }
171
+ /** 记录网页 AI 的完整回复(原始文本,逐行原样)。 */
172
+ export function logAiPlatformResponseComplete(params) {
173
+ const { requestId, platform, roundNum, rawText } = params;
174
+ const timestamp = formatTimestamp();
175
+ const lines = [
176
+ `\n[${timestamp}] ========== 第 ${roundNum} 轮 [${requestId}] ==========`,
177
+ `[<<< AI] 第 ${roundNum} 轮网页回复消息:`,
178
+ ` AI 平台: ${platform}`,
179
+ ` 原始文本长度: ${rawText.length}`,
180
+ ...indent(String(rawText)),
181
+ ];
182
+ append(lines);
183
+ }
184
+ /** 记录网关返回给客户端的响应。 */
185
+ export function logApiResponse(params) {
186
+ const { requestId, model, content, toolCalls, finishReason = 'stop', duration = 0, } = params;
187
+ const timestamp = formatTimestamp();
188
+ const lines = [
189
+ `\n[${timestamp}] ========== API 响应 [${requestId}] ==========`,
190
+ '[<<< RESPONSE]',
191
+ ` 模型: ${model}`,
192
+ ` 完成原因: ${finishReason}`,
193
+ ` 耗时: ${duration.toFixed(1)}s`,
194
+ ];
195
+ if (content) {
196
+ lines.push(`\n [回复内容] (${content.length} 字符):`);
197
+ lines.push(...indent(content));
198
+ }
199
+ if (toolCalls && toolCalls.length > 0) {
200
+ lines.push(`\n [工具调用] (${toolCalls.length} 个):`);
201
+ toolCalls.forEach((tc, i) => {
202
+ const fn = (tc['function'] ?? {});
203
+ const name = typeof fn['name'] === 'string' ? fn['name'] : '?';
204
+ const args = JSON.stringify(fn['arguments'] ?? '{}');
205
+ lines.push(` [${i}] ${name}: ${args}`);
206
+ });
207
+ }
208
+ append(lines);
209
+ }
210
+ /** 记录发送给平台的内容。 */
211
+ export function logAiPlatformRequest(params) {
212
+ const { requestId, platform, messages } = params;
213
+ const timestamp = formatTimestamp();
214
+ const lines = [
215
+ `\n[${timestamp}] ========== 发送给 AI 平台 [${requestId}] ==========`,
216
+ '[>>> AI]',
217
+ ` 平台: ${platform}`,
218
+ ` 消息数: ${messages.length}`,
219
+ '\n [消息内容]:',
220
+ ];
221
+ messages.forEach((msg, i) => {
222
+ const role = typeof msg['role'] === 'string' ? msg['role'] : '?';
223
+ lines.push(` [${i}] ${role}:`);
224
+ lines.push(...indent(contentToText(msg['content']), ' '));
225
+ });
226
+ append(lines);
227
+ }
228
+ /** 记录平台的回复(原始文本 + 解析出的工具调用)。 */
229
+ export function logAiPlatformResponse(params) {
230
+ const { requestId, platform, rawText, parsedToolCalls, duration = 0 } = params;
231
+ const timestamp = formatTimestamp();
232
+ const lines = [
233
+ `\n[${timestamp}] ========== AI 平台回复 [${requestId}] ==========`,
234
+ '[<<< AI]',
235
+ ` 平台: ${platform}`,
236
+ ` 耗时: ${duration.toFixed(1)}s`,
237
+ ` 原始文本长度: ${rawText.length}`,
238
+ '\n [原始文本]:',
239
+ ...indent(rawText),
240
+ ];
241
+ if (parsedToolCalls && parsedToolCalls.length > 0) {
242
+ lines.push(`\n [解析工具调用] (${parsedToolCalls.length} 个):`);
243
+ parsedToolCalls.forEach((tc, i) => {
244
+ const fn = (tc['function'] ?? {});
245
+ const name = typeof fn['name'] === 'string' ? fn['name'] : '?';
246
+ const args = JSON.stringify(fn['arguments'] ?? '{}');
247
+ lines.push(` [${i}] ${name}: ${args}`);
248
+ });
249
+ }
250
+ append(lines);
251
+ }
252
+ /** 记录错误。 */
253
+ export function logApiError(requestId, error, context = '') {
254
+ const timestamp = formatTimestamp();
255
+ const lines = [
256
+ `\n[${timestamp}] ========== API 错误 [${requestId}] ==========`,
257
+ '[!!! ERROR]',
258
+ ` 错误: ${error}`,
259
+ ];
260
+ if (context)
261
+ lines.push(` 上下文: ${context.slice(0, 500)}`);
262
+ append(lines);
263
+ }
264
+ //# sourceMappingURL=api-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-logger.js","sourceRoot":"","sources":["../../src/log/api-logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /** 重置缓存(测试用;对应 Python 的 `lru_cache` 失效)。 */
2
+ export declare function resetDebugLoggerCache(): void;
3
+ /** `debug_YYYYMMDD.log` 的绝对路径。 */
4
+ export declare function debugLogPath(date?: Date): string;
5
+ /** 记录客户端请求。 */
6
+ export declare function logClientRequest(params: {
7
+ requestId: string;
8
+ model: string;
9
+ messages: Array<Record<string, unknown>>;
10
+ stream?: boolean;
11
+ tools?: Array<Record<string, unknown>> | null;
12
+ extra?: Record<string, unknown>;
13
+ }): void;
14
+ /** 记录返回给客户端的响应。 */
15
+ export declare function logClientResponse(params: {
16
+ requestId: string;
17
+ model: string;
18
+ finishReason: string;
19
+ content?: string;
20
+ toolCalls?: Array<Record<string, unknown>> | null;
21
+ duration?: number;
22
+ }): void;
23
+ /** 记录发送给网页 AI 的内容。 */
24
+ export declare function logAiRequest(params: {
25
+ requestId: string;
26
+ platform: string;
27
+ messages: Array<Record<string, unknown>>;
28
+ workspacePath?: string;
29
+ }): void;
30
+ /** 记录网页 AI 的原始回复。 */
31
+ export declare function logAiResponse(params: {
32
+ requestId: string;
33
+ platform: string;
34
+ rawText: string;
35
+ parsedToolCalls?: Array<Record<string, unknown>> | null;
36
+ parsedText?: string;
37
+ duration?: number;
38
+ }): void;
39
+ /** 记录错误。 */
40
+ export declare function logError(requestId: string, error: string, context?: string): void;
41
+ /** 记录工具调用结果。 */
42
+ export declare function logToolCallResult(params: {
43
+ requestId: string;
44
+ toolName: string;
45
+ toolArgs: Record<string, unknown>;
46
+ result: string;
47
+ duration?: number;
48
+ }): void;
49
+ //# sourceMappingURL=debug-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-logger.d.ts","sourceRoot":"","sources":["../../src/log/debug-logger.ts"],"names":[],"mappings":"AA6BA,4CAA4C;AAC5C,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AAsBD,kCAAkC;AAClC,wBAAgB,YAAY,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAI5D;AA4FD,eAAe;AACf,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,GAAG,IAAI,CAqCP;AAED,mBAAmB;AACnB,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAmBP;AAED,sBAAsB;AACtB,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,IAAI,CAyCP;AAED,qBAAqB;AACrB,wBAAgB,aAAa,CAAC,MAAM,EAAE;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAoBP;AAED,YAAY;AACZ,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,SAAK,GAAG,IAAI,CAU7E;AAED,gBAAgB;AAChB,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAWP"}