newcraw 1.0.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.
- package/LICENSE +201 -0
- package/README.md +692 -0
- package/README.zh-CN.md +338 -0
- package/cli-acp.js +82 -0
- package/cli.js +105 -0
- package/dist/REPL-74GZVSMY.js +42 -0
- package/dist/REPL-74GZVSMY.js.map +7 -0
- package/dist/acp-A55ZRIPP.js +1357 -0
- package/dist/acp-A55ZRIPP.js.map +7 -0
- package/dist/agentsValidate-XWFIEHJ2.js +373 -0
- package/dist/agentsValidate-XWFIEHJ2.js.map +7 -0
- package/dist/ask-4ACYU23S.js +126 -0
- package/dist/ask-4ACYU23S.js.map +7 -0
- package/dist/autoUpdater-O2WHHSGP.js +17 -0
- package/dist/autoUpdater-O2WHHSGP.js.map +7 -0
- package/dist/chunk-2UO3BFZH.js +16 -0
- package/dist/chunk-2UO3BFZH.js.map +7 -0
- package/dist/chunk-3C73U2IU.js +2970 -0
- package/dist/chunk-3C73U2IU.js.map +7 -0
- package/dist/chunk-3U5X4VWP.js +2613 -0
- package/dist/chunk-3U5X4VWP.js.map +7 -0
- package/dist/chunk-755HIAI3.js +95 -0
- package/dist/chunk-755HIAI3.js.map +7 -0
- package/dist/chunk-7ZFLZNOW.js +21 -0
- package/dist/chunk-7ZFLZNOW.js.map +7 -0
- package/dist/chunk-A44DGORI.js +49 -0
- package/dist/chunk-A44DGORI.js.map +7 -0
- package/dist/chunk-AXWJI6N5.js +11 -0
- package/dist/chunk-AXWJI6N5.js.map +7 -0
- package/dist/chunk-B26ZUMJI.js +515 -0
- package/dist/chunk-B26ZUMJI.js.map +7 -0
- package/dist/chunk-BHNQGSLO.js +96 -0
- package/dist/chunk-BHNQGSLO.js.map +7 -0
- package/dist/chunk-BUI6KGVA.js +164 -0
- package/dist/chunk-BUI6KGVA.js.map +7 -0
- package/dist/chunk-DY5D4SS7.js +936 -0
- package/dist/chunk-DY5D4SS7.js.map +7 -0
- package/dist/chunk-EENI5HG7.js +498 -0
- package/dist/chunk-EENI5HG7.js.map +7 -0
- package/dist/chunk-EXPWPWA4.js +654 -0
- package/dist/chunk-EXPWPWA4.js.map +7 -0
- package/dist/chunk-FHOCKJOW.js +766 -0
- package/dist/chunk-FHOCKJOW.js.map +7 -0
- package/dist/chunk-GPKVTIYJ.js +191 -0
- package/dist/chunk-GPKVTIYJ.js.map +7 -0
- package/dist/chunk-H5BCUDEN.js +794 -0
- package/dist/chunk-H5BCUDEN.js.map +7 -0
- package/dist/chunk-INJSFEKL.js +47 -0
- package/dist/chunk-INJSFEKL.js.map +7 -0
- package/dist/chunk-JX5ZQYTQ.js +12 -0
- package/dist/chunk-JX5ZQYTQ.js.map +7 -0
- package/dist/chunk-KQSHIOZK.js +24 -0
- package/dist/chunk-KQSHIOZK.js.map +7 -0
- package/dist/chunk-L6WKZEK4.js +1609 -0
- package/dist/chunk-L6WKZEK4.js.map +7 -0
- package/dist/chunk-LC4CL3YJ.js +124 -0
- package/dist/chunk-LC4CL3YJ.js.map +7 -0
- package/dist/chunk-MXSB7IOZ.js +1097 -0
- package/dist/chunk-MXSB7IOZ.js.map +7 -0
- package/dist/chunk-N5OHRWG2.js +249 -0
- package/dist/chunk-N5OHRWG2.js.map +7 -0
- package/dist/chunk-NQE3GGE3.js +19 -0
- package/dist/chunk-NQE3GGE3.js.map +7 -0
- package/dist/chunk-QF6YDTME.js +139 -0
- package/dist/chunk-QF6YDTME.js.map +7 -0
- package/dist/chunk-QTX7AJFQ.js +240 -0
- package/dist/chunk-QTX7AJFQ.js.map +7 -0
- package/dist/chunk-S3ZAJPYZ.js +515 -0
- package/dist/chunk-S3ZAJPYZ.js.map +7 -0
- package/dist/chunk-S5Y5IF2H.js +735 -0
- package/dist/chunk-S5Y5IF2H.js.map +7 -0
- package/dist/chunk-SBE6Y327.js +836 -0
- package/dist/chunk-SBE6Y327.js.map +7 -0
- package/dist/chunk-T25Z3JMG.js +17 -0
- package/dist/chunk-T25Z3JMG.js.map +7 -0
- package/dist/chunk-T6VKT5FR.js +196 -0
- package/dist/chunk-T6VKT5FR.js.map +7 -0
- package/dist/chunk-TSGGSPYD.js +151 -0
- package/dist/chunk-TSGGSPYD.js.map +7 -0
- package/dist/chunk-TY3CCSAT.js +24 -0
- package/dist/chunk-TY3CCSAT.js.map +7 -0
- package/dist/chunk-U224EQOS.js +34 -0
- package/dist/chunk-U224EQOS.js.map +7 -0
- package/dist/chunk-U7S4MEYP.js +95 -0
- package/dist/chunk-U7S4MEYP.js.map +7 -0
- package/dist/chunk-ULVAAZ2U.js +30517 -0
- package/dist/chunk-ULVAAZ2U.js.map +7 -0
- package/dist/chunk-WWLFALT7.js +128 -0
- package/dist/chunk-WWLFALT7.js.map +7 -0
- package/dist/chunk-XJQATPV7.js +23 -0
- package/dist/chunk-XJQATPV7.js.map +7 -0
- package/dist/chunk-XMGUQHMF.js +72 -0
- package/dist/chunk-XMGUQHMF.js.map +7 -0
- package/dist/chunk-XOMW5QTV.js +472 -0
- package/dist/chunk-XOMW5QTV.js.map +7 -0
- package/dist/chunk-Y7VZUSIM.js +1256 -0
- package/dist/chunk-Y7VZUSIM.js.map +7 -0
- package/dist/chunk-YVNBXMIP.js +511 -0
- package/dist/chunk-YVNBXMIP.js.map +7 -0
- package/dist/chunk-YYPJWXSA.js +145 -0
- package/dist/chunk-YYPJWXSA.js.map +7 -0
- package/dist/cli-BW34VKCN.js +3917 -0
- package/dist/cli-BW34VKCN.js.map +7 -0
- package/dist/commands-4CNZZBTE.js +46 -0
- package/dist/commands-4CNZZBTE.js.map +7 -0
- package/dist/config-XKRCXCSS.js +81 -0
- package/dist/config-XKRCXCSS.js.map +7 -0
- package/dist/context-T5CR3RP6.js +30 -0
- package/dist/context-T5CR3RP6.js.map +7 -0
- package/dist/costTracker-2G3ZI2JF.js +19 -0
- package/dist/costTracker-2G3ZI2JF.js.map +7 -0
- package/dist/customCommands-OCUMXZDN.js +25 -0
- package/dist/customCommands-OCUMXZDN.js.map +7 -0
- package/dist/env-DYDNFB4D.js +22 -0
- package/dist/env-DYDNFB4D.js.map +7 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +7 -0
- package/dist/kodeAgentSessionId-KTGFX2BE.js +13 -0
- package/dist/kodeAgentSessionId-KTGFX2BE.js.map +7 -0
- package/dist/kodeAgentSessionLoad-ZKR2VGHO.js +18 -0
- package/dist/kodeAgentSessionLoad-ZKR2VGHO.js.map +7 -0
- package/dist/kodeAgentSessionResume-NFZCTIBZ.js +16 -0
- package/dist/kodeAgentSessionResume-NFZCTIBZ.js.map +7 -0
- package/dist/kodeAgentStreamJson-VIXFTYL5.js +13 -0
- package/dist/kodeAgentStreamJson-VIXFTYL5.js.map +7 -0
- package/dist/kodeAgentStreamJsonSession-6CKTK6AF.js +131 -0
- package/dist/kodeAgentStreamJsonSession-6CKTK6AF.js.map +7 -0
- package/dist/kodeAgentStructuredStdio-SI5C7AAD.js +10 -0
- package/dist/kodeAgentStructuredStdio-SI5C7AAD.js.map +7 -0
- package/dist/kodeHooks-5RXJRDCY.js +36 -0
- package/dist/kodeHooks-5RXJRDCY.js.map +7 -0
- package/dist/llm-QJA3QMXR.js +3118 -0
- package/dist/llm-QJA3QMXR.js.map +7 -0
- package/dist/llmLazy-VCEV22DK.js +15 -0
- package/dist/llmLazy-VCEV22DK.js.map +7 -0
- package/dist/loader-CKNYMPCZ.js +28 -0
- package/dist/loader-CKNYMPCZ.js.map +7 -0
- package/dist/mcp-2SZTOKZX.js +49 -0
- package/dist/mcp-2SZTOKZX.js.map +7 -0
- package/dist/mentionProcessor-O7NWOH6S.js +211 -0
- package/dist/mentionProcessor-O7NWOH6S.js.map +7 -0
- package/dist/messages-PRKIHXMK.js +65 -0
- package/dist/messages-PRKIHXMK.js.map +7 -0
- package/dist/model-WG6RA25G.js +30 -0
- package/dist/model-WG6RA25G.js.map +7 -0
- package/dist/openai-VQLYFQ6B.js +29 -0
- package/dist/openai-VQLYFQ6B.js.map +7 -0
- package/dist/outputStyles-VQ57E3B6.js +28 -0
- package/dist/outputStyles-VQ57E3B6.js.map +7 -0
- package/dist/package.json +4 -0
- package/dist/pluginRuntime-NWOLU73K.js +218 -0
- package/dist/pluginRuntime-NWOLU73K.js.map +7 -0
- package/dist/pluginValidation-R7B6QQ6T.js +17 -0
- package/dist/pluginValidation-R7B6QQ6T.js.map +7 -0
- package/dist/prompts-W4V4Y67M.js +48 -0
- package/dist/prompts-W4V4Y67M.js.map +7 -0
- package/dist/query-GFFKKURO.js +50 -0
- package/dist/query-GFFKKURO.js.map +7 -0
- package/dist/responsesStreaming-2AIT6GHG.js +10 -0
- package/dist/responsesStreaming-2AIT6GHG.js.map +7 -0
- package/dist/ripgrep-SVBVC46X.js +17 -0
- package/dist/ripgrep-SVBVC46X.js.map +7 -0
- package/dist/skillMarketplace-5Z7Y6FTD.js +37 -0
- package/dist/skillMarketplace-5Z7Y6FTD.js.map +7 -0
- package/dist/state-X3R7BV7A.js +16 -0
- package/dist/state-X3R7BV7A.js.map +7 -0
- package/dist/theme-4VA64EWF.js +14 -0
- package/dist/theme-4VA64EWF.js.map +7 -0
- package/dist/toolPermissionContext-I3IXPVED.js +17 -0
- package/dist/toolPermissionContext-I3IXPVED.js.map +7 -0
- package/dist/toolPermissionSettings-35DJQEKG.js +18 -0
- package/dist/toolPermissionSettings-35DJQEKG.js.map +7 -0
- package/dist/tools-USOBTPOI.js +47 -0
- package/dist/tools-USOBTPOI.js.map +7 -0
- package/dist/userInput-NID2UYXG.js +312 -0
- package/dist/userInput-NID2UYXG.js.map +7 -0
- package/dist/uuid-VA3KVASX.js +9 -0
- package/dist/uuid-VA3KVASX.js.map +7 -0
- package/dist/yoga.wasm +0 -0
- package/package.json +135 -0
- package/scripts/binary-utils.cjs +61 -0
- package/scripts/cli-acp-wrapper.cjs +82 -0
- package/scripts/cli-wrapper.cjs +105 -0
- package/scripts/postinstall.js +144 -0
- package/web/dist/assets/index-COAJqX1Z.css +1 -0
- package/web/dist/assets/index-CzS_4LmC.js +179 -0
- package/web/dist/index.html +14 -0
- package/yoga.wasm +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/services/plugins/customCommands.ts"],
|
|
4
|
+
"sourcesContent": ["import { existsSync, readFileSync, readdirSync, statSync } from 'fs'\r\nimport { basename, dirname, join, relative, resolve, sep } from 'path'\r\nimport { homedir } from 'os'\r\nimport { memoize } from 'lodash-es'\r\nimport type { MessageParam } from '@anthropic-ai/sdk/resources/index.mjs'\r\nimport type { Command } from '@commands'\r\nimport { getCwd } from '@utils/state'\r\nimport { getSessionPlugins } from '@utils/session/sessionPlugins'\r\nimport { getKodeBaseDir } from '@utils/config/env'\r\nimport { debug as debugLogger } from '@utils/log/debugLogger'\r\nimport { logError } from '@utils/log'\r\nimport { execFile } from 'child_process'\r\nimport { promisify } from 'util'\r\nimport matter from 'gray-matter'\r\nimport yaml from 'js-yaml'\r\n\r\nconst execFileAsync = promisify(execFile)\r\n\r\nexport async function executeBashCommands(content: string): Promise<string> {\r\n const bashCommandRegex = /!\\`([^`]+)\\`/g\r\n const matches = [...content.matchAll(bashCommandRegex)]\r\n\r\n if (matches.length === 0) {\r\n return content\r\n }\r\n\r\n let result = content\r\n\r\n for (const match of matches) {\r\n const fullMatch = match[0]\r\n const command = match[1].trim()\r\n\r\n try {\r\n const parts = command.split(/\\s+/)\r\n const cmd = parts[0]\r\n const args = parts.slice(1)\r\n\r\n const { stdout, stderr } = await execFileAsync(cmd, args, {\r\n timeout: 5000,\r\n encoding: 'utf8',\r\n cwd: getCwd(),\r\n })\r\n\r\n const output = stdout.trim() || stderr.trim() || '(no output)'\r\n result = result.replace(fullMatch, output)\r\n } catch (error) {\r\n logError(error)\r\n debugLogger.warn('CUSTOM_COMMAND_BASH_EXEC_FAILED', {\r\n command,\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n result = result.replace(fullMatch, `(error executing: ${command})`)\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\nexport async function resolveFileReferences(content: string): Promise<string> {\r\n const fileRefRegex = /@([a-zA-Z0-9/._-]+(?:\\.[a-zA-Z0-9]+)?)/g\r\n const matches = [...content.matchAll(fileRefRegex)]\r\n\r\n if (matches.length === 0) {\r\n return content\r\n }\r\n\r\n let result = content\r\n\r\n for (const match of matches) {\r\n const fullMatch = match[0]\r\n const filePath = match[1]\r\n\r\n if (filePath.startsWith('agent-')) {\r\n continue\r\n }\r\n\r\n try {\r\n const fullPath = join(getCwd(), filePath)\r\n\r\n if (existsSync(fullPath)) {\r\n const fileContent = readFileSync(fullPath, { encoding: 'utf-8' })\r\n\r\n const formattedContent = `\\n\\n## File: ${filePath}\\n\\`\\`\\`\\n${fileContent}\\n\\`\\`\\`\\n`\r\n result = result.replace(fullMatch, formattedContent)\r\n } else {\r\n result = result.replace(fullMatch, `(file not found: ${filePath})`)\r\n }\r\n } catch (error) {\r\n logError(error)\r\n debugLogger.warn('CUSTOM_COMMAND_FILE_READ_FAILED', {\r\n filePath,\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n result = result.replace(fullMatch, `(error reading: ${filePath})`)\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\nexport interface CustomCommandFrontmatter {\r\n description?: string\r\n 'allowed-tools'?: string[]\r\n 'argument-hint'?: string\r\n when_to_use?: string\r\n version?: string\r\n model?: string\r\n maxThinkingTokens?: number | string\r\n max_thinking_tokens?: number | string\r\n 'max-thinking-tokens'?: number | string\r\n name?: string\r\n 'disable-model-invocation'?: boolean | string\r\n}\r\n\r\nexport interface CustomCommandWithScope {\r\n type: 'prompt'\r\n name: string\r\n description: string\r\n isEnabled: boolean\r\n isHidden: boolean\r\n aliases?: string[]\r\n progressMessage: string\r\n userFacingName(): string\r\n getPromptForCommand(args: string): Promise<MessageParam[]>\r\n allowedTools?: string[]\r\n maxThinkingTokens?: number\r\n argumentHint?: string\r\n whenToUse?: string\r\n version?: string\r\n model?: string\r\n isSkill?: boolean\r\n disableModelInvocation?: boolean\r\n hasUserSpecifiedDescription?: boolean\r\n source?: 'localSettings' | 'userSettings' | 'pluginDir'\r\n scope?: 'user' | 'project'\r\n filePath?: string\r\n}\r\n\r\nexport interface CustomCommandFile {\r\n frontmatter: CustomCommandFrontmatter\r\n content: string\r\n filePath: string\r\n}\r\n\r\nexport function parseFrontmatter(content: string): {\r\n frontmatter: CustomCommandFrontmatter\r\n content: string\r\n} {\r\n const yamlSchema = (yaml as any).JSON_SCHEMA\r\n const parsed = matter(content, {\r\n engines: {\r\n yaml: {\r\n parse: (input: string) =>\r\n yaml.load(input, yamlSchema ? { schema: yamlSchema } : undefined) ??\r\n {},\r\n },\r\n },\r\n })\r\n return {\r\n frontmatter: (parsed.data ?? {}) as CustomCommandFrontmatter,\r\n content: parsed.content ?? '',\r\n }\r\n}\r\n\r\ntype CommandSource = 'localSettings' | 'userSettings' | 'pluginDir'\r\n\r\nfunction isSkillMarkdownFile(filePath: string): boolean {\r\n return /^skill\\.md$/i.test(basename(filePath))\r\n}\r\n\r\nfunction getUserKodeBaseDir(): string {\r\n return getKodeBaseDir()\r\n}\r\n\r\nfunction toBoolean(value: unknown): boolean {\r\n if (typeof value === 'boolean') return value\r\n if (typeof value === 'string') {\r\n const normalized = value.trim().toLowerCase()\r\n if (['1', 'true', 'yes', 'on'].includes(normalized)) return true\r\n if (['0', 'false', 'no', 'off'].includes(normalized)) return false\r\n }\r\n return false\r\n}\r\n\r\nfunction parseAllowedTools(value: unknown): string[] {\r\n if (Array.isArray(value)) {\r\n return value.map(v => String(v).trim()).filter(Boolean)\r\n }\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim()\r\n if (!trimmed) return []\r\n return trimmed\r\n .split(/\\s+/)\r\n .map(v => v.trim())\r\n .filter(Boolean)\r\n }\r\n return []\r\n}\r\n\r\nfunction parseMaxThinkingTokens(\r\n frontmatter: CustomCommandFrontmatter,\r\n): number | undefined {\r\n const raw =\r\n (frontmatter as any).maxThinkingTokens ??\r\n (frontmatter as any).max_thinking_tokens ??\r\n (frontmatter as any)['max-thinking-tokens'] ??\r\n (frontmatter as any)['max_thinking_tokens']\r\n if (raw === undefined || raw === null) return undefined\r\n const value = typeof raw === 'number' ? raw : Number(String(raw).trim())\r\n if (!Number.isFinite(value) || value < 0) return undefined\r\n return Math.floor(value)\r\n}\r\n\r\nfunction sourceLabel(source: CommandSource): string {\r\n if (source === 'localSettings') return 'project'\r\n if (source === 'userSettings') return 'user'\r\n if (source === 'pluginDir') return 'plugin'\r\n return 'unknown'\r\n}\r\n\r\nfunction extractDescriptionFromMarkdown(\r\n markdown: string,\r\n fallback: string,\r\n): string {\r\n const lines = markdown.split(/\\r?\\n/)\r\n for (const line of lines) {\r\n const trimmed = line.trim()\r\n if (!trimmed) continue\r\n const heading = trimmed.match(/^#{1,6}\\s+(.*)$/)\r\n if (heading?.[1]) return heading[1].trim()\r\n return trimmed.length > 120 ? `${trimmed.slice(0, 117)}...` : trimmed\r\n }\r\n return fallback\r\n}\r\n\r\nfunction namespaceFromDirPath(dirPath: string, baseDir: string): string {\r\n const relPath = relative(baseDir, dirPath)\r\n if (!relPath || relPath === '.' || relPath.startsWith('..')) return ''\r\n return relPath.split(sep).join(':')\r\n}\r\n\r\nfunction nameForCommandFile(filePath: string, baseDir: string): string {\r\n if (isSkillMarkdownFile(filePath)) {\r\n const skillDir = dirname(filePath)\r\n const parentDir = dirname(skillDir)\r\n const skillName = basename(skillDir)\r\n const namespace = namespaceFromDirPath(parentDir, baseDir)\r\n return namespace ? `${namespace}:${skillName}` : skillName\r\n }\r\n\r\n const dir = dirname(filePath)\r\n const namespace = namespaceFromDirPath(dir, baseDir)\r\n const fileName = basename(filePath).replace(/\\.md$/i, '')\r\n return namespace ? `${namespace}:${fileName}` : fileName\r\n}\r\n\r\ntype CommandFileRecord = {\r\n baseDir: string\r\n filePath: string\r\n frontmatter: CustomCommandFrontmatter\r\n content: string\r\n source: CommandSource\r\n scope: 'user' | 'project'\r\n}\r\n\r\nfunction buildPluginQualifiedName(\r\n pluginName: string,\r\n localName: string,\r\n): string {\r\n const p = pluginName.trim()\r\n const l = localName.trim()\r\n if (!p) return l\r\n if (!l || l === p) return p\r\n return `${p}:${l}`\r\n}\r\n\r\nfunction nameForPluginCommandFile(\r\n filePath: string,\r\n commandsDir: string,\r\n pluginName: string,\r\n): string {\r\n const rel = relative(commandsDir, filePath)\r\n const noExt = rel.replace(/\\.md$/i, '')\r\n const localName = noExt.split(sep).filter(Boolean).join(':')\r\n return buildPluginQualifiedName(pluginName, localName)\r\n}\r\n\r\nfunction createPluginPromptCommandFromFile(record: {\r\n pluginName: string\r\n commandsDir: string\r\n filePath: string\r\n frontmatter: CustomCommandFrontmatter\r\n content: string\r\n}): CustomCommandWithScope | null {\r\n const name = nameForPluginCommandFile(\r\n record.filePath,\r\n record.commandsDir,\r\n record.pluginName,\r\n )\r\n if (!name) return null\r\n\r\n const descriptionText =\r\n record.frontmatter.description ??\r\n extractDescriptionFromMarkdown(record.content, 'Custom command')\r\n const allowedTools = parseAllowedTools(record.frontmatter['allowed-tools'])\r\n const maxThinkingTokens = parseMaxThinkingTokens(record.frontmatter)\r\n const argumentHint = record.frontmatter['argument-hint']\r\n const whenToUse = record.frontmatter.when_to_use\r\n const version = record.frontmatter.version\r\n const disableModelInvocation = toBoolean(\r\n record.frontmatter['disable-model-invocation'],\r\n )\r\n const model =\r\n record.frontmatter.model === 'inherit'\r\n ? undefined\r\n : record.frontmatter.model\r\n\r\n return {\r\n type: 'prompt',\r\n name,\r\n description: `${descriptionText} (${sourceLabel('pluginDir')})`,\r\n isEnabled: true,\r\n isHidden: false,\r\n filePath: record.filePath,\r\n aliases: [],\r\n progressMessage: 'running',\r\n allowedTools,\r\n maxThinkingTokens,\r\n argumentHint,\r\n whenToUse,\r\n version,\r\n model,\r\n isSkill: false,\r\n disableModelInvocation,\r\n hasUserSpecifiedDescription: !!record.frontmatter.description,\r\n source: 'pluginDir',\r\n scope: 'project',\r\n userFacingName() {\r\n return name\r\n },\r\n async getPromptForCommand(args: string): Promise<MessageParam[]> {\r\n let prompt = record.content\r\n const trimmedArgs = args.trim()\r\n if (trimmedArgs) {\r\n if (prompt.includes('$ARGUMENTS')) {\r\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\r\n } else {\r\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\r\n }\r\n }\r\n return [{ role: 'user', content: prompt }]\r\n },\r\n }\r\n}\r\n\r\nfunction loadPluginCommandsFromDir(args: {\r\n pluginName: string\r\n commandsDir: string\r\n signal: AbortSignal\r\n}): CustomCommandWithScope[] {\r\n let commandsBaseDir = args.commandsDir\r\n let files: string[] = []\r\n try {\r\n const st = statSync(args.commandsDir)\r\n if (st.isFile()) {\r\n if (!args.commandsDir.toLowerCase().endsWith('.md')) return []\r\n files = [args.commandsDir]\r\n commandsBaseDir = dirname(args.commandsDir)\r\n } else if (st.isDirectory()) {\r\n files = listMarkdownFilesRecursively(args.commandsDir, args.signal)\r\n } else {\r\n return []\r\n }\r\n } catch {\r\n return []\r\n }\r\n\r\n const out: CustomCommandWithScope[] = []\r\n for (const filePath of files) {\r\n if (args.signal.aborted) break\r\n try {\r\n const raw = readFileSync(filePath, 'utf8')\r\n const { frontmatter, content } = parseFrontmatter(raw)\r\n const cmd = createPluginPromptCommandFromFile({\r\n pluginName: args.pluginName,\r\n commandsDir: commandsBaseDir,\r\n filePath,\r\n frontmatter,\r\n content,\r\n })\r\n if (cmd) out.push(cmd)\r\n } catch {\r\n }\r\n }\r\n return out\r\n}\r\n\r\nfunction loadPluginSkillDirectoryCommandsFromBaseDir(args: {\r\n pluginName: string\r\n skillsDir: string\r\n}): CustomCommandWithScope[] {\r\n if (!existsSync(args.skillsDir)) return []\r\n\r\n const out: CustomCommandWithScope[] = []\r\n let entries\r\n try {\r\n entries = readdirSync(args.skillsDir, { withFileTypes: true })\r\n } catch {\r\n return []\r\n }\r\n\r\n const strictMode = toBoolean(process.env.NEWCRAW_SKILLS_STRICT)\r\n const validateName = (skillName: string): boolean => {\r\n if (skillName.length < 1 || skillName.length > 64) return false\r\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(skillName)\r\n }\r\n\r\n for (const entry of entries) {\r\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue\r\n const skillDir = join(args.skillsDir, entry.name)\r\n const skillFileCandidates = [\r\n join(skillDir, 'SKILL.md'),\r\n join(skillDir, 'skill.md'),\r\n ]\r\n const skillFile = skillFileCandidates.find(p => existsSync(p))\r\n if (!skillFile) continue\r\n\r\n try {\r\n const raw = readFileSync(skillFile, 'utf8')\r\n const { frontmatter, content } = parseFrontmatter(raw)\r\n\r\n const dirName = entry.name\r\n const declaredName =\r\n typeof (frontmatter as any).name === 'string'\r\n ? String((frontmatter as any).name).trim()\r\n : ''\r\n const effectiveDeclaredName =\r\n declaredName && declaredName === dirName ? declaredName : ''\r\n if (declaredName && declaredName !== dirName) {\r\n if (strictMode) continue\r\n debugLogger.warn('CUSTOM_COMMAND_SKILL_NAME_MISMATCH', {\r\n dirName,\r\n declaredName,\r\n skillFile,\r\n })\r\n }\r\n const name = buildPluginQualifiedName(args.pluginName, dirName)\r\n if (!validateName(dirName)) {\r\n if (strictMode) continue\r\n debugLogger.warn('CUSTOM_COMMAND_SKILL_DIR_INVALID', { dirName, skillFile })\r\n }\r\n const descriptionText =\r\n frontmatter.description ??\r\n extractDescriptionFromMarkdown(content, 'Skill')\r\n if (strictMode) {\r\n const d =\r\n typeof frontmatter.description === 'string'\r\n ? frontmatter.description.trim()\r\n : ''\r\n if (!d || d.length > 1024) continue\r\n }\r\n\r\n const allowedTools = parseAllowedTools(frontmatter['allowed-tools'])\r\n const maxThinkingTokens = parseMaxThinkingTokens(frontmatter as any)\r\n const argumentHint = frontmatter['argument-hint']\r\n const whenToUse = frontmatter.when_to_use\r\n const version = frontmatter.version\r\n const disableModelInvocation = toBoolean(\r\n frontmatter['disable-model-invocation'],\r\n )\r\n const model =\r\n frontmatter.model === 'inherit' ? undefined : frontmatter.model\r\n\r\n out.push({\r\n type: 'prompt',\r\n name,\r\n description: `${descriptionText} (${sourceLabel('pluginDir')})`,\r\n isEnabled: true,\r\n isHidden: true,\r\n aliases: [],\r\n filePath: skillFile,\r\n progressMessage: 'loading',\r\n allowedTools,\r\n maxThinkingTokens,\r\n argumentHint,\r\n whenToUse,\r\n version,\r\n model,\r\n isSkill: true,\r\n disableModelInvocation,\r\n hasUserSpecifiedDescription: !!frontmatter.description,\r\n source: 'pluginDir',\r\n scope: 'project',\r\n userFacingName() {\r\n return effectiveDeclaredName\r\n ? buildPluginQualifiedName(args.pluginName, effectiveDeclaredName)\r\n : name\r\n },\r\n async getPromptForCommand(argsText: string): Promise<MessageParam[]> {\r\n let prompt = `Base directory for this skill: ${skillDir}\\n\\n${content}`\r\n const trimmedArgs = argsText.trim()\r\n if (trimmedArgs) {\r\n if (prompt.includes('$ARGUMENTS')) {\r\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\r\n } else {\r\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\r\n }\r\n }\r\n return [{ role: 'user', content: prompt }]\r\n },\r\n })\r\n } catch {\r\n }\r\n }\r\n\r\n return out\r\n}\r\n\r\nfunction applySkillFilePreference(\r\n files: CommandFileRecord[],\r\n): CommandFileRecord[] {\r\n const grouped = new Map<string, CommandFileRecord[]>()\r\n for (const file of files) {\r\n const key = dirname(file.filePath)\r\n const existing = grouped.get(key) ?? []\r\n existing.push(file)\r\n grouped.set(key, existing)\r\n }\r\n\r\n const result: CommandFileRecord[] = []\r\n for (const group of grouped.values()) {\r\n const skillFiles = group.filter(f => isSkillMarkdownFile(f.filePath))\r\n if (skillFiles.length > 0) {\r\n result.push(skillFiles[0]!)\r\n continue\r\n }\r\n result.push(...group)\r\n }\r\n return result\r\n}\r\n\r\nfunction createPromptCommandFromFile(\r\n record: CommandFileRecord,\r\n): CustomCommandWithScope | null {\r\n const isSkill = isSkillMarkdownFile(record.filePath)\r\n const name = nameForCommandFile(record.filePath, record.baseDir)\r\n if (!name) return null\r\n\r\n const descriptionText =\r\n record.frontmatter.description ??\r\n extractDescriptionFromMarkdown(\r\n record.content,\r\n isSkill ? 'Skill' : 'Custom command',\r\n )\r\n\r\n const allowedTools = parseAllowedTools(record.frontmatter['allowed-tools'])\r\n const maxThinkingTokens = parseMaxThinkingTokens(record.frontmatter)\r\n const argumentHint = record.frontmatter['argument-hint']\r\n const whenToUse = record.frontmatter.when_to_use\r\n const version = record.frontmatter.version\r\n const disableModelInvocation = toBoolean(\r\n record.frontmatter['disable-model-invocation'],\r\n )\r\n const model =\r\n record.frontmatter.model === 'inherit'\r\n ? undefined\r\n : record.frontmatter.model\r\n\r\n const description = `${descriptionText} (${sourceLabel(record.source)})`\r\n const progressMessage = isSkill ? 'loading' : 'running'\r\n const skillBaseDir = isSkill ? dirname(record.filePath) : undefined\r\n\r\n return {\r\n type: 'prompt',\r\n name,\r\n description,\r\n isEnabled: true,\r\n isHidden: false,\r\n filePath: record.filePath,\r\n aliases: [],\r\n progressMessage,\r\n allowedTools,\r\n maxThinkingTokens,\r\n argumentHint,\r\n whenToUse,\r\n version,\r\n model,\r\n isSkill,\r\n disableModelInvocation,\r\n hasUserSpecifiedDescription: !!record.frontmatter.description,\r\n source: record.source,\r\n scope: record.scope,\r\n userFacingName() {\r\n return name\r\n },\r\n async getPromptForCommand(args: string): Promise<MessageParam[]> {\r\n let prompt = record.content\r\n if (isSkill && skillBaseDir) {\r\n prompt = `Base directory for this skill: ${skillBaseDir}\\n\\n${prompt}`\r\n }\r\n const trimmedArgs = args.trim()\r\n if (trimmedArgs) {\r\n if (prompt.includes('$ARGUMENTS')) {\r\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\r\n } else {\r\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\r\n }\r\n }\r\n return [{ role: 'user', content: prompt }]\r\n },\r\n }\r\n}\r\n\r\nfunction listMarkdownFilesRecursively(\r\n baseDir: string,\r\n signal: AbortSignal,\r\n): string[] {\r\n const results: string[] = []\r\n const queue: string[] = [baseDir]\r\n while (queue.length > 0) {\r\n if (signal.aborted) break\r\n const currentDir = queue.pop()!\r\n let entries\r\n try {\r\n entries = readdirSync(currentDir, { withFileTypes: true })\r\n } catch {\r\n continue\r\n }\r\n for (const entry of entries) {\r\n if (signal.aborted) break\r\n const fullPath = join(currentDir, entry.name)\r\n if (entry.isDirectory()) {\r\n queue.push(fullPath)\r\n continue\r\n }\r\n if (entry.isFile() && entry.name.toLowerCase().endsWith('.md')) {\r\n results.push(fullPath)\r\n }\r\n }\r\n }\r\n return results\r\n}\r\n\r\nfunction loadCommandMarkdownFilesFromBaseDir(\r\n baseDir: string,\r\n source: CommandSource,\r\n scope: 'user' | 'project',\r\n signal: AbortSignal,\r\n): CommandFileRecord[] {\r\n if (!existsSync(baseDir)) return []\r\n const files = listMarkdownFilesRecursively(baseDir, signal)\r\n const records: CommandFileRecord[] = []\r\n for (const filePath of files) {\r\n if (signal.aborted) break\r\n try {\r\n const raw = readFileSync(filePath, 'utf8')\r\n const { frontmatter, content } = parseFrontmatter(raw)\r\n records.push({ baseDir, filePath, frontmatter, content, source, scope })\r\n } catch {\r\n }\r\n }\r\n return records\r\n}\r\n\r\nfunction loadSkillDirectoryCommandsFromBaseDir(\r\n skillsDir: string,\r\n source: CommandSource,\r\n scope: 'user' | 'project',\r\n): CustomCommandWithScope[] {\r\n if (!existsSync(skillsDir)) return []\r\n\r\n const out: CustomCommandWithScope[] = []\r\n let entries\r\n try {\r\n entries = readdirSync(skillsDir, { withFileTypes: true })\r\n } catch {\r\n return []\r\n }\r\n\r\n const strictMode = toBoolean(process.env.NEWCRAW_SKILLS_STRICT)\r\n const validateName = (skillName: string): boolean => {\r\n if (skillName.length < 1 || skillName.length > 64) return false\r\n return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(skillName)\r\n }\r\n\r\n for (const entry of entries) {\r\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue\r\n const skillDir = join(skillsDir, entry.name)\r\n const skillFileCandidates = [\r\n join(skillDir, 'SKILL.md'),\r\n join(skillDir, 'skill.md'),\r\n ]\r\n const skillFile = skillFileCandidates.find(p => existsSync(p))\r\n if (!skillFile) continue\r\n\r\n try {\r\n const raw = readFileSync(skillFile, 'utf8')\r\n const { frontmatter, content } = parseFrontmatter(raw)\r\n\r\n const dirName = entry.name\r\n const declaredName =\r\n typeof (frontmatter as any).name === 'string'\r\n ? String((frontmatter as any).name).trim()\r\n : ''\r\n const effectiveDeclaredName =\r\n declaredName && declaredName === dirName ? declaredName : ''\r\n if (declaredName && declaredName !== dirName) {\r\n if (strictMode) continue\r\n debugLogger.warn('CUSTOM_COMMAND_SKILL_NAME_MISMATCH', {\r\n dirName,\r\n declaredName,\r\n skillFile,\r\n })\r\n }\r\n const name = dirName\r\n if (!validateName(name)) {\r\n if (strictMode) continue\r\n debugLogger.warn('CUSTOM_COMMAND_SKILL_DIR_INVALID', { name, skillFile })\r\n }\r\n const descriptionText =\r\n frontmatter.description ??\r\n extractDescriptionFromMarkdown(content, 'Skill')\r\n if (strictMode) {\r\n const d =\r\n typeof frontmatter.description === 'string'\r\n ? frontmatter.description.trim()\r\n : ''\r\n if (!d || d.length > 1024) continue\r\n }\r\n\r\n const allowedTools = parseAllowedTools(frontmatter['allowed-tools'])\r\n const maxThinkingTokens = parseMaxThinkingTokens(frontmatter as any)\r\n const argumentHint = frontmatter['argument-hint']\r\n const whenToUse = frontmatter.when_to_use\r\n const version = frontmatter.version\r\n const disableModelInvocation = toBoolean(\r\n frontmatter['disable-model-invocation'],\r\n )\r\n const model =\r\n frontmatter.model === 'inherit' ? undefined : frontmatter.model\r\n\r\n out.push({\r\n type: 'prompt',\r\n name,\r\n description: `${descriptionText} (${sourceLabel(source)})`,\r\n isEnabled: true,\r\n isHidden: true,\r\n aliases: [],\r\n filePath: skillFile,\r\n progressMessage: 'loading',\r\n allowedTools,\r\n maxThinkingTokens,\r\n argumentHint,\r\n whenToUse,\r\n version,\r\n model,\r\n isSkill: true,\r\n disableModelInvocation,\r\n hasUserSpecifiedDescription: !!frontmatter.description,\r\n source,\r\n scope,\r\n userFacingName() {\r\n return effectiveDeclaredName || name\r\n },\r\n async getPromptForCommand(args: string): Promise<MessageParam[]> {\r\n let prompt = `Base directory for this skill: ${skillDir}\\n\\n${content}`\r\n const trimmedArgs = args.trim()\r\n if (trimmedArgs) {\r\n if (prompt.includes('$ARGUMENTS')) {\r\n prompt = prompt.replaceAll('$ARGUMENTS', trimmedArgs)\r\n } else {\r\n prompt = `${prompt}\\n\\nARGUMENTS: ${trimmedArgs}`\r\n }\r\n }\r\n return [{ role: 'user', content: prompt }]\r\n },\r\n })\r\n } catch {\r\n }\r\n }\r\n\r\n return out\r\n}\r\n\r\nexport const loadCustomCommands = memoize(\r\n async (): Promise<CustomCommandWithScope[]> => {\r\n const cwd = getCwd()\r\n const userKodeBaseDir = getUserKodeBaseDir()\r\n const sessionPlugins = getSessionPlugins()\r\n\r\n const projectLegacyCommandsDir = join(cwd, '.claude', 'commands')\r\n const userLegacyCommandsDir = join(homedir(), '.claude', 'commands')\r\n const projectKodeCommandsDir = join(cwd, '.newcraw', 'commands')\r\n const userKodeCommandsDir = join(userKodeBaseDir, 'commands')\r\n\r\n const projectLegacySkillsDir = join(cwd, '.claude', 'skills')\r\n const userLegacySkillsDir = join(homedir(), '.claude', 'skills')\r\n const projectKodeSkillsDir = join(cwd, '.newcraw', 'skills')\r\n const userKodeSkillsDir = join(userKodeBaseDir, 'skills')\r\n\r\n const abortController = new AbortController()\r\n const timeout = setTimeout(() => abortController.abort(), 3000)\r\n\r\n try {\r\n const commandFiles = applySkillFilePreference([\r\n ...loadCommandMarkdownFilesFromBaseDir(\r\n projectLegacyCommandsDir,\r\n 'localSettings',\r\n 'project',\r\n abortController.signal,\r\n ),\r\n ...loadCommandMarkdownFilesFromBaseDir(\r\n projectKodeCommandsDir,\r\n 'localSettings',\r\n 'project',\r\n abortController.signal,\r\n ),\r\n ...loadCommandMarkdownFilesFromBaseDir(\r\n userLegacyCommandsDir,\r\n 'userSettings',\r\n 'user',\r\n abortController.signal,\r\n ),\r\n ...loadCommandMarkdownFilesFromBaseDir(\r\n userKodeCommandsDir,\r\n 'userSettings',\r\n 'user',\r\n abortController.signal,\r\n ),\r\n ])\r\n\r\n const fileCommands = commandFiles\r\n .map(createPromptCommandFromFile)\r\n .filter((cmd): cmd is CustomCommandWithScope => cmd !== null)\r\n\r\n const skillDirCommands: CustomCommandWithScope[] = [\r\n ...loadSkillDirectoryCommandsFromBaseDir(\r\n projectLegacySkillsDir,\r\n 'localSettings',\r\n 'project',\r\n ),\r\n ...loadSkillDirectoryCommandsFromBaseDir(\r\n projectKodeSkillsDir,\r\n 'localSettings',\r\n 'project',\r\n ),\r\n ...loadSkillDirectoryCommandsFromBaseDir(\r\n userLegacySkillsDir,\r\n 'userSettings',\r\n 'user',\r\n ),\r\n ...loadSkillDirectoryCommandsFromBaseDir(\r\n userKodeSkillsDir,\r\n 'userSettings',\r\n 'user',\r\n ),\r\n ]\r\n\r\n const pluginCommands: CustomCommandWithScope[] = []\r\n if (sessionPlugins.length > 0) {\r\n for (const plugin of sessionPlugins) {\r\n for (const commandsDir of plugin.commandsDirs) {\r\n pluginCommands.push(\r\n ...loadPluginCommandsFromDir({\r\n pluginName: plugin.name,\r\n commandsDir,\r\n signal: abortController.signal,\r\n }),\r\n )\r\n }\r\n for (const skillsDir of plugin.skillsDirs) {\r\n pluginCommands.push(\r\n ...loadPluginSkillDirectoryCommandsFromBaseDir({\r\n pluginName: plugin.name,\r\n skillsDir,\r\n }),\r\n )\r\n }\r\n }\r\n }\r\n\r\n const ordered = [\r\n ...fileCommands,\r\n ...skillDirCommands,\r\n ...pluginCommands,\r\n ].filter(cmd => cmd.isEnabled)\r\n\r\n const seen = new Set<string>()\r\n const unique: CustomCommandWithScope[] = []\r\n for (const cmd of ordered) {\r\n const key = cmd.userFacingName()\r\n if (seen.has(key)) continue\r\n seen.add(key)\r\n unique.push(cmd)\r\n }\r\n\r\n return unique\r\n } catch (error) {\r\n logError(error)\r\n debugLogger.warn('CUSTOM_COMMANDS_LOAD_FAILED', {\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n return []\r\n } finally {\r\n clearTimeout(timeout)\r\n }\r\n },\r\n () => {\r\n const cwd = getCwd()\r\n const userKodeBaseDir = getUserKodeBaseDir()\r\n const dirs = [\r\n join(homedir(), '.claude', 'commands'),\r\n join(cwd, '.claude', 'commands'),\r\n join(userKodeBaseDir, 'commands'),\r\n join(cwd, '.newcraw', 'commands'),\r\n join(homedir(), '.claude', 'skills'),\r\n join(cwd, '.claude', 'skills'),\r\n join(userKodeBaseDir, 'skills'),\r\n join(cwd, '.newcraw', 'skills'),\r\n ]\r\n const exists = dirs.map(d => (existsSync(d) ? '1' : '0')).join('')\r\n return `${cwd}:${exists}:${Math.floor(Date.now() / 60000)}`\r\n },\r\n)\r\n\r\nexport const reloadCustomCommands = (): void => {\r\n loadCustomCommands.cache.clear()\r\n}\r\n\r\nexport function getCustomCommandDirectories(): {\r\n userClaudeCommands: string\r\n projectClaudeCommands: string\r\n userClaudeSkills: string\r\n projectClaudeSkills: string\r\n userKodeCommands: string\r\n projectKodeCommands: string\r\n userKodeSkills: string\r\n projectKodeSkills: string\r\n} {\r\n const userKodeBaseDir = getUserKodeBaseDir()\r\n return {\r\n userClaudeCommands: join(homedir(), '.claude', 'commands'),\r\n projectClaudeCommands: join(getCwd(), '.claude', 'commands'),\r\n userClaudeSkills: join(homedir(), '.claude', 'skills'),\r\n projectClaudeSkills: join(getCwd(), '.claude', 'skills'),\r\n userKodeCommands: join(userKodeBaseDir, 'commands'),\r\n projectKodeCommands: join(getCwd(), '.newcraw', 'commands'),\r\n userKodeSkills: join(userKodeBaseDir, 'skills'),\r\n projectKodeSkills: join(getCwd(), '.newcraw', 'skills'),\r\n }\r\n}\r\n\r\nexport function hasCustomCommands(): boolean {\r\n const dirs = getCustomCommandDirectories()\r\n return (\r\n existsSync(dirs.userClaudeCommands) ||\r\n existsSync(dirs.projectClaudeCommands) ||\r\n existsSync(dirs.userClaudeSkills) ||\r\n existsSync(dirs.projectClaudeSkills) ||\r\n existsSync(dirs.userKodeCommands) ||\r\n existsSync(dirs.projectKodeCommands) ||\r\n existsSync(dirs.userKodeSkills) ||\r\n existsSync(dirs.projectKodeSkills)\r\n )\r\n}\r\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;AAAA,SAAS,YAAY,cAAc,aAAa,gBAAgB;AAChE,SAAS,UAAU,SAAS,MAAM,UAAmB,WAAW;AAChE,SAAS,eAAe;AACxB,SAAS,eAAe;AAQxB,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAC1B,OAAO,YAAY;AACnB,OAAO,UAAU;AAEjB,IAAM,gBAAgB,UAAU,QAAQ;AAExC,eAAsB,oBAAoB,SAAkC;AAC1E,QAAM,mBAAmB;AACzB,QAAM,UAAU,CAAC,GAAG,QAAQ,SAAS,gBAAgB,CAAC;AAEtD,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AAEb,aAAW,SAAS,SAAS;AAC3B,UAAM,YAAY,MAAM,CAAC;AACzB,UAAM,UAAU,MAAM,CAAC,EAAE,KAAK;AAE9B,QAAI;AACF,YAAM,QAAQ,QAAQ,MAAM,KAAK;AACjC,YAAM,MAAM,MAAM,CAAC;AACnB,YAAM,OAAO,MAAM,MAAM,CAAC;AAE1B,YAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,cAAc,KAAK,MAAM;AAAA,QACxD,SAAS;AAAA,QACT,UAAU;AAAA,QACV,KAAK,OAAO;AAAA,MACd,CAAC;AAED,YAAM,SAAS,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK;AACjD,eAAS,OAAO,QAAQ,WAAW,MAAM;AAAA,IAC3C,SAAS,OAAO;AACd,eAAS,KAAK;AACd,YAAY,KAAK,mCAAmC;AAAA,QAClD;AAAA,QACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AACD,eAAS,OAAO,QAAQ,WAAW,qBAAqB,OAAO,GAAG;AAAA,IACpE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,sBAAsB,SAAkC;AAC5E,QAAM,eAAe;AACrB,QAAM,UAAU,CAAC,GAAG,QAAQ,SAAS,YAAY,CAAC;AAElD,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AAEb,aAAW,SAAS,SAAS;AAC3B,UAAM,YAAY,MAAM,CAAC;AACzB,UAAM,WAAW,MAAM,CAAC;AAExB,QAAI,SAAS,WAAW,QAAQ,GAAG;AACjC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,KAAK,OAAO,GAAG,QAAQ;AAExC,UAAI,WAAW,QAAQ,GAAG;AACxB,cAAM,cAAc,aAAa,UAAU,EAAE,UAAU,QAAQ,CAAC;AAEhE,cAAM,mBAAmB;AAAA;AAAA,WAAgB,QAAQ;AAAA;AAAA,EAAa,WAAW;AAAA;AAAA;AACzE,iBAAS,OAAO,QAAQ,WAAW,gBAAgB;AAAA,MACrD,OAAO;AACL,iBAAS,OAAO,QAAQ,WAAW,oBAAoB,QAAQ,GAAG;AAAA,MACpE;AAAA,IACF,SAAS,OAAO;AACd,eAAS,KAAK;AACd,YAAY,KAAK,mCAAmC;AAAA,QAClD;AAAA,QACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AACD,eAAS,OAAO,QAAQ,WAAW,mBAAmB,QAAQ,GAAG;AAAA,IACnE;AAAA,EACF;AAEA,SAAO;AACT;AA8CO,SAAS,iBAAiB,SAG/B;AACA,QAAM,aAAc,KAAa;AACjC,QAAM,SAAS,OAAO,SAAS;AAAA,IAC7B,SAAS;AAAA,MACP,MAAM;AAAA,QACJ,OAAO,CAAC,UACN,KAAK,KAAK,OAAO,aAAa,EAAE,QAAQ,WAAW,IAAI,MAAS,KAChE,CAAC;AAAA,MACL;AAAA,IACF;AAAA,EACF,CAAC;AACD,SAAO;AAAA,IACL,aAAc,OAAO,QAAQ,CAAC;AAAA,IAC9B,SAAS,OAAO,WAAW;AAAA,EAC7B;AACF;AAIA,SAAS,oBAAoB,UAA2B;AACtD,SAAO,eAAe,KAAK,SAAS,QAAQ,CAAC;AAC/C;AAEA,SAAS,qBAA6B;AACpC,SAAO,eAAe;AACxB;AAEA,SAAS,UAAU,OAAyB;AAC1C,MAAI,OAAO,UAAU,UAAW,QAAO;AACvC,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,QAAI,CAAC,KAAK,QAAQ,OAAO,IAAI,EAAE,SAAS,UAAU,EAAG,QAAO;AAC5D,QAAI,CAAC,KAAK,SAAS,MAAM,KAAK,EAAE,SAAS,UAAU,EAAG,QAAO;AAAA,EAC/D;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAA0B;AACnD,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,OAAK,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAAA,EACxD;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,CAAC,QAAS,QAAO,CAAC;AACtB,WAAO,QACJ,MAAM,KAAK,EACX,IAAI,OAAK,EAAE,KAAK,CAAC,EACjB,OAAO,OAAO;AAAA,EACnB;AACA,SAAO,CAAC;AACV;AAEA,SAAS,uBACP,aACoB;AACpB,QAAM,MACH,YAAoB,qBACpB,YAAoB,uBACpB,YAAoB,qBAAqB,KACzC,YAAoB,qBAAqB;AAC5C,MAAI,QAAQ,UAAa,QAAQ,KAAM,QAAO;AAC9C,QAAM,QAAQ,OAAO,QAAQ,WAAW,MAAM,OAAO,OAAO,GAAG,EAAE,KAAK,CAAC;AACvE,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,EAAG,QAAO;AACjD,SAAO,KAAK,MAAM,KAAK;AACzB;AAEA,SAAS,YAAY,QAA+B;AAClD,MAAI,WAAW,gBAAiB,QAAO;AACvC,MAAI,WAAW,eAAgB,QAAO;AACtC,MAAI,WAAW,YAAa,QAAO;AACnC,SAAO;AACT;AAEA,SAAS,+BACP,UACA,UACQ;AACR,QAAM,QAAQ,SAAS,MAAM,OAAO;AACpC,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,QAAS;AACd,UAAM,UAAU,QAAQ,MAAM,iBAAiB;AAC/C,QAAI,UAAU,CAAC,EAAG,QAAO,QAAQ,CAAC,EAAE,KAAK;AACzC,WAAO,QAAQ,SAAS,MAAM,GAAG,QAAQ,MAAM,GAAG,GAAG,CAAC,QAAQ;AAAA,EAChE;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,SAAiB,SAAyB;AACtE,QAAM,UAAU,SAAS,SAAS,OAAO;AACzC,MAAI,CAAC,WAAW,YAAY,OAAO,QAAQ,WAAW,IAAI,EAAG,QAAO;AACpE,SAAO,QAAQ,MAAM,GAAG,EAAE,KAAK,GAAG;AACpC;AAEA,SAAS,mBAAmB,UAAkB,SAAyB;AACrE,MAAI,oBAAoB,QAAQ,GAAG;AACjC,UAAM,WAAW,QAAQ,QAAQ;AACjC,UAAM,YAAY,QAAQ,QAAQ;AAClC,UAAM,YAAY,SAAS,QAAQ;AACnC,UAAMA,aAAY,qBAAqB,WAAW,OAAO;AACzD,WAAOA,aAAY,GAAGA,UAAS,IAAI,SAAS,KAAK;AAAA,EACnD;AAEA,QAAM,MAAM,QAAQ,QAAQ;AAC5B,QAAM,YAAY,qBAAqB,KAAK,OAAO;AACnD,QAAM,WAAW,SAAS,QAAQ,EAAE,QAAQ,UAAU,EAAE;AACxD,SAAO,YAAY,GAAG,SAAS,IAAI,QAAQ,KAAK;AAClD;AAWA,SAAS,yBACP,YACA,WACQ;AACR,QAAM,IAAI,WAAW,KAAK;AAC1B,QAAM,IAAI,UAAU,KAAK;AACzB,MAAI,CAAC,EAAG,QAAO;AACf,MAAI,CAAC,KAAK,MAAM,EAAG,QAAO;AAC1B,SAAO,GAAG,CAAC,IAAI,CAAC;AAClB;AAEA,SAAS,yBACP,UACA,aACA,YACQ;AACR,QAAM,MAAM,SAAS,aAAa,QAAQ;AAC1C,QAAM,QAAQ,IAAI,QAAQ,UAAU,EAAE;AACtC,QAAM,YAAY,MAAM,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAC3D,SAAO,yBAAyB,YAAY,SAAS;AACvD;AAEA,SAAS,kCAAkC,QAMT;AAChC,QAAM,OAAO;AAAA,IACX,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACA,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,kBACJ,OAAO,YAAY,eACnB,+BAA+B,OAAO,SAAS,gBAAgB;AACjE,QAAM,eAAe,kBAAkB,OAAO,YAAY,eAAe,CAAC;AAC1E,QAAM,oBAAoB,uBAAuB,OAAO,WAAW;AACnE,QAAM,eAAe,OAAO,YAAY,eAAe;AACvD,QAAM,YAAY,OAAO,YAAY;AACrC,QAAM,UAAU,OAAO,YAAY;AACnC,QAAM,yBAAyB;AAAA,IAC7B,OAAO,YAAY,0BAA0B;AAAA,EAC/C;AACA,QAAM,QACJ,OAAO,YAAY,UAAU,YACzB,SACA,OAAO,YAAY;AAEzB,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,aAAa,GAAG,eAAe,KAAK,YAAY,WAAW,CAAC;AAAA,IAC5D,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU,OAAO;AAAA,IACjB,SAAS,CAAC;AAAA,IACV,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,6BAA6B,CAAC,CAAC,OAAO,YAAY;AAAA,IAClD,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBAAiB;AACf,aAAO;AAAA,IACT;AAAA,IACA,MAAM,oBAAoB,MAAuC;AAC/D,UAAI,SAAS,OAAO;AACpB,YAAM,cAAc,KAAK,KAAK;AAC9B,UAAI,aAAa;AACf,YAAI,OAAO,SAAS,YAAY,GAAG;AACjC,mBAAS,OAAO,WAAW,cAAc,WAAW;AAAA,QACtD,OAAO;AACL,mBAAS,GAAG,MAAM;AAAA;AAAA,aAAkB,WAAW;AAAA,QACjD;AAAA,MACF;AACA,aAAO,CAAC,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,IAC3C;AAAA,EACF;AACF;AAEA,SAAS,0BAA0B,MAIN;AAC3B,MAAI,kBAAkB,KAAK;AAC3B,MAAI,QAAkB,CAAC;AACvB,MAAI;AACF,UAAM,KAAK,SAAS,KAAK,WAAW;AACpC,QAAI,GAAG,OAAO,GAAG;AACf,UAAI,CAAC,KAAK,YAAY,YAAY,EAAE,SAAS,KAAK,EAAG,QAAO,CAAC;AAC7D,cAAQ,CAAC,KAAK,WAAW;AACzB,wBAAkB,QAAQ,KAAK,WAAW;AAAA,IAC5C,WAAW,GAAG,YAAY,GAAG;AAC3B,cAAQ,6BAA6B,KAAK,aAAa,KAAK,MAAM;AAAA,IACpE,OAAO;AACL,aAAO,CAAC;AAAA,IACV;AAAA,EACF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,MAAgC,CAAC;AACvC,aAAW,YAAY,OAAO;AAC5B,QAAI,KAAK,OAAO,QAAS;AACzB,QAAI;AACF,YAAM,MAAM,aAAa,UAAU,MAAM;AACzC,YAAM,EAAE,aAAa,QAAQ,IAAI,iBAAiB,GAAG;AACrD,YAAM,MAAM,kCAAkC;AAAA,QAC5C,YAAY,KAAK;AAAA,QACjB,aAAa;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,UAAI,IAAK,KAAI,KAAK,GAAG;AAAA,IACvB,QAAQ;AAAA,IACR;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,4CAA4C,MAGxB;AAC3B,MAAI,CAAC,WAAW,KAAK,SAAS,EAAG,QAAO,CAAC;AAEzC,QAAM,MAAgC,CAAC;AACvC,MAAI;AACJ,MAAI;AACF,cAAU,YAAY,KAAK,WAAW,EAAE,eAAe,KAAK,CAAC;AAAA,EAC/D,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,aAAa,UAAU,QAAQ,IAAI,qBAAqB;AAC9D,QAAM,eAAe,CAAC,cAA+B;AACnD,QAAI,UAAU,SAAS,KAAK,UAAU,SAAS,GAAI,QAAO;AAC1D,WAAO,6BAA6B,KAAK,SAAS;AAAA,EACpD;AAEA,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,eAAe,EAAG;AACrD,UAAM,WAAW,KAAK,KAAK,WAAW,MAAM,IAAI;AAChD,UAAM,sBAAsB;AAAA,MAC1B,KAAK,UAAU,UAAU;AAAA,MACzB,KAAK,UAAU,UAAU;AAAA,IAC3B;AACA,UAAM,YAAY,oBAAoB,KAAK,OAAK,WAAW,CAAC,CAAC;AAC7D,QAAI,CAAC,UAAW;AAEhB,QAAI;AACF,YAAM,MAAM,aAAa,WAAW,MAAM;AAC1C,YAAM,EAAE,aAAa,QAAQ,IAAI,iBAAiB,GAAG;AAErD,YAAM,UAAU,MAAM;AACtB,YAAM,eACJ,OAAQ,YAAoB,SAAS,WACjC,OAAQ,YAAoB,IAAI,EAAE,KAAK,IACvC;AACN,YAAM,wBACJ,gBAAgB,iBAAiB,UAAU,eAAe;AAC5D,UAAI,gBAAgB,iBAAiB,SAAS;AAC5C,YAAI,WAAY;AAChB,cAAY,KAAK,sCAAsC;AAAA,UACrD;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AACA,YAAM,OAAO,yBAAyB,KAAK,YAAY,OAAO;AAC9D,UAAI,CAAC,aAAa,OAAO,GAAG;AAC1B,YAAI,WAAY;AAChB,cAAY,KAAK,oCAAoC,EAAE,SAAS,UAAU,CAAC;AAAA,MAC7E;AACA,YAAM,kBACJ,YAAY,eACZ,+BAA+B,SAAS,OAAO;AACjD,UAAI,YAAY;AACd,cAAM,IACJ,OAAO,YAAY,gBAAgB,WAC/B,YAAY,YAAY,KAAK,IAC7B;AACN,YAAI,CAAC,KAAK,EAAE,SAAS,KAAM;AAAA,MAC7B;AAEA,YAAM,eAAe,kBAAkB,YAAY,eAAe,CAAC;AACnE,YAAM,oBAAoB,uBAAuB,WAAkB;AACnE,YAAM,eAAe,YAAY,eAAe;AAChD,YAAM,YAAY,YAAY;AAC9B,YAAM,UAAU,YAAY;AAC5B,YAAM,yBAAyB;AAAA,QAC7B,YAAY,0BAA0B;AAAA,MACxC;AACA,YAAM,QACJ,YAAY,UAAU,YAAY,SAAY,YAAY;AAE5D,UAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN;AAAA,QACA,aAAa,GAAG,eAAe,KAAK,YAAY,WAAW,CAAC;AAAA,QAC5D,WAAW;AAAA,QACX,UAAU;AAAA,QACV,SAAS,CAAC;AAAA,QACV,UAAU;AAAA,QACV,iBAAiB;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,6BAA6B,CAAC,CAAC,YAAY;AAAA,QAC3C,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,iBAAiB;AACf,iBAAO,wBACH,yBAAyB,KAAK,YAAY,qBAAqB,IAC/D;AAAA,QACN;AAAA,QACA,MAAM,oBAAoB,UAA2C;AACnE,cAAI,SAAS,kCAAkC,QAAQ;AAAA;AAAA,EAAO,OAAO;AACrE,gBAAM,cAAc,SAAS,KAAK;AAClC,cAAI,aAAa;AACf,gBAAI,OAAO,SAAS,YAAY,GAAG;AACjC,uBAAS,OAAO,WAAW,cAAc,WAAW;AAAA,YACtD,OAAO;AACL,uBAAS,GAAG,MAAM;AAAA;AAAA,aAAkB,WAAW;AAAA,YACjD;AAAA,UACF;AACA,iBAAO,CAAC,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH,QAAQ;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,yBACP,OACqB;AACrB,QAAM,UAAU,oBAAI,IAAiC;AACrD,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,QAAQ,KAAK,QAAQ;AACjC,UAAM,WAAW,QAAQ,IAAI,GAAG,KAAK,CAAC;AACtC,aAAS,KAAK,IAAI;AAClB,YAAQ,IAAI,KAAK,QAAQ;AAAA,EAC3B;AAEA,QAAM,SAA8B,CAAC;AACrC,aAAW,SAAS,QAAQ,OAAO,GAAG;AACpC,UAAM,aAAa,MAAM,OAAO,OAAK,oBAAoB,EAAE,QAAQ,CAAC;AACpE,QAAI,WAAW,SAAS,GAAG;AACzB,aAAO,KAAK,WAAW,CAAC,CAAE;AAC1B;AAAA,IACF;AACA,WAAO,KAAK,GAAG,KAAK;AAAA,EACtB;AACA,SAAO;AACT;AAEA,SAAS,4BACP,QAC+B;AAC/B,QAAM,UAAU,oBAAoB,OAAO,QAAQ;AACnD,QAAM,OAAO,mBAAmB,OAAO,UAAU,OAAO,OAAO;AAC/D,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,kBACJ,OAAO,YAAY,eACnB;AAAA,IACE,OAAO;AAAA,IACP,UAAU,UAAU;AAAA,EACtB;AAEF,QAAM,eAAe,kBAAkB,OAAO,YAAY,eAAe,CAAC;AAC1E,QAAM,oBAAoB,uBAAuB,OAAO,WAAW;AACnE,QAAM,eAAe,OAAO,YAAY,eAAe;AACvD,QAAM,YAAY,OAAO,YAAY;AACrC,QAAM,UAAU,OAAO,YAAY;AACnC,QAAM,yBAAyB;AAAA,IAC7B,OAAO,YAAY,0BAA0B;AAAA,EAC/C;AACA,QAAM,QACJ,OAAO,YAAY,UAAU,YACzB,SACA,OAAO,YAAY;AAEzB,QAAM,cAAc,GAAG,eAAe,KAAK,YAAY,OAAO,MAAM,CAAC;AACrE,QAAM,kBAAkB,UAAU,YAAY;AAC9C,QAAM,eAAe,UAAU,QAAQ,OAAO,QAAQ,IAAI;AAE1D,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU,OAAO;AAAA,IACjB,SAAS,CAAC;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,6BAA6B,CAAC,CAAC,OAAO,YAAY;AAAA,IAClD,QAAQ,OAAO;AAAA,IACf,OAAO,OAAO;AAAA,IACd,iBAAiB;AACf,aAAO;AAAA,IACT;AAAA,IACA,MAAM,oBAAoB,MAAuC;AAC/D,UAAI,SAAS,OAAO;AACpB,UAAI,WAAW,cAAc;AAC3B,iBAAS,kCAAkC,YAAY;AAAA;AAAA,EAAO,MAAM;AAAA,MACtE;AACA,YAAM,cAAc,KAAK,KAAK;AAC9B,UAAI,aAAa;AACf,YAAI,OAAO,SAAS,YAAY,GAAG;AACjC,mBAAS,OAAO,WAAW,cAAc,WAAW;AAAA,QACtD,OAAO;AACL,mBAAS,GAAG,MAAM;AAAA;AAAA,aAAkB,WAAW;AAAA,QACjD;AAAA,MACF;AACA,aAAO,CAAC,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,IAC3C;AAAA,EACF;AACF;AAEA,SAAS,6BACP,SACA,QACU;AACV,QAAM,UAAoB,CAAC;AAC3B,QAAM,QAAkB,CAAC,OAAO;AAChC,SAAO,MAAM,SAAS,GAAG;AACvB,QAAI,OAAO,QAAS;AACpB,UAAM,aAAa,MAAM,IAAI;AAC7B,QAAI;AACJ,QAAI;AACF,gBAAU,YAAY,YAAY,EAAE,eAAe,KAAK,CAAC;AAAA,IAC3D,QAAQ;AACN;AAAA,IACF;AACA,eAAW,SAAS,SAAS;AAC3B,UAAI,OAAO,QAAS;AACpB,YAAM,WAAW,KAAK,YAAY,MAAM,IAAI;AAC5C,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,KAAK,QAAQ;AACnB;AAAA,MACF;AACA,UAAI,MAAM,OAAO,KAAK,MAAM,KAAK,YAAY,EAAE,SAAS,KAAK,GAAG;AAC9D,gBAAQ,KAAK,QAAQ;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oCACP,SACA,QACA,OACA,QACqB;AACrB,MAAI,CAAC,WAAW,OAAO,EAAG,QAAO,CAAC;AAClC,QAAM,QAAQ,6BAA6B,SAAS,MAAM;AAC1D,QAAM,UAA+B,CAAC;AACtC,aAAW,YAAY,OAAO;AAC5B,QAAI,OAAO,QAAS;AACpB,QAAI;AACF,YAAM,MAAM,aAAa,UAAU,MAAM;AACzC,YAAM,EAAE,aAAa,QAAQ,IAAI,iBAAiB,GAAG;AACrD,cAAQ,KAAK,EAAE,SAAS,UAAU,aAAa,SAAS,QAAQ,MAAM,CAAC;AAAA,IACzE,QAAQ;AAAA,IACR;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sCACP,WACA,QACA,OAC0B;AAC1B,MAAI,CAAC,WAAW,SAAS,EAAG,QAAO,CAAC;AAEpC,QAAM,MAAgC,CAAC;AACvC,MAAI;AACJ,MAAI;AACF,cAAU,YAAY,WAAW,EAAE,eAAe,KAAK,CAAC;AAAA,EAC1D,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,aAAa,UAAU,QAAQ,IAAI,qBAAqB;AAC9D,QAAM,eAAe,CAAC,cAA+B;AACnD,QAAI,UAAU,SAAS,KAAK,UAAU,SAAS,GAAI,QAAO;AAC1D,WAAO,6BAA6B,KAAK,SAAS;AAAA,EACpD;AAEA,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,eAAe,EAAG;AACrD,UAAM,WAAW,KAAK,WAAW,MAAM,IAAI;AAC3C,UAAM,sBAAsB;AAAA,MAC1B,KAAK,UAAU,UAAU;AAAA,MACzB,KAAK,UAAU,UAAU;AAAA,IAC3B;AACA,UAAM,YAAY,oBAAoB,KAAK,OAAK,WAAW,CAAC,CAAC;AAC7D,QAAI,CAAC,UAAW;AAEhB,QAAI;AACF,YAAM,MAAM,aAAa,WAAW,MAAM;AAC1C,YAAM,EAAE,aAAa,QAAQ,IAAI,iBAAiB,GAAG;AAErD,YAAM,UAAU,MAAM;AACtB,YAAM,eACJ,OAAQ,YAAoB,SAAS,WACjC,OAAQ,YAAoB,IAAI,EAAE,KAAK,IACvC;AACN,YAAM,wBACJ,gBAAgB,iBAAiB,UAAU,eAAe;AAC5D,UAAI,gBAAgB,iBAAiB,SAAS;AAC5C,YAAI,WAAY;AAChB,cAAY,KAAK,sCAAsC;AAAA,UACrD;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AACA,YAAM,OAAO;AACb,UAAI,CAAC,aAAa,IAAI,GAAG;AACvB,YAAI,WAAY;AAChB,cAAY,KAAK,oCAAoC,EAAE,MAAM,UAAU,CAAC;AAAA,MAC1E;AACA,YAAM,kBACJ,YAAY,eACZ,+BAA+B,SAAS,OAAO;AACjD,UAAI,YAAY;AACd,cAAM,IACJ,OAAO,YAAY,gBAAgB,WAC/B,YAAY,YAAY,KAAK,IAC7B;AACN,YAAI,CAAC,KAAK,EAAE,SAAS,KAAM;AAAA,MAC7B;AAEA,YAAM,eAAe,kBAAkB,YAAY,eAAe,CAAC;AACnE,YAAM,oBAAoB,uBAAuB,WAAkB;AACnE,YAAM,eAAe,YAAY,eAAe;AAChD,YAAM,YAAY,YAAY;AAC9B,YAAM,UAAU,YAAY;AAC5B,YAAM,yBAAyB;AAAA,QAC7B,YAAY,0BAA0B;AAAA,MACxC;AACA,YAAM,QACJ,YAAY,UAAU,YAAY,SAAY,YAAY;AAE5D,UAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN;AAAA,QACA,aAAa,GAAG,eAAe,KAAK,YAAY,MAAM,CAAC;AAAA,QACvD,WAAW;AAAA,QACX,UAAU;AAAA,QACV,SAAS,CAAC;AAAA,QACV,UAAU;AAAA,QACV,iBAAiB;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,6BAA6B,CAAC,CAAC,YAAY;AAAA,QAC3C;AAAA,QACA;AAAA,QACA,iBAAiB;AACf,iBAAO,yBAAyB;AAAA,QAClC;AAAA,QACA,MAAM,oBAAoB,MAAuC;AAC/D,cAAI,SAAS,kCAAkC,QAAQ;AAAA;AAAA,EAAO,OAAO;AACrE,gBAAM,cAAc,KAAK,KAAK;AAC9B,cAAI,aAAa;AACf,gBAAI,OAAO,SAAS,YAAY,GAAG;AACjC,uBAAS,OAAO,WAAW,cAAc,WAAW;AAAA,YACtD,OAAO;AACL,uBAAS,GAAG,MAAM;AAAA;AAAA,aAAkB,WAAW;AAAA,YACjD;AAAA,UACF;AACA,iBAAO,CAAC,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH,QAAQ;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,qBAAqB;AAAA,EAChC,YAA+C;AAC7C,UAAM,MAAM,OAAO;AACnB,UAAM,kBAAkB,mBAAmB;AAC3C,UAAM,iBAAiB,kBAAkB;AAEzC,UAAM,2BAA2B,KAAK,KAAK,WAAW,UAAU;AAChE,UAAM,wBAAwB,KAAK,QAAQ,GAAG,WAAW,UAAU;AACnE,UAAM,yBAAyB,KAAK,KAAK,YAAY,UAAU;AAC/D,UAAM,sBAAsB,KAAK,iBAAiB,UAAU;AAE5D,UAAM,yBAAyB,KAAK,KAAK,WAAW,QAAQ;AAC5D,UAAM,sBAAsB,KAAK,QAAQ,GAAG,WAAW,QAAQ;AAC/D,UAAM,uBAAuB,KAAK,KAAK,YAAY,QAAQ;AAC3D,UAAM,oBAAoB,KAAK,iBAAiB,QAAQ;AAExD,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,UAAM,UAAU,WAAW,MAAM,gBAAgB,MAAM,GAAG,GAAI;AAE9D,QAAI;AACF,YAAM,eAAe,yBAAyB;AAAA,QAC5C,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA,gBAAgB;AAAA,QAClB;AAAA,QACA,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA,gBAAgB;AAAA,QAClB;AAAA,QACA,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA,gBAAgB;AAAA,QAClB;AAAA,QACA,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA,gBAAgB;AAAA,QAClB;AAAA,MACF,CAAC;AAED,YAAM,eAAe,aAClB,IAAI,2BAA2B,EAC/B,OAAO,CAAC,QAAuC,QAAQ,IAAI;AAE9D,YAAM,mBAA6C;AAAA,QACjD,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,YAAM,iBAA2C,CAAC;AAClD,UAAI,eAAe,SAAS,GAAG;AAC7B,mBAAW,UAAU,gBAAgB;AACnC,qBAAW,eAAe,OAAO,cAAc;AAC7C,2BAAe;AAAA,cACb,GAAG,0BAA0B;AAAA,gBAC3B,YAAY,OAAO;AAAA,gBACnB;AAAA,gBACA,QAAQ,gBAAgB;AAAA,cAC1B,CAAC;AAAA,YACH;AAAA,UACF;AACA,qBAAW,aAAa,OAAO,YAAY;AACzC,2BAAe;AAAA,cACb,GAAG,4CAA4C;AAAA,gBAC7C,YAAY,OAAO;AAAA,gBACnB;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU;AAAA,QACd,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,MACL,EAAE,OAAO,SAAO,IAAI,SAAS;AAE7B,YAAM,OAAO,oBAAI,IAAY;AAC7B,YAAM,SAAmC,CAAC;AAC1C,iBAAW,OAAO,SAAS;AACzB,cAAM,MAAM,IAAI,eAAe;AAC/B,YAAI,KAAK,IAAI,GAAG,EAAG;AACnB,aAAK,IAAI,GAAG;AACZ,eAAO,KAAK,GAAG;AAAA,MACjB;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,eAAS,KAAK;AACd,YAAY,KAAK,+BAA+B;AAAA,QAC9C,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AACD,aAAO,CAAC;AAAA,IACV,UAAE;AACA,mBAAa,OAAO;AAAA,IACtB;AAAA,EACF;AAAA,EACA,MAAM;AACJ,UAAM,MAAM,OAAO;AACnB,UAAM,kBAAkB,mBAAmB;AAC3C,UAAM,OAAO;AAAA,MACX,KAAK,QAAQ,GAAG,WAAW,UAAU;AAAA,MACrC,KAAK,KAAK,WAAW,UAAU;AAAA,MAC/B,KAAK,iBAAiB,UAAU;AAAA,MAChC,KAAK,KAAK,YAAY,UAAU;AAAA,MAChC,KAAK,QAAQ,GAAG,WAAW,QAAQ;AAAA,MACnC,KAAK,KAAK,WAAW,QAAQ;AAAA,MAC7B,KAAK,iBAAiB,QAAQ;AAAA,MAC9B,KAAK,KAAK,YAAY,QAAQ;AAAA,IAChC;AACA,UAAM,SAAS,KAAK,IAAI,OAAM,WAAW,CAAC,IAAI,MAAM,GAAI,EAAE,KAAK,EAAE;AACjE,WAAO,GAAG,GAAG,IAAI,MAAM,IAAI,KAAK,MAAM,KAAK,IAAI,IAAI,GAAK,CAAC;AAAA,EAC3D;AACF;AAEO,IAAM,uBAAuB,MAAY;AAC9C,qBAAmB,MAAM,MAAM;AACjC;AAEO,SAAS,8BASd;AACA,QAAM,kBAAkB,mBAAmB;AAC3C,SAAO;AAAA,IACL,oBAAoB,KAAK,QAAQ,GAAG,WAAW,UAAU;AAAA,IACzD,uBAAuB,KAAK,OAAO,GAAG,WAAW,UAAU;AAAA,IAC3D,kBAAkB,KAAK,QAAQ,GAAG,WAAW,QAAQ;AAAA,IACrD,qBAAqB,KAAK,OAAO,GAAG,WAAW,QAAQ;AAAA,IACvD,kBAAkB,KAAK,iBAAiB,UAAU;AAAA,IAClD,qBAAqB,KAAK,OAAO,GAAG,YAAY,UAAU;AAAA,IAC1D,gBAAgB,KAAK,iBAAiB,QAAQ;AAAA,IAC9C,mBAAmB,KAAK,OAAO,GAAG,YAAY,QAAQ;AAAA,EACxD;AACF;AAEO,SAAS,oBAA6B;AAC3C,QAAM,OAAO,4BAA4B;AACzC,SACE,WAAW,KAAK,kBAAkB,KAClC,WAAW,KAAK,qBAAqB,KACrC,WAAW,KAAK,gBAAgB,KAChC,WAAW,KAAK,mBAAmB,KACnC,WAAW,KAAK,gBAAgB,KAChC,WAAW,KAAK,mBAAmB,KACnC,WAAW,KAAK,cAAc,KAC9B,WAAW,KAAK,iBAAiB;AAErC;",
|
|
6
|
+
"names": ["namespace"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { createRequire as __newcrawCreateRequire } from "node:module";
|
|
2
|
+
const require = __newcrawCreateRequire(import.meta.url);
|
|
3
|
+
import {
|
|
4
|
+
getSettingsFileCandidates,
|
|
5
|
+
loadSettingsWithLegacyFallback,
|
|
6
|
+
saveSettingsToPrimaryAndSyncLegacy
|
|
7
|
+
} from "./chunk-YYPJWXSA.js";
|
|
8
|
+
import {
|
|
9
|
+
createDefaultToolPermissionContext,
|
|
10
|
+
isPersistableToolPermissionDestination
|
|
11
|
+
} from "./chunk-U7S4MEYP.js";
|
|
12
|
+
import {
|
|
13
|
+
getCurrentProjectConfig
|
|
14
|
+
} from "./chunk-SBE6Y327.js";
|
|
15
|
+
import {
|
|
16
|
+
getCwd,
|
|
17
|
+
logError
|
|
18
|
+
} from "./chunk-3C73U2IU.js";
|
|
19
|
+
|
|
20
|
+
// src/utils/permissions/toolPermissionSettings.ts
|
|
21
|
+
function uniqueStrings(value) {
|
|
22
|
+
if (!Array.isArray(value)) return [];
|
|
23
|
+
const out = [];
|
|
24
|
+
const seen = /* @__PURE__ */ new Set();
|
|
25
|
+
for (const item of value) {
|
|
26
|
+
if (typeof item !== "string") continue;
|
|
27
|
+
if (seen.has(item)) continue;
|
|
28
|
+
seen.add(item);
|
|
29
|
+
out.push(item);
|
|
30
|
+
}
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
function getPrimarySettingsFilePathForDestination(options) {
|
|
34
|
+
const candidates = getSettingsFileCandidates({
|
|
35
|
+
destination: options.destination,
|
|
36
|
+
projectDir: options.projectDir,
|
|
37
|
+
homeDir: options.homeDir
|
|
38
|
+
});
|
|
39
|
+
return candidates?.primary ?? null;
|
|
40
|
+
}
|
|
41
|
+
function loadToolPermissionContextFromDisk(options) {
|
|
42
|
+
const projectDir = options?.projectDir ?? getCwd();
|
|
43
|
+
const homeDir = options?.homeDir;
|
|
44
|
+
const includeKodeProjectConfig = options?.includeKodeProjectConfig ?? true;
|
|
45
|
+
const base = createDefaultToolPermissionContext({
|
|
46
|
+
isBypassPermissionsModeAvailable: options?.isBypassPermissionsModeAvailable ?? false
|
|
47
|
+
});
|
|
48
|
+
const destinations = [
|
|
49
|
+
"userSettings",
|
|
50
|
+
"projectSettings",
|
|
51
|
+
"localSettings"
|
|
52
|
+
];
|
|
53
|
+
for (const destination of destinations) {
|
|
54
|
+
const settings = loadSettingsWithLegacyFallback({
|
|
55
|
+
destination,
|
|
56
|
+
projectDir,
|
|
57
|
+
homeDir,
|
|
58
|
+
migrateToPrimary: true
|
|
59
|
+
}).settings;
|
|
60
|
+
const perms = settings?.permissions;
|
|
61
|
+
const allow = uniqueStrings(perms?.allow);
|
|
62
|
+
const deny = uniqueStrings(perms?.deny);
|
|
63
|
+
const ask = uniqueStrings(perms?.ask);
|
|
64
|
+
const additionalDirectories = uniqueStrings(perms?.additionalDirectories);
|
|
65
|
+
if (allow.length > 0) base.alwaysAllowRules[destination] = allow;
|
|
66
|
+
if (deny.length > 0) base.alwaysDenyRules[destination] = deny;
|
|
67
|
+
if (ask.length > 0) base.alwaysAskRules[destination] = ask;
|
|
68
|
+
for (const dir of additionalDirectories) {
|
|
69
|
+
base.additionalWorkingDirectories.set(dir, {
|
|
70
|
+
path: dir,
|
|
71
|
+
source: destination
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (includeKodeProjectConfig) {
|
|
76
|
+
try {
|
|
77
|
+
const cfg = getCurrentProjectConfig();
|
|
78
|
+
const allow = Array.isArray(cfg.allowedTools) ? cfg.allowedTools : [];
|
|
79
|
+
const deny = Array.isArray(cfg.deniedTools) ? cfg.deniedTools : [];
|
|
80
|
+
const ask = Array.isArray(cfg.askedTools) ? cfg.askedTools : [];
|
|
81
|
+
if (allow.length > 0) {
|
|
82
|
+
const prev = base.alwaysAllowRules.localSettings ?? [];
|
|
83
|
+
base.alwaysAllowRules.localSettings = [.../* @__PURE__ */ new Set([...prev, ...allow])];
|
|
84
|
+
}
|
|
85
|
+
if (deny.length > 0) {
|
|
86
|
+
const prev = base.alwaysDenyRules.localSettings ?? [];
|
|
87
|
+
base.alwaysDenyRules.localSettings = [.../* @__PURE__ */ new Set([...prev, ...deny])];
|
|
88
|
+
}
|
|
89
|
+
if (ask.length > 0) {
|
|
90
|
+
const prev = base.alwaysAskRules.localSettings ?? [];
|
|
91
|
+
base.alwaysAskRules.localSettings = [.../* @__PURE__ */ new Set([...prev, ...ask])];
|
|
92
|
+
}
|
|
93
|
+
} catch (error) {
|
|
94
|
+
logError(error);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return base;
|
|
98
|
+
}
|
|
99
|
+
function getOrCreatePermissions(settings) {
|
|
100
|
+
const existing = settings.permissions;
|
|
101
|
+
if (existing && typeof existing === "object") {
|
|
102
|
+
return existing;
|
|
103
|
+
}
|
|
104
|
+
settings.permissions = {};
|
|
105
|
+
return settings.permissions;
|
|
106
|
+
}
|
|
107
|
+
function behaviorKey(behavior) {
|
|
108
|
+
switch (behavior) {
|
|
109
|
+
case "allow":
|
|
110
|
+
return "allow";
|
|
111
|
+
case "deny":
|
|
112
|
+
return "deny";
|
|
113
|
+
case "ask":
|
|
114
|
+
return "ask";
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function persistToolPermissionUpdateToDisk(options) {
|
|
118
|
+
const update = options.update;
|
|
119
|
+
if (!isPersistableToolPermissionDestination(update.destination)) {
|
|
120
|
+
return { persisted: false };
|
|
121
|
+
}
|
|
122
|
+
if (update.type === "setMode") {
|
|
123
|
+
return { persisted: false };
|
|
124
|
+
}
|
|
125
|
+
const filePath = getPrimarySettingsFilePathForDestination({
|
|
126
|
+
destination: update.destination,
|
|
127
|
+
projectDir: options.projectDir,
|
|
128
|
+
homeDir: options.homeDir
|
|
129
|
+
});
|
|
130
|
+
if (!filePath) return { persisted: false };
|
|
131
|
+
const existing = loadSettingsWithLegacyFallback({
|
|
132
|
+
destination: update.destination,
|
|
133
|
+
projectDir: options.projectDir,
|
|
134
|
+
homeDir: options.homeDir,
|
|
135
|
+
migrateToPrimary: true
|
|
136
|
+
}).settings ?? {};
|
|
137
|
+
const permissions = getOrCreatePermissions(existing);
|
|
138
|
+
try {
|
|
139
|
+
switch (update.type) {
|
|
140
|
+
case "addRules":
|
|
141
|
+
case "replaceRules":
|
|
142
|
+
case "removeRules": {
|
|
143
|
+
const key = behaviorKey(update.behavior);
|
|
144
|
+
const current = uniqueStrings(permissions[key]);
|
|
145
|
+
if (update.type === "addRules") {
|
|
146
|
+
const merged = [.../* @__PURE__ */ new Set([...current, ...update.rules])];
|
|
147
|
+
permissions[key] = merged;
|
|
148
|
+
} else if (update.type === "replaceRules") {
|
|
149
|
+
permissions[key] = uniqueStrings(update.rules);
|
|
150
|
+
} else {
|
|
151
|
+
const toRemove = new Set(update.rules);
|
|
152
|
+
permissions[key] = current.filter((rule) => !toRemove.has(rule));
|
|
153
|
+
}
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
case "addDirectories":
|
|
157
|
+
case "removeDirectories": {
|
|
158
|
+
const current = uniqueStrings(permissions.additionalDirectories);
|
|
159
|
+
if (update.type === "addDirectories") {
|
|
160
|
+
permissions.additionalDirectories = [
|
|
161
|
+
.../* @__PURE__ */ new Set([...current, ...update.directories])
|
|
162
|
+
];
|
|
163
|
+
} else {
|
|
164
|
+
const toRemove = new Set(update.directories);
|
|
165
|
+
permissions.additionalDirectories = current.filter(
|
|
166
|
+
(dir) => !toRemove.has(dir)
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
default:
|
|
172
|
+
return { persisted: false };
|
|
173
|
+
}
|
|
174
|
+
saveSettingsToPrimaryAndSyncLegacy({
|
|
175
|
+
destination: update.destination,
|
|
176
|
+
projectDir: options.projectDir,
|
|
177
|
+
homeDir: options.homeDir,
|
|
178
|
+
settings: existing,
|
|
179
|
+
syncLegacyIfExists: true
|
|
180
|
+
});
|
|
181
|
+
return { persisted: true };
|
|
182
|
+
} catch (error) {
|
|
183
|
+
logError(error);
|
|
184
|
+
return { persisted: false };
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export {
|
|
189
|
+
loadToolPermissionContextFromDisk,
|
|
190
|
+
persistToolPermissionUpdateToDisk
|
|
191
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/permissions/toolPermissionSettings.ts"],
|
|
4
|
+
"sourcesContent": ["import type {\r\n ToolPermissionContext,\r\n ToolPermissionContextUpdate,\r\n ToolPermissionRuleBehavior,\r\n ToolPermissionUpdateDestination,\r\n} from '@newcraw-types/toolPermissionContext'\r\nimport {\r\n createDefaultToolPermissionContext,\r\n isPersistableToolPermissionDestination,\r\n} from '@newcraw-types/toolPermissionContext'\r\nimport { getCurrentProjectConfig } from '@utils/config'\r\nimport { getCwd } from '@utils/state'\r\nimport { logError } from '@utils/log'\r\nimport {\r\n getSettingsFileCandidates,\r\n loadSettingsWithLegacyFallback,\r\n saveSettingsToPrimaryAndSyncLegacy,\r\n type SettingsFile,\r\n} from '@utils/config/settingsFiles'\r\n\r\ntype SettingsPermissions = {\r\n allow?: unknown\r\n deny?: unknown\r\n ask?: unknown\r\n additionalDirectories?: unknown\r\n}\r\n\r\ntype SettingsFileWithPermissions = {\r\n permissions?: SettingsPermissions\r\n [key: string]: unknown\r\n}\r\n\r\nfunction uniqueStrings(value: unknown): string[] {\r\n if (!Array.isArray(value)) return []\r\n const out: string[] = []\r\n const seen = new Set<string>()\r\n for (const item of value) {\r\n if (typeof item !== 'string') continue\r\n if (seen.has(item)) continue\r\n seen.add(item)\r\n out.push(item)\r\n }\r\n return out\r\n}\r\n\r\nfunction getPrimarySettingsFilePathForDestination(options: {\r\n destination: ToolPermissionUpdateDestination\r\n projectDir?: string\r\n homeDir?: string\r\n}): string | null {\r\n const candidates = getSettingsFileCandidates({\r\n destination: options.destination as any,\r\n projectDir: options.projectDir,\r\n homeDir: options.homeDir,\r\n })\r\n return candidates?.primary ?? null\r\n}\r\n\r\nexport function loadToolPermissionContextFromDisk(options?: {\r\n projectDir?: string\r\n homeDir?: string\r\n includeKodeProjectConfig?: boolean\r\n isBypassPermissionsModeAvailable?: boolean\r\n}): ToolPermissionContext {\r\n const projectDir = options?.projectDir ?? getCwd()\r\n const homeDir = options?.homeDir\r\n const includeKodeProjectConfig = options?.includeKodeProjectConfig ?? true\r\n\r\n const base = createDefaultToolPermissionContext({\r\n isBypassPermissionsModeAvailable:\r\n options?.isBypassPermissionsModeAvailable ?? false,\r\n })\r\n\r\n const destinations: ToolPermissionUpdateDestination[] = [\r\n 'userSettings',\r\n 'projectSettings',\r\n 'localSettings',\r\n ]\r\n\r\n for (const destination of destinations) {\r\n const settings = loadSettingsWithLegacyFallback({\r\n destination: destination as any,\r\n projectDir,\r\n homeDir,\r\n migrateToPrimary: true,\r\n }).settings as SettingsFileWithPermissions | null\r\n const perms = settings?.permissions\r\n const allow = uniqueStrings(perms?.allow)\r\n const deny = uniqueStrings(perms?.deny)\r\n const ask = uniqueStrings(perms?.ask)\r\n const additionalDirectories = uniqueStrings(perms?.additionalDirectories)\r\n\r\n if (allow.length > 0) base.alwaysAllowRules[destination] = allow\r\n if (deny.length > 0) base.alwaysDenyRules[destination] = deny\r\n if (ask.length > 0) base.alwaysAskRules[destination] = ask\r\n\r\n for (const dir of additionalDirectories) {\r\n base.additionalWorkingDirectories.set(dir, {\r\n path: dir,\r\n source: destination,\r\n })\r\n }\r\n }\r\n\r\n if (includeKodeProjectConfig) {\r\n try {\r\n const cfg = getCurrentProjectConfig()\r\n const allow = Array.isArray(cfg.allowedTools) ? cfg.allowedTools : []\r\n const deny = Array.isArray((cfg as any).deniedTools)\r\n ? (cfg as any).deniedTools\r\n : []\r\n const ask = Array.isArray((cfg as any).askedTools)\r\n ? (cfg as any).askedTools\r\n : []\r\n\r\n if (allow.length > 0) {\r\n const prev = base.alwaysAllowRules.localSettings ?? []\r\n base.alwaysAllowRules.localSettings = [...new Set([...prev, ...allow])]\r\n }\r\n if (deny.length > 0) {\r\n const prev = base.alwaysDenyRules.localSettings ?? []\r\n base.alwaysDenyRules.localSettings = [...new Set([...prev, ...deny])]\r\n }\r\n if (ask.length > 0) {\r\n const prev = base.alwaysAskRules.localSettings ?? []\r\n base.alwaysAskRules.localSettings = [...new Set([...prev, ...ask])]\r\n }\r\n } catch (error) {\r\n logError(error)\r\n }\r\n }\r\n\r\n return base\r\n}\r\n\r\nfunction getOrCreatePermissions(\r\n settings: SettingsFileWithPermissions,\r\n): Required<SettingsFileWithPermissions>['permissions'] {\r\n const existing = settings.permissions\r\n if (existing && typeof existing === 'object') {\r\n return existing as SettingsPermissions\r\n }\r\n settings.permissions = {}\r\n return settings.permissions as SettingsPermissions\r\n}\r\n\r\nfunction behaviorKey(\r\n behavior: ToolPermissionRuleBehavior,\r\n): keyof SettingsPermissions {\r\n switch (behavior) {\r\n case 'allow':\r\n return 'allow'\r\n case 'deny':\r\n return 'deny'\r\n case 'ask':\r\n return 'ask'\r\n }\r\n}\r\n\r\nexport function persistToolPermissionUpdateToDisk(options: {\r\n update: ToolPermissionContextUpdate\r\n projectDir?: string\r\n homeDir?: string\r\n}): { persisted: boolean } {\r\n const update = options.update\r\n if (!isPersistableToolPermissionDestination(update.destination)) {\r\n return { persisted: false }\r\n }\r\n if (update.type === 'setMode') {\r\n return { persisted: false }\r\n }\r\n\r\n const filePath = getPrimarySettingsFilePathForDestination({\r\n destination: update.destination,\r\n projectDir: options.projectDir,\r\n homeDir: options.homeDir,\r\n })\r\n if (!filePath) return { persisted: false }\r\n\r\n const existing =\r\n (loadSettingsWithLegacyFallback({\r\n destination: update.destination as any,\r\n projectDir: options.projectDir,\r\n homeDir: options.homeDir,\r\n migrateToPrimary: true,\r\n }).settings as SettingsFileWithPermissions | null) ?? {}\r\n const permissions = getOrCreatePermissions(existing)\r\n\r\n try {\r\n switch (update.type) {\r\n case 'addRules':\r\n case 'replaceRules':\r\n case 'removeRules': {\r\n const key = behaviorKey(update.behavior)\r\n const current = uniqueStrings(permissions[key])\r\n\r\n if (update.type === 'addRules') {\r\n const merged = [...new Set([...current, ...update.rules])]\r\n permissions[key] = merged\r\n } else if (update.type === 'replaceRules') {\r\n permissions[key] = uniqueStrings(update.rules)\r\n } else {\r\n const toRemove = new Set(update.rules)\r\n permissions[key] = current.filter(rule => !toRemove.has(rule))\r\n }\r\n break\r\n }\r\n case 'addDirectories':\r\n case 'removeDirectories': {\r\n const current = uniqueStrings(permissions.additionalDirectories)\r\n if (update.type === 'addDirectories') {\r\n permissions.additionalDirectories = [\r\n ...new Set([...current, ...update.directories]),\r\n ]\r\n } else {\r\n const toRemove = new Set(update.directories)\r\n permissions.additionalDirectories = current.filter(\r\n dir => !toRemove.has(dir),\r\n )\r\n }\r\n break\r\n }\r\n default:\r\n return { persisted: false }\r\n }\r\n\r\n saveSettingsToPrimaryAndSyncLegacy({\r\n destination: update.destination as any,\r\n projectDir: options.projectDir,\r\n homeDir: options.homeDir,\r\n settings: existing as SettingsFile,\r\n syncLegacyIfExists: true,\r\n })\r\n return { persisted: true }\r\n } catch (error) {\r\n logError(error)\r\n return { persisted: false }\r\n }\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|