pybao-cli 1.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +440 -0
- package/README.zh-CN.md +338 -0
- package/cli-acp.js +82 -0
- package/cli.js +105 -0
- package/dist/REPL-WPV32MTF.js +42 -0
- package/dist/REPL-WPV32MTF.js.map +7 -0
- package/dist/acp-75HO2LBV.js +1357 -0
- package/dist/acp-75HO2LBV.js.map +7 -0
- package/dist/agentsValidate-6Z57ARKC.js +373 -0
- package/dist/agentsValidate-6Z57ARKC.js.map +7 -0
- package/dist/ask-NXXXCGY4.js +125 -0
- package/dist/ask-NXXXCGY4.js.map +7 -0
- package/dist/autoUpdater-PJMGNPUG.js +17 -0
- package/dist/autoUpdater-PJMGNPUG.js.map +7 -0
- package/dist/chunk-27GYWUY2.js +72 -0
- package/dist/chunk-27GYWUY2.js.map +7 -0
- package/dist/chunk-3DFBSQIT.js +23 -0
- package/dist/chunk-3DFBSQIT.js.map +7 -0
- package/dist/chunk-3KNGJX7Q.js +794 -0
- package/dist/chunk-3KNGJX7Q.js.map +7 -0
- package/dist/chunk-3PDD7M4T.js +164 -0
- package/dist/chunk-3PDD7M4T.js.map +7 -0
- package/dist/chunk-3ZNSAB7B.js +515 -0
- package/dist/chunk-3ZNSAB7B.js.map +7 -0
- package/dist/chunk-4SNFQYCY.js +511 -0
- package/dist/chunk-4SNFQYCY.js.map +7 -0
- package/dist/chunk-4XPNRLJG.js +1609 -0
- package/dist/chunk-4XPNRLJG.js.map +7 -0
- package/dist/chunk-5P7HBXTD.js +12 -0
- package/dist/chunk-5P7HBXTD.js.map +7 -0
- package/dist/chunk-6RZIUY5K.js +191 -0
- package/dist/chunk-6RZIUY5K.js.map +7 -0
- package/dist/chunk-6WELHKDA.js +240 -0
- package/dist/chunk-6WELHKDA.js.map +7 -0
- package/dist/chunk-7AAE6EO2.js +145 -0
- package/dist/chunk-7AAE6EO2.js.map +7 -0
- package/dist/chunk-A3BVXXA3.js +47 -0
- package/dist/chunk-A3BVXXA3.js.map +7 -0
- package/dist/chunk-A6PUMROK.js +152 -0
- package/dist/chunk-A6PUMROK.js.map +7 -0
- package/dist/chunk-BH3Y62E3.js +11 -0
- package/dist/chunk-BH3Y62E3.js.map +7 -0
- package/dist/chunk-BJSWTHRM.js +16 -0
- package/dist/chunk-BJSWTHRM.js.map +7 -0
- package/dist/chunk-BQA2EOUU.js +124 -0
- package/dist/chunk-BQA2EOUU.js.map +7 -0
- package/dist/chunk-CZZKRPE2.js +19 -0
- package/dist/chunk-CZZKRPE2.js.map +7 -0
- package/dist/chunk-ERMQRV55.js +24 -0
- package/dist/chunk-ERMQRV55.js.map +7 -0
- package/dist/chunk-HB2P6645.js +34 -0
- package/dist/chunk-HB2P6645.js.map +7 -0
- package/dist/chunk-HIRIJ2LQ.js +1256 -0
- package/dist/chunk-HIRIJ2LQ.js.map +7 -0
- package/dist/chunk-ICTEVBLN.js +735 -0
- package/dist/chunk-ICTEVBLN.js.map +7 -0
- package/dist/chunk-JKGOGSFT.js +128 -0
- package/dist/chunk-JKGOGSFT.js.map +7 -0
- package/dist/chunk-JZDE77EH.js +836 -0
- package/dist/chunk-JZDE77EH.js.map +7 -0
- package/dist/chunk-M624LT6O.js +17 -0
- package/dist/chunk-M624LT6O.js.map +7 -0
- package/dist/chunk-OMELVAJD.js +96 -0
- package/dist/chunk-OMELVAJD.js.map +7 -0
- package/dist/chunk-OUXHGDLH.js +95 -0
- package/dist/chunk-OUXHGDLH.js.map +7 -0
- package/dist/chunk-PCXUZ6AT.js +249 -0
- package/dist/chunk-PCXUZ6AT.js.map +7 -0
- package/dist/chunk-Q24ZGKIE.js +1097 -0
- package/dist/chunk-Q24ZGKIE.js.map +7 -0
- package/dist/chunk-QBHEERCF.js +30254 -0
- package/dist/chunk-QBHEERCF.js.map +7 -0
- package/dist/chunk-QIHB5PYM.js +472 -0
- package/dist/chunk-QIHB5PYM.js.map +7 -0
- package/dist/chunk-RQVLBMP7.js +24 -0
- package/dist/chunk-RQVLBMP7.js.map +7 -0
- package/dist/chunk-SWYJOV5E.js +490 -0
- package/dist/chunk-SWYJOV5E.js.map +7 -0
- package/dist/chunk-T6GVXTNQ.js +21 -0
- package/dist/chunk-T6GVXTNQ.js.map +7 -0
- package/dist/chunk-T7GPUZVK.js +766 -0
- package/dist/chunk-T7GPUZVK.js.map +7 -0
- package/dist/chunk-TXFCNQDE.js +2934 -0
- package/dist/chunk-TXFCNQDE.js.map +7 -0
- package/dist/chunk-UNNVICVU.js +95 -0
- package/dist/chunk-UNNVICVU.js.map +7 -0
- package/dist/chunk-UUNVJZWA.js +515 -0
- package/dist/chunk-UUNVJZWA.js.map +7 -0
- package/dist/chunk-VRGR4ZTQ.js +49 -0
- package/dist/chunk-VRGR4ZTQ.js.map +7 -0
- package/dist/chunk-VTVTEE5N.js +2613 -0
- package/dist/chunk-VTVTEE5N.js.map +7 -0
- package/dist/chunk-WPTPPOYN.js +936 -0
- package/dist/chunk-WPTPPOYN.js.map +7 -0
- package/dist/chunk-XXFY63TM.js +196 -0
- package/dist/chunk-XXFY63TM.js.map +7 -0
- package/dist/chunk-Z3HMXDXP.js +654 -0
- package/dist/chunk-Z3HMXDXP.js.map +7 -0
- package/dist/chunk-ZJGXEWKF.js +138 -0
- package/dist/chunk-ZJGXEWKF.js.map +7 -0
- package/dist/cli-RFYBXM7F.js +3917 -0
- package/dist/cli-RFYBXM7F.js.map +7 -0
- package/dist/commands-YOXMODDO.js +46 -0
- package/dist/commands-YOXMODDO.js.map +7 -0
- package/dist/config-5OPX3H2K.js +81 -0
- package/dist/config-5OPX3H2K.js.map +7 -0
- package/dist/context-THRRBPFP.js +30 -0
- package/dist/context-THRRBPFP.js.map +7 -0
- package/dist/costTracker-ELNBZ2DN.js +19 -0
- package/dist/costTracker-ELNBZ2DN.js.map +7 -0
- package/dist/customCommands-4XOZH44N.js +25 -0
- package/dist/customCommands-4XOZH44N.js.map +7 -0
- package/dist/env-EL4KBHMB.js +22 -0
- package/dist/env-EL4KBHMB.js.map +7 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +7 -0
- package/dist/kodeAgentSessionId-PROTVRBR.js +13 -0
- package/dist/kodeAgentSessionId-PROTVRBR.js.map +7 -0
- package/dist/kodeAgentSessionLoad-UMPV7MC3.js +18 -0
- package/dist/kodeAgentSessionLoad-UMPV7MC3.js.map +7 -0
- package/dist/kodeAgentSessionResume-YJS4FVQM.js +16 -0
- package/dist/kodeAgentSessionResume-YJS4FVQM.js.map +7 -0
- package/dist/kodeAgentStreamJson-3T26CHCP.js +13 -0
- package/dist/kodeAgentStreamJson-3T26CHCP.js.map +7 -0
- package/dist/kodeAgentStreamJsonSession-BZS2VDCY.js +131 -0
- package/dist/kodeAgentStreamJsonSession-BZS2VDCY.js.map +7 -0
- package/dist/kodeAgentStructuredStdio-TNB6U6SP.js +10 -0
- package/dist/kodeAgentStructuredStdio-TNB6U6SP.js.map +7 -0
- package/dist/kodeHooks-VUAWIY2D.js +36 -0
- package/dist/kodeHooks-VUAWIY2D.js.map +7 -0
- package/dist/llm-A3BCM4Q2.js +3118 -0
- package/dist/llm-A3BCM4Q2.js.map +7 -0
- package/dist/llmLazy-ZJSRLZVD.js +15 -0
- package/dist/llmLazy-ZJSRLZVD.js.map +7 -0
- package/dist/loader-HZQBWO74.js +28 -0
- package/dist/loader-HZQBWO74.js.map +7 -0
- package/dist/mcp-XKOJ55B2.js +49 -0
- package/dist/mcp-XKOJ55B2.js.map +7 -0
- package/dist/mentionProcessor-ANYU5MLF.js +211 -0
- package/dist/mentionProcessor-ANYU5MLF.js.map +7 -0
- package/dist/messages-75DL5XBP.js +63 -0
- package/dist/messages-75DL5XBP.js.map +7 -0
- package/dist/model-OPJGJZRC.js +30 -0
- package/dist/model-OPJGJZRC.js.map +7 -0
- package/dist/openai-DT54BAFP.js +29 -0
- package/dist/openai-DT54BAFP.js.map +7 -0
- package/dist/outputStyles-TPFVI52O.js +28 -0
- package/dist/outputStyles-TPFVI52O.js.map +7 -0
- package/dist/package.json +4 -0
- package/dist/pluginRuntime-W74PYSZ4.js +218 -0
- package/dist/pluginRuntime-W74PYSZ4.js.map +7 -0
- package/dist/pluginValidation-FALYRVI2.js +17 -0
- package/dist/pluginValidation-FALYRVI2.js.map +7 -0
- package/dist/prompts-J4TPRMJ3.js +48 -0
- package/dist/prompts-J4TPRMJ3.js.map +7 -0
- package/dist/query-K3QKBVDN.js +50 -0
- package/dist/query-K3QKBVDN.js.map +7 -0
- package/dist/responsesStreaming-HMB74TRD.js +10 -0
- package/dist/responsesStreaming-HMB74TRD.js.map +7 -0
- package/dist/ripgrep-XJGSUBG7.js +17 -0
- package/dist/ripgrep-XJGSUBG7.js.map +7 -0
- package/dist/skillMarketplace-AUGKNCPW.js +37 -0
- package/dist/skillMarketplace-AUGKNCPW.js.map +7 -0
- package/dist/state-DQYRXKTG.js +16 -0
- package/dist/state-DQYRXKTG.js.map +7 -0
- package/dist/theme-MS5HDUBJ.js +14 -0
- package/dist/theme-MS5HDUBJ.js.map +7 -0
- package/dist/toolPermissionContext-GYD5LYFK.js +17 -0
- package/dist/toolPermissionContext-GYD5LYFK.js.map +7 -0
- package/dist/toolPermissionSettings-4MPZVYDR.js +18 -0
- package/dist/toolPermissionSettings-4MPZVYDR.js.map +7 -0
- package/dist/tools-QW6SIJLJ.js +47 -0
- package/dist/tools-QW6SIJLJ.js.map +7 -0
- package/dist/userInput-F2PGBRFU.js +311 -0
- package/dist/userInput-F2PGBRFU.js.map +7 -0
- package/dist/uuid-GYYCQ6QK.js +9 -0
- package/dist/uuid-GYYCQ6QK.js.map +7 -0
- package/dist/yoga.wasm +0 -0
- package/package.json +136 -0
- package/scripts/binary-utils.cjs +62 -0
- package/scripts/cli-acp-wrapper.cjs +82 -0
- package/scripts/cli-wrapper.cjs +105 -0
- package/scripts/postinstall.js +144 -0
- package/yoga.wasm +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/config/schema.ts", "../src/core/config/defaults.ts", "../src/core/config/loader.ts", "../src/utils/text/json.ts", "../src/core/config/migrations.ts", "../src/core/config/validator.ts"],
|
|
4
|
+
"sourcesContent": ["import type { ThemeNames } from '@utils/theme'\n\nexport type McpStdioServerConfig = {\n type?: 'stdio'\n command: string\n args: string[]\n env?: Record<string, string>\n}\n\nexport type McpSSEServerConfig = {\n type: 'sse'\n url: string\n headers?: Record<string, string>\n headersHelper?: string\n}\n\nexport type McpHttpServerConfig = {\n type: 'http'\n url: string\n headers?: Record<string, string>\n headersHelper?: string\n}\n\nexport type McpSSEIdeServerConfig = {\n type: 'sse-ide'\n url: string\n ideName: string\n ideRunningInWindows?: boolean\n headers?: Record<string, string>\n headersHelper?: string\n}\n\nexport type McpWsServerConfig = {\n type: 'ws'\n url: string\n}\n\nexport type McpWsIdeServerConfig = {\n type: 'ws-ide'\n url: string\n ideName: string\n authToken?: string\n ideRunningInWindows?: boolean\n}\n\nexport type McpServerConfig =\n | McpStdioServerConfig\n | McpSSEServerConfig\n | McpHttpServerConfig\n | McpSSEIdeServerConfig\n | McpWsServerConfig\n | McpWsIdeServerConfig\n\nexport type ProjectConfig = {\n allowedTools: string[]\n deniedTools?: string[]\n askedTools?: string[]\n context: Record<string, string>\n contextFiles?: string[]\n history: string[]\n dontCrawlDirectory?: boolean\n enableArchitectTool?: boolean\n mcpContextUris: string[]\n mcpServers?: Record<string, McpServerConfig>\n approvedMcprcServers?: string[]\n rejectedMcprcServers?: string[]\n lastAPIDuration?: number\n lastCost?: number\n lastDuration?: number\n lastSessionId?: string\n exampleFiles?: string[]\n exampleFilesGeneratedAt?: number\n hasTrustDialogAccepted?: boolean\n hasCompletedProjectOnboarding?: boolean\n}\n\nexport type AutoUpdaterStatus =\n | 'disabled'\n | 'enabled'\n | 'no_permissions'\n | 'not_configured'\n\nexport function isAutoUpdaterStatus(value: string): value is AutoUpdaterStatus {\n return ['disabled', 'enabled', 'no_permissions', 'not_configured'].includes(\n value as AutoUpdaterStatus,\n )\n}\n\nexport type NotificationChannel =\n | 'iterm2'\n | 'terminal_bell'\n | 'iterm2_with_bell'\n | 'notifications_disabled'\n\nexport type ProviderType =\n | 'anthropic'\n | 'openai'\n | 'mistral'\n | 'deepseek'\n | 'kimi'\n | 'qwen'\n | 'glm'\n | 'minimax'\n | 'baidu-qianfan'\n | 'siliconflow'\n | 'bigdream'\n | 'opendev'\n | 'xai'\n | 'groq'\n | 'gemini'\n | 'ollama'\n | 'azure'\n | 'custom'\n | 'custom-openai'\n | (string & {})\n\nexport type ModelProfile = {\n name: string\n provider: ProviderType\n modelName: string\n baseURL?: string\n apiKey: string\n maxTokens: number\n contextLength: number\n reasoningEffort?: 'low' | 'medium' | 'high' | 'minimal' | string\n isActive: boolean\n createdAt: number\n lastUsed?: number\n isGPT5?: boolean\n validationStatus?: 'valid' | 'needs_repair' | 'auto_repaired'\n lastValidation?: number\n}\n\nexport type ModelPointerType = 'main' | 'task' | 'compact' | 'quick'\n\nexport type ModelPointers = {\n main: string\n task: string\n compact: string\n quick: string\n}\n\nexport type AccountInfo = {\n accountUuid: string\n emailAddress: string\n organizationUuid?: string\n}\n\nexport type GlobalConfig = {\n projects?: Record<string, ProjectConfig>\n numStartups: number\n autoUpdaterStatus?: AutoUpdaterStatus\n userID?: string\n theme: ThemeNames\n hasCompletedOnboarding?: boolean\n lastPlanModeUse?: number\n lastOnboardingVersion?: string\n lastReleaseNotesSeen?: string\n mcpServers?: Record<string, McpServerConfig>\n preferredNotifChannel: NotificationChannel\n verbose: boolean\n customApiKeyResponses?: {\n approved?: string[]\n rejected?: string[]\n }\n primaryProvider?: ProviderType\n maxTokens?: number\n autoCompactThreshold?: number\n hasAcknowledgedCostThreshold?: boolean\n oauthAccount?: AccountInfo\n proxy?: string\n stream?: boolean\n\n modelProfiles?: ModelProfile[]\n modelPointers?: ModelPointers\n defaultModelName?: string\n lastDismissedUpdateVersion?: string\n}\n\nexport const GLOBAL_CONFIG_KEYS = [\n 'autoUpdaterStatus',\n 'theme',\n 'hasCompletedOnboarding',\n 'lastOnboardingVersion',\n 'lastReleaseNotesSeen',\n 'verbose',\n 'customApiKeyResponses',\n 'primaryProvider',\n 'preferredNotifChannel',\n 'maxTokens',\n 'autoCompactThreshold',\n] as const\n\nexport type GlobalConfigKey = (typeof GLOBAL_CONFIG_KEYS)[number]\n\nexport function isGlobalConfigKey(key: string): key is GlobalConfigKey {\n return GLOBAL_CONFIG_KEYS.includes(key as GlobalConfigKey)\n}\n\nexport const PROJECT_CONFIG_KEYS = [\n 'dontCrawlDirectory',\n 'enableArchitectTool',\n 'hasTrustDialogAccepted',\n 'hasCompletedProjectOnboarding',\n] as const\n\nexport type ProjectConfigKey = (typeof PROJECT_CONFIG_KEYS)[number]\n\nexport function isProjectConfigKey(key: string): key is ProjectConfigKey {\n return PROJECT_CONFIG_KEYS.includes(key as ProjectConfigKey)\n}\n\nexport type ProjectMcpServerDefinitions = {\n servers: Record<string, McpServerConfig>\n sources: Record<string, '.mcp.json' | '.mcprc'>\n mcpJsonPath: string\n mcprcPath: string\n}\n", "import { homedir } from 'os'\nimport type { GlobalConfig, ProjectConfig, ProviderType } from './schema'\nimport type { ThemeNames } from '@utils/theme'\n\nexport const DEFAULT_PROJECT_CONFIG: ProjectConfig = {\n allowedTools: [],\n deniedTools: [],\n askedTools: [],\n context: {},\n history: [],\n dontCrawlDirectory: false,\n enableArchitectTool: false,\n mcpContextUris: [],\n mcpServers: {},\n approvedMcprcServers: [],\n rejectedMcprcServers: [],\n hasTrustDialogAccepted: false,\n}\n\nexport function defaultConfigForProject(projectPath: string): ProjectConfig {\n const config = { ...DEFAULT_PROJECT_CONFIG }\n if (projectPath === homedir()) {\n config.dontCrawlDirectory = true\n }\n return config\n}\n\nexport const DEFAULT_GLOBAL_CONFIG: GlobalConfig = {\n numStartups: 0,\n autoUpdaterStatus: 'not_configured',\n theme: 'dark' as ThemeNames,\n preferredNotifChannel: 'iterm2',\n verbose: false,\n primaryProvider: 'anthropic' as ProviderType,\n customApiKeyResponses: {\n approved: [],\n rejected: [],\n },\n stream: true,\n\n modelProfiles: [],\n modelPointers: {\n main: '',\n task: '',\n compact: '',\n quick: '',\n },\n lastDismissedUpdateVersion: undefined,\n}\n\n", "import { existsSync, readFileSync, writeFileSync } from 'fs'\nimport { join, posix, resolve, win32 } from 'path'\nimport { cloneDeep, memoize, pick } from 'lodash-es'\nimport { homedir } from 'os'\nimport { randomBytes } from 'crypto'\nimport { getGlobalConfigFilePath } from '@utils/config/env'\nimport { getCwd } from '@utils/state'\nimport { safeParseJSON } from '@utils/text/json'\nimport { ConfigParseError } from '@utils/text/errors'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport {\n DEFAULT_GLOBAL_CONFIG,\n DEFAULT_PROJECT_CONFIG,\n defaultConfigForProject,\n} from './defaults'\nimport {\n GLOBAL_CONFIG_KEYS,\n PROJECT_CONFIG_KEYS,\n isGlobalConfigKey,\n isAutoUpdaterStatus,\n isProjectConfigKey,\n type GlobalConfig,\n type McpServerConfig,\n type ProjectConfig,\n type ProjectMcpServerDefinitions,\n} from './schema'\nimport { migrateModelProfilesRemoveId } from './migrations'\n\nfunction expandHomeDirForPlatform(\n input: string,\n homeDirPath: string,\n platform: NodeJS.Platform,\n): string {\n const trimmed = input.trim()\n if (!trimmed) return trimmed\n if (trimmed === '~') return homeDirPath\n if (trimmed.startsWith('~/') || trimmed.startsWith('~\\\\')) {\n const rest = trimmed.slice(2)\n return platform === 'win32'\n ? win32.join(homeDirPath, rest)\n : posix.join(homeDirPath, rest)\n }\n return trimmed\n}\n\nexport function normalizeProjectPathForComparison(\n projectPath: string,\n baseDir: string,\n opts?: { platform?: NodeJS.Platform; homeDir?: string },\n): string {\n const platform = opts?.platform ?? process.platform\n const homeDirPath = opts?.homeDir ?? homedir()\n const expanded = expandHomeDirForPlatform(projectPath, homeDirPath, platform)\n if (!expanded) return ''\n\n if (platform === 'win32') {\n const resolved = win32.isAbsolute(expanded)\n ? win32.resolve(expanded)\n : win32.resolve(baseDir, expanded)\n return resolved.toLowerCase()\n }\n\n const resolved = posix.isAbsolute(expanded)\n ? posix.resolve(expanded)\n : posix.resolve(baseDir, expanded)\n return resolved\n}\n\nfunction findMatchingProjectKey(\n projects: Record<string, ProjectConfig> | undefined,\n absolutePath: string,\n): string | undefined {\n if (!projects) return undefined\n if (projects[absolutePath]) return absolutePath\n\n const normalizedTarget = normalizeProjectPathForComparison(\n absolutePath,\n absolutePath,\n )\n\n for (const key of Object.keys(projects)) {\n if (\n normalizeProjectPathForComparison(key, absolutePath) === normalizedTarget\n ) {\n return key\n }\n }\n\n return undefined\n}\n\nexport function checkHasTrustDialogAccepted(): boolean {\n let currentPath = getCwd()\n const config = getConfig(getGlobalConfigFilePath(), DEFAULT_GLOBAL_CONFIG)\n\n while (true) {\n const projectKey = findMatchingProjectKey(config.projects, currentPath)\n const projectConfig = projectKey ? config.projects?.[projectKey] : undefined\n if (projectConfig?.hasTrustDialogAccepted) {\n return true\n }\n const parentPath = resolve(currentPath, '..')\n if (parentPath === currentPath) {\n break\n }\n currentPath = parentPath\n }\n\n return false\n}\n\nconst TEST_GLOBAL_CONFIG_FOR_TESTING: GlobalConfig = {\n ...DEFAULT_GLOBAL_CONFIG,\n autoUpdaterStatus: 'disabled',\n}\nconst TEST_PROJECT_CONFIG_FOR_TESTING: ProjectConfig = {\n ...DEFAULT_PROJECT_CONFIG,\n}\n\nexport function saveGlobalConfig(config: GlobalConfig): void {\n if (process.env.NODE_ENV === 'test') {\n for (const key in config) {\n TEST_GLOBAL_CONFIG_FOR_TESTING[key] = config[key]\n }\n return\n }\n\n saveConfig(\n getGlobalConfigFilePath(),\n {\n ...config,\n projects: getConfig(getGlobalConfigFilePath(), DEFAULT_GLOBAL_CONFIG)\n .projects,\n },\n DEFAULT_GLOBAL_CONFIG,\n )\n}\n\nexport function getGlobalConfig(): GlobalConfig {\n if (process.env.NODE_ENV === 'test') {\n return TEST_GLOBAL_CONFIG_FOR_TESTING\n }\n const config = getConfig(getGlobalConfigFilePath(), DEFAULT_GLOBAL_CONFIG)\n return migrateModelProfilesRemoveId(config)\n}\n\nexport function normalizeApiKeyForConfig(apiKey: string): string {\n return apiKey?.slice(-20) ?? ''\n}\n\nexport function getCustomApiKeyStatus(\n truncatedApiKey: string,\n): 'approved' | 'rejected' | 'new' {\n const config = getGlobalConfig()\n if (config.customApiKeyResponses?.approved?.includes(truncatedApiKey)) {\n return 'approved'\n }\n if (config.customApiKeyResponses?.rejected?.includes(truncatedApiKey)) {\n return 'rejected'\n }\n return 'new'\n}\n\nfunction saveConfig<A extends object>(\n file: string,\n config: A,\n defaultConfig: A,\n): void {\n const filteredConfig = Object.fromEntries(\n Object.entries(config).filter(\n ([key, value]) =>\n JSON.stringify(value) !== JSON.stringify(defaultConfig[key as keyof A]),\n ),\n )\n try {\n writeFileSync(file, JSON.stringify(filteredConfig, null, 2), 'utf-8')\n } catch (error) {\n const err = error as NodeJS.ErrnoException\n if (\n err?.code === 'EACCES' ||\n err?.code === 'EPERM' ||\n err?.code === 'EROFS'\n ) {\n debugLogger.state('CONFIG_SAVE_SKIPPED', {\n file,\n reason: String(err.code),\n })\n return\n }\n throw error\n }\n}\n\nlet configReadingAllowed = false\n\nexport function enableConfigs(): void {\n configReadingAllowed = true\n getConfig(\n getGlobalConfigFilePath(),\n DEFAULT_GLOBAL_CONFIG,\n true,\n )\n}\n\nfunction getConfig<A>(\n file: string,\n defaultConfig: A,\n throwOnInvalid?: boolean,\n): A {\n void configReadingAllowed\n\n debugLogger.state('CONFIG_LOAD_START', {\n file,\n fileExists: String(existsSync(file)),\n throwOnInvalid: String(!!throwOnInvalid),\n })\n\n if (!existsSync(file)) {\n debugLogger.state('CONFIG_LOAD_DEFAULT', {\n file,\n reason: 'file_not_exists',\n defaultConfigKeys: Object.keys(defaultConfig as object).join(', '),\n })\n return cloneDeep(defaultConfig)\n }\n\n try {\n const fileContent = readFileSync(file, 'utf-8')\n debugLogger.state('CONFIG_FILE_READ', {\n file,\n contentLength: String(fileContent.length),\n contentPreview:\n fileContent.substring(0, 100) + (fileContent.length > 100 ? '...' : ''),\n })\n\n try {\n const parsedConfig = JSON.parse(fileContent)\n debugLogger.state('CONFIG_JSON_PARSED', {\n file,\n parsedKeys: Object.keys(parsedConfig).join(', '),\n })\n\n const finalConfig = {\n ...cloneDeep(defaultConfig),\n ...parsedConfig,\n }\n\n debugLogger.state('CONFIG_LOAD_SUCCESS', {\n file,\n finalConfigKeys: Object.keys(finalConfig as object).join(', '),\n })\n\n return finalConfig\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n\n debugLogger.error('CONFIG_JSON_PARSE_ERROR', {\n file,\n errorMessage,\n errorType: error instanceof Error ? error.constructor.name : typeof error,\n contentLength: String(fileContent.length),\n })\n\n throw new ConfigParseError(errorMessage, file, defaultConfig)\n }\n } catch (error: unknown) {\n if (error instanceof ConfigParseError && throwOnInvalid) {\n debugLogger.error('CONFIG_PARSE_ERROR_RETHROWN', {\n file,\n throwOnInvalid: String(throwOnInvalid),\n errorMessage: error.message,\n })\n throw error\n }\n\n debugLogger.warn('CONFIG_FALLBACK_TO_DEFAULT', {\n file,\n errorType: error instanceof Error ? error.constructor.name : typeof error,\n errorMessage: error instanceof Error ? error.message : String(error),\n action: 'using_default_config',\n })\n\n return cloneDeep(defaultConfig)\n }\n}\n\nexport function getCurrentProjectConfig(): ProjectConfig {\n if (process.env.NODE_ENV === 'test') {\n return TEST_PROJECT_CONFIG_FOR_TESTING\n }\n\n const absolutePath = resolve(getCwd())\n const config = getConfig(getGlobalConfigFilePath(), DEFAULT_GLOBAL_CONFIG)\n\n if (!config.projects) {\n return defaultConfigForProject(absolutePath)\n }\n\n const projectKey = findMatchingProjectKey(config.projects, absolutePath)\n const projectConfig =\n projectKey && config.projects[projectKey]\n ? config.projects[projectKey]\n : defaultConfigForProject(absolutePath)\n if (typeof projectConfig.allowedTools === 'string') {\n projectConfig.allowedTools =\n (safeParseJSON(projectConfig.allowedTools) as string[]) ?? []\n }\n if (typeof (projectConfig as any).deniedTools === 'string') {\n ;(projectConfig as any).deniedTools =\n (safeParseJSON((projectConfig as any).deniedTools) as string[]) ?? []\n }\n if (typeof (projectConfig as any).askedTools === 'string') {\n ;(projectConfig as any).askedTools =\n (safeParseJSON((projectConfig as any).askedTools) as string[]) ?? []\n }\n return projectConfig\n}\n\nexport function saveCurrentProjectConfig(projectConfig: ProjectConfig): void {\n if (process.env.NODE_ENV === 'test') {\n for (const key in projectConfig) {\n TEST_PROJECT_CONFIG_FOR_TESTING[key] = projectConfig[key]\n }\n return\n }\n const config = getConfig(getGlobalConfigFilePath(), DEFAULT_GLOBAL_CONFIG)\n const resolvedCwd = resolve(getCwd())\n const existingKey = findMatchingProjectKey(config.projects, resolvedCwd)\n const storageKey = existingKey ?? resolvedCwd\n\n saveConfig(\n getGlobalConfigFilePath(),\n {\n ...config,\n projects: {\n ...config.projects,\n [storageKey]: projectConfig,\n },\n },\n DEFAULT_GLOBAL_CONFIG,\n )\n}\n\nexport async function isAutoUpdaterDisabled(): Promise<boolean> {\n const status = getGlobalConfig().autoUpdaterStatus\n return status !== 'enabled'\n}\n\nexport const TEST_MCPRC_CONFIG_FOR_TESTING: Record<string, McpServerConfig> = {}\n\nexport function clearMcprcConfigForTesting(): void {\n if (process.env.NODE_ENV === 'test') {\n Object.keys(TEST_MCPRC_CONFIG_FOR_TESTING).forEach(key => {\n delete TEST_MCPRC_CONFIG_FOR_TESTING[key]\n })\n }\n}\n\nexport function addMcprcServerForTesting(\n name: string,\n server: McpServerConfig,\n): void {\n if (process.env.NODE_ENV === 'test') {\n TEST_MCPRC_CONFIG_FOR_TESTING[name] = server\n }\n}\n\nexport function removeMcprcServerForTesting(name: string): void {\n if (process.env.NODE_ENV === 'test') {\n if (!TEST_MCPRC_CONFIG_FOR_TESTING[name]) {\n throw new Error(`No MCP server found with name: ${name} in .mcprc`)\n }\n delete TEST_MCPRC_CONFIG_FOR_TESTING[name]\n }\n}\n\nexport const getMcprcConfig = memoize(\n (): Record<string, McpServerConfig> => {\n if (process.env.NODE_ENV === 'test') {\n return TEST_MCPRC_CONFIG_FOR_TESTING\n }\n\n const mcprcPath = join(getCwd(), '.mcprc')\n if (!existsSync(mcprcPath)) {\n return {}\n }\n\n try {\n const mcprcContent = readFileSync(mcprcPath, 'utf-8')\n const config = safeParseJSON(mcprcContent)\n if (config && typeof config === 'object') {\n return config as Record<string, McpServerConfig>\n }\n } catch {}\n return {}\n },\n () => {\n const cwd = getCwd()\n const mcprcPath = join(cwd, '.mcprc')\n if (existsSync(mcprcPath)) {\n try {\n const stat = readFileSync(mcprcPath, 'utf-8')\n return `${cwd}:${stat}`\n } catch {\n return cwd\n }\n }\n return cwd\n },\n)\n\nfunction parseMcpServersFromMcpJson(\n value: unknown,\n): Record<string, McpServerConfig> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return {}\n const raw = (value as { mcpServers?: unknown }).mcpServers\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return {}\n return raw as Record<string, McpServerConfig>\n}\n\nfunction parseMcpServersFromMcprc(\n value: unknown,\n): Record<string, McpServerConfig> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return {}\n const maybeNested = (value as { mcpServers?: unknown }).mcpServers\n if (\n maybeNested &&\n typeof maybeNested === 'object' &&\n !Array.isArray(maybeNested)\n ) {\n return maybeNested as Record<string, McpServerConfig>\n }\n return value as Record<string, McpServerConfig>\n}\n\nexport const getProjectMcpServerDefinitions = memoize(\n (): ProjectMcpServerDefinitions => {\n if (process.env.NODE_ENV === 'test') {\n return {\n servers: {},\n sources: {},\n mcpJsonPath: join(getCwd(), '.mcp.json'),\n mcprcPath: join(getCwd(), '.mcprc'),\n }\n }\n\n const cwd = getCwd()\n const mcpJsonPath = join(cwd, '.mcp.json')\n const mcprcPath = join(cwd, '.mcprc')\n\n let mcpJsonServers: Record<string, McpServerConfig> = {}\n let mcprcServers: Record<string, McpServerConfig> = {}\n\n if (existsSync(mcpJsonPath)) {\n try {\n const content = readFileSync(mcpJsonPath, 'utf-8')\n const parsed = safeParseJSON(content)\n mcpJsonServers = parseMcpServersFromMcpJson(parsed)\n } catch {}\n }\n\n if (existsSync(mcprcPath)) {\n try {\n const content = readFileSync(mcprcPath, 'utf-8')\n const parsed = safeParseJSON(content)\n mcprcServers = parseMcpServersFromMcprc(parsed)\n } catch {}\n }\n\n const sources: Record<string, '.mcp.json' | '.mcprc'> = {}\n for (const name of Object.keys(mcpJsonServers)) {\n sources[name] = '.mcp.json'\n }\n for (const name of Object.keys(mcprcServers)) {\n sources[name] = '.mcprc'\n }\n\n return {\n servers: { ...mcpJsonServers, ...mcprcServers },\n sources,\n mcpJsonPath,\n mcprcPath,\n }\n },\n () => {\n const cwd = getCwd()\n const mcpJsonPath = join(cwd, '.mcp.json')\n const mcprcPath = join(cwd, '.mcprc')\n\n const parts: string[] = [cwd]\n\n if (existsSync(mcpJsonPath)) {\n try {\n parts.push('mcp.json')\n parts.push(readFileSync(mcpJsonPath, 'utf-8'))\n } catch {}\n }\n\n if (existsSync(mcprcPath)) {\n try {\n parts.push('mcprc')\n parts.push(readFileSync(mcprcPath, 'utf-8'))\n } catch {}\n }\n\n return parts.join(':')\n },\n)\n\nexport function getOrCreateUserID(): string {\n const config = getGlobalConfig()\n if (config.userID) {\n return config.userID\n }\n\n const userID = randomBytes(32).toString('hex')\n saveGlobalConfig({ ...config, userID })\n return userID\n}\n\nexport function getConfigForCLI(key: string, global: boolean): unknown {\n if (global) {\n if (!isGlobalConfigKey(key)) {\n console.error(\n `Error: '${key}' is not a valid config key. Valid keys are: ${GLOBAL_CONFIG_KEYS.join(', ')}`,\n )\n process.exit(1)\n }\n return getGlobalConfig()[key]\n } else {\n if (!isProjectConfigKey(key)) {\n console.error(\n `Error: '${key}' is not a valid config key. Valid keys are: ${PROJECT_CONFIG_KEYS.join(', ')}`,\n )\n process.exit(1)\n }\n return getCurrentProjectConfig()[key]\n }\n}\n\nexport function setConfigForCLI(\n key: string,\n value: unknown,\n global: boolean,\n): void {\n if (global) {\n if (!isGlobalConfigKey(key)) {\n console.error(\n `Error: Cannot set '${key}'. Only these keys can be modified: ${GLOBAL_CONFIG_KEYS.join(', ')}`,\n )\n process.exit(1)\n }\n\n if (key === 'autoUpdaterStatus' && !isAutoUpdaterStatus(value as string)) {\n console.error(\n `Error: Invalid value for autoUpdaterStatus. Must be one of: disabled, enabled, no_permissions, not_configured`,\n )\n process.exit(1)\n }\n\n const currentConfig = getGlobalConfig()\n saveGlobalConfig({\n ...currentConfig,\n [key]: value,\n })\n } else {\n if (!isProjectConfigKey(key)) {\n console.error(\n `Error: Cannot set '${key}'. Only these keys can be modified: ${PROJECT_CONFIG_KEYS.join(', ')}. Did you mean --global?`,\n )\n process.exit(1)\n }\n const currentConfig = getCurrentProjectConfig()\n saveCurrentProjectConfig({\n ...currentConfig,\n [key]: value,\n })\n }\n setTimeout(() => {\n process.exit(0)\n }, 100)\n}\n\nexport function deleteConfigForCLI(key: string, global: boolean): void {\n if (global) {\n if (!isGlobalConfigKey(key)) {\n console.error(\n `Error: Cannot delete '${key}'. Only these keys can be modified: ${GLOBAL_CONFIG_KEYS.join(', ')}`,\n )\n process.exit(1)\n }\n const currentConfig = getGlobalConfig()\n delete currentConfig[key]\n saveGlobalConfig(currentConfig)\n } else {\n if (!isProjectConfigKey(key)) {\n console.error(\n `Error: Cannot delete '${key}'. Only these keys can be modified: ${PROJECT_CONFIG_KEYS.join(', ')}. Did you mean --global?`,\n )\n process.exit(1)\n }\n const currentConfig = getCurrentProjectConfig()\n delete currentConfig[key]\n saveCurrentProjectConfig(currentConfig)\n }\n}\n\nexport function listConfigForCLI(global: true): GlobalConfig\nexport function listConfigForCLI(global: false): ProjectConfig\nexport function listConfigForCLI(global: boolean): object {\n if (global) {\n const currentConfig = pick(getGlobalConfig(), GLOBAL_CONFIG_KEYS)\n return currentConfig\n } else {\n return pick(getCurrentProjectConfig(), PROJECT_CONFIG_KEYS)\n }\n}\n\nexport function getOpenAIApiKey(): string | undefined {\n return process.env.OPENAI_API_KEY\n}\n\nexport function getAnthropicApiKey(): string {\n return process.env.ANTHROPIC_API_KEY || ''\n}\n", "import { logError } from '@utils/log'\n\nexport function safeParseJSON(json: string | null | undefined): unknown {\n if (!json) {\n return null\n }\n try {\n return JSON.parse(json)\n } catch (e) {\n logError(e)\n return null\n }\n}\n", "import type { GlobalConfig, ModelPointers, ModelProfile } from './schema'\n\nexport function migrateModelProfilesRemoveId(config: GlobalConfig): GlobalConfig {\n if (!config.modelProfiles) return config\n\n const idToModelNameMap = new Map<string, string>()\n const migratedProfiles = config.modelProfiles.map(profile => {\n if ((profile as any).id && profile.modelName) {\n idToModelNameMap.set((profile as any).id, profile.modelName)\n }\n\n const { id, ...profileWithoutId } = profile as any\n return profileWithoutId as ModelProfile\n })\n\n const migratedPointers: ModelPointers = {\n main: '',\n task: '',\n compact: '',\n quick: '',\n }\n\n const rawPointers = config.modelPointers as\n | Record<string, unknown>\n | undefined\n const rawMain = typeof rawPointers?.main === 'string' ? rawPointers.main : ''\n const rawTask = typeof rawPointers?.task === 'string' ? rawPointers.task : ''\n const rawQuick =\n typeof rawPointers?.quick === 'string' ? rawPointers.quick : ''\n const rawCompact =\n typeof rawPointers?.compact === 'string'\n ? rawPointers.compact\n : typeof rawPointers?.reasoning === 'string'\n ? rawPointers.reasoning\n : ''\n\n if (rawMain) migratedPointers.main = idToModelNameMap.get(rawMain) || rawMain\n if (rawTask) migratedPointers.task = idToModelNameMap.get(rawTask) || rawTask\n if (rawCompact)\n migratedPointers.compact = idToModelNameMap.get(rawCompact) || rawCompact\n if (rawQuick)\n migratedPointers.quick = idToModelNameMap.get(rawQuick) || rawQuick\n\n let defaultModelName: string | undefined\n if ((config as any).defaultModelId) {\n defaultModelName =\n idToModelNameMap.get((config as any).defaultModelId) ||\n (config as any).defaultModelId\n } else if ((config as any).defaultModelName) {\n defaultModelName = (config as any).defaultModelName\n }\n\n const migratedConfig = { ...config }\n delete (migratedConfig as any).defaultModelId\n delete (migratedConfig as any).currentSelectedModelId\n delete (migratedConfig as any).mainAgentModelId\n delete (migratedConfig as any).taskToolModelId\n\n return {\n ...migratedConfig,\n modelProfiles: migratedProfiles,\n modelPointers: migratedPointers,\n defaultModelName,\n }\n}\n\n", "import type { ModelPointerType, ModelProfile, ProviderType } from './schema'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { getGlobalConfig, saveGlobalConfig } from './loader'\n\nexport function setAllPointersToModel(modelName: string): void {\n const config = getGlobalConfig()\n const updatedConfig = {\n ...config,\n modelPointers: {\n main: modelName,\n task: modelName,\n compact: modelName,\n quick: modelName,\n },\n defaultModelName: modelName,\n }\n saveGlobalConfig(updatedConfig)\n}\n\nexport function setModelPointer(\n pointer: ModelPointerType,\n modelName: string,\n): void {\n const config = getGlobalConfig()\n const updatedConfig = {\n ...config,\n modelPointers: {\n ...config.modelPointers,\n [pointer]: modelName,\n },\n }\n saveGlobalConfig(updatedConfig)\n\n import('../../utils/model').then(({ reloadModelManager }) => {\n reloadModelManager()\n })\n}\n\nexport function isGPT5ModelName(modelName: string): boolean {\n if (!modelName || typeof modelName !== 'string') return false\n const lowerName = modelName.toLowerCase()\n return lowerName.startsWith('gpt-5') || lowerName.includes('gpt-5')\n}\n\nexport function validateAndRepairGPT5Profile(\n profile: ModelProfile,\n): ModelProfile {\n const isGPT5 = isGPT5ModelName(profile.modelName)\n const now = Date.now()\n\n const repairedProfile: ModelProfile = { ...profile }\n let wasRepaired = false\n\n if (isGPT5 !== profile.isGPT5) {\n repairedProfile.isGPT5 = isGPT5\n wasRepaired = true\n }\n\n if (isGPT5) {\n\n const validReasoningEfforts = ['minimal', 'low', 'medium', 'high']\n if (\n !profile.reasoningEffort ||\n !validReasoningEfforts.includes(profile.reasoningEffort)\n ) {\n repairedProfile.reasoningEffort = 'medium'\n wasRepaired = true\n debugLogger.state('GPT5_CONFIG_AUTO_REPAIR', {\n model: profile.modelName,\n field: 'reasoningEffort',\n value: 'medium',\n })\n }\n\n if (profile.contextLength < 128000) {\n repairedProfile.contextLength = 128000\n wasRepaired = true\n debugLogger.state('GPT5_CONFIG_AUTO_REPAIR', {\n model: profile.modelName,\n field: 'contextLength',\n value: 128000,\n })\n }\n\n if (profile.maxTokens < 4000) {\n repairedProfile.maxTokens = 8192\n wasRepaired = true\n debugLogger.state('GPT5_CONFIG_AUTO_REPAIR', {\n model: profile.modelName,\n field: 'maxTokens',\n value: 8192,\n })\n }\n\n if (\n profile.provider !== 'openai' &&\n profile.provider !== 'custom-openai' &&\n profile.provider !== 'azure'\n ) {\n debugLogger.warn('GPT5_CONFIG_UNEXPECTED_PROVIDER', {\n model: profile.modelName,\n provider: profile.provider,\n expectedProviders: ['openai', 'custom-openai', 'azure'],\n })\n }\n\n if (profile.modelName.includes('gpt-5') && !profile.baseURL) {\n repairedProfile.baseURL = 'https://api.openai.com/v1'\n wasRepaired = true\n debugLogger.state('GPT5_CONFIG_AUTO_REPAIR', {\n model: profile.modelName,\n field: 'baseURL',\n value: 'https://api.openai.com/v1',\n })\n }\n }\n\n repairedProfile.validationStatus = wasRepaired ? 'auto_repaired' : 'valid'\n repairedProfile.lastValidation = now\n\n if (wasRepaired) {\n debugLogger.info('GPT5_CONFIG_AUTO_REPAIRED', { model: profile.modelName })\n }\n\n return repairedProfile\n}\n\nexport function validateAndRepairAllGPT5Profiles(): {\n repaired: number\n total: number\n} {\n const config = getGlobalConfig()\n if (!config.modelProfiles) {\n return { repaired: 0, total: 0 }\n }\n\n let repairCount = 0\n const repairedProfiles = config.modelProfiles.map(profile => {\n const repairedProfile = validateAndRepairGPT5Profile(profile)\n if (repairedProfile.validationStatus === 'auto_repaired') {\n repairCount++\n }\n return repairedProfile\n })\n\n if (repairCount > 0) {\n const updatedConfig = {\n ...config,\n modelProfiles: repairedProfiles,\n }\n saveGlobalConfig(updatedConfig)\n debugLogger.info('GPT5_CONFIG_AUTO_REPAIR_SUMMARY', {\n repaired: repairCount,\n total: config.modelProfiles.length,\n })\n }\n\n return { repaired: repairCount, total: config.modelProfiles.length }\n}\n\nexport function getGPT5ConfigRecommendations(\n modelName: string,\n): Partial<ModelProfile> {\n if (!isGPT5ModelName(modelName)) {\n return {}\n }\n\n const recommendations: Partial<ModelProfile> = {\n contextLength: 128000,\n maxTokens: 8192,\n reasoningEffort: 'medium',\n isGPT5: true,\n }\n\n if (modelName.includes('gpt-5-mini')) {\n recommendations.maxTokens = 4096\n recommendations.reasoningEffort = 'low'\n } else if (modelName.includes('gpt-5-nano')) {\n recommendations.maxTokens = 2048\n recommendations.reasoningEffort = 'minimal'\n }\n\n return recommendations\n}\n\nexport function createGPT5ModelProfile(\n name: string,\n modelName: string,\n apiKey: string,\n baseURL?: string,\n provider: ProviderType = 'openai',\n): ModelProfile {\n const recommendations = getGPT5ConfigRecommendations(modelName)\n\n const profile: ModelProfile = {\n name,\n provider,\n modelName,\n baseURL: baseURL || 'https://api.openai.com/v1',\n apiKey,\n maxTokens: recommendations.maxTokens || 8192,\n contextLength: recommendations.contextLength || 128000,\n reasoningEffort: recommendations.reasoningEffort || 'medium',\n isActive: true,\n createdAt: Date.now(),\n isGPT5: true,\n validationStatus: 'valid',\n lastValidation: Date.now(),\n }\n\n return profile\n}\n\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["homedir", "homedir", "resolved"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createRequire as __pybCreateRequire } from "node:module";
|
|
2
|
+
const require = __pybCreateRequire(import.meta.url);
|
|
3
|
+
|
|
4
|
+
// src/core/tools/tool.ts
|
|
5
|
+
function getToolDescription(tool) {
|
|
6
|
+
if (tool.cachedDescription) {
|
|
7
|
+
return tool.cachedDescription;
|
|
8
|
+
}
|
|
9
|
+
if (typeof tool.description === "string") {
|
|
10
|
+
return tool.description;
|
|
11
|
+
}
|
|
12
|
+
return `Tool: ${tool.name}`;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export {
|
|
16
|
+
getToolDescription
|
|
17
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/tools/tool.ts"],
|
|
4
|
+
"sourcesContent": ["import { z } from 'zod'\nimport type * as React from 'react'\nimport type { PermissionMode } from '@kode-types/permissionMode'\nimport type { ToolPermissionContext } from '@kode-types/toolPermissionContext'\n\nexport type SetToolJSXFn = (\n jsx: {\n jsx: React.ReactNode | null\n shouldHidePromptInput: boolean\n } | null,\n) => void\n\nexport interface ToolUseContext {\n messageId: string | undefined\n toolUseId?: string\n agentId?: string\n safeMode?: boolean\n abortController: AbortController\n readFileTimestamps: { [filePath: string]: number }\n options?: {\n commands?: any[]\n tools?: any[]\n verbose?: boolean\n slowAndCapableModel?: string\n safeMode?: boolean\n permissionMode?: PermissionMode\n toolPermissionContext?: ToolPermissionContext\n lastUserPrompt?: string\n forkNumber?: number\n messageLogName?: string\n maxThinkingTokens?: any\n model?: string\n commandAllowedTools?: string[]\n isKodingRequest?: boolean\n kodingContext?: string\n isCustomCommand?: boolean\n mcpClients?: any[]\n disableSlashCommands?: boolean\n persistSession?: boolean\n shouldAvoidPermissionPrompts?: boolean\n }\n responseState?: {\n previousResponseId?: string\n conversationId?: string\n }\n}\n\nexport interface ExtendedToolUseContext extends ToolUseContext {\n setToolJSX: SetToolJSXFn\n}\n\nexport interface ValidationResult {\n result: boolean\n message?: string\n errorCode?: number\n meta?: any\n}\n\nexport interface Tool<\n TInput extends z.ZodTypeAny = z.ZodTypeAny,\n TOutput = any,\n> {\n name: string\n description?: string | ((input?: z.infer<TInput>) => Promise<string>)\n inputSchema: TInput\n inputJSONSchema?: Record<string, unknown>\n prompt: (options?: { safeMode?: boolean }) => Promise<string>\n userFacingName?: (input?: z.infer<TInput>) => string\n cachedDescription?: string\n isEnabled: () => Promise<boolean>\n isReadOnly: (input?: z.infer<TInput>) => boolean\n isConcurrencySafe: (input?: z.infer<TInput>) => boolean\n needsPermissions: (input?: z.infer<TInput>) => boolean\n requiresUserInteraction?: (input?: z.infer<TInput>) => boolean\n validateInput?: (\n input: z.infer<TInput>,\n context?: ToolUseContext,\n ) => Promise<ValidationResult>\n renderResultForAssistant: (output: TOutput) => string | any[]\n renderToolUseMessage: (\n input: z.infer<TInput>,\n options: { verbose: boolean },\n ) => string | React.ReactElement | null\n renderToolUseRejectedMessage?: (...args: any[]) => React.ReactElement\n renderToolResultMessage?: (\n output: TOutput,\n options: { verbose: boolean },\n ) => React.ReactNode\n call: (\n input: z.infer<TInput>,\n context: ToolUseContext,\n ) => AsyncGenerator<\n | {\n type: 'result'\n data: TOutput\n resultForAssistant?: string | any[]\n newMessages?: unknown[]\n contextModifier?: {\n modifyContext: (ctx: ToolUseContext) => ToolUseContext\n }\n }\n | {\n type: 'progress'\n content: any\n normalizedMessages?: any[]\n tools?: any[]\n },\n void,\n unknown\n >\n}\n\nexport function getToolDescription(tool: Tool): string {\n if (tool.cachedDescription) {\n return tool.cachedDescription\n }\n\n if (typeof tool.description === 'string') {\n return tool.description\n }\n\n return `Tool: ${tool.name}`\n}\n"],
|
|
5
|
+
"mappings": ";;;;AAgHO,SAAS,mBAAmB,MAAoB;AACrD,MAAI,KAAK,mBAAmB;AAC1B,WAAO,KAAK;AAAA,EACd;AAEA,MAAI,OAAO,KAAK,gBAAgB,UAAU;AACxC,WAAO,KAAK;AAAA,EACd;AAEA,SAAO,SAAS,KAAK,IAAI;AAC3B;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { createRequire as __pybCreateRequire } from "node:module";
|
|
2
|
+
const require = __pybCreateRequire(import.meta.url);
|
|
3
|
+
import {
|
|
4
|
+
setRequestStatus
|
|
5
|
+
} from "./chunk-3DFBSQIT.js";
|
|
6
|
+
|
|
7
|
+
// src/services/ai/adapters/responsesStreaming.ts
|
|
8
|
+
async function processResponsesStream(stream, startTime, fallbackResponseId) {
|
|
9
|
+
const contentBlocks = [];
|
|
10
|
+
const usage = {
|
|
11
|
+
prompt_tokens: 0,
|
|
12
|
+
completion_tokens: 0
|
|
13
|
+
};
|
|
14
|
+
let responseId = fallbackResponseId;
|
|
15
|
+
const pendingToolCalls = [];
|
|
16
|
+
let hasMarkedStreaming = false;
|
|
17
|
+
for await (const event of stream) {
|
|
18
|
+
if (event.type === "message_start") {
|
|
19
|
+
responseId = event.responseId || responseId;
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (event.type === "text_delta") {
|
|
23
|
+
if (!hasMarkedStreaming) {
|
|
24
|
+
setRequestStatus({ kind: "streaming" });
|
|
25
|
+
hasMarkedStreaming = true;
|
|
26
|
+
}
|
|
27
|
+
const last = contentBlocks[contentBlocks.length - 1];
|
|
28
|
+
if (!last || last.type !== "text") {
|
|
29
|
+
contentBlocks.push({ type: "text", text: event.delta, citations: [] });
|
|
30
|
+
} else {
|
|
31
|
+
last.text += event.delta;
|
|
32
|
+
}
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (event.type === "tool_request") {
|
|
36
|
+
setRequestStatus({ kind: "tool", detail: event.tool?.name });
|
|
37
|
+
pendingToolCalls.push(event.tool);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (event.type === "usage") {
|
|
41
|
+
usage.prompt_tokens = event.usage.input;
|
|
42
|
+
usage.completion_tokens = event.usage.output;
|
|
43
|
+
usage.promptTokens = event.usage.input;
|
|
44
|
+
usage.completionTokens = event.usage.output;
|
|
45
|
+
usage.totalTokens = event.usage.total ?? event.usage.input + event.usage.output;
|
|
46
|
+
if (event.usage.reasoning !== void 0) {
|
|
47
|
+
usage.reasoningTokens = event.usage.reasoning;
|
|
48
|
+
}
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
for (const toolCall of pendingToolCalls) {
|
|
53
|
+
let toolArgs = {};
|
|
54
|
+
try {
|
|
55
|
+
toolArgs = toolCall.input ? JSON.parse(toolCall.input) : {};
|
|
56
|
+
} catch {
|
|
57
|
+
}
|
|
58
|
+
contentBlocks.push({
|
|
59
|
+
type: "tool_use",
|
|
60
|
+
id: toolCall.id,
|
|
61
|
+
name: toolCall.name,
|
|
62
|
+
input: toolArgs
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
const assistantMessage = {
|
|
66
|
+
type: "assistant",
|
|
67
|
+
message: {
|
|
68
|
+
role: "assistant",
|
|
69
|
+
content: contentBlocks,
|
|
70
|
+
usage: {
|
|
71
|
+
input_tokens: usage.prompt_tokens ?? 0,
|
|
72
|
+
output_tokens: usage.completion_tokens ?? 0,
|
|
73
|
+
prompt_tokens: usage.prompt_tokens ?? 0,
|
|
74
|
+
completion_tokens: usage.completion_tokens ?? 0,
|
|
75
|
+
totalTokens: usage.totalTokens ?? (usage.prompt_tokens || 0) + (usage.completion_tokens || 0),
|
|
76
|
+
reasoningTokens: usage.reasoningTokens
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
costUSD: 0,
|
|
80
|
+
durationMs: Date.now() - startTime,
|
|
81
|
+
uuid: `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`,
|
|
82
|
+
responseId
|
|
83
|
+
};
|
|
84
|
+
return {
|
|
85
|
+
assistantMessage,
|
|
86
|
+
rawResponse: {
|
|
87
|
+
id: responseId,
|
|
88
|
+
content: contentBlocks,
|
|
89
|
+
usage
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export {
|
|
95
|
+
processResponsesStream
|
|
96
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/services/ai/adapters/responsesStreaming.ts"],
|
|
4
|
+
"sourcesContent": ["import { StreamingEvent } from './base'\nimport { AssistantMessage } from '@query'\nimport { setRequestStatus } from '@utils/session/requestStatus'\n\nexport async function processResponsesStream(\n stream: AsyncGenerator<StreamingEvent>,\n startTime: number,\n fallbackResponseId: string,\n): Promise<{ assistantMessage: AssistantMessage; rawResponse: any }> {\n const contentBlocks: any[] = []\n const usage: any = {\n prompt_tokens: 0,\n completion_tokens: 0,\n }\n\n let responseId = fallbackResponseId\n const pendingToolCalls: any[] = []\n let hasMarkedStreaming = false\n\n for await (const event of stream) {\n if (event.type === 'message_start') {\n responseId = event.responseId || responseId\n continue\n }\n\n if (event.type === 'text_delta') {\n if (!hasMarkedStreaming) {\n setRequestStatus({ kind: 'streaming' })\n hasMarkedStreaming = true\n }\n const last = contentBlocks[contentBlocks.length - 1]\n if (!last || last.type !== 'text') {\n contentBlocks.push({ type: 'text', text: event.delta, citations: [] })\n } else {\n last.text += event.delta\n }\n continue\n }\n\n if (event.type === 'tool_request') {\n setRequestStatus({ kind: 'tool', detail: event.tool?.name })\n pendingToolCalls.push(event.tool)\n continue\n }\n\n if (event.type === 'usage') {\n usage.prompt_tokens = event.usage.input\n usage.completion_tokens = event.usage.output\n usage.promptTokens = event.usage.input\n usage.completionTokens = event.usage.output\n usage.totalTokens =\n event.usage.total ?? event.usage.input + event.usage.output\n if (event.usage.reasoning !== undefined) {\n usage.reasoningTokens = event.usage.reasoning\n }\n continue\n }\n }\n\n for (const toolCall of pendingToolCalls) {\n let toolArgs = {}\n try {\n toolArgs = toolCall.input ? JSON.parse(toolCall.input) : {}\n } catch {}\n\n contentBlocks.push({\n type: 'tool_use',\n id: toolCall.id,\n name: toolCall.name,\n input: toolArgs,\n })\n }\n\n const assistantMessage: AssistantMessage = {\n type: 'assistant',\n message: {\n role: 'assistant',\n content: contentBlocks,\n usage: {\n input_tokens: usage.prompt_tokens ?? 0,\n output_tokens: usage.completion_tokens ?? 0,\n prompt_tokens: usage.prompt_tokens ?? 0,\n completion_tokens: usage.completion_tokens ?? 0,\n totalTokens:\n usage.totalTokens ??\n (usage.prompt_tokens || 0) + (usage.completion_tokens || 0),\n reasoningTokens: usage.reasoningTokens,\n },\n },\n costUSD: 0,\n durationMs: Date.now() - startTime,\n uuid: `${Date.now()}-${Math.random().toString(36).slice(2, 11)}` as any,\n responseId,\n }\n\n return {\n assistantMessage,\n rawResponse: {\n id: responseId,\n content: contentBlocks,\n usage,\n },\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;AAIA,eAAsB,uBACpB,QACA,WACA,oBACmE;AACnE,QAAM,gBAAuB,CAAC;AAC9B,QAAM,QAAa;AAAA,IACjB,eAAe;AAAA,IACf,mBAAmB;AAAA,EACrB;AAEA,MAAI,aAAa;AACjB,QAAM,mBAA0B,CAAC;AACjC,MAAI,qBAAqB;AAEzB,mBAAiB,SAAS,QAAQ;AAChC,QAAI,MAAM,SAAS,iBAAiB;AAClC,mBAAa,MAAM,cAAc;AACjC;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,cAAc;AAC/B,UAAI,CAAC,oBAAoB;AACvB,yBAAiB,EAAE,MAAM,YAAY,CAAC;AACtC,6BAAqB;AAAA,MACvB;AACA,YAAM,OAAO,cAAc,cAAc,SAAS,CAAC;AACnD,UAAI,CAAC,QAAQ,KAAK,SAAS,QAAQ;AACjC,sBAAc,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,OAAO,WAAW,CAAC,EAAE,CAAC;AAAA,MACvE,OAAO;AACL,aAAK,QAAQ,MAAM;AAAA,MACrB;AACA;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,gBAAgB;AACjC,uBAAiB,EAAE,MAAM,QAAQ,QAAQ,MAAM,MAAM,KAAK,CAAC;AAC3D,uBAAiB,KAAK,MAAM,IAAI;AAChC;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,SAAS;AAC1B,YAAM,gBAAgB,MAAM,MAAM;AAClC,YAAM,oBAAoB,MAAM,MAAM;AACtC,YAAM,eAAe,MAAM,MAAM;AACjC,YAAM,mBAAmB,MAAM,MAAM;AACrC,YAAM,cACJ,MAAM,MAAM,SAAS,MAAM,MAAM,QAAQ,MAAM,MAAM;AACvD,UAAI,MAAM,MAAM,cAAc,QAAW;AACvC,cAAM,kBAAkB,MAAM,MAAM;AAAA,MACtC;AACA;AAAA,IACF;AAAA,EACF;AAEA,aAAW,YAAY,kBAAkB;AACvC,QAAI,WAAW,CAAC;AAChB,QAAI;AACF,iBAAW,SAAS,QAAQ,KAAK,MAAM,SAAS,KAAK,IAAI,CAAC;AAAA,IAC5D,QAAQ;AAAA,IAAC;AAET,kBAAc,KAAK;AAAA,MACjB,MAAM;AAAA,MACN,IAAI,SAAS;AAAA,MACb,MAAM,SAAS;AAAA,MACf,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,mBAAqC;AAAA,IACzC,MAAM;AAAA,IACN,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,QACL,cAAc,MAAM,iBAAiB;AAAA,QACrC,eAAe,MAAM,qBAAqB;AAAA,QAC1C,eAAe,MAAM,iBAAiB;AAAA,QACtC,mBAAmB,MAAM,qBAAqB;AAAA,QAC9C,aACE,MAAM,gBACL,MAAM,iBAAiB,MAAM,MAAM,qBAAqB;AAAA,QAC3D,iBAAiB,MAAM;AAAA,MACzB;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,YAAY,KAAK,IAAI,IAAI;AAAA,IACzB,MAAM,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,IAC9D;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,aAAa;AAAA,MACX,IAAI;AAAA,MACJ,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { createRequire as __pybCreateRequire } from "node:module";
|
|
2
|
+
const require = __pybCreateRequire(import.meta.url);
|
|
3
|
+
|
|
4
|
+
// src/core/costTracker.ts
|
|
5
|
+
import chalk from "chalk";
|
|
6
|
+
|
|
7
|
+
// src/utils/terminal/format.ts
|
|
8
|
+
function wrapText(text, width) {
|
|
9
|
+
const lines = [];
|
|
10
|
+
let currentLine = "";
|
|
11
|
+
for (const char of text) {
|
|
12
|
+
if ([...currentLine].length < width) {
|
|
13
|
+
currentLine += char;
|
|
14
|
+
} else {
|
|
15
|
+
lines.push(currentLine);
|
|
16
|
+
currentLine = char;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
if (currentLine) lines.push(currentLine);
|
|
20
|
+
return lines;
|
|
21
|
+
}
|
|
22
|
+
function formatDuration(ms) {
|
|
23
|
+
if (ms < 6e4) {
|
|
24
|
+
return `${(ms / 1e3).toFixed(1)}s`;
|
|
25
|
+
}
|
|
26
|
+
const hours = Math.floor(ms / 36e5);
|
|
27
|
+
const minutes = Math.floor(ms % 36e5 / 6e4);
|
|
28
|
+
const seconds = (ms % 6e4 / 1e3).toFixed(1);
|
|
29
|
+
if (hours > 0) {
|
|
30
|
+
return `${hours}h ${minutes}m ${seconds}s`;
|
|
31
|
+
}
|
|
32
|
+
if (minutes > 0) {
|
|
33
|
+
return `${minutes}m ${seconds}s`;
|
|
34
|
+
}
|
|
35
|
+
return `${seconds}s`;
|
|
36
|
+
}
|
|
37
|
+
function formatNumber(number) {
|
|
38
|
+
return new Intl.NumberFormat("en", {
|
|
39
|
+
notation: "compact",
|
|
40
|
+
maximumFractionDigits: 1
|
|
41
|
+
}).format(number).toLowerCase();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// src/core/costTracker.ts
|
|
45
|
+
var STATE = {
|
|
46
|
+
totalCost: 0,
|
|
47
|
+
totalAPIDuration: 0,
|
|
48
|
+
startTime: Date.now()
|
|
49
|
+
};
|
|
50
|
+
function addToTotalCost(cost, duration) {
|
|
51
|
+
STATE.totalCost += cost;
|
|
52
|
+
STATE.totalAPIDuration += duration;
|
|
53
|
+
}
|
|
54
|
+
function getTotalCost() {
|
|
55
|
+
return STATE.totalCost;
|
|
56
|
+
}
|
|
57
|
+
function getTotalDuration() {
|
|
58
|
+
return Date.now() - STATE.startTime;
|
|
59
|
+
}
|
|
60
|
+
function getTotalAPIDuration() {
|
|
61
|
+
return STATE.totalAPIDuration;
|
|
62
|
+
}
|
|
63
|
+
function formatCost(cost) {
|
|
64
|
+
return `$${cost > 0.5 ? round(cost, 100).toFixed(2) : cost.toFixed(4)}`;
|
|
65
|
+
}
|
|
66
|
+
function formatTotalCost() {
|
|
67
|
+
return chalk.grey(
|
|
68
|
+
`Total cost: ${formatCost(STATE.totalCost)}
|
|
69
|
+
Total duration (API): ${formatDuration(STATE.totalAPIDuration)}
|
|
70
|
+
Total duration (wall): ${formatDuration(getTotalDuration())}`
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
function round(number, precision) {
|
|
74
|
+
return Math.round(number * precision) / precision;
|
|
75
|
+
}
|
|
76
|
+
function resetStateForTests() {
|
|
77
|
+
if (process.env.NODE_ENV !== "test") {
|
|
78
|
+
throw new Error("resetStateForTests can only be called in tests");
|
|
79
|
+
}
|
|
80
|
+
STATE.startTime = Date.now();
|
|
81
|
+
STATE.totalCost = 0;
|
|
82
|
+
STATE.totalAPIDuration = 0;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export {
|
|
86
|
+
wrapText,
|
|
87
|
+
formatDuration,
|
|
88
|
+
formatNumber,
|
|
89
|
+
addToTotalCost,
|
|
90
|
+
getTotalCost,
|
|
91
|
+
getTotalDuration,
|
|
92
|
+
getTotalAPIDuration,
|
|
93
|
+
formatTotalCost,
|
|
94
|
+
resetStateForTests
|
|
95
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/costTracker.ts", "../src/utils/terminal/format.ts"],
|
|
4
|
+
"sourcesContent": ["import chalk from 'chalk'\nimport { formatDuration } from '@utils/terminal/format'\n\nconst STATE: {\n totalCost: number\n totalAPIDuration: number\n startTime: number\n} = {\n totalCost: 0,\n totalAPIDuration: 0,\n startTime: Date.now(),\n}\n\nexport function addToTotalCost(cost: number, duration: number): void {\n STATE.totalCost += cost\n STATE.totalAPIDuration += duration\n}\n\nexport function getTotalCost(): number {\n return STATE.totalCost\n}\n\nexport function getTotalDuration(): number {\n return Date.now() - STATE.startTime\n}\n\nexport function getTotalAPIDuration(): number {\n return STATE.totalAPIDuration\n}\n\nfunction formatCost(cost: number): string {\n return `$${cost > 0.5 ? round(cost, 100).toFixed(2) : cost.toFixed(4)}`\n}\n\nexport function formatTotalCost(): string {\n return chalk.grey(\n `Total cost: ${formatCost(STATE.totalCost)}\nTotal duration (API): ${formatDuration(STATE.totalAPIDuration)}\nTotal duration (wall): ${formatDuration(getTotalDuration())}`,\n )\n}\n\nfunction round(number: number, precision: number): number {\n return Math.round(number * precision) / precision\n}\n\nexport function resetStateForTests(): void {\n if (process.env.NODE_ENV !== 'test') {\n throw new Error('resetStateForTests can only be called in tests')\n }\n STATE.startTime = Date.now()\n STATE.totalCost = 0\n STATE.totalAPIDuration = 0\n}\n", "export function wrapText(text: string, width: number): string[] {\n const lines: string[] = []\n let currentLine = ''\n\n for (const char of text) {\n if ([...currentLine].length < width) {\n currentLine += char\n } else {\n lines.push(currentLine)\n currentLine = char\n }\n }\n\n if (currentLine) lines.push(currentLine)\n return lines\n}\n\nexport function formatDuration(ms: number): string {\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`\n }\n\n const hours = Math.floor(ms / 3600000)\n const minutes = Math.floor((ms % 3600000) / 60000)\n const seconds = ((ms % 60000) / 1000).toFixed(1)\n\n if (hours > 0) {\n return `${hours}h ${minutes}m ${seconds}s`\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds}s`\n }\n return `${seconds}s`\n}\n\nexport function formatNumber(number: number): string {\n return new Intl.NumberFormat('en', {\n notation: 'compact',\n maximumFractionDigits: 1,\n })\n .format(number)\n .toLowerCase()\n}\n"],
|
|
5
|
+
"mappings": ";;;;AAAA,OAAO,WAAW;;;ACAX,SAAS,SAAS,MAAc,OAAyB;AAC9D,QAAM,QAAkB,CAAC;AACzB,MAAI,cAAc;AAElB,aAAW,QAAQ,MAAM;AACvB,QAAI,CAAC,GAAG,WAAW,EAAE,SAAS,OAAO;AACnC,qBAAe;AAAA,IACjB,OAAO;AACL,YAAM,KAAK,WAAW;AACtB,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,YAAa,OAAM,KAAK,WAAW;AACvC,SAAO;AACT;AAEO,SAAS,eAAe,IAAoB;AACjD,MAAI,KAAK,KAAO;AACd,WAAO,IAAI,KAAK,KAAM,QAAQ,CAAC,CAAC;AAAA,EAClC;AAEA,QAAM,QAAQ,KAAK,MAAM,KAAK,IAAO;AACrC,QAAM,UAAU,KAAK,MAAO,KAAK,OAAW,GAAK;AACjD,QAAM,WAAY,KAAK,MAAS,KAAM,QAAQ,CAAC;AAE/C,MAAI,QAAQ,GAAG;AACb,WAAO,GAAG,KAAK,KAAK,OAAO,KAAK,OAAO;AAAA,EACzC;AACA,MAAI,UAAU,GAAG;AACf,WAAO,GAAG,OAAO,KAAK,OAAO;AAAA,EAC/B;AACA,SAAO,GAAG,OAAO;AACnB;AAEO,SAAS,aAAa,QAAwB;AACnD,SAAO,IAAI,KAAK,aAAa,MAAM;AAAA,IACjC,UAAU;AAAA,IACV,uBAAuB;AAAA,EACzB,CAAC,EACE,OAAO,MAAM,EACb,YAAY;AACjB;;;ADvCA,IAAM,QAIF;AAAA,EACF,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,WAAW,KAAK,IAAI;AACtB;AAEO,SAAS,eAAe,MAAc,UAAwB;AACnE,QAAM,aAAa;AACnB,QAAM,oBAAoB;AAC5B;AAEO,SAAS,eAAuB;AACrC,SAAO,MAAM;AACf;AAEO,SAAS,mBAA2B;AACzC,SAAO,KAAK,IAAI,IAAI,MAAM;AAC5B;AAEO,SAAS,sBAA8B;AAC5C,SAAO,MAAM;AACf;AAEA,SAAS,WAAW,MAAsB;AACxC,SAAO,IAAI,OAAO,MAAM,MAAM,MAAM,GAAG,EAAE,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;AACvE;AAEO,SAAS,kBAA0B;AACxC,SAAO,MAAM;AAAA,IACX,eAAe,WAAW,MAAM,SAAS,CAAC;AAAA,wBACtB,eAAe,MAAM,gBAAgB,CAAC;AAAA,yBACrC,eAAe,iBAAiB,CAAC,CAAC;AAAA,EACzD;AACF;AAEA,SAAS,MAAM,QAAgB,WAA2B;AACxD,SAAO,KAAK,MAAM,SAAS,SAAS,IAAI;AAC1C;AAEO,SAAS,qBAA2B;AACzC,MAAI,QAAQ,IAAI,aAAa,QAAQ;AACnC,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACA,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,YAAY;AAClB,QAAM,mBAAmB;AAC3B;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { createRequire as __pybCreateRequire } from "node:module";
|
|
2
|
+
const require = __pybCreateRequire(import.meta.url);
|
|
3
|
+
import {
|
|
4
|
+
AbortError
|
|
5
|
+
} from "./chunk-RQVLBMP7.js";
|
|
6
|
+
|
|
7
|
+
// src/utils/protocol/kodeAgentStructuredStdio.ts
|
|
8
|
+
import { createInterface } from "node:readline";
|
|
9
|
+
function isRecord(value) {
|
|
10
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
11
|
+
}
|
|
12
|
+
function tryParseLine(line) {
|
|
13
|
+
if (!line.trim()) return null;
|
|
14
|
+
try {
|
|
15
|
+
const parsed = JSON.parse(line);
|
|
16
|
+
if (!isRecord(parsed)) return null;
|
|
17
|
+
if (typeof parsed.type !== "string") return null;
|
|
18
|
+
return parsed;
|
|
19
|
+
} catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function makeRequestId() {
|
|
24
|
+
return Math.random().toString(36).slice(2, 15);
|
|
25
|
+
}
|
|
26
|
+
var KodeAgentStructuredStdio = class {
|
|
27
|
+
constructor(input, output, opts = {}) {
|
|
28
|
+
this.input = input;
|
|
29
|
+
this.output = output;
|
|
30
|
+
this.opts = opts;
|
|
31
|
+
}
|
|
32
|
+
started = false;
|
|
33
|
+
inputClosed = false;
|
|
34
|
+
pendingRequests = /* @__PURE__ */ new Map();
|
|
35
|
+
queuedUserMessages = [];
|
|
36
|
+
awaitingUserWaiters = [];
|
|
37
|
+
start() {
|
|
38
|
+
if (this.started) return;
|
|
39
|
+
this.started = true;
|
|
40
|
+
const rl = createInterface({ input: this.input });
|
|
41
|
+
(async () => {
|
|
42
|
+
for await (const line of rl) {
|
|
43
|
+
this.handleLine(String(line));
|
|
44
|
+
}
|
|
45
|
+
})().catch(() => {
|
|
46
|
+
}).finally(() => {
|
|
47
|
+
this.inputClosed = true;
|
|
48
|
+
rl.close();
|
|
49
|
+
this.rejectAllPending(new Error("Stream closed"));
|
|
50
|
+
this.rejectAllUserWaiters(new Error("Stream closed"));
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
rejectAllPending(err) {
|
|
54
|
+
for (const pending of this.pendingRequests.values()) {
|
|
55
|
+
pending.cleanup();
|
|
56
|
+
pending.reject(err);
|
|
57
|
+
}
|
|
58
|
+
this.pendingRequests.clear();
|
|
59
|
+
}
|
|
60
|
+
rejectAllUserWaiters(err) {
|
|
61
|
+
for (const waiter of this.awaitingUserWaiters.splice(0)) {
|
|
62
|
+
waiter.reject(err);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
write(obj) {
|
|
66
|
+
this.output.write(JSON.stringify(obj) + "\n");
|
|
67
|
+
}
|
|
68
|
+
sendControlResponseSuccess(requestId, response) {
|
|
69
|
+
this.write({
|
|
70
|
+
type: "control_response",
|
|
71
|
+
response: {
|
|
72
|
+
subtype: "success",
|
|
73
|
+
request_id: requestId,
|
|
74
|
+
...response !== void 0 ? { response } : {}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
sendControlResponseError(requestId, error) {
|
|
79
|
+
this.write({
|
|
80
|
+
type: "control_response",
|
|
81
|
+
response: {
|
|
82
|
+
subtype: "error",
|
|
83
|
+
request_id: requestId,
|
|
84
|
+
error
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
sendControlCancelRequest(requestId) {
|
|
89
|
+
this.write({
|
|
90
|
+
type: "control_cancel_request",
|
|
91
|
+
request_id: requestId
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
handleLine(line) {
|
|
95
|
+
const msg = tryParseLine(line);
|
|
96
|
+
if (!msg) return;
|
|
97
|
+
if (msg.type === "keep_alive") {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (msg.type === "user") {
|
|
101
|
+
const userMsg = msg;
|
|
102
|
+
const waiter = this.awaitingUserWaiters.shift();
|
|
103
|
+
if (waiter) waiter.resolve(userMsg);
|
|
104
|
+
else this.queuedUserMessages.push(userMsg);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (msg.type === "control_response") {
|
|
108
|
+
const responseMsg = msg;
|
|
109
|
+
const requestId = responseMsg.response?.request_id;
|
|
110
|
+
if (typeof requestId !== "string" || !requestId) return;
|
|
111
|
+
const pending = this.pendingRequests.get(requestId);
|
|
112
|
+
if (!pending) return;
|
|
113
|
+
pending.cleanup();
|
|
114
|
+
this.pendingRequests.delete(requestId);
|
|
115
|
+
pending.resolve(responseMsg.response);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (msg.type === "control_request") {
|
|
119
|
+
const requestMsg = msg;
|
|
120
|
+
const requestId = requestMsg.request_id;
|
|
121
|
+
const subtype = requestMsg.request?.subtype;
|
|
122
|
+
if (typeof requestId !== "string" || !requestId) return;
|
|
123
|
+
if (typeof subtype !== "string" || !subtype) {
|
|
124
|
+
this.sendControlResponseError(
|
|
125
|
+
requestId,
|
|
126
|
+
"Invalid control request (missing subtype)"
|
|
127
|
+
);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (subtype === "interrupt") {
|
|
131
|
+
this.opts.onInterrupt?.();
|
|
132
|
+
this.sendControlResponseSuccess(requestId);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const handler = this.opts.onControlRequest;
|
|
136
|
+
if (handler) {
|
|
137
|
+
Promise.resolve().then(async () => await handler(requestMsg)).then(
|
|
138
|
+
(response) => this.sendControlResponseSuccess(requestId, response)
|
|
139
|
+
).catch(
|
|
140
|
+
(err) => this.sendControlResponseError(
|
|
141
|
+
requestId,
|
|
142
|
+
err instanceof Error ? err.message : String(err)
|
|
143
|
+
)
|
|
144
|
+
);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
this.sendControlResponseError(
|
|
148
|
+
requestId,
|
|
149
|
+
`Unsupported control request subtype: ${subtype}`
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async nextUserMessage(args) {
|
|
154
|
+
if (this.queuedUserMessages.length > 0) {
|
|
155
|
+
return this.queuedUserMessages.shift();
|
|
156
|
+
}
|
|
157
|
+
if (this.inputClosed) {
|
|
158
|
+
throw new Error("Stream closed");
|
|
159
|
+
}
|
|
160
|
+
const timeoutMs = typeof args?.timeoutMs === "number" && Number.isFinite(args.timeoutMs) ? Math.max(0, args.timeoutMs) : null;
|
|
161
|
+
return await new Promise((resolve, reject) => {
|
|
162
|
+
let settled = false;
|
|
163
|
+
let waiter = null;
|
|
164
|
+
const onAbort = () => {
|
|
165
|
+
cleanup();
|
|
166
|
+
reject(new AbortError("User input aborted."));
|
|
167
|
+
};
|
|
168
|
+
const onTimeout = () => {
|
|
169
|
+
cleanup();
|
|
170
|
+
reject(new Error("Timed out waiting for user input."));
|
|
171
|
+
};
|
|
172
|
+
const cleanup = () => {
|
|
173
|
+
if (settled) return;
|
|
174
|
+
settled = true;
|
|
175
|
+
if (args?.signal) args.signal.removeEventListener("abort", onAbort);
|
|
176
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
177
|
+
if (waiter) {
|
|
178
|
+
const idx = this.awaitingUserWaiters.indexOf(waiter);
|
|
179
|
+
if (idx >= 0) this.awaitingUserWaiters.splice(idx, 1);
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
let timeoutId = null;
|
|
183
|
+
if (timeoutMs !== null) timeoutId = setTimeout(onTimeout, timeoutMs);
|
|
184
|
+
if (args?.signal)
|
|
185
|
+
args.signal.addEventListener("abort", onAbort, { once: true });
|
|
186
|
+
waiter = {
|
|
187
|
+
resolve: (msg) => {
|
|
188
|
+
cleanup();
|
|
189
|
+
resolve(msg);
|
|
190
|
+
},
|
|
191
|
+
reject: (err) => {
|
|
192
|
+
cleanup();
|
|
193
|
+
reject(err);
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
this.awaitingUserWaiters.push(waiter);
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
async sendRequest(request, args) {
|
|
200
|
+
if (this.inputClosed) {
|
|
201
|
+
throw new Error("Stream closed");
|
|
202
|
+
}
|
|
203
|
+
if (args?.signal?.aborted) {
|
|
204
|
+
throw new AbortError("Request aborted.");
|
|
205
|
+
}
|
|
206
|
+
const requestId = makeRequestId();
|
|
207
|
+
this.write({ type: "control_request", request_id: requestId, request });
|
|
208
|
+
const timeoutMs = typeof args?.timeoutMs === "number" && Number.isFinite(args.timeoutMs) ? Math.max(0, args.timeoutMs) : null;
|
|
209
|
+
return await new Promise((resolve, reject) => {
|
|
210
|
+
const onAbort = () => {
|
|
211
|
+
this.sendControlCancelRequest(requestId);
|
|
212
|
+
this.pendingRequests.delete(requestId);
|
|
213
|
+
cleanup();
|
|
214
|
+
reject(new AbortError("Request aborted."));
|
|
215
|
+
};
|
|
216
|
+
const onTimeout = () => {
|
|
217
|
+
this.sendControlCancelRequest(requestId);
|
|
218
|
+
this.pendingRequests.delete(requestId);
|
|
219
|
+
cleanup();
|
|
220
|
+
reject(new Error("Timed out waiting for control response."));
|
|
221
|
+
};
|
|
222
|
+
const cleanup = () => {
|
|
223
|
+
if (args?.signal) args.signal.removeEventListener("abort", onAbort);
|
|
224
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
225
|
+
};
|
|
226
|
+
let timeoutId = null;
|
|
227
|
+
if (timeoutMs !== null) timeoutId = setTimeout(onTimeout, timeoutMs);
|
|
228
|
+
if (args?.signal)
|
|
229
|
+
args.signal.addEventListener("abort", onAbort, { once: true });
|
|
230
|
+
this.pendingRequests.set(requestId, {
|
|
231
|
+
cleanup,
|
|
232
|
+
resolve: (response) => {
|
|
233
|
+
if (response.subtype === "error") {
|
|
234
|
+
reject(
|
|
235
|
+
new Error(response.error || "Unknown control response error")
|
|
236
|
+
);
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
resolve(response.response ?? null);
|
|
240
|
+
},
|
|
241
|
+
reject
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
export {
|
|
248
|
+
KodeAgentStructuredStdio
|
|
249
|
+
};
|