pybao-cli 1.3.4 → 1.3.6
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/README.zh-CN.md +35 -35
- package/cli-acp.js +3 -3
- package/cli.js +4 -4
- package/dist/REPL-36K3V4O6.js +42 -0
- package/dist/{acp-ZK4PEHBS.js → acp-RFQVH724.js} +43 -43
- package/dist/acp-RFQVH724.js.map +7 -0
- package/dist/{agentsValidate-CNLZLCPF.js → agentsValidate-4DLL2NVH.js} +15 -15
- package/dist/agentsValidate-4DLL2NVH.js.map +7 -0
- package/dist/{ask-NQBBFHNS.js → ask-UIDVOYKR.js} +26 -26
- package/dist/ask-UIDVOYKR.js.map +7 -0
- package/dist/{autoUpdater-7SQ4X6WM.js → autoUpdater-JQKBGYMM.js} +3 -3
- package/dist/{chunk-YPIUGZMS.js → chunk-23L7MV2Y.js} +139 -129
- package/dist/chunk-23L7MV2Y.js.map +7 -0
- package/dist/{chunk-UWYVKM6V.js → chunk-2YGCWRVO.js} +34 -33
- package/dist/chunk-2YGCWRVO.js.map +7 -0
- package/dist/{chunk-66YCDEA2.js → chunk-4VAP5YEL.js} +11 -11
- package/dist/chunk-4VAP5YEL.js.map +7 -0
- package/dist/{chunk-EAXM67TE.js → chunk-55R7I54L.js} +12 -12
- package/dist/chunk-55R7I54L.js.map +7 -0
- package/dist/{chunk-PCXUZ6AT.js → chunk-5AGDLQAW.js} +3 -3
- package/dist/chunk-5AGDLQAW.js.map +7 -0
- package/dist/{chunk-27GYWUY2.js → chunk-5JHD6MUL.js} +3 -3
- package/dist/chunk-5JHD6MUL.js.map +7 -0
- package/dist/{chunk-EMMXJ26S.js → chunk-5L2YBNO5.js} +11 -11
- package/dist/chunk-5L2YBNO5.js.map +7 -0
- package/dist/{chunk-G2IOASOV.js → chunk-6GPWRDBK.js} +1 -1
- package/dist/{chunk-G2IOASOV.js.map → chunk-6GPWRDBK.js.map} +1 -1
- package/dist/{chunk-QM5NC7TO.js → chunk-6PHKJJUJ.js} +6 -6
- package/dist/{chunk-QM5NC7TO.js.map → chunk-6PHKJJUJ.js.map} +2 -2
- package/dist/{chunk-VVZQUQB5.js → chunk-7BBVZG5B.js} +25 -25
- package/dist/chunk-7BBVZG5B.js.map +7 -0
- package/dist/{chunk-T7WZHV42.js → chunk-A3LKXXWG.js} +2 -2
- package/dist/{chunk-TM6EL75Y.js → chunk-AJOZ3W4U.js} +4 -4
- package/dist/{chunk-T6GVXTNQ.js → chunk-B6IMQJZM.js} +7 -7
- package/dist/chunk-B6IMQJZM.js.map +7 -0
- package/dist/{chunk-FPLHZKHG.js → chunk-FGKBQAZE.js} +18 -18
- package/dist/chunk-FGKBQAZE.js.map +7 -0
- package/dist/{chunk-7X3QUKZJ.js → chunk-HRW76ZCA.js} +4 -4
- package/dist/chunk-HRW76ZCA.js.map +7 -0
- package/dist/{chunk-HIP7XQSM.js → chunk-MSOYRSL6.js} +11 -11
- package/dist/chunk-MSOYRSL6.js.map +7 -0
- package/dist/{chunk-VRGR4ZTQ.js → chunk-MWPFU2KU.js} +2 -2
- package/dist/chunk-MWPFU2KU.js.map +7 -0
- package/dist/{chunk-ONRCOGHT.js → chunk-OYSULZG3.js} +6 -6
- package/dist/chunk-OYSULZG3.js.map +7 -0
- package/dist/{chunk-TCCONYNZ.js → chunk-Q2ULATNS.js} +27 -27
- package/dist/chunk-Q2ULATNS.js.map +7 -0
- package/dist/{chunk-2QWJPY3A.js → chunk-QOJXMDS7.js} +7 -7
- package/dist/chunk-QOJXMDS7.js.map +7 -0
- package/dist/{chunk-H5WLCP2Q.js → chunk-QYW4WV3B.js} +9 -9
- package/dist/chunk-QYW4WV3B.js.map +7 -0
- package/dist/{chunk-EREH4M6C.js → chunk-R6B5QXT3.js} +5 -5
- package/dist/chunk-R6B5QXT3.js.map +7 -0
- package/dist/{chunk-UEANWPJI.js → chunk-RNVMHRM6.js} +7 -7
- package/dist/chunk-RNVMHRM6.js.map +7 -0
- package/dist/{chunk-6UHQEJU5.js → chunk-RXEB7A7K.js} +3 -3
- package/dist/chunk-RXEB7A7K.js.map +7 -0
- package/dist/{chunk-S74HKDFU.js → chunk-SD4T5FIT.js} +4 -4
- package/dist/{chunk-S74HKDFU.js.map → chunk-SD4T5FIT.js.map} +1 -1
- package/dist/{chunk-JL3N5JHZ.js → chunk-T5LHTEEE.js} +3 -3
- package/dist/{chunk-LQH5OITU.js → chunk-V2WGJF5D.js} +3 -3
- package/dist/{chunk-QLP2QCPC.js → chunk-VJS3VGKL.js} +5 -5
- package/dist/chunk-VJS3VGKL.js.map +7 -0
- package/dist/{chunk-CY54GWA4.js → chunk-WTWAFAPK.js} +14 -14
- package/dist/chunk-WTWAFAPK.js.map +7 -0
- package/dist/chunk-XI4LTVYT.js.map +7 -0
- package/dist/{chunk-DS3EM3LE.js → chunk-YILTNJUA.js} +5 -5
- package/dist/chunk-YILTNJUA.js.map +7 -0
- package/dist/{chunk-Z7YDRXPH.js → chunk-ZFB54AUA.js} +7 -7
- package/dist/chunk-ZFB54AUA.js.map +7 -0
- package/dist/{cli-ZJ7IBHJY.js → cli-G5SV42ST.js} +119 -119
- package/dist/cli-G5SV42ST.js.map +7 -0
- package/dist/commands-H7B4G4WE.js +46 -0
- package/dist/{config-EUUK7YTG.js → config-LAK62YAE.js} +4 -4
- package/dist/{context-MQKNXW2P.js → context-FDF2ICND.js} +5 -5
- package/dist/{customCommands-G6OTNNST.js → customCommands-JPYZGAPD.js} +4 -4
- package/dist/{env-3A7JSF3L.js → env-RJ42F6F2.js} +8 -8
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/{llm-TFMCL3FJ.js → llm-IUITCXQH.js} +34 -34
- package/dist/llm-IUITCXQH.js.map +7 -0
- package/dist/{llmLazy-JF4W3ECN.js → llmLazy-O2Y2FTMW.js} +1 -1
- package/dist/{loader-E3DJWZ43.js → loader-DKNG527Z.js} +4 -4
- package/dist/{mcp-CLIGTX2Y.js → mcp-JE45AJB5.js} +7 -7
- package/dist/{mentionProcessor-D44ZKAHF.js → mentionProcessor-CCRLNX5N.js} +5 -5
- package/dist/{messages-IFBBCPBX.js → messages-LCIJ5GI6.js} +1 -1
- package/dist/{model-KHNUZMSI.js → model-WJ5IN4MT.js} +5 -5
- package/dist/{openai-4XFA4KMK.js → openai-C7RHYT6C.js} +5 -5
- package/dist/{outputStyles-NUAH4FME.js → outputStyles-XQRKFIMI.js} +4 -4
- package/dist/{pluginRuntime-KYFB3F2O.js → pluginRuntime-HXRNF35P.js} +8 -8
- package/dist/pluginRuntime-HXRNF35P.js.map +7 -0
- package/dist/{pluginValidation-TCIL3PVT.js → pluginValidation-SGVDLOVE.js} +6 -6
- package/dist/prompts-ZRXVAHLW.js +48 -0
- package/dist/pybAgentSessionId-3HDHCCI5.js +13 -0
- package/dist/pybAgentSessionLoad-QAARWCFK.js +18 -0
- package/dist/pybAgentSessionResume-MFLYKJKP.js +16 -0
- package/dist/{kodeAgentStreamJson-3T26CHCP.js → pybAgentStreamJson-UG22YE4Z.js} +5 -5
- package/dist/{kodeAgentStreamJsonSession-E2WXNFYU.js → pybAgentStreamJsonSession-FPPTEZ7F.js} +9 -9
- package/dist/pybAgentStreamJsonSession-FPPTEZ7F.js.map +7 -0
- package/dist/{kodeAgentStructuredStdio-TNB6U6SP.js → pybAgentStructuredStdio-QDF6UGAJ.js} +3 -3
- package/dist/{kodeHooks-KEIFTKSA.js → pybHooks-BXTK4AZR.js} +7 -7
- package/dist/query-5HYIZ5QR.js +50 -0
- package/dist/{ripgrep-BQTXXOCY.js → ripgrep-DUGXYW5R.js} +3 -3
- package/dist/{skillMarketplace-WPLPA36Z.js → skillMarketplace-PZ2OWCJR.js} +3 -3
- package/dist/{state-6OLUFGTV.js → state-BORHBKLZ.js} +2 -2
- package/dist/{theme-FKIHHDYJ.js → theme-WWGSHY7G.js} +5 -5
- package/dist/{toolPermissionSettings-2YSDIYCD.js → toolPermissionSettings-AR5JDEUS.js} +6 -6
- package/dist/tools-BPXFPBXM.js +47 -0
- package/dist/{userInput-5HJRPHLY.js → userInput-SIOPI4PP.js} +34 -34
- package/dist/userInput-SIOPI4PP.js.map +7 -0
- package/package.json +1 -1
- package/scripts/binary-utils.cjs +8 -8
- package/scripts/cli-acp-wrapper.cjs +3 -3
- package/scripts/cli-wrapper.cjs +4 -4
- package/scripts/postinstall.js +7 -7
- package/dist/REPL-DWIFIJDL.js +0 -42
- package/dist/acp-ZK4PEHBS.js.map +0 -7
- package/dist/agentsValidate-CNLZLCPF.js.map +0 -7
- package/dist/ask-NQBBFHNS.js.map +0 -7
- package/dist/chunk-27GYWUY2.js.map +0 -7
- package/dist/chunk-2QWJPY3A.js.map +0 -7
- package/dist/chunk-66YCDEA2.js.map +0 -7
- package/dist/chunk-6UHQEJU5.js.map +0 -7
- package/dist/chunk-7X3QUKZJ.js.map +0 -7
- package/dist/chunk-CY54GWA4.js.map +0 -7
- package/dist/chunk-DS3EM3LE.js.map +0 -7
- package/dist/chunk-EAXM67TE.js.map +0 -7
- package/dist/chunk-EMMXJ26S.js.map +0 -7
- package/dist/chunk-EREH4M6C.js.map +0 -7
- package/dist/chunk-FPLHZKHG.js.map +0 -7
- package/dist/chunk-H5WLCP2Q.js.map +0 -7
- package/dist/chunk-HIP7XQSM.js.map +0 -7
- package/dist/chunk-M624LT6O.js.map +0 -7
- package/dist/chunk-ONRCOGHT.js.map +0 -7
- package/dist/chunk-PCXUZ6AT.js.map +0 -7
- package/dist/chunk-QLP2QCPC.js.map +0 -7
- package/dist/chunk-T6GVXTNQ.js.map +0 -7
- package/dist/chunk-TCCONYNZ.js.map +0 -7
- package/dist/chunk-UEANWPJI.js.map +0 -7
- package/dist/chunk-UWYVKM6V.js.map +0 -7
- package/dist/chunk-VRGR4ZTQ.js.map +0 -7
- package/dist/chunk-VVZQUQB5.js.map +0 -7
- package/dist/chunk-YPIUGZMS.js.map +0 -7
- package/dist/chunk-Z7YDRXPH.js.map +0 -7
- package/dist/cli-ZJ7IBHJY.js.map +0 -7
- package/dist/commands-26Q4GJ7U.js +0 -46
- package/dist/kodeAgentSessionId-PROTVRBR.js +0 -13
- package/dist/kodeAgentSessionLoad-63BYTKTV.js +0 -18
- package/dist/kodeAgentSessionResume-B74VONCU.js +0 -16
- package/dist/kodeAgentStreamJsonSession-E2WXNFYU.js.map +0 -7
- package/dist/llm-TFMCL3FJ.js.map +0 -7
- package/dist/pluginRuntime-KYFB3F2O.js.map +0 -7
- package/dist/prompts-JD7BGHKJ.js +0 -48
- package/dist/query-J5JOOKFI.js +0 -50
- package/dist/tools-S6P5P65H.js +0 -47
- package/dist/userInput-5HJRPHLY.js.map +0 -7
- /package/dist/{REPL-DWIFIJDL.js.map → REPL-36K3V4O6.js.map} +0 -0
- /package/dist/{autoUpdater-7SQ4X6WM.js.map → autoUpdater-JQKBGYMM.js.map} +0 -0
- /package/dist/{chunk-T7WZHV42.js.map → chunk-A3LKXXWG.js.map} +0 -0
- /package/dist/{chunk-TM6EL75Y.js.map → chunk-AJOZ3W4U.js.map} +0 -0
- /package/dist/{chunk-JL3N5JHZ.js.map → chunk-T5LHTEEE.js.map} +0 -0
- /package/dist/{chunk-LQH5OITU.js.map → chunk-V2WGJF5D.js.map} +0 -0
- /package/dist/{chunk-M624LT6O.js → chunk-XI4LTVYT.js} +0 -0
- /package/dist/{commands-26Q4GJ7U.js.map → commands-H7B4G4WE.js.map} +0 -0
- /package/dist/{config-EUUK7YTG.js.map → config-LAK62YAE.js.map} +0 -0
- /package/dist/{context-MQKNXW2P.js.map → context-FDF2ICND.js.map} +0 -0
- /package/dist/{customCommands-G6OTNNST.js.map → customCommands-JPYZGAPD.js.map} +0 -0
- /package/dist/{env-3A7JSF3L.js.map → env-RJ42F6F2.js.map} +0 -0
- /package/dist/{kodeAgentSessionId-PROTVRBR.js.map → llmLazy-O2Y2FTMW.js.map} +0 -0
- /package/dist/{kodeAgentSessionLoad-63BYTKTV.js.map → loader-DKNG527Z.js.map} +0 -0
- /package/dist/{kodeAgentSessionResume-B74VONCU.js.map → mcp-JE45AJB5.js.map} +0 -0
- /package/dist/{mentionProcessor-D44ZKAHF.js.map → mentionProcessor-CCRLNX5N.js.map} +0 -0
- /package/dist/{kodeAgentStreamJson-3T26CHCP.js.map → messages-LCIJ5GI6.js.map} +0 -0
- /package/dist/{kodeAgentStructuredStdio-TNB6U6SP.js.map → model-WJ5IN4MT.js.map} +0 -0
- /package/dist/{kodeHooks-KEIFTKSA.js.map → openai-C7RHYT6C.js.map} +0 -0
- /package/dist/{llmLazy-JF4W3ECN.js.map → outputStyles-XQRKFIMI.js.map} +0 -0
- /package/dist/{loader-E3DJWZ43.js.map → pluginValidation-SGVDLOVE.js.map} +0 -0
- /package/dist/{mcp-CLIGTX2Y.js.map → prompts-ZRXVAHLW.js.map} +0 -0
- /package/dist/{messages-IFBBCPBX.js.map → pybAgentSessionId-3HDHCCI5.js.map} +0 -0
- /package/dist/{model-KHNUZMSI.js.map → pybAgentSessionLoad-QAARWCFK.js.map} +0 -0
- /package/dist/{openai-4XFA4KMK.js.map → pybAgentSessionResume-MFLYKJKP.js.map} +0 -0
- /package/dist/{outputStyles-NUAH4FME.js.map → pybAgentStreamJson-UG22YE4Z.js.map} +0 -0
- /package/dist/{pluginValidation-TCIL3PVT.js.map → pybAgentStructuredStdio-QDF6UGAJ.js.map} +0 -0
- /package/dist/{prompts-JD7BGHKJ.js.map → pybHooks-BXTK4AZR.js.map} +0 -0
- /package/dist/{query-J5JOOKFI.js.map → query-5HYIZ5QR.js.map} +0 -0
- /package/dist/{ripgrep-BQTXXOCY.js.map → ripgrep-DUGXYW5R.js.map} +0 -0
- /package/dist/{skillMarketplace-WPLPA36Z.js.map → skillMarketplace-PZ2OWCJR.js.map} +0 -0
- /package/dist/{state-6OLUFGTV.js.map → state-BORHBKLZ.js.map} +0 -0
- /package/dist/{theme-FKIHHDYJ.js.map → theme-WWGSHY7G.js.map} +0 -0
- /package/dist/{toolPermissionSettings-2YSDIYCD.js.map → toolPermissionSettings-AR5JDEUS.js.map} +0 -0
- /package/dist/{tools-S6P5P65H.js.map → tools-BPXFPBXM.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/utils/protocol/kodeAgentSessionResume.ts"],
|
|
4
|
-
"sourcesContent": ["import { existsSync, readdirSync, readFileSync, statSync } from 'fs'\nimport { basename, join } from 'path'\nimport {\n getSessionProjectDir,\n getSessionProjectsDir,\n} from './kodeAgentSessionLog'\nimport { isUuid } from '@utils/text/uuid'\n\nexport type KodeAgentSessionListItem = {\n sessionId: string\n slug: string | null\n customTitle: string | null\n tag: string | null\n summary: string | null\n cwd: string | null\n createdAt: Date | null\n modifiedAt: Date | null\n}\n\nexport type ResumeResolveResult =\n | { kind: 'ok'; sessionId: string }\n | { kind: 'ambiguous'; identifier: string; matchingSessionIds: string[] }\n | { kind: 'different_directory'; sessionId: string; otherCwd: string | null }\n | { kind: 'not_found'; identifier: string }\n\nfunction safeParseJson(line: string): unknown | null {\n try {\n return JSON.parse(line)\n } catch {\n return null\n }\n}\n\nfunction safeParseDate(value: unknown): Date | null {\n if (typeof value !== 'string') return null\n const d = new Date(value)\n if (Number.isNaN(d.getTime())) return null\n return d\n}\n\nfunction readSessionListItemBestEffort(args: {\n filePath: string\n sessionId: string\n}): Omit<KodeAgentSessionListItem, 'sessionId'> {\n const { filePath, sessionId } = args\n\n let slug: string | null = null\n let cwd: string | null = null\n let createdAt: Date | null = null\n let modifiedAt: Date | null = null\n let customTitle: string | null = null\n let tag: string | null = null\n let lastAssistantUuid: string | null = null\n const summariesByLeaf = new Map<string, string>()\n let lastSummary: string | null = null\n\n try {\n modifiedAt = new Date(statSync(filePath).mtimeMs)\n } catch {\n modifiedAt = null\n }\n\n let content: string\n try {\n content = readFileSync(filePath, 'utf8')\n } catch {\n return {\n slug,\n customTitle,\n tag,\n summary: null,\n cwd,\n createdAt,\n modifiedAt,\n }\n }\n\n for (const rawLine of content.split('\\n')) {\n const line = rawLine.trim()\n if (!line) continue\n const parsed = safeParseJson(line)\n if (!parsed || typeof parsed !== 'object') continue\n\n const entry: any = parsed\n\n if (!slug && typeof entry.slug === 'string' && entry.slug.trim()) {\n slug = entry.slug.trim()\n }\n if (!cwd && typeof entry.cwd === 'string' && entry.cwd.trim()) {\n cwd = entry.cwd.trim()\n }\n if (!createdAt) {\n const ts = safeParseDate(entry.timestamp)\n if (ts) createdAt = ts\n }\n\n if (typeof entry.type !== 'string') continue\n\n if (entry.type === 'assistant') {\n if (typeof entry.uuid === 'string' && entry.uuid)\n lastAssistantUuid = entry.uuid\n continue\n }\n\n if (entry.type === 'summary') {\n const leafUuid = typeof entry.leafUuid === 'string' ? entry.leafUuid : ''\n const summary = typeof entry.summary === 'string' ? entry.summary : ''\n if (leafUuid && summary) {\n summariesByLeaf.set(leafUuid, summary)\n lastSummary = summary\n }\n continue\n }\n\n if (entry.type === 'custom-title') {\n const id = typeof entry.sessionId === 'string' ? entry.sessionId : ''\n const title =\n typeof entry.customTitle === 'string' ? entry.customTitle : ''\n if (id === sessionId && title) customTitle = title\n continue\n }\n\n if (entry.type === 'tag') {\n const id = typeof entry.sessionId === 'string' ? entry.sessionId : ''\n const t = typeof entry.tag === 'string' ? entry.tag : ''\n if (id === sessionId && t) tag = t\n continue\n }\n }\n\n const summary =\n (lastAssistantUuid\n ? (summariesByLeaf.get(lastAssistantUuid) ?? null)\n : null) ??\n lastSummary ??\n null\n\n return {\n slug,\n customTitle,\n tag,\n summary,\n cwd,\n createdAt,\n modifiedAt,\n }\n}\n\nexport function listKodeAgentSessions(args: {\n cwd: string\n}): KodeAgentSessionListItem[] {\n const { cwd } = args\n const projectDir = getSessionProjectDir(cwd)\n if (!existsSync(projectDir)) return []\n\n const candidates = readdirSync(projectDir)\n .filter(name => name.endsWith('.jsonl'))\n .filter(name => !name.startsWith('agent-'))\n .map(name => ({\n sessionId: basename(name, '.jsonl'),\n filePath: join(projectDir, name),\n }))\n .filter(c => isUuid(c.sessionId))\n\n const items = candidates.map(({ sessionId, filePath }) => ({\n sessionId,\n ...readSessionListItemBestEffort({ filePath, sessionId }),\n }))\n\n items.sort((a, b) => {\n const am = a.modifiedAt?.getTime() ?? 0\n const bm = b.modifiedAt?.getTime() ?? 0\n return bm - am\n })\n\n return items\n}\n\nfunction findSessionFileAcrossProjects(args: {\n sessionId: string\n}): { filePath: string } | null {\n const { sessionId } = args\n const projectsDir = getSessionProjectsDir()\n if (!existsSync(projectsDir)) return null\n\n let projectNames: string[]\n try {\n projectNames = readdirSync(projectsDir)\n } catch {\n return null\n }\n\n for (const projectName of projectNames) {\n const candidate = join(projectsDir, projectName, `${sessionId}.jsonl`)\n if (existsSync(candidate)) return { filePath: candidate }\n }\n\n return null\n}\n\nfunction readSessionCwdBestEffort(filePath: string): string | null {\n try {\n const content = readFileSync(filePath, 'utf8')\n for (const rawLine of content.split('\\n')) {\n const line = rawLine.trim()\n if (!line) continue\n const parsed = safeParseJson(line)\n if (!parsed || typeof parsed !== 'object') continue\n const cwd = (parsed as any).cwd\n if (typeof cwd === 'string' && cwd.trim()) return cwd.trim()\n }\n } catch {\n }\n return null\n}\n\nfunction sessionExistsInProject(cwd: string, sessionId: string): boolean {\n try {\n return existsSync(join(getSessionProjectDir(cwd), `${sessionId}.jsonl`))\n } catch {\n return false\n }\n}\n\nexport function resolveResumeSessionIdentifier(args: {\n cwd: string\n identifier: string\n}): ResumeResolveResult {\n const { cwd, identifier } = args\n const id = identifier.trim()\n if (!id) return { kind: 'not_found', identifier }\n\n if (isUuid(id)) {\n if (sessionExistsInProject(cwd, id)) return { kind: 'ok', sessionId: id }\n\n const elsewhere = findSessionFileAcrossProjects({ sessionId: id })\n if (elsewhere) {\n return {\n kind: 'different_directory',\n sessionId: id,\n otherCwd: readSessionCwdBestEffort(elsewhere.filePath),\n }\n }\n\n return { kind: 'not_found', identifier: id }\n }\n\n const sessions = listKodeAgentSessions({ cwd })\n const matches = sessions\n .filter(s => s.slug === id || s.customTitle === id)\n .map(s => s.sessionId)\n\n if (matches.length === 1) return { kind: 'ok', sessionId: matches[0]! }\n if (matches.length > 1)\n return { kind: 'ambiguous', identifier: id, matchingSessionIds: matches }\n return { kind: 'not_found', identifier: id }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["summary"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/utils/log/debugLogger.ts"],
|
|
4
|
-
"sourcesContent": ["import { existsSync, mkdirSync, appendFileSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { randomUUID } from 'crypto'\nimport { format } from 'node:util'\nimport chalk from 'chalk'\nimport envPaths from 'env-paths'\nimport { PRODUCT_COMMAND } from '@constants/product'\nimport { SESSION_ID } from './index'\nimport type { Message } from '@kode-types/conversation'\n\nexport enum LogLevel {\n TRACE = 'TRACE',\n DEBUG = 'DEBUG',\n INFO = 'INFO',\n WARN = 'WARN',\n ERROR = 'ERROR',\n FLOW = 'FLOW',\n API = 'API',\n STATE = 'STATE',\n REMINDER = 'REMINDER',\n}\n\nconst isDebugMode = () =>\n process.argv.includes('--debug-verbose') ||\n process.argv.includes('--mcp-debug') ||\n process.argv.some(\n arg => arg === '--debug' || arg === '-d' || arg.startsWith('--debug='),\n )\nconst isVerboseMode = () => process.argv.includes('--verbose')\nconst isDebugVerboseMode = () => process.argv.includes('--debug-verbose')\n\nconst TERMINAL_LOG_LEVELS = new Set([\n LogLevel.ERROR,\n LogLevel.WARN,\n LogLevel.INFO,\n LogLevel.REMINDER,\n])\n\nconst DEBUG_VERBOSE_TERMINAL_LOG_LEVELS = new Set([\n LogLevel.ERROR,\n LogLevel.WARN,\n LogLevel.FLOW,\n LogLevel.API,\n LogLevel.STATE,\n LogLevel.INFO,\n LogLevel.REMINDER,\n])\n\nconst USER_FRIENDLY_LEVELS = new Set([\n 'SESSION_START',\n 'QUERY_START',\n 'QUERY_PROGRESS',\n 'QUERY_COMPLETE',\n 'TOOL_EXECUTION',\n 'ERROR_OCCURRED',\n 'PERFORMANCE_SUMMARY',\n])\n\nconst STARTUP_TIMESTAMP = new Date().toISOString().replace(/[:.]/g, '-')\nconst REQUEST_START_TIME = Date.now()\n\nconst KODE_DIR = join(homedir(), '.kode')\nfunction getProjectDir(cwd: string): string {\n return cwd.replace(/[^a-zA-Z0-9]/g, '-')\n}\n\nconst DEBUG_PATHS = {\n base: () => join(KODE_DIR, getProjectDir(process.cwd()), 'debug'),\n detailed: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-detailed.log`),\n flow: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-flow.log`),\n api: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-api.log`),\n state: () => join(DEBUG_PATHS.base(), `${STARTUP_TIMESTAMP}-state.log`),\n}\n\nfunction ensureDebugDir() {\n const debugDir = DEBUG_PATHS.base()\n if (!existsSync(debugDir)) {\n mkdirSync(debugDir, { recursive: true })\n }\n}\n\ninterface LogEntry {\n timestamp: string\n level: LogLevel\n phase: string\n requestId?: string\n data: any\n elapsed?: number\n}\n\nclass RequestContext {\n public readonly id: string\n public readonly startTime: number\n private phases: Map<string, number> = new Map()\n\n constructor() {\n this.id = randomUUID().slice(0, 8)\n this.startTime = Date.now()\n }\n\n markPhase(phase: string) {\n this.phases.set(phase, Date.now() - this.startTime)\n }\n\n getPhaseTime(phase: string): number {\n return this.phases.get(phase) || 0\n }\n\n getAllPhases(): Record<string, number> {\n return Object.fromEntries(this.phases)\n }\n}\n\nconst activeRequests = new Map<string, RequestContext>()\nlet currentRequest: RequestContext | null = null\n\nfunction terminalLog(...args: unknown[]): void {\n process.stderr.write(`${format(...args)}\\n`)\n}\n\nfunction writeToFile(filePath: string, entry: LogEntry) {\n if (!isDebugMode()) return\n\n try {\n ensureDebugDir()\n const logLine =\n JSON.stringify(\n {\n ...entry,\n sessionId: SESSION_ID,\n pid: process.pid,\n uptime: Date.now() - REQUEST_START_TIME,\n },\n null,\n 2,\n ) + ',\\n'\n\n appendFileSync(filePath, logLine)\n } catch (error) {\n }\n}\n\nconst recentLogs = new Map<string, number>()\nconst LOG_DEDUPE_WINDOW_MS = 5000\n\nfunction getDedupeKey(level: LogLevel, phase: string, data: any): string {\n if (phase.startsWith('CONFIG_')) {\n const file = data?.file || ''\n return `${level}:${phase}:${file}`\n }\n\n return `${level}:${phase}`\n}\n\nfunction shouldLogWithDedupe(\n level: LogLevel,\n phase: string,\n data: any,\n): boolean {\n const key = getDedupeKey(level, phase, data)\n const now = Date.now()\n const lastLogTime = recentLogs.get(key)\n\n if (!lastLogTime || now - lastLogTime > LOG_DEDUPE_WINDOW_MS) {\n recentLogs.set(key, now)\n\n for (const [oldKey, oldTime] of recentLogs.entries()) {\n if (now - oldTime > LOG_DEDUPE_WINDOW_MS) {\n recentLogs.delete(oldKey)\n }\n }\n\n return true\n }\n\n return false\n}\nfunction formatMessages(messages: any): string {\n if (Array.isArray(messages)) {\n const recentMessages = messages.slice(-5)\n return recentMessages\n .map((msg, index) => {\n const role = msg.role || 'unknown'\n let content = ''\n\n if (typeof msg.content === 'string') {\n content =\n msg.content.length > 300\n ? msg.content.substring(0, 300) + '...'\n : msg.content\n } else if (typeof msg.content === 'object') {\n content = '[complex_content]'\n } else {\n content = String(msg.content || '')\n }\n\n const totalIndex = messages.length - recentMessages.length + index\n return `[${totalIndex}] ${chalk.dim(role)}: ${content}`\n })\n .join('\\n ')\n }\n\n if (typeof messages === 'string') {\n try {\n const parsed = JSON.parse(messages)\n if (Array.isArray(parsed)) {\n return formatMessages(parsed)\n }\n } catch {\n }\n }\n\n if (typeof messages === 'string' && messages.length > 200) {\n return messages.substring(0, 200) + '...'\n }\n\n return typeof messages === 'string' ? messages : JSON.stringify(messages)\n}\n\nfunction shouldShowInTerminal(level: LogLevel): boolean {\n if (!isDebugMode()) return false\n\n if (isDebugVerboseMode()) {\n return DEBUG_VERBOSE_TERMINAL_LOG_LEVELS.has(level)\n }\n\n return TERMINAL_LOG_LEVELS.has(level)\n}\n\nfunction logToTerminal(entry: LogEntry) {\n if (!shouldShowInTerminal(entry.level)) return\n\n const { level, phase, data, requestId, elapsed } = entry\n const timestamp = new Date().toISOString().slice(11, 23)\n\n let prefix = ''\n let color = chalk.gray\n\n switch (level) {\n case LogLevel.FLOW:\n prefix = '\uD83D\uDD04'\n color = chalk.cyan\n break\n case LogLevel.API:\n prefix = '\uD83C\uDF10'\n color = chalk.yellow\n break\n case LogLevel.STATE:\n prefix = '\uD83D\uDCCA'\n color = chalk.blue\n break\n case LogLevel.ERROR:\n prefix = '\u274C'\n color = chalk.red\n break\n case LogLevel.WARN:\n prefix = '\u26A0\uFE0F'\n color = chalk.yellow\n break\n case LogLevel.INFO:\n prefix = '\u2139\uFE0F'\n color = chalk.green\n break\n case LogLevel.TRACE:\n prefix = '\uD83D\uDCC8'\n color = chalk.magenta\n break\n default:\n prefix = '\uD83D\uDD0D'\n color = chalk.gray\n }\n\n const reqId = requestId ? chalk.dim(`[${requestId}]`) : ''\n const elapsedStr = elapsed !== undefined ? chalk.dim(`+${elapsed}ms`) : ''\n\n let dataStr = ''\n if (typeof data === 'object' && data !== null) {\n if (data.messages) {\n const formattedMessages = formatMessages(data.messages)\n dataStr = JSON.stringify(\n {\n ...data,\n messages: `\\n ${formattedMessages}`,\n },\n null,\n 2,\n )\n } else {\n dataStr = JSON.stringify(data, null, 2)\n }\n } else {\n dataStr = typeof data === 'string' ? data : JSON.stringify(data)\n }\n\n terminalLog(\n `${color(`[${timestamp}]`)} ${prefix} ${color(phase)} ${reqId} ${dataStr} ${elapsedStr}`,\n )\n}\n\nexport function debugLog(\n level: LogLevel,\n phase: string,\n data: any,\n requestId?: string,\n) {\n if (!isDebugMode()) return\n\n if (!shouldLogWithDedupe(level, phase, data)) {\n return\n }\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n phase,\n data,\n requestId: requestId || currentRequest?.id,\n elapsed: currentRequest ? Date.now() - currentRequest.startTime : undefined,\n }\n\n writeToFile(DEBUG_PATHS.detailed(), entry)\n\n switch (level) {\n case LogLevel.FLOW:\n writeToFile(DEBUG_PATHS.flow(), entry)\n break\n case LogLevel.API:\n writeToFile(DEBUG_PATHS.api(), entry)\n break\n case LogLevel.STATE:\n writeToFile(DEBUG_PATHS.state(), entry)\n break\n }\n\n logToTerminal(entry)\n}\n\nexport const debug = {\n flow: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.FLOW, phase, data, requestId),\n\n api: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.API, phase, data, requestId),\n\n state: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.STATE, phase, data, requestId),\n\n info: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.INFO, phase, data, requestId),\n\n warn: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.WARN, phase, data, requestId),\n\n error: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.ERROR, phase, data, requestId),\n\n trace: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.TRACE, phase, data, requestId),\n\n ui: (phase: string, data: any, requestId?: string) =>\n debugLog(LogLevel.STATE, `UI_${phase}`, data, requestId),\n}\n\nexport function startRequest(): RequestContext {\n const ctx = new RequestContext()\n currentRequest = ctx\n activeRequests.set(ctx.id, ctx)\n\n debug.flow('REQUEST_START', {\n requestId: ctx.id,\n activeRequests: activeRequests.size,\n })\n\n return ctx\n}\n\nexport function endRequest(ctx?: RequestContext) {\n const request = ctx || currentRequest\n if (!request) return\n\n debug.flow('REQUEST_END', {\n requestId: request.id,\n totalTime: Date.now() - request.startTime,\n phases: request.getAllPhases(),\n })\n\n activeRequests.delete(request.id)\n if (currentRequest === request) {\n currentRequest = null\n }\n}\n\nexport function getCurrentRequest(): RequestContext | null {\n return currentRequest\n}\n\nexport function markPhase(phase: string, data?: any) {\n if (!currentRequest) return\n\n currentRequest.markPhase(phase)\n debug.flow(`PHASE_${phase.toUpperCase()}`, {\n requestId: currentRequest.id,\n elapsed: currentRequest.getPhaseTime(phase),\n data,\n })\n}\n\nexport function logReminderEvent(\n eventType: string,\n reminderData: any,\n agentId?: string,\n) {\n if (!isDebugMode()) return\n\n debug.info('REMINDER_EVENT_TRIGGERED', {\n eventType,\n agentId: agentId || 'default',\n reminderType: reminderData.type || 'unknown',\n reminderCategory: reminderData.category || 'general',\n reminderPriority: reminderData.priority || 'medium',\n contentLength: reminderData.content ? reminderData.content.length : 0,\n timestamp: Date.now(),\n })\n}\n\nexport function logAPIError(context: {\n model: string\n endpoint: string\n status: number\n error: any\n request?: any\n response?: any\n provider?: string\n}) {\n const errorDir = join(KODE_DIR, 'logs', 'error', 'api')\n\n if (!existsSync(errorDir)) {\n try {\n mkdirSync(errorDir, { recursive: true })\n } catch (err) {\n terminalLog('Failed to create error log directory:', err)\n return\n }\n }\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\n const sanitizedModel = context.model.replace(/[^a-zA-Z0-9-_]/g, '_')\n const filename = `${sanitizedModel}_${timestamp}.log`\n const filepath = join(errorDir, filename)\n\n const fullLogContent = {\n timestamp: new Date().toISOString(),\n sessionId: SESSION_ID,\n requestId: getCurrentRequest()?.id,\n model: context.model,\n provider: context.provider,\n endpoint: context.endpoint,\n status: context.status,\n error: context.error,\n request: context.request,\n response: context.response,\n environment: {\n nodeVersion: process.version,\n platform: process.platform,\n cwd: process.cwd(),\n },\n }\n\n try {\n appendFileSync(filepath, JSON.stringify(fullLogContent, null, 2) + '\\n')\n appendFileSync(filepath, '='.repeat(80) + '\\n\\n')\n } catch (err) {\n terminalLog('Failed to write API error log:', err)\n }\n\n if (isDebugMode()) {\n debug.error('API_ERROR', {\n model: context.model,\n status: context.status,\n error:\n typeof context.error === 'string'\n ? context.error\n : context.error?.message || 'Unknown error',\n endpoint: context.endpoint,\n logFile: filename,\n })\n }\n\n if (isVerboseMode() || isDebugVerboseMode()) {\n terminalLog()\n terminalLog(chalk.red('\u2501'.repeat(60)))\n terminalLog(chalk.red.bold('\u26A0\uFE0F API Error'))\n terminalLog(chalk.red('\u2501'.repeat(60)))\n\n terminalLog(chalk.white(' Model: ') + chalk.yellow(context.model))\n terminalLog(chalk.white(' Status: ') + chalk.red(context.status))\n\n let errorMessage = 'Unknown error'\n if (typeof context.error === 'string') {\n errorMessage = context.error\n } else if (context.error?.message) {\n errorMessage = context.error.message\n } else if (context.error?.error?.message) {\n errorMessage = context.error.error.message\n }\n\n terminalLog(chalk.white(' Error: ') + chalk.red(errorMessage))\n\n if (context.response) {\n terminalLog()\n terminalLog(chalk.gray(' Response:'))\n const responseStr =\n typeof context.response === 'string'\n ? context.response\n : JSON.stringify(context.response, null, 2)\n\n responseStr.split('\\n').forEach(line => {\n terminalLog(chalk.gray(' ' + line))\n })\n }\n\n terminalLog()\n terminalLog(chalk.dim(` \uD83D\uDCC1 Full log: ${filepath}`))\n terminalLog(chalk.red('\u2501'.repeat(60)))\n terminalLog()\n }\n}\n\nexport function logLLMInteraction(context: {\n systemPrompt: string\n messages: any[]\n response: any\n usage?: { inputTokens: number; outputTokens: number }\n timing: { start: number; end: number }\n apiFormat?: 'anthropic' | 'openai'\n}) {\n if (!isDebugMode()) return\n\n const duration = context.timing.end - context.timing.start\n\n terminalLog('\\n' + chalk.blue('\uD83E\uDDE0 LLM CALL DEBUG'))\n terminalLog(chalk.gray('\u2501'.repeat(60)))\n\n terminalLog(chalk.yellow('\uD83D\uDCCA Context Overview:'))\n terminalLog(` Messages Count: ${context.messages.length}`)\n terminalLog(` System Prompt Length: ${context.systemPrompt.length} chars`)\n terminalLog(` Duration: ${duration.toFixed(0)}ms`)\n\n if (context.usage) {\n terminalLog(\n ` Token Usage: ${context.usage.inputTokens} \u2192 ${context.usage.outputTokens}`,\n )\n }\n\n const apiLabel = context.apiFormat\n ? ` (${context.apiFormat.toUpperCase()})`\n : ''\n terminalLog(chalk.cyan(`\\n\uD83D\uDCAC Real API Messages${apiLabel} (last 10):`))\n\n const recentMessages = context.messages.slice(-10)\n recentMessages.forEach((msg, index) => {\n const globalIndex = context.messages.length - recentMessages.length + index\n const roleColor =\n msg.role === 'user'\n ? 'green'\n : msg.role === 'assistant'\n ? 'blue'\n : msg.role === 'system'\n ? 'yellow'\n : 'gray'\n\n let content = ''\n let isReminder = false\n\n if (typeof msg.content === 'string') {\n if (msg.content.includes('<system-reminder>')) {\n isReminder = true\n const reminderContent = msg.content\n .replace(/<\\/?system-reminder>/g, '')\n .trim()\n content = `\uD83D\uDD14 ${reminderContent.length > 800 ? reminderContent.substring(0, 800) + '...' : reminderContent}`\n } else {\n const maxLength =\n msg.role === 'user' ? 1000 : msg.role === 'system' ? 1200 : 800\n content =\n msg.content.length > maxLength\n ? msg.content.substring(0, maxLength) + '...'\n : msg.content\n }\n } else if (Array.isArray(msg.content)) {\n const textBlocks = msg.content.filter(\n (block: any) => block.type === 'text',\n )\n const toolBlocks = msg.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n if (textBlocks.length > 0) {\n const text = textBlocks[0].text || ''\n const maxLength = msg.role === 'assistant' ? 1000 : 800\n content =\n text.length > maxLength ? text.substring(0, maxLength) + '...' : text\n }\n if (toolBlocks.length > 0) {\n content += ` [+ ${toolBlocks.length} tool calls]`\n }\n if (textBlocks.length === 0 && toolBlocks.length === 0) {\n content = `[${msg.content.length} blocks: ${msg.content.map(b => b.type || 'unknown').join(', ')}]`\n }\n } else {\n content = '[complex_content]'\n }\n\n if (isReminder) {\n terminalLog(\n ` [${globalIndex}] ${chalk.magenta('\uD83D\uDD14 REMINDER')}: ${chalk.dim(content)}`,\n )\n } else {\n const roleIcon =\n msg.role === 'user'\n ? '\uD83D\uDC64'\n : msg.role === 'assistant'\n ? '\uD83E\uDD16'\n : msg.role === 'system'\n ? '\u2699\uFE0F'\n : '\uD83D\uDCC4'\n terminalLog(\n ` [${globalIndex}] ${(chalk as any)[roleColor](roleIcon + ' ' + msg.role.toUpperCase())}: ${content}`,\n )\n }\n\n if (msg.role === 'assistant' && Array.isArray(msg.content)) {\n const toolCalls = msg.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n if (toolCalls.length > 0) {\n terminalLog(\n chalk.cyan(\n ` \uD83D\uDD27 \u2192 Tool calls (${toolCalls.length}): ${toolCalls.map((t: any) => t.name).join(', ')}`,\n ),\n )\n toolCalls.forEach((tool: any, idx: number) => {\n const inputStr = JSON.stringify(tool.input || {})\n const maxLength = 200\n const displayInput =\n inputStr.length > maxLength\n ? inputStr.substring(0, maxLength) + '...'\n : inputStr\n terminalLog(\n chalk.dim(` [${idx}] ${tool.name}: ${displayInput}`),\n )\n })\n }\n }\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n terminalLog(\n chalk.cyan(\n ` \uD83D\uDD27 \u2192 Tool calls (${msg.tool_calls.length}): ${msg.tool_calls.map((t: any) => t.function.name).join(', ')}`,\n ),\n )\n msg.tool_calls.forEach((tool: any, idx: number) => {\n const inputStr = tool.function.arguments || '{}'\n const maxLength = 200\n const displayInput =\n inputStr.length > maxLength\n ? inputStr.substring(0, maxLength) + '...'\n : inputStr\n terminalLog(\n chalk.dim(` [${idx}] ${tool.function.name}: ${displayInput}`),\n )\n })\n }\n })\n\n terminalLog(chalk.magenta('\\n\uD83E\uDD16 LLM Response:'))\n\n let responseContent = ''\n let toolCalls: any[] = []\n\n if (Array.isArray(context.response.content)) {\n const textBlocks = context.response.content.filter(\n (block: any) => block.type === 'text',\n )\n responseContent = textBlocks.length > 0 ? textBlocks[0].text || '' : ''\n toolCalls = context.response.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n } else if (typeof context.response.content === 'string') {\n responseContent = context.response.content\n toolCalls = context.response.tool_calls || context.response.toolCalls || []\n } else if (context.response.message?.content) {\n if (Array.isArray(context.response.message.content)) {\n const textBlocks = context.response.message.content.filter(\n (block: any) => block.type === 'text',\n )\n responseContent = textBlocks.length > 0 ? textBlocks[0].text || '' : ''\n toolCalls = context.response.message.content.filter(\n (block: any) => block.type === 'tool_use',\n )\n } else if (typeof context.response.message.content === 'string') {\n responseContent = context.response.message.content\n }\n } else {\n responseContent = JSON.stringify(\n context.response.content || context.response || '',\n )\n }\n\n const maxResponseLength = 1000\n const displayContent =\n responseContent.length > maxResponseLength\n ? responseContent.substring(0, maxResponseLength) + '...'\n : responseContent\n terminalLog(` Content: ${displayContent}`)\n\n if (toolCalls.length > 0) {\n const toolNames = toolCalls.map(\n (t: any) => t.name || t.function?.name || 'unknown',\n )\n terminalLog(\n chalk.cyan(\n ` \uD83D\uDD27 Tool Calls (${toolCalls.length}): ${toolNames.join(', ')}`,\n ),\n )\n toolCalls.forEach((tool: any, index: number) => {\n const toolName = tool.name || tool.function?.name || 'unknown'\n const toolInput = tool.input || tool.function?.arguments || '{}'\n const inputStr =\n typeof toolInput === 'string' ? toolInput : JSON.stringify(toolInput)\n const maxToolInputLength = 300\n const displayInput =\n inputStr.length > maxToolInputLength\n ? inputStr.substring(0, maxToolInputLength) + '...'\n : inputStr\n terminalLog(chalk.dim(` [${index}] ${toolName}: ${displayInput}`))\n })\n }\n\n terminalLog(\n ` Stop Reason: ${context.response.stop_reason || context.response.finish_reason || 'unknown'}`,\n )\n terminalLog(chalk.gray('\u2501'.repeat(60)))\n}\n\nexport function logSystemPromptConstruction(construction: {\n basePrompt: string\n kodeContext?: string\n reminders: string[]\n finalPrompt: string\n}) {\n if (!isDebugMode()) return\n\n terminalLog('\\n' + chalk.yellow('\uD83D\uDCDD SYSTEM PROMPT CONSTRUCTION'))\n terminalLog(` Base Prompt: ${construction.basePrompt.length} chars`)\n\n if (construction.kodeContext) {\n terminalLog(` + Kode Context: ${construction.kodeContext.length} chars`)\n }\n\n if (construction.reminders.length > 0) {\n terminalLog(\n ` + Dynamic Reminders: ${construction.reminders.length} items`,\n )\n construction.reminders.forEach((reminder, index) => {\n terminalLog(chalk.dim(` [${index}] ${reminder.substring(0, 80)}...`))\n })\n }\n\n terminalLog(` = Final Length: ${construction.finalPrompt.length} chars`)\n}\n\nexport function logContextCompression(compression: {\n beforeMessages: number\n afterMessages: number\n trigger: string\n preservedFiles: string[]\n compressionRatio: number\n}) {\n if (!isDebugMode()) return\n\n terminalLog('\\n' + chalk.red('\uD83D\uDDDC\uFE0F CONTEXT COMPRESSION'))\n terminalLog(` Trigger: ${compression.trigger}`)\n terminalLog(\n ` Messages: ${compression.beforeMessages} \u2192 ${compression.afterMessages}`,\n )\n terminalLog(\n ` Compression Ratio: ${(compression.compressionRatio * 100).toFixed(1)}%`,\n )\n\n if (compression.preservedFiles.length > 0) {\n terminalLog(` Preserved Files: ${compression.preservedFiles.join(', ')}`)\n }\n}\n\nexport function logUserFriendly(type: string, data: any, requestId?: string) {\n if (!isDebugMode()) return\n\n const timestamp = new Date().toLocaleTimeString()\n let message = ''\n let color = chalk.gray\n let icon = '\u2022'\n\n switch (type) {\n case 'SESSION_START':\n icon = '\uD83D\uDE80'\n color = chalk.green\n message = `Session started with ${data.model || 'default model'}`\n break\n case 'QUERY_START':\n icon = '\uD83D\uDCAD'\n color = chalk.blue\n message = `Processing query: \"${data.query?.substring(0, 50)}${data.query?.length > 50 ? '...' : ''}\"`\n break\n case 'QUERY_PROGRESS':\n icon = '\u23F3'\n color = chalk.yellow\n message = `${data.phase} (${data.elapsed}ms)`\n break\n case 'QUERY_COMPLETE':\n icon = '\u2705'\n color = chalk.green\n message = `Query completed in ${data.duration}ms - Cost: $${data.cost} - ${data.tokens} tokens`\n break\n case 'TOOL_EXECUTION':\n icon = '\uD83D\uDD27'\n color = chalk.cyan\n message = `${data.toolName}: ${data.action} ${data.target ? '\u2192 ' + data.target : ''}`\n break\n case 'ERROR_OCCURRED':\n icon = '\u274C'\n color = chalk.red\n message = `${data.error} ${data.context ? '(' + data.context + ')' : ''}`\n break\n case 'PERFORMANCE_SUMMARY':\n icon = '\uD83D\uDCCA'\n color = chalk.magenta\n message = `Session: ${data.queries} queries, $${data.totalCost}, ${data.avgResponseTime}ms avg`\n break\n default:\n message = JSON.stringify(data)\n }\n\n const reqId = requestId ? chalk.dim(`[${requestId.slice(0, 8)}]`) : ''\n terminalLog(`${color(`[${timestamp}]`)} ${icon} ${color(message)} ${reqId}`)\n}\n\nexport function initDebugLogger() {\n if (!isDebugMode()) return\n\n debug.info('DEBUG_LOGGER_INIT', {\n startupTimestamp: STARTUP_TIMESTAMP,\n sessionId: SESSION_ID,\n debugPaths: {\n detailed: DEBUG_PATHS.detailed(),\n flow: DEBUG_PATHS.flow(),\n api: DEBUG_PATHS.api(),\n state: DEBUG_PATHS.state(),\n },\n })\n\n const terminalLevels = isDebugVerboseMode()\n ? Array.from(DEBUG_VERBOSE_TERMINAL_LOG_LEVELS).join(', ')\n : Array.from(TERMINAL_LOG_LEVELS).join(', ')\n\n terminalLog(\n chalk.dim(`[DEBUG] Terminal output filtered to: ${terminalLevels}`),\n )\n terminalLog(\n chalk.dim(`[DEBUG] Complete logs saved to: ${DEBUG_PATHS.base()}`),\n )\n if (!isDebugVerboseMode()) {\n terminalLog(\n chalk.dim(\n `[DEBUG] Use --debug-verbose for detailed system logs (FLOW, API, STATE)`,\n ),\n )\n }\n}\n\ninterface ErrorDiagnosis {\n errorType: string\n category:\n | 'NETWORK'\n | 'API'\n | 'PERMISSION'\n | 'CONFIG'\n | 'SYSTEM'\n | 'USER_INPUT'\n severity: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL'\n description: string\n suggestions: string[]\n debugSteps: string[]\n relatedLogs?: string[]\n}\n\nexport function diagnoseError(error: any, context?: any): ErrorDiagnosis {\n const errorMessage = error instanceof Error ? error.message : String(error)\n const errorStack = error instanceof Error ? error.stack : undefined\n\n if (\n errorMessage.includes('aborted') ||\n errorMessage.includes('AbortController')\n ) {\n return {\n errorType: 'REQUEST_ABORTED',\n category: 'SYSTEM',\n severity: 'MEDIUM',\n description:\n 'Request was aborted, often due to user cancellation or timeout',\n suggestions: [\n '\u68C0\u67E5\u662F\u5426\u6309\u4E0B\u4E86 ESC \u952E\u53D6\u6D88\u8BF7\u6C42',\n '\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u662F\u5426\u7A33\u5B9A',\n '\u9A8C\u8BC1 AbortController \u72B6\u6001: isActive \u548C signal.aborted \u5E94\u8BE5\u4E00\u81F4',\n '\u67E5\u770B\u662F\u5426\u6709\u91CD\u590D\u7684\u8BF7\u6C42\u5BFC\u81F4\u51B2\u7A81',\n ],\n debugSteps: [\n '\u4F7F\u7528 --debug-verbose \u6A21\u5F0F\u67E5\u770B\u8BE6\u7EC6\u7684\u8BF7\u6C42\u6D41\u7A0B',\n '\u68C0\u67E5 debug \u65E5\u5FD7\u4E2D\u7684 BINARY_FEEDBACK_* \u4E8B\u4EF6',\n '\u9A8C\u8BC1 REQUEST_START \u548C REQUEST_END \u65E5\u5FD7\u914D\u5BF9',\n '\u67E5\u770B QUERY_ABORTED \u4E8B\u4EF6\u7684\u89E6\u53D1\u539F\u56E0',\n ],\n }\n }\n\n if (\n errorMessage.includes('api-key') ||\n errorMessage.includes('authentication') ||\n errorMessage.includes('401')\n ) {\n return {\n errorType: 'API_AUTHENTICATION',\n category: 'API',\n severity: 'HIGH',\n description: 'API authentication failed - invalid or missing API key',\n suggestions: [\n '\u8FD0\u884C /login \u91CD\u65B0\u8BBE\u7F6E API \u5BC6\u94A5',\n '\u68C0\u67E5 ~/.kode/ \u914D\u7F6E\u6587\u4EF6\u4E2D\u7684 API \u5BC6\u94A5',\n '\u9A8C\u8BC1 API \u5BC6\u94A5\u662F\u5426\u5DF2\u8FC7\u671F\u6216\u88AB\u64A4\u9500',\n '\u786E\u8BA4\u4F7F\u7528\u7684 provider \u8BBE\u7F6E\u6B63\u786E (anthropic/opendev/bigdream)',\n ],\n debugSteps: [\n '\u68C0\u67E5 CONFIG_LOAD \u65E5\u5FD7\u4E2D\u7684 provider \u548C API \u5BC6\u94A5\u72B6\u6001',\n '\u8FD0\u884C kode doctor \u68C0\u67E5\u7CFB\u7EDF\u5065\u5EB7\u72B6\u6001',\n '\u67E5\u770B API_ERROR \u65E5\u5FD7\u4E86\u89E3\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F',\n '\u4F7F\u7528 kode config \u547D\u4EE4\u67E5\u770B\u5F53\u524D\u914D\u7F6E',\n ],\n }\n }\n\n if (\n errorMessage.includes('ECONNREFUSED') ||\n errorMessage.includes('ENOTFOUND') ||\n errorMessage.includes('timeout')\n ) {\n return {\n errorType: 'NETWORK_CONNECTION',\n category: 'NETWORK',\n severity: 'HIGH',\n description: 'Network connection failed - unable to reach API endpoint',\n suggestions: [\n '\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u662F\u5426\u6B63\u5E38',\n '\u786E\u8BA4\u9632\u706B\u5899\u6CA1\u6709\u963B\u6B62\u76F8\u5173\u7AEF\u53E3',\n '\u68C0\u67E5 proxy \u8BBE\u7F6E\u662F\u5426\u6B63\u786E',\n '\u5C1D\u8BD5\u5207\u6362\u5230\u4E0D\u540C\u7684\u7F51\u7EDC\u73AF\u5883',\n '\u9A8C\u8BC1 baseURL \u914D\u7F6E\u662F\u5426\u6B63\u786E',\n ],\n debugSteps: [\n '\u68C0\u67E5 API_REQUEST_START \u548C\u76F8\u5173\u7F51\u7EDC\u65E5\u5FD7',\n '\u67E5\u770B LLM_REQUEST_ERROR \u4E2D\u7684\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F',\n '\u4F7F\u7528 ping \u6216 curl \u6D4B\u8BD5 API \u7AEF\u70B9\u8FDE\u901A\u6027',\n '\u68C0\u67E5\u4F01\u4E1A\u7F51\u7EDC\u662F\u5426\u9700\u8981\u4EE3\u7406\u8BBE\u7F6E',\n ],\n }\n }\n\n if (\n errorMessage.includes('permission') ||\n errorMessage.includes('EACCES') ||\n errorMessage.includes('denied')\n ) {\n return {\n errorType: 'PERMISSION_DENIED',\n category: 'PERMISSION',\n severity: 'MEDIUM',\n description: 'Permission denied - insufficient access rights',\n suggestions: [\n '\u68C0\u67E5\u6587\u4EF6\u548C\u76EE\u5F55\u7684\u8BFB\u5199\u6743\u9650',\n '\u786E\u8BA4\u5F53\u524D\u7528\u6237\u6709\u8DB3\u591F\u7684\u7CFB\u7EDF\u6743\u9650',\n '\u67E5\u770B\u662F\u5426\u9700\u8981\u7BA1\u7406\u5458\u6743\u9650\u8FD0\u884C',\n '\u68C0\u67E5\u5DE5\u5177\u6743\u9650\u8BBE\u7F6E\u662F\u5426\u6B63\u786E\u914D\u7F6E',\n ],\n debugSteps: [\n '\u67E5\u770B PERMISSION_* \u65E5\u5FD7\u4E86\u89E3\u6743\u9650\u68C0\u67E5\u8FC7\u7A0B',\n '\u68C0\u67E5\u6587\u4EF6\u7CFB\u7EDF\u6743\u9650: ls -la',\n '\u9A8C\u8BC1\u5DE5\u5177\u5BA1\u6279\u72B6\u6001',\n '\u67E5\u770B TOOL_* \u76F8\u5173\u7684\u8C03\u8BD5\u65E5\u5FD7',\n ],\n }\n }\n\n if (\n errorMessage.includes('substring is not a function') ||\n errorMessage.includes('content')\n ) {\n return {\n errorType: 'RESPONSE_FORMAT',\n category: 'API',\n severity: 'MEDIUM',\n description: 'LLM response format mismatch between different providers',\n suggestions: [\n '\u68C0\u67E5\u5F53\u524D\u4F7F\u7528\u7684 provider \u662F\u5426\u4E0E\u671F\u671B\u4E00\u81F4',\n '\u9A8C\u8BC1\u54CD\u5E94\u683C\u5F0F\u5904\u7406\u903B\u8F91',\n '\u786E\u8BA4\u4E0D\u540C provider \u7684\u54CD\u5E94\u683C\u5F0F\u5DEE\u5F02',\n '\u68C0\u67E5\u662F\u5426\u9700\u8981\u66F4\u65B0\u54CD\u5E94\u89E3\u6790\u4EE3\u7801',\n ],\n debugSteps: [\n '\u67E5\u770B LLM_CALL_DEBUG \u4E2D\u7684\u54CD\u5E94\u683C\u5F0F',\n '\u68C0\u67E5 provider \u914D\u7F6E\u548C\u5B9E\u9645\u4F7F\u7528\u7684 API',\n '\u5BF9\u6BD4 Anthropic \u548C OpenAI \u54CD\u5E94\u683C\u5F0F\u5DEE\u5F02',\n '\u9A8C\u8BC1 logLLMInteraction \u51FD\u6570\u7684\u683C\u5F0F\u5904\u7406',\n ],\n }\n }\n\n if (\n errorMessage.includes('too long') ||\n errorMessage.includes('context') ||\n errorMessage.includes('token')\n ) {\n return {\n errorType: 'CONTEXT_OVERFLOW',\n category: 'SYSTEM',\n severity: 'MEDIUM',\n description: 'Context window exceeded - conversation too long',\n suggestions: [\n '\u8FD0\u884C /compact \u624B\u52A8\u538B\u7F29\u5BF9\u8BDD\u5386\u53F2',\n '\u68C0\u67E5\u81EA\u52A8\u538B\u7F29\u8BBE\u7F6E\u662F\u5426\u6B63\u786E\u914D\u7F6E',\n '\u51CF\u5C11\u5355\u6B21\u8F93\u5165\u7684\u5185\u5BB9\u957F\u5EA6',\n '\u6E05\u7406\u4E0D\u5FC5\u8981\u7684\u4E0A\u4E0B\u6587\u4FE1\u606F',\n ],\n debugSteps: [\n '\u67E5\u770B AUTO_COMPACT_* \u65E5\u5FD7\u68C0\u67E5\u538B\u7F29\u89E6\u53D1',\n '\u68C0\u67E5 token \u4F7F\u7528\u91CF\u548C\u9608\u503C',\n '\u67E5\u770B CONTEXT_COMPRESSION \u76F8\u5173\u65E5\u5FD7',\n '\u9A8C\u8BC1\u6A21\u578B\u7684\u6700\u5927 token \u9650\u5236',\n ],\n }\n }\n\n if (\n errorMessage.includes('config') ||\n (errorMessage.includes('undefined') && context?.configRelated)\n ) {\n return {\n errorType: 'CONFIGURATION',\n category: 'CONFIG',\n severity: 'MEDIUM',\n description: 'Configuration error - missing or invalid settings',\n suggestions: [\n '\u8FD0\u884C kode config \u68C0\u67E5\u914D\u7F6E\u8BBE\u7F6E',\n '\u5220\u9664\u635F\u574F\u7684\u914D\u7F6E\u6587\u4EF6\u91CD\u65B0\u521D\u59CB\u5316',\n '\u68C0\u67E5 JSON \u914D\u7F6E\u6587\u4EF6\u8BED\u6CD5\u662F\u5426\u6B63\u786E',\n '\u9A8C\u8BC1\u73AF\u5883\u53D8\u91CF\u8BBE\u7F6E',\n ],\n debugSteps: [\n '\u67E5\u770B CONFIG_LOAD \u548C CONFIG_SAVE \u65E5\u5FD7',\n '\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\u548C\u6743\u9650',\n '\u9A8C\u8BC1 JSON \u683C\u5F0F: cat ~/.kode/config.json | jq',\n '\u67E5\u770B\u914D\u7F6E\u7F13\u5B58\u76F8\u5173\u7684\u8C03\u8BD5\u4FE1\u606F',\n ],\n }\n }\n\n return {\n errorType: 'UNKNOWN',\n category: 'SYSTEM',\n severity: 'MEDIUM',\n description: `Unexpected error: ${errorMessage}`,\n suggestions: [\n '\u91CD\u65B0\u542F\u52A8\u5E94\u7528\u7A0B\u5E8F',\n '\u68C0\u67E5\u7CFB\u7EDF\u8D44\u6E90\u662F\u5426\u5145\u8DB3',\n '\u67E5\u770B\u5B8C\u6574\u7684\u9519\u8BEF\u65E5\u5FD7\u83B7\u53D6\u66F4\u591A\u4FE1\u606F',\n '\u5982\u679C\u95EE\u9898\u6301\u7EED\uFF0C\u8BF7\u62A5\u544A\u6B64\u9519\u8BEF',\n ],\n debugSteps: [\n '\u4F7F\u7528 --debug-verbose \u83B7\u53D6\u8BE6\u7EC6\u65E5\u5FD7',\n '\u68C0\u67E5 error.log \u4E2D\u7684\u5B8C\u6574\u9519\u8BEF\u4FE1\u606F',\n '\u67E5\u770B\u7CFB\u7EDF\u8D44\u6E90\u4F7F\u7528\u60C5\u51B5',\n '\u6536\u96C6\u91CD\u73B0\u6B65\u9AA4\u548C\u73AF\u5883\u4FE1\u606F',\n ],\n relatedLogs: errorStack ? [errorStack] : undefined,\n }\n}\n\nexport function logErrorWithDiagnosis(\n error: any,\n context?: any,\n requestId?: string,\n) {\n if (!isDebugMode()) return\n\n const diagnosis = diagnoseError(error, context)\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n debug.error(\n 'ERROR_OCCURRED',\n {\n error: errorMessage,\n errorType: diagnosis.errorType,\n category: diagnosis.category,\n severity: diagnosis.severity,\n context,\n },\n requestId,\n )\n\n terminalLog('\\n' + chalk.red('\uD83D\uDEA8 ERROR DIAGNOSIS'))\n terminalLog(chalk.gray('\u2501'.repeat(60)))\n\n terminalLog(chalk.red(`\u274C ${diagnosis.errorType}`))\n terminalLog(\n chalk.dim(\n `Category: ${diagnosis.category} | Severity: ${diagnosis.severity}`,\n ),\n )\n terminalLog(`\\n${diagnosis.description}`)\n\n terminalLog(chalk.yellow('\\n\uD83D\uDCA1 Recovery Suggestions:'))\n diagnosis.suggestions.forEach((suggestion, index) => {\n terminalLog(` ${index + 1}. ${suggestion}`)\n })\n\n terminalLog(chalk.cyan('\\n\uD83D\uDD0D Debug Steps:'))\n diagnosis.debugSteps.forEach((step, index) => {\n terminalLog(` ${index + 1}. ${step}`)\n })\n\n if (diagnosis.relatedLogs && diagnosis.relatedLogs.length > 0) {\n terminalLog(chalk.magenta('\\n\uD83D\uDCCB Related Information:'))\n diagnosis.relatedLogs.forEach((log, index) => {\n const truncatedLog =\n log.length > 200 ? log.substring(0, 200) + '...' : log\n terminalLog(chalk.dim(` ${truncatedLog}`))\n })\n }\n\n const debugPath = DEBUG_PATHS.base()\n terminalLog(chalk.gray(`\\n\uD83D\uDCC1 Complete logs: ${debugPath}`))\n terminalLog(chalk.gray('\u2501'.repeat(60)))\n}\nexport function getDebugInfo() {\n return {\n isDebugMode: isDebugMode(),\n isVerboseMode: isVerboseMode(),\n isDebugVerboseMode: isDebugVerboseMode(),\n startupTimestamp: STARTUP_TIMESTAMP,\n sessionId: SESSION_ID,\n currentRequest: currentRequest?.id,\n activeRequests: Array.from(activeRequests.keys()),\n terminalLogLevels: isDebugVerboseMode()\n ? Array.from(DEBUG_VERBOSE_TERMINAL_LOG_LEVELS)\n : Array.from(TERMINAL_LOG_LEVELS),\n debugPaths: {\n detailed: DEBUG_PATHS.detailed(),\n flow: DEBUG_PATHS.flow(),\n api: DEBUG_PATHS.api(),\n state: DEBUG_PATHS.state(),\n },\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["toolCalls"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/utils/agent/storage.ts", "../src/utils/session/todoStorage.ts", "../src/services/system/systemReminder.ts"],
|
|
4
|
-
"sourcesContent": ["import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { randomUUID } from 'crypto'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { logError } from '@utils/log'\n\n\nfunction getConfigDirectory(): string {\n return (\n process.env.KODE_CONFIG_DIR ??\n process.env.ANYKODE_CONFIG_DIR ??\n join(homedir(), '.kode')\n )\n}\n\nfunction getSessionId(): string {\n return process.env.ANYKODE_SESSION_ID ?? 'default-session'\n}\n\nexport function getAgentFilePath(agentId: string): string {\n const sessionId = getSessionId()\n const filename = `${sessionId}-agent-${agentId}.json`\n const configDir = getConfigDirectory()\n\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true })\n }\n\n return join(configDir, filename)\n}\n\nexport function readAgentData<T = any>(agentId: string): T | null {\n const filePath = getAgentFilePath(agentId)\n\n if (!existsSync(filePath)) {\n return null\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8')\n return JSON.parse(content) as T\n } catch (error) {\n logError(error)\n debugLogger.warn('AGENT_STORAGE_READ_FAILED', {\n agentId,\n error: error instanceof Error ? error.message : String(error),\n })\n return null\n }\n}\n\nexport function writeAgentData<T = any>(agentId: string, data: T): void {\n const filePath = getAgentFilePath(agentId)\n\n try {\n writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8')\n } catch (error) {\n logError(error)\n debugLogger.warn('AGENT_STORAGE_WRITE_FAILED', {\n agentId,\n error: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n}\n\nexport function getDefaultAgentId(): string {\n return 'default'\n}\n\nexport function resolveAgentId(agentId?: string): string {\n return agentId || getDefaultAgentId()\n}\n\nexport function generateAgentId(): string {\n return randomUUID()\n}\n", "import { setSessionState, getSessionState } from './sessionState'\nimport { readAgentData, writeAgentData, resolveAgentId } from '@utils/agent/storage'\n\nexport interface TodoItem {\n id: string\n content: string\n status: 'pending' | 'in_progress' | 'completed'\n activeForm: string\n priority: 'high' | 'medium' | 'low'\n createdAt?: number\n updatedAt?: number\n tags?: string[]\n estimatedHours?: number\n previousStatus?: 'pending' | 'in_progress' | 'completed'\n}\n\nexport interface TodoQuery {\n status?: TodoItem['status'][]\n priority?: TodoItem['priority'][]\n contentMatch?: string\n tags?: string[]\n dateRange?: { from?: Date; to?: Date }\n}\n\nexport interface TodoStorageConfig {\n maxTodos: number\n autoArchiveCompleted: boolean\n sortBy: 'createdAt' | 'updatedAt' | 'priority' | 'status'\n sortOrder: 'asc' | 'desc'\n}\n\nconst TODO_STORAGE_KEY = 'todos'\nconst TODO_CONFIG_KEY = 'todoConfig'\nconst TODO_CACHE_KEY = 'todoCache'\n\nconst DEFAULT_CONFIG: TodoStorageConfig = {\n maxTodos: 100,\n autoArchiveCompleted: false,\n sortBy: 'status',\n sortOrder: 'desc',\n}\n\nlet todoCache: TodoItem[] | null = null\nlet cacheTimestamp = 0\nconst CACHE_TTL = 5000\n\nexport interface TodoMetrics {\n totalOperations: number\n cacheHits: number\n cacheMisses: number\n lastOperation: number\n}\n\nfunction invalidateCache(): void {\n todoCache = null\n cacheTimestamp = 0\n}\n\nfunction updateMetrics(operation: string, cacheHit: boolean = false): void {\n const sessionState = getSessionState() as any\n const metrics = sessionState.todoMetrics || {\n totalOperations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n lastOperation: 0,\n }\n\n metrics.totalOperations++\n metrics.lastOperation = Date.now()\n\n if (cacheHit) {\n metrics.cacheHits++\n } else {\n metrics.cacheMisses++\n }\n\n setSessionState({\n ...sessionState,\n todoMetrics: metrics,\n })\n}\n\nexport function getTodoMetrics(): TodoMetrics {\n const sessionState = getSessionState() as any\n return (\n sessionState.todoMetrics || {\n totalOperations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n lastOperation: 0,\n }\n )\n}\n\nexport function getTodos(agentId?: string): TodoItem[] {\n const resolvedAgentId = resolveAgentId(agentId)\n const now = Date.now()\n\n if (agentId) {\n updateMetrics('getTodos', false)\n const agentTodos = readAgentData<TodoItem[]>(resolvedAgentId) || []\n\n const agentCacheKey = `todoCache_${resolvedAgentId}`\n\n return agentTodos.map(todo => ({\n ...todo,\n activeForm: todo.activeForm || todo.content,\n }))\n }\n\n if (todoCache && now - cacheTimestamp < CACHE_TTL) {\n updateMetrics('getTodos', true)\n return todoCache.map(todo => ({\n ...todo,\n activeForm: todo.activeForm || todo.content,\n }))\n }\n\n updateMetrics('getTodos', false)\n const sessionState = getSessionState()\n const todos = (sessionState as any)[TODO_STORAGE_KEY] || []\n\n todoCache = [...todos].map((todo: TodoItem) => ({\n ...todo,\n activeForm: todo.activeForm || todo.content,\n }))\n cacheTimestamp = now\n\n return todoCache\n}\n\nexport function setTodos(todos: TodoItem[], agentId?: string): void {\n const resolvedAgentId = resolveAgentId(agentId)\n const config = getTodoConfig()\n const existingTodos = getTodos(agentId)\n\n if (agentId) {\n if (todos.length > config.maxTodos) {\n throw new Error(\n `Todo limit exceeded. Maximum ${config.maxTodos} todos allowed.`,\n )\n }\n\n let processedTodos = todos\n if (config.autoArchiveCompleted) {\n processedTodos = todos.filter(todo => todo.status !== 'completed')\n }\n\n const updatedTodos = processedTodos.map(todo => {\n const existingTodo = existingTodos.find(\n existing => existing.id === todo.id,\n )\n\n return {\n ...todo,\n activeForm: todo.activeForm || todo.content,\n updatedAt: Date.now(),\n createdAt: todo.createdAt || Date.now(),\n previousStatus:\n existingTodo?.status !== todo.status\n ? existingTodo?.status\n : todo.previousStatus,\n }\n })\n\n writeAgentData(resolvedAgentId, updatedTodos)\n updateMetrics('setTodos')\n return\n }\n\n if (todos.length > config.maxTodos) {\n throw new Error(\n `Todo limit exceeded. Maximum ${config.maxTodos} todos allowed.`,\n )\n }\n\n let processedTodos = todos\n if (config.autoArchiveCompleted) {\n processedTodos = todos.filter(todo => todo.status !== 'completed')\n }\n\n const updatedTodos = processedTodos.map(todo => {\n const existingTodo = existingTodos.find(existing => existing.id === todo.id)\n\n return {\n ...todo,\n activeForm: todo.activeForm || todo.content,\n updatedAt: Date.now(),\n createdAt: todo.createdAt || Date.now(),\n previousStatus:\n existingTodo?.status !== todo.status\n ? existingTodo?.status\n : todo.previousStatus,\n }\n })\n\n setSessionState({\n ...getSessionState(),\n [TODO_STORAGE_KEY]: updatedTodos,\n } as any)\n\n invalidateCache()\n updateMetrics('setTodos')\n}\n\nexport function getTodoConfig(): TodoStorageConfig {\n const sessionState = getSessionState() as any\n return { ...DEFAULT_CONFIG, ...(sessionState[TODO_CONFIG_KEY] || {}) }\n}\n\nexport function setTodoConfig(config: Partial<TodoStorageConfig>): void {\n const currentConfig = getTodoConfig()\n const newConfig = { ...currentConfig, ...config }\n\n setSessionState({\n ...getSessionState(),\n [TODO_CONFIG_KEY]: newConfig,\n } as any)\n\n if (config.sortBy || config.sortOrder) {\n const todos = getTodos()\n setTodos(todos)\n }\n}\n\nexport function addTodo(\n todo: Omit<TodoItem, 'createdAt' | 'updatedAt'>,\n): TodoItem[] {\n const todos = getTodos()\n\n if (todos.some(existing => existing.id === todo.id)) {\n throw new Error(`Todo with ID '${todo.id}' already exists`)\n }\n\n const newTodo: TodoItem = {\n ...todo,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n }\n\n const updatedTodos = [...todos, newTodo]\n setTodos(updatedTodos)\n updateMetrics('addTodo')\n return updatedTodos\n}\n\nexport function updateTodo(id: string, updates: Partial<TodoItem>): TodoItem[] {\n const todos = getTodos()\n const existingTodo = todos.find(todo => todo.id === id)\n\n if (!existingTodo) {\n throw new Error(`Todo with ID '${id}' not found`)\n }\n\n const updatedTodos = todos.map(todo =>\n todo.id === id ? { ...todo, ...updates, updatedAt: Date.now() } : todo,\n )\n\n setTodos(updatedTodos)\n updateMetrics('updateTodo')\n return updatedTodos\n}\n\nexport function deleteTodo(id: string): TodoItem[] {\n const todos = getTodos()\n const todoExists = todos.some(todo => todo.id === id)\n\n if (!todoExists) {\n throw new Error(`Todo with ID '${id}' not found`)\n }\n\n const updatedTodos = todos.filter(todo => todo.id !== id)\n setTodos(updatedTodos)\n updateMetrics('deleteTodo')\n return updatedTodos\n}\n\nexport function clearTodos(): void {\n setTodos([])\n updateMetrics('clearTodos')\n}\n\nexport function getTodoById(id: string): TodoItem | undefined {\n const todos = getTodos()\n updateMetrics('getTodoById')\n return todos.find(todo => todo.id === id)\n}\n\nexport function getTodosByStatus(status: TodoItem['status']): TodoItem[] {\n const todos = getTodos()\n updateMetrics('getTodosByStatus')\n return todos.filter(todo => todo.status === status)\n}\n\nexport function getTodosByPriority(priority: TodoItem['priority']): TodoItem[] {\n const todos = getTodos()\n updateMetrics('getTodosByPriority')\n return todos.filter(todo => todo.priority === priority)\n}\n\nexport function queryTodos(query: TodoQuery): TodoItem[] {\n const todos = getTodos()\n updateMetrics('queryTodos')\n\n return todos.filter(todo => {\n if (query.status && !query.status.includes(todo.status)) {\n return false\n }\n\n if (query.priority && !query.priority.includes(todo.priority)) {\n return false\n }\n\n if (\n query.contentMatch &&\n !todo.content.toLowerCase().includes(query.contentMatch.toLowerCase())\n ) {\n return false\n }\n\n if (query.tags && todo.tags) {\n const hasMatchingTag = query.tags.some(tag => todo.tags!.includes(tag))\n if (!hasMatchingTag) return false\n }\n\n if (query.dateRange) {\n const todoDate = new Date(todo.createdAt || 0)\n if (query.dateRange.from && todoDate < query.dateRange.from) return false\n if (query.dateRange.to && todoDate > query.dateRange.to) return false\n }\n\n return true\n })\n}\n\nexport function getTodoStatistics() {\n const todos = getTodos()\n const metrics = getTodoMetrics()\n\n return {\n total: todos.length,\n byStatus: {\n pending: todos.filter(t => t.status === 'pending').length,\n in_progress: todos.filter(t => t.status === 'in_progress').length,\n completed: todos.filter(t => t.status === 'completed').length,\n },\n byPriority: {\n high: todos.filter(t => t.priority === 'high').length,\n medium: todos.filter(t => t.priority === 'medium').length,\n low: todos.filter(t => t.priority === 'low').length,\n },\n metrics,\n cacheEfficiency:\n metrics.totalOperations > 0\n ? Math.round((metrics.cacheHits / metrics.totalOperations) * 100)\n : 0,\n }\n}\n\nexport function optimizeTodoStorage(): void {\n invalidateCache()\n\n const todos = getTodos()\n const validTodos = todos.filter(\n todo =>\n todo.id &&\n todo.content &&\n todo.activeForm &&\n ['pending', 'in_progress', 'completed'].includes(todo.status) &&\n ['high', 'medium', 'low'].includes(todo.priority),\n )\n\n if (validTodos.length !== todos.length) {\n setTodos(validTodos)\n }\n\n updateMetrics('optimizeTodoStorage')\n}\n", "import { getTodos, TodoItem } from '@utils/session/todoStorage'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { logError } from '@utils/log'\n\nexport interface ReminderMessage {\n role: 'system'\n content: string\n isMeta: boolean\n timestamp: number\n type: string\n priority: 'low' | 'medium' | 'high'\n category: 'task' | 'security' | 'performance' | 'general'\n}\n\ninterface ReminderConfig {\n todoEmptyReminder: boolean\n securityReminder: boolean\n performanceReminder: boolean\n maxRemindersPerSession: number\n}\n\ninterface SessionReminderState {\n lastTodoUpdate: number\n lastFileAccess: number\n sessionStartTime: number\n remindersSent: Set<string>\n contextPresent: boolean\n reminderCount: number\n config: ReminderConfig\n}\n\nclass SystemReminderService {\n private sessionState: SessionReminderState = {\n lastTodoUpdate: 0,\n lastFileAccess: 0,\n sessionStartTime: Date.now(),\n remindersSent: new Set(),\n contextPresent: false,\n reminderCount: 0,\n config: {\n todoEmptyReminder: true,\n securityReminder: true,\n performanceReminder: true,\n maxRemindersPerSession: 10,\n },\n }\n\n private eventDispatcher = new Map<string, Array<(context: any) => void>>()\n private reminderCache = new Map<string, ReminderMessage>()\n\n constructor() {\n this.setupEventDispatcher()\n }\n\n public generateReminders(\n hasContext: boolean = false,\n agentId?: string,\n ): ReminderMessage[] {\n this.sessionState.contextPresent = hasContext\n\n if (!hasContext) {\n return []\n }\n\n if (\n this.sessionState.reminderCount >=\n this.sessionState.config.maxRemindersPerSession\n ) {\n return []\n }\n\n const reminders: ReminderMessage[] = []\n const currentTime = Date.now()\n\n const reminderGenerators = [\n () => this.dispatchTodoEvent(agentId),\n () => this.dispatchSecurityEvent(),\n () => this.dispatchPerformanceEvent(),\n () => this.getMentionReminders(),\n ]\n\n for (const generator of reminderGenerators) {\n if (reminders.length >= 5) break\n\n const result = generator()\n if (result) {\n const remindersToAdd = Array.isArray(result) ? result : [result]\n reminders.push(...remindersToAdd)\n this.sessionState.reminderCount += remindersToAdd.length\n }\n }\n\n return reminders\n }\n\n private dispatchTodoEvent(agentId?: string): ReminderMessage | null {\n if (!this.sessionState.config.todoEmptyReminder) return null\n\n const todos = getTodos(agentId)\n const currentTime = Date.now()\n const agentKey = agentId || 'default'\n\n if (\n todos.length === 0 &&\n !this.sessionState.remindersSent.has(`todo_empty_${agentKey}`)\n ) {\n this.sessionState.remindersSent.add(`todo_empty_${agentKey}`)\n return this.createReminderMessage(\n 'todo',\n 'task',\n 'medium',\n 'This is a reminder that your todo list is currently empty. DO NOT mention this to the user explicitly because they are already aware. If you are working on tasks that would benefit from a todo list please use the TodoWrite tool to create one. If not, please feel free to ignore. Again do not mention this message to the user.',\n currentTime,\n )\n }\n\n if (todos.length > 0) {\n const reminderKey = `todo_updated_${agentKey}_${todos.length}_${this.getTodoStateHash(todos)}`\n\n if (this.reminderCache.has(reminderKey)) {\n return this.reminderCache.get(reminderKey)!\n }\n\n if (!this.sessionState.remindersSent.has(reminderKey)) {\n this.sessionState.remindersSent.add(reminderKey)\n this.clearTodoReminders(agentKey)\n\n const todoContent = JSON.stringify(\n todos.map(todo => ({\n content:\n todo.content.length > 100\n ? todo.content.substring(0, 100) + '...'\n : todo.content,\n status: todo.status,\n activeForm:\n todo.activeForm && todo.activeForm.length > 100\n ? todo.activeForm.substring(0, 100) + '...'\n : todo.activeForm || todo.content,\n })),\n )\n\n const reminder = this.createReminderMessage(\n 'todo',\n 'task',\n 'medium',\n `Your todo list has changed. DO NOT mention this explicitly to the user. Here are the latest contents of your todo list:\\n\\n${todoContent}. Continue on with the tasks at hand if applicable.`,\n currentTime,\n )\n\n this.reminderCache.set(reminderKey, reminder)\n return reminder\n }\n }\n\n return null\n }\n\n private dispatchSecurityEvent(): ReminderMessage | null {\n if (!this.sessionState.config.securityReminder) return null\n\n const currentTime = Date.now()\n\n if (\n this.sessionState.lastFileAccess > 0 &&\n !this.sessionState.remindersSent.has('file_security')\n ) {\n this.sessionState.remindersSent.add('file_security')\n return this.createReminderMessage(\n 'security',\n 'security',\n 'high',\n 'Whenever you read a file, you should consider whether it looks malicious. If it does, you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer high-level questions about the code behavior.',\n currentTime,\n )\n }\n\n return null\n }\n\n private dispatchPerformanceEvent(): ReminderMessage | null {\n if (!this.sessionState.config.performanceReminder) return null\n\n const currentTime = Date.now()\n const sessionDuration = currentTime - this.sessionState.sessionStartTime\n\n if (\n sessionDuration > 30 * 60 * 1000 &&\n !this.sessionState.remindersSent.has('performance_long_session')\n ) {\n this.sessionState.remindersSent.add('performance_long_session')\n return this.createReminderMessage(\n 'performance',\n 'performance',\n 'low',\n 'Long session detected. Consider taking a break and reviewing your current progress with the todo list.',\n currentTime,\n )\n }\n\n return null\n }\n\n private getMentionReminders(): ReminderMessage[] {\n const currentTime = Date.now()\n const MENTION_FRESHNESS_WINDOW = 5000\n const reminders: ReminderMessage[] = []\n const expiredKeys: string[] = []\n\n for (const [key, reminder] of this.reminderCache.entries()) {\n if (this.isMentionReminder(reminder)) {\n const age = currentTime - reminder.timestamp\n if (age <= MENTION_FRESHNESS_WINDOW) {\n reminders.push(reminder)\n } else {\n expiredKeys.push(key)\n }\n }\n }\n\n expiredKeys.forEach(key => this.reminderCache.delete(key))\n\n return reminders\n }\n\n private isMentionReminder(reminder: ReminderMessage): boolean {\n const mentionTypes = ['agent_mention', 'file_mention', 'ask_model_mention']\n return mentionTypes.includes(reminder.type)\n }\n\n public generateFileChangeReminder(context: any): ReminderMessage | null {\n const { agentId, filePath, reminder } = context\n\n if (!reminder) {\n return null\n }\n\n const currentTime = Date.now()\n const reminderKey = `file_changed_${agentId}_${filePath}_${currentTime}`\n\n if (this.sessionState.remindersSent.has(reminderKey)) {\n return null\n }\n\n this.sessionState.remindersSent.add(reminderKey)\n\n return this.createReminderMessage(\n 'file_changed',\n 'general',\n 'medium',\n reminder,\n currentTime,\n )\n }\n\n private createReminderMessage(\n type: string,\n category: ReminderMessage['category'],\n priority: ReminderMessage['priority'],\n content: string,\n timestamp: number,\n ): ReminderMessage {\n return {\n role: 'system',\n content: `<system-reminder>\\n${content}\\n</system-reminder>`,\n isMeta: true,\n timestamp,\n type,\n priority,\n category,\n }\n }\n\n private getTodoStateHash(todos: TodoItem[]): string {\n return todos\n .map(t => `${t.content}:${t.status}:${t.activeForm || t.content}`)\n .sort()\n .join('|')\n }\n\n private clearTodoReminders(agentId?: string): void {\n const agentKey = agentId || 'default'\n for (const key of this.sessionState.remindersSent) {\n if (key.startsWith(`todo_updated_${agentKey}_`)) {\n this.sessionState.remindersSent.delete(key)\n }\n }\n }\n\n private setupEventDispatcher(): void {\n this.addEventListener('session:startup', context => {\n this.resetSession()\n\n this.sessionState.sessionStartTime = Date.now()\n this.sessionState.contextPresent =\n Object.keys(context.context || {}).length > 0\n })\n\n this.addEventListener('todo:changed', context => {\n this.sessionState.lastTodoUpdate = Date.now()\n this.clearTodoReminders(context.agentId)\n })\n\n this.addEventListener('todo:file_changed', context => {\n const agentId = context.agentId || 'default'\n this.clearTodoReminders(agentId)\n this.sessionState.lastTodoUpdate = Date.now()\n\n const reminder = this.generateFileChangeReminder(context)\n if (reminder) {\n this.emitEvent('reminder:inject', {\n reminder: reminder.content,\n agentId,\n type: 'file_changed',\n timestamp: Date.now(),\n })\n }\n })\n\n this.addEventListener('file:read', context => {\n this.sessionState.lastFileAccess = Date.now()\n })\n\n this.addEventListener('file:edited', context => {\n })\n\n this.addEventListener('agent:mentioned', context => {\n this.createMentionReminder({\n type: 'agent_mention',\n key: `agent_mention_${context.agentType}_${context.timestamp}`,\n category: 'task',\n priority: 'high',\n content: `The user mentioned @${context.originalMention}. You MUST use the Task tool with subagent_type=\"${context.agentType}\" to delegate this task to the specified agent. Provide a detailed, self-contained task description that fully captures the user's intent for the ${context.agentType} agent to execute.`,\n timestamp: context.timestamp,\n })\n })\n\n this.addEventListener('file:mentioned', context => {\n this.createMentionReminder({\n type: 'file_mention',\n key: `file_mention_${context.filePath}_${context.timestamp}`,\n category: 'general',\n priority: 'high',\n content: `The user mentioned @${context.originalMention}. You MUST read the entire content of the file at path: ${context.filePath} using the Read tool to understand the full context before proceeding with the user's request.`,\n timestamp: context.timestamp,\n })\n })\n\n this.addEventListener('ask-model:mentioned', context => {\n this.createMentionReminder({\n type: 'ask_model_mention',\n key: `ask_model_mention_${context.modelName}_${context.timestamp}`,\n category: 'task',\n priority: 'high',\n content: `The user mentioned @${context.modelName}. You MUST use the AskExpertModelTool to consult this specific model for expert opinions and analysis. Provide the user's question or context clearly to get the most relevant response from ${context.modelName}.`,\n timestamp: context.timestamp,\n })\n })\n }\n\n public addEventListener(\n event: string,\n callback: (context: any) => void,\n ): void {\n if (!this.eventDispatcher.has(event)) {\n this.eventDispatcher.set(event, [])\n }\n this.eventDispatcher.get(event)!.push(callback)\n }\n\n public emitEvent(event: string, context: any): void {\n const listeners = this.eventDispatcher.get(event) || []\n listeners.forEach(callback => {\n try {\n callback(context)\n } catch (error) {\n logError(error)\n debugLogger.warn('SYSTEM_REMINDER_LISTENER_ERROR', {\n event,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n })\n }\n\n private createMentionReminder(params: {\n type: string\n key: string\n category: ReminderMessage['category']\n priority: ReminderMessage['priority']\n content: string\n timestamp: number\n }): void {\n if (!this.sessionState.remindersSent.has(params.key)) {\n this.sessionState.remindersSent.add(params.key)\n\n const reminder = this.createReminderMessage(\n params.type,\n params.category,\n params.priority,\n params.content,\n params.timestamp,\n )\n\n this.reminderCache.set(params.key, reminder)\n }\n }\n\n public resetSession(): void {\n this.sessionState = {\n lastTodoUpdate: 0,\n lastFileAccess: 0,\n sessionStartTime: Date.now(),\n remindersSent: new Set(),\n contextPresent: false,\n reminderCount: 0,\n config: { ...this.sessionState.config },\n }\n this.reminderCache.clear()\n }\n\n public updateConfig(config: Partial<ReminderConfig>): void {\n this.sessionState.config = { ...this.sessionState.config, ...config }\n }\n\n public getSessionState(): SessionReminderState {\n return { ...this.sessionState }\n }\n}\n\nexport const systemReminderService = new SystemReminderService()\n\nexport const generateSystemReminders = (\n hasContext: boolean = false,\n agentId?: string,\n) => systemReminderService.generateReminders(hasContext, agentId)\n\nexport const generateFileChangeReminder = (context: any) =>\n systemReminderService.generateFileChangeReminder(context)\n\nexport const emitReminderEvent = (event: string, context: any) =>\n systemReminderService.emitEvent(event, context)\n\nexport const resetReminderSession = () => systemReminderService.resetSession()\nexport const getReminderSessionState = () =>\n systemReminderService.getSessionState()\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["processedTodos", "updatedTodos"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/utils/config/style.ts", "../src/utils/config/projectInstructions.ts", "../src/context/index.ts", "../src/utils/system/git.ts", "../src/utils/identity/user.ts"],
|
|
4
|
-
"sourcesContent": ["import { readFileSync } from 'fs'\nimport { memoize } from 'lodash-es'\nimport { getCwd } from '@utils/state'\nimport { getProjectInstructionFiles } from './projectInstructions'\n\nconst STYLE_PROMPT =\n 'The codebase follows strict style guidelines shown below. All code changes must strictly adhere to these guidelines to maintain consistency and quality.'\n\nexport const getCodeStyle = memoize((): string => {\n const styles: string[] = []\n\n const instructionFiles = getProjectInstructionFiles(getCwd())\n for (const file of instructionFiles) {\n try {\n styles.push(\n `Contents of ${file.absolutePath}:\\n\\n${readFileSync(file.absolutePath, 'utf-8')}`,\n )\n } catch {\n }\n }\n\n if (styles.length === 0) {\n return ''\n }\n\n return `${STYLE_PROMPT}\\n\\n${styles.join('\\n\\n')}`\n})\n", "import { existsSync, readFileSync } from 'fs'\nimport { dirname, join, parse, relative, resolve, sep } from 'path'\n\nexport type ProjectInstructionFile = {\n absolutePath: string\n relativePathFromGitRoot: string\n filename: 'AGENTS.override.md' | 'AGENTS.md'\n}\n\nconst DEFAULT_PROJECT_DOC_MAX_BYTES = 32 * 1024\n\nfunction isRegularFile(path: string): boolean {\n try {\n return existsSync(path)\n } catch {\n return false\n }\n}\n\nexport function findGitRoot(startDir: string): string | null {\n let currentDir = resolve(startDir)\n const fsRoot = parse(currentDir).root\n\n while (true) {\n const dotGitPath = join(currentDir, '.git')\n if (existsSync(dotGitPath)) {\n return currentDir\n }\n if (currentDir === fsRoot) {\n return null\n }\n currentDir = dirname(currentDir)\n }\n}\n\nfunction getDirsFromGitRootToCwd(gitRoot: string, cwd: string): string[] {\n const absoluteGitRoot = resolve(gitRoot)\n const absoluteCwd = resolve(cwd)\n\n const rel = relative(absoluteGitRoot, absoluteCwd)\n if (!rel || rel === '.') {\n return [absoluteGitRoot]\n }\n\n const parts = rel.split(sep).filter(Boolean)\n const dirs: string[] = [absoluteGitRoot]\n for (let i = 0; i < parts.length; i++) {\n dirs.push(join(absoluteGitRoot, ...parts.slice(0, i + 1)))\n }\n return dirs\n}\n\nexport function getProjectInstructionFiles(\n cwd: string,\n): ProjectInstructionFile[] {\n const gitRoot = findGitRoot(cwd)\n const root = gitRoot ?? resolve(cwd)\n const dirs = getDirsFromGitRootToCwd(root, cwd)\n\n const results: ProjectInstructionFile[] = []\n for (const dir of dirs) {\n const overridePath = join(dir, 'AGENTS.override.md')\n const agentsPath = join(dir, 'AGENTS.md')\n\n if (isRegularFile(overridePath)) {\n results.push({\n absolutePath: overridePath,\n relativePathFromGitRoot:\n relative(root, overridePath) || 'AGENTS.override.md',\n filename: 'AGENTS.override.md',\n })\n continue\n }\n\n if (isRegularFile(agentsPath)) {\n results.push({\n absolutePath: agentsPath,\n relativePathFromGitRoot: relative(root, agentsPath) || 'AGENTS.md',\n filename: 'AGENTS.md',\n })\n }\n }\n\n return results\n}\n\nexport function getProjectDocMaxBytes(): number {\n const raw = process.env.KODE_PROJECT_DOC_MAX_BYTES\n if (!raw) return DEFAULT_PROJECT_DOC_MAX_BYTES\n const parsed = Number.parseInt(raw, 10)\n if (!Number.isFinite(parsed) || parsed <= 0)\n return DEFAULT_PROJECT_DOC_MAX_BYTES\n return parsed\n}\n\nexport function readAndConcatProjectInstructionFiles(\n files: ProjectInstructionFile[],\n {\n maxBytes = getProjectDocMaxBytes(),\n includeHeadings = true,\n }: { maxBytes?: number; includeHeadings?: boolean } = {},\n): { content: string; truncated: boolean } {\n let totalBytes = 0\n let truncated = false\n\n const parts: string[] = []\n\n const truncateUtf8ToBytes = (value: string, bytes: number): string => {\n const buf = Buffer.from(value, 'utf8')\n if (buf.length <= bytes) return value\n return buf.subarray(0, Math.max(0, bytes)).toString('utf8')\n }\n\n for (const file of files) {\n if (totalBytes >= maxBytes) {\n truncated = true\n break\n }\n\n let raw: string\n try {\n raw = readFileSync(file.absolutePath, 'utf-8')\n } catch {\n continue\n }\n\n if (!raw.trim()) continue\n\n const separator = parts.length > 0 ? '\\n\\n' : ''\n const separatorBytes = Buffer.byteLength(separator, 'utf8')\n const remainingAfterSeparator = maxBytes - totalBytes - separatorBytes\n if (remainingAfterSeparator <= 0) {\n truncated = true\n break\n }\n\n const heading = includeHeadings\n ? `# ${file.filename}\\n\\n_Path: ${file.relativePathFromGitRoot}_\\n\\n`\n : ''\n\n const block = `${heading}${raw}`.trimEnd()\n const blockBytes = Buffer.byteLength(block, 'utf8')\n\n if (blockBytes <= remainingAfterSeparator) {\n parts.push(`${separator}${block}`)\n totalBytes += separatorBytes + blockBytes\n continue\n }\n\n truncated = true\n const suffix = `\\n\\n... (truncated: project instruction files exceeded ${maxBytes} bytes)`\n const suffixBytes = Buffer.byteLength(suffix, 'utf8')\n\n let finalBlock = ''\n if (suffixBytes >= remainingAfterSeparator) {\n finalBlock = truncateUtf8ToBytes(suffix, remainingAfterSeparator)\n } else {\n const prefixBudget = remainingAfterSeparator - suffixBytes\n const prefix = truncateUtf8ToBytes(block, prefixBudget)\n finalBlock = `${prefix}${suffix}`\n }\n\n parts.push(`${separator}${finalBlock}`)\n totalBytes += separatorBytes + Buffer.byteLength(finalBlock, 'utf8')\n break\n }\n\n return { content: parts.join(''), truncated }\n}\n", "import {\n getCurrentProjectConfig,\n saveCurrentProjectConfig,\n} from '@utils/config'\nimport { logError } from '@utils/log'\nimport { getCodeStyle } from '@utils/config/style'\nimport { getCwd } from '@utils/state'\nimport { memoize, omit } from 'lodash-es'\nimport { getIsGit } from '@utils/system/git'\nimport { execFileNoThrow } from '@utils/system/execFileNoThrow'\nimport { join } from 'path'\nimport { readFile } from 'fs/promises'\nimport { existsSync, readdirSync } from 'fs'\nimport { getModelManager } from '@utils/model'\nimport { lastX } from '@utils/text/generators'\nimport { getGitEmail } from '@utils/identity/user'\nimport {\n getProjectInstructionFiles,\n readAndConcatProjectInstructionFiles,\n} from '@utils/config/projectInstructions'\nexport async function getInstructionFilesNote(): Promise<string | null> {\n try {\n const cwd = getCwd()\n const instructionFiles = getProjectInstructionFiles(cwd)\n const legacyPath = join(cwd, 'CLAUDE.md')\n const hasLegacy = existsSync(legacyPath)\n\n if (instructionFiles.length === 0 && !hasLegacy) {\n return null\n }\n\n const fileTypes = new Set<string>()\n for (const f of instructionFiles) fileTypes.add(f.filename)\n if (hasLegacy) fileTypes.add('CLAUDE.md (legacy)')\n\n const allFiles = [\n ...instructionFiles.map(f => f.absolutePath),\n ...(hasLegacy ? [legacyPath] : []),\n ]\n\n return `NOTE: Additional project instruction files (${Array.from(fileTypes).join(', ')}) were found. When working in these directories, make sure to read and follow the instructions in the corresponding files:\\n${allFiles\n .map(_ => `- ${_}`)\n .join('\\n')}`\n } catch (error) {\n logError(error)\n return null\n }\n}\n\nexport function setContext(key: string, value: string): void {\n const projectConfig = getCurrentProjectConfig()\n const context = omit(\n { ...projectConfig.context, [key]: value },\n 'codeStyle',\n 'directoryStructure',\n )\n saveCurrentProjectConfig({ ...projectConfig, context })\n}\n\nexport function removeContext(key: string): void {\n const projectConfig = getCurrentProjectConfig()\n const context = omit(\n projectConfig.context,\n key,\n 'codeStyle',\n 'directoryStructure',\n )\n saveCurrentProjectConfig({ ...projectConfig, context })\n}\n\nexport const getReadme = memoize(async (): Promise<string | null> => {\n try {\n const readmePath = join(getCwd(), 'README.md')\n if (!existsSync(readmePath)) {\n return null\n }\n const content = await readFile(readmePath, 'utf-8')\n return content\n } catch (e) {\n logError(e)\n return null\n }\n})\n\nexport async function getProjectDocsForCwd(\n cwd: string,\n): Promise<string | null> {\n try {\n const instructionFiles = getProjectInstructionFiles(cwd)\n const legacyPath = join(cwd, 'CLAUDE.md')\n\n const docs = []\n\n if (instructionFiles.length > 0) {\n const { content } = readAndConcatProjectInstructionFiles(\n instructionFiles,\n { includeHeadings: true },\n )\n if (content.trim().length > 0) docs.push(content)\n }\n\n if (existsSync(legacyPath)) {\n try {\n const content = await readFile(legacyPath, 'utf-8')\n docs.push(\n `# Legacy instructions (CLAUDE.md)\\n\\n${content}`,\n )\n } catch (e) {\n logError(e)\n }\n }\n\n return docs.length > 0 ? docs.join('\\n\\n---\\n\\n') : null\n } catch (e) {\n logError(e)\n return null\n }\n}\n\nexport const getProjectDocs = memoize(async (): Promise<string | null> => {\n return getProjectDocsForCwd(getCwd())\n})\n\nexport const getGitStatus = memoize(async (): Promise<string | null> => {\n if (process.env.NODE_ENV === 'test') {\n return null\n }\n if (!(await getIsGit())) {\n return null\n }\n\n try {\n const [branch, mainBranch, status, log, authorLog] = await Promise.all([\n execFileNoThrow(\n 'git',\n ['branch', '--show-current'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n ['rev-parse', '--abbrev-ref', 'origin/HEAD'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.replace('origin/', '').trim()),\n execFileNoThrow(\n 'git',\n ['status', '--short'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n ['log', '--oneline', '-n', '5'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n [\n 'log',\n '--oneline',\n '-n',\n '5',\n '--author',\n (await getGitEmail()) || '',\n ],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n ])\n const statusLines = status.split('\\n').length\n const truncatedStatus =\n statusLines > 200\n ? status.split('\\n').slice(0, 200).join('\\n') +\n '\\n... (truncated because there are more than 200 lines. If you need more information, run \"git status\" using BashTool)'\n : status\n\n return `This is the git status at the start of the conversation. Note that this status is a snapshot in time, and will not update during the conversation.\\nCurrent branch: ${branch}\\n\\nMain branch (you will usually use this for PRs): ${mainBranch}\\n\\nStatus:\\n${truncatedStatus || '(clean)'}\\n\\nRecent commits:\\n${log}\\n\\nYour recent commits:\\n${authorLog || '(no recent commits)'}`\n } catch (error) {\n logError(error)\n return null\n }\n})\n\nexport const getContext = memoize(\n async (): Promise<{\n [k: string]: string\n }> => {\n const codeStyle = getCodeStyle()\n const projectConfig = getCurrentProjectConfig()\n const dontCrawl = projectConfig.dontCrawlDirectory\n const [\n gitStatus,\n directoryStructure,\n instructionFilesNote,\n readme,\n projectDocs,\n ] = await Promise.all([\n getGitStatus(),\n dontCrawl ? Promise.resolve('') : getDirectoryStructure(),\n dontCrawl ? Promise.resolve('') : getInstructionFilesNote(),\n getReadme(),\n getProjectDocs(),\n ])\n return {\n ...projectConfig.context,\n ...(directoryStructure ? { directoryStructure } : {}),\n ...(gitStatus ? { gitStatus } : {}),\n ...(codeStyle ? { codeStyle } : {}),\n ...(instructionFilesNote ? { instructionFilesNote } : {}),\n ...(readme ? { readme } : {}),\n ...(projectDocs ? { projectDocs } : {}),\n }\n },\n)\n\nexport const getDirectoryStructure = memoize(\n async function (): Promise<string> {\n let lines: string\n try {\n const entries = readdirSync(getCwd(), { withFileTypes: true })\n lines = entries\n .map(entry => `${entry.isDirectory() ? 'd' : 'f'} ${entry.name}`)\n .join('\\n')\n } catch (error) {\n logError(error)\n return ''\n }\n\n return `Below is a snapshot of this project's file structure at the start of the conversation. This snapshot will NOT update during the conversation.\n\n${lines}`\n },\n)\n", "import { memoize } from 'lodash-es'\nimport { execFileNoThrow } from './execFileNoThrow'\n\nexport const getIsGit = memoize(async (): Promise<boolean> => {\n const { code } = await execFileNoThrow('git', [\n 'rev-parse',\n '--is-inside-work-tree',\n ])\n return code === 0\n})\n\nexport const getHead = async (): Promise<string> => {\n const { stdout } = await execFileNoThrow('git', ['rev-parse', 'HEAD'])\n return stdout.trim()\n}\n\nexport const getBranch = async (): Promise<string> => {\n const { stdout } = await execFileNoThrow(\n 'git',\n ['rev-parse', '--abbrev-ref', 'HEAD'],\n undefined,\n undefined,\n false,\n )\n return stdout.trim()\n}\n\nexport const getRemoteUrl = async (): Promise<string | null> => {\n const { stdout, code } = await execFileNoThrow(\n 'git',\n ['remote', 'get-url', 'origin'],\n undefined,\n undefined,\n false,\n )\n return code === 0 ? stdout.trim() : null\n}\n\nexport const getIsHeadOnRemote = async (): Promise<boolean> => {\n const { code } = await execFileNoThrow(\n 'git',\n ['rev-parse', '@{u}'],\n undefined,\n undefined,\n false,\n )\n return code === 0\n}\n\nexport const getIsClean = async (): Promise<boolean> => {\n const { stdout } = await execFileNoThrow(\n 'git',\n ['status', '--porcelain'],\n undefined,\n undefined,\n false,\n )\n return stdout.trim().length === 0\n}\n\nexport interface GitRepoState {\n commitHash: string\n branchName: string\n remoteUrl: string | null\n isHeadOnRemote: boolean\n isClean: boolean\n}\n\nexport async function getGitState(): Promise<GitRepoState | null> {\n try {\n const [commitHash, branchName, remoteUrl, isHeadOnRemote, isClean] =\n await Promise.all([\n getHead(),\n getBranch(),\n getRemoteUrl(),\n getIsHeadOnRemote(),\n getIsClean(),\n ])\n\n return {\n commitHash,\n branchName,\n remoteUrl,\n isHeadOnRemote,\n isClean,\n }\n } catch (_) {\n return null\n }\n}\n", "import { getGlobalConfig, getOrCreateUserID } from '@utils/config'\nimport { memoize } from 'lodash-es'\nimport { env } from '@utils/config/env'\nimport { execFileNoThrow } from '@utils/system/execFileNoThrow'\nimport { logError, SESSION_ID } from '@utils/log'\nimport { MACRO } from '@constants/macros'\nexport const getGitEmail = memoize(async (): Promise<string | undefined> => {\n const result = await execFileNoThrow('git', ['config', 'user.email'])\n if (result.code !== 0) {\n logError(`Failed to get git email: ${result.stdout} ${result.stderr}`)\n return undefined\n }\n return result.stdout.trim() || undefined\n})\n\ntype SimpleUser = {\n customIDs?: Record<string, string>\n userID: string\n appVersion?: string\n userAgent?: string\n email?: string\n custom?: Record<string, unknown>\n}\n\nexport const getUser = memoize(async (): Promise<SimpleUser> => {\n const userID = getOrCreateUserID()\n const config = getGlobalConfig()\n const email = undefined\n return {\n customIDs: {\n sessionId: SESSION_ID,\n },\n userID,\n appVersion: MACRO.VERSION,\n userAgent: env.platform,\n email,\n custom: {\n nodeVersion: env.nodeVersion,\n userType: process.env.USER_TYPE,\n organizationUuid: config.oauthAccount?.organizationUuid,\n accountUuid: config.oauthAccount?.accountUuid,\n },\n }\n})\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["readFileSync", "readFileSync", "memoize", "memoize", "memoize", "join", "existsSync", "memoize", "memoize", "join", "existsSync", "memoize"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/services/plugins/skillMarketplace.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n copyFileSync,\n existsSync,\n lstatSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from 'node:fs'\nimport { randomUUID } from 'node:crypto'\nimport { homedir } from 'node:os'\nimport { basename, dirname, join, resolve, sep } from 'node:path'\nimport { unzipSync } from 'fflate'\nimport { z } from 'zod'\nimport { CONFIG_BASE_DIR } from '@constants/product'\nimport { getCwd } from '@utils/state'\nimport { getKodeBaseDir } from '@utils/config/env'\n\nconst KNOWN_MARKETPLACES_FILE = 'known_marketplaces.json'\nconst MARKETPLACES_CACHE_DIR = 'marketplaces'\nconst INSTALLED_SKILL_PLUGINS_FILE = 'installed-skill-plugins.json'\n\nconst MarketplaceSourceSchema = z.discriminatedUnion('source', [\n z.strictObject({\n source: z.literal('github'),\n repo: z.string().min(3),\n ref: z.string().optional(),\n path: z.string().optional(),\n }),\n z.strictObject({\n source: z.literal('git'),\n url: z.string().min(3),\n ref: z.string().optional(),\n path: z.string().optional(),\n }),\n z.strictObject({\n source: z.literal('url'),\n url: z.string().url(),\n headers: z.record(z.string(), z.string()).optional(),\n }),\n z.strictObject({\n source: z.literal('npm'),\n package: z.string().min(1),\n }),\n z.strictObject({\n source: z.literal('file'),\n path: z.string().min(1),\n }),\n z.strictObject({\n source: z.literal('directory'),\n path: z.string().min(1),\n }),\n])\n\nexport type MarketplaceSource = z.infer<typeof MarketplaceSourceSchema>\n\nconst MarketplacePathListSchema = z.preprocess(value => {\n if (typeof value === 'string') return [value]\n return value\n}, z.array(z.string()))\n\nconst MarketplacePluginSchema = z\n .object({\n name: z.string().min(1),\n description: z.string().optional(),\n source: z.string().optional().default('./'),\n strict: z.boolean().optional(),\n skills: MarketplacePathListSchema.optional(),\n commands: MarketplacePathListSchema.optional(),\n })\n .passthrough()\n\nexport const MarketplaceManifestSchema = z\n .object({\n $schema: z.string().optional(),\n description: z.string().optional(),\n name: z.string().min(1),\n owner: z\n .object({\n name: z.string().optional(),\n email: z.string().optional(),\n })\n .passthrough()\n .optional(),\n metadata: z.record(z.string(), z.unknown()).optional().default({}),\n plugins: z.array(MarketplacePluginSchema).default([]),\n })\n .passthrough()\n\nexport type MarketplaceManifest = z.infer<typeof MarketplaceManifestSchema>\nexport type PluginEntry = MarketplaceManifest['plugins'][number]\n\nconst KnownMarketplacesSchema = z.record(\n z.string(),\n z.strictObject({\n source: MarketplaceSourceSchema,\n installLocation: z.string().min(1),\n lastUpdated: z.string().min(1),\n autoUpdate: z.boolean().optional(),\n }),\n)\n\nexport type KnownMarketplacesConfig = z.infer<typeof KnownMarketplacesSchema>\n\nexport type PluginScope = 'user' | 'project' | 'local'\n\ntype InstalledSkillPlugin = {\n plugin: string\n marketplace: string\n scope: PluginScope\n kind?: 'skill-pack' | 'plugin-pack'\n isEnabled?: boolean\n projectPath?: string\n installedAt: string\n pluginRoot?: string\n skills: string[]\n commands: string[]\n sourceMarketplacePath: string\n}\n\ntype InstalledSkillPluginsFile = Record<string, InstalledSkillPlugin>\n\nfunction userKodeDir(): string {\n return getKodeBaseDir()\n}\n\nfunction normalizePluginScope(options?: {\n scope?: PluginScope\n project?: boolean\n}): PluginScope {\n if (\n options?.scope === 'user' ||\n options?.scope === 'project' ||\n options?.scope === 'local'\n ) {\n return options.scope\n }\n if (options?.project === true) return 'project'\n return 'user'\n}\n\nfunction scopeBaseDir(scope: PluginScope): string {\n if (scope === 'user') return userKodeDir()\n return join(getCwd(), CONFIG_BASE_DIR)\n}\n\nfunction scopeSkillsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'skills')\n}\n\nfunction scopeCommandsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'commands')\n}\n\nfunction scopeDisabledSkillsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'skills.disabled')\n}\n\nfunction scopeDisabledCommandsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'commands.disabled')\n}\n\nfunction scopeInstalledPluginsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'plugins', 'installed')\n}\n\nfunction scopeInstalledPluginRoot(\n scope: PluginScope,\n plugin: string,\n marketplace: string,\n): string {\n return join(scopeInstalledPluginsDir(scope), plugin, marketplace)\n}\n\nfunction pluginsDir(): string {\n return join(userKodeDir(), 'plugins')\n}\n\nfunction knownMarketplacesConfigPath(): string {\n return join(pluginsDir(), KNOWN_MARKETPLACES_FILE)\n}\n\nfunction marketplaceCacheBaseDir(): string {\n return join(pluginsDir(), MARKETPLACES_CACHE_DIR)\n}\n\nfunction installedSkillPluginsPath(): string {\n return join(userKodeDir(), INSTALLED_SKILL_PLUGINS_FILE)\n}\n\nfunction ensureDir(path: string): void {\n mkdirSync(path, { recursive: true })\n}\n\nfunction readJsonFile<T>(path: string, fallback: T): T {\n try {\n if (!existsSync(path)) return fallback\n const raw = readFileSync(path, 'utf8')\n return JSON.parse(raw) as T\n } catch {\n return fallback\n }\n}\n\nfunction writeJsonFile(path: string, value: unknown): void {\n ensureDir(dirname(path))\n writeFileSync(path, `${JSON.stringify(value, null, 2)}\\n`, 'utf8')\n}\n\nfunction normalizeMarketplaceSubPath(path: string | undefined): string | null {\n if (!path) return null\n const trimmed = path\n .trim()\n .replace(/^\\.?\\//, '')\n .replace(/^\\/+/, '')\n if (!trimmed) return null\n if (trimmed.includes('..')) {\n throw new Error(`Marketplace path contains '..': ${path}`)\n }\n return trimmed.replace(/\\\\/g, '/').replace(/\\/+$/, '')\n}\n\nfunction safeJoinWithin(baseDir: string, relativePath: string): string {\n const normalized = relativePath.replace(/\\\\/g, '/')\n if (!normalized || normalized.startsWith('/') || normalized.includes('..')) {\n throw new Error(`Unsafe path in archive: ${relativePath}`)\n }\n const joined = resolve(baseDir, normalized.split('/').join(sep))\n const resolvedBase = resolve(baseDir)\n if (!joined.startsWith(resolvedBase + sep) && joined !== resolvedBase) {\n throw new Error(`Path traversal detected: ${relativePath}`)\n }\n return joined\n}\n\nfunction ensureEmptyDir(path: string): void {\n if (existsSync(path)) rmSync(path, { recursive: true, force: true })\n ensureDir(path)\n}\n\nfunction safeCopyDirectory(srcDir: string, destDir: string): void {\n ensureDir(destDir)\n const entries = readdirSync(srcDir, { withFileTypes: true })\n for (const entry of entries) {\n const srcPath = join(srcDir, entry.name)\n const destPath = join(destDir, entry.name)\n\n if (entry.isDirectory()) {\n safeCopyDirectory(srcPath, destPath)\n continue\n }\n\n if (entry.isFile()) {\n ensureDir(dirname(destPath))\n copyFileSync(srcPath, destPath)\n continue\n }\n\n }\n}\n\nfunction readMarketplaceFromDirectory(rootDir: string): MarketplaceManifest {\n const primaryMarketplaceFile = resolve(\n rootDir,\n '.kode-plugin',\n 'marketplace.json',\n )\n const legacyMarketplaceFile = resolve(\n rootDir,\n '.claude-plugin',\n 'marketplace.json',\n )\n const marketplaceFile = existsSync(primaryMarketplaceFile)\n ? primaryMarketplaceFile\n : legacyMarketplaceFile\n if (!existsSync(marketplaceFile)) {\n throw new Error(\n `Marketplace file not found (expected .kode-plugin/marketplace.json or .claude-plugin/marketplace.json)`,\n )\n }\n const raw = readFileSync(marketplaceFile, 'utf8')\n const parsed = MarketplaceManifestSchema.safeParse(JSON.parse(raw))\n if (!parsed.success) {\n throw new Error(\n `Invalid marketplace.json: ${parsed.error.issues.map(i => i.message).join('; ')}`,\n )\n }\n return parsed.data\n}\n\nexport function parsePluginSpec(spec: string): {\n plugin: string\n marketplace: string\n} {\n const trimmed = spec.trim()\n const parts = trimmed.split('@')\n if (parts.length !== 2) {\n throw new Error(\n `Invalid plugin spec: ${spec}. Expected format: <plugin>@<marketplace>`,\n )\n }\n const plugin = parts[0]!.trim()\n const marketplace = parts[1]!.trim()\n if (!plugin || !marketplace) {\n throw new Error(\n `Invalid plugin spec: ${spec}. Expected format: <plugin>@<marketplace>`,\n )\n }\n return { plugin, marketplace }\n}\n\nfunction resolvePluginForInstall(pluginInput: string): {\n plugin: string\n marketplace: string\n pluginSpec: string\n} {\n const trimmed = pluginInput.trim()\n if (!trimmed) throw new Error('Plugin is required')\n\n if (trimmed.includes('@')) {\n const resolved = parsePluginSpec(trimmed)\n return {\n ...resolved,\n pluginSpec: `${resolved.plugin}@${resolved.marketplace}`,\n }\n }\n\n const config = loadKnownMarketplaces()\n const matches: { marketplace: string; entry: PluginEntry }[] = []\n for (const [marketplace, entry] of Object.entries(config)) {\n try {\n const manifest = readMarketplaceFromDirectory(entry.installLocation)\n const found = manifest.plugins.find(p => p.name === trimmed)\n if (found) matches.push({ marketplace, entry: found })\n } catch {\n }\n }\n\n if (matches.length === 0) {\n const availableMarketplaces = Object.keys(config).sort().join(', ')\n throw new Error(\n `Plugin '${trimmed}' not found in any marketplace. Available marketplaces: ${availableMarketplaces || '(none)'}`,\n )\n }\n\n if (matches.length > 1) {\n const options = matches\n .map(m => `${trimmed}@${m.marketplace}`)\n .sort()\n .join(', ')\n throw new Error(\n `Plugin '${trimmed}' is available in multiple marketplaces. Use an explicit spec: ${options}`,\n )\n }\n\n return {\n plugin: trimmed,\n marketplace: matches[0]!.marketplace,\n pluginSpec: `${trimmed}@${matches[0]!.marketplace}`,\n }\n}\n\nfunction resolveInstalledPluginSpec(\n pluginInput: string,\n state: InstalledSkillPluginsFile,\n): string {\n const trimmed = pluginInput.trim()\n if (!trimmed) throw new Error('Plugin is required')\n\n if (trimmed.includes('@')) {\n parsePluginSpec(trimmed)\n return trimmed\n }\n\n const matches = Object.entries(state).filter(\n ([, record]) => record?.plugin === trimmed,\n )\n if (matches.length === 0) {\n throw new Error(`Plugin '${trimmed}' is not installed`)\n }\n if (matches.length > 1) {\n const options = matches\n .map(([spec]) => spec)\n .sort()\n .join(', ')\n throw new Error(\n `Plugin '${trimmed}' is installed from multiple marketplaces. Use an explicit spec: ${options}`,\n )\n }\n return matches[0]![0]\n}\n\nfunction baseDirForInstallRecord(record: InstalledSkillPlugin): string {\n if (record.scope === 'user') return userKodeDir()\n const projectPath =\n typeof record.projectPath === 'string' ? record.projectPath.trim() : ''\n if (!projectPath) {\n throw new Error(\n `Installed plugin '${record.plugin}@${record.marketplace}' is missing projectPath for scope=${record.scope}`,\n )\n }\n return join(projectPath, CONFIG_BASE_DIR)\n}\n\nfunction githubRepoFromUrl(input: string): string | null {\n const ssh = input.match(/^git@github\\.com:([^/]+\\/[^/]+?)(?:\\.git)?$/)\n if (ssh?.[1]) return ssh[1]\n const https = input.match(\n /^https?:\\/\\/github\\.com\\/([^/]+\\/[^/]+?)(?:\\.git)?$/,\n )\n if (https?.[1]) return https[1]\n return null\n}\n\nfunction parseRefAndPath(input: string): {\n base: string\n ref?: string\n path?: string\n} {\n const [beforeHash, hashPart] = input.split('#', 2)\n const [base, refPart] = beforeHash.split('@', 2)\n return {\n base,\n ref: refPart?.trim() || undefined,\n path: hashPart?.trim() || undefined,\n }\n}\n\nfunction parseMarketplaceSourceInput(sourceInput: string): MarketplaceSource {\n const raw = sourceInput.trim()\n if (!raw) throw new Error('Marketplace source is required')\n\n for (const prefix of [\n 'github:',\n 'git:',\n 'url:',\n 'npm:',\n 'file:',\n 'dir:',\n ] as const) {\n if (raw.startsWith(prefix)) {\n const rest = raw.slice(prefix.length).trim()\n const parsed = parseRefAndPath(rest)\n if (prefix === 'github:') {\n return {\n source: 'github',\n repo: parsed.base.trim(),\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n if (prefix === 'git:') {\n const repo = githubRepoFromUrl(parsed.base.trim())\n if (repo) {\n return {\n source: 'github',\n repo,\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n return {\n source: 'git',\n url: parsed.base.trim(),\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n if (prefix === 'url:') {\n return { source: 'url', url: rest }\n }\n if (prefix === 'npm:') {\n return { source: 'npm', package: rest }\n }\n if (prefix === 'file:') {\n return { source: 'file', path: rest }\n }\n if (prefix === 'dir:') {\n return { source: 'directory', path: rest }\n }\n }\n }\n\n const resolved = resolve(raw)\n if (existsSync(resolved)) {\n const stat = lstatSync(resolved)\n if (stat.isDirectory()) return { source: 'directory', path: resolved }\n if (stat.isFile()) return { source: 'file', path: resolved }\n throw new Error(`Marketplace source must be a directory or file: ${raw}`)\n }\n\n const parsed = parseRefAndPath(raw)\n if (/^[^/\\s]+\\/[^/\\s]+$/.test(parsed.base)) {\n return {\n source: 'github',\n repo: parsed.base,\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n\n const repo = githubRepoFromUrl(parsed.base)\n if (repo) {\n return {\n source: 'github',\n repo,\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n\n if (/^https?:\\/\\//.test(raw)) {\n return { source: 'url', url: raw }\n }\n\n throw new Error(\n `Unsupported marketplace source: ${sourceInput}. Use a local path, \"owner/repo\", or prefixes like github:, git:, url:, file:, dir:.`,\n )\n}\n\nasync function fetchBinary(url: string): Promise<Uint8Array> {\n const resp = await fetch(url, { method: 'GET' })\n if (!resp.ok) {\n throw new Error(\n `Failed to download ${url}: ${resp.status} ${resp.statusText}`,\n )\n }\n const buf = await resp.arrayBuffer()\n return new Uint8Array(buf)\n}\n\nasync function tryDownloadGithubZip(\n repo: string,\n ref: string,\n): Promise<Uint8Array> {\n const [owner, name] = repo.split('/', 2)\n if (!owner || !name) throw new Error(`Invalid GitHub repo: ${repo}`)\n\n const candidates = ref.startsWith('refs/')\n ? [ref]\n : [`refs/heads/${ref}`, `refs/tags/${ref}`]\n\n\t let lastError: Error | null = null\n\t for (const candidate of candidates) {\n\t const url = `https://codeload.github.com/${owner}/${name}/zip/${candidate}`\n\t try {\n\t return await fetchBinary(url)\n\t } catch (err) {\n\t lastError = err instanceof Error ? err : Error(String(err))\n\t }\n }\n throw lastError ?? new Error(`Failed to download GitHub repo ${repo}@${ref}`)\n}\n\nasync function cacheMarketplaceToTempDir(\n source: MarketplaceSource,\n tempDir: string,\n): Promise<void> {\n ensureEmptyDir(tempDir)\n\n if (source.source === 'directory') {\n const root = resolve(source.path)\n if (!existsSync(root) || !lstatSync(root).isDirectory()) {\n throw new Error(`Directory not found: ${source.path}`)\n }\n safeCopyDirectory(root, tempDir)\n return\n }\n\n if (source.source === 'file') {\n const file = resolve(source.path)\n if (!existsSync(file) || !lstatSync(file).isFile()) {\n throw new Error(`File not found: ${source.path}`)\n }\n const out = join(tempDir, '.kode-plugin')\n ensureDir(out)\n copyFileSync(file, join(out, 'marketplace.json'))\n return\n }\n\n if (source.source === 'github') {\n const pathWithin = normalizeMarketplaceSubPath(source.path)\n\n const preferredRef = source.ref?.trim() || ''\n const refsToTry = preferredRef ? [preferredRef] : ['main', 'master']\n\n let zip: Uint8Array | null = null\n let usedRef = preferredRef || 'main'\n let lastError: Error | null = null\n for (const ref of refsToTry) {\n try {\n zip = await tryDownloadGithubZip(source.repo, ref)\n usedRef = ref\n break\n } catch (err) {\n lastError = err instanceof Error ? err : Error(String(err))\n }\n }\n if (!zip)\n throw (\n lastError ?? new Error(`Failed to download GitHub repo ${source.repo}`)\n )\n\n const files = unzipSync(zip)\n const names = Object.keys(files).filter(Boolean)\n const topDir = names.length > 0 ? names[0]!.split('/')[0]! : ''\n const includePrefix = pathWithin\n ? `${topDir}/${pathWithin.replace(/\\/+$/, '')}/`\n : `${topDir}/`\n\n let extractedCount = 0\n for (const [name, data] of Object.entries(files)) {\n if (!name.startsWith(includePrefix)) continue\n const rel = name.slice(includePrefix.length)\n if (!rel) continue\n if (rel.endsWith('/')) {\n ensureDir(safeJoinWithin(tempDir, rel))\n continue\n }\n const dest = safeJoinWithin(tempDir, rel)\n ensureDir(dirname(dest))\n writeFileSync(dest, data)\n extractedCount++\n }\n\n if (extractedCount === 0) {\n throw new Error(\n `No files extracted from ${source.repo}@${usedRef}${pathWithin ? `#${pathWithin}` : ''}`,\n )\n }\n return\n }\n\n if (source.source === 'url') {\n const url = source.url\n if (url.toLowerCase().endsWith('.json')) {\n const data = await fetchBinary(url)\n const out = join(tempDir, '.kode-plugin')\n ensureDir(out)\n writeFileSync(join(out, 'marketplace.json'), Buffer.from(data))\n return\n }\n if (url.toLowerCase().endsWith('.zip')) {\n const zip = await fetchBinary(url)\n const files = unzipSync(zip)\n for (const [name, data] of Object.entries(files)) {\n if (!name || name.endsWith('/')) continue\n const dest = safeJoinWithin(tempDir, name)\n ensureDir(dirname(dest))\n writeFileSync(dest, data)\n }\n return\n }\n throw new Error(\n `Unsupported url marketplace source. Provide a .json or .zip URL: ${url}`,\n )\n }\n\n if (source.source === 'git') {\n const repo = githubRepoFromUrl(source.url)\n if (repo) {\n await cacheMarketplaceToTempDir(\n {\n source: 'github',\n repo,\n ...(source.ref ? { ref: source.ref } : {}),\n ...(source.path ? { path: source.path } : {}),\n },\n tempDir,\n )\n return\n }\n throw new Error(\n `git sources are not supported without GitHub conversion (url=${source.url})`,\n )\n }\n\n if (source.source === 'npm') {\n throw new Error(\n `npm marketplace sources are not supported yet (package=${source.package}). Install the package and add it as a local dir instead.`,\n )\n }\n}\n\nfunction loadKnownMarketplaces(): KnownMarketplacesConfig {\n const raw = readJsonFile<unknown>(knownMarketplacesConfigPath(), {})\n const parsed = KnownMarketplacesSchema.safeParse(raw)\n if (!parsed.success) {\n throw new Error(\n `Marketplace configuration is corrupted: ${parsed.error.issues.map(i => i.message).join('; ')}`,\n )\n }\n return parsed.data\n}\n\nfunction saveKnownMarketplaces(config: KnownMarketplacesConfig): void {\n const parsed = KnownMarketplacesSchema.safeParse(config)\n if (!parsed.success) {\n throw new Error(`Invalid marketplace config: ${parsed.error.message}`)\n }\n writeJsonFile(knownMarketplacesConfigPath(), parsed.data)\n}\n\nexport function listMarketplaces(): KnownMarketplacesConfig {\n return loadKnownMarketplaces()\n}\n\nexport async function addMarketplace(\n sourceInput: string,\n): Promise<{ name: string }> {\n const source = parseMarketplaceSourceInput(sourceInput)\n const validatedSource = MarketplaceSourceSchema.safeParse(source)\n if (!validatedSource.success) {\n throw new Error(\n `Invalid marketplace source: ${validatedSource.error.issues.map(i => i.message).join('; ')}`,\n )\n }\n\n const config = loadKnownMarketplaces()\n const cacheBase = marketplaceCacheBaseDir()\n ensureDir(cacheBase)\n\n const tempDir = join(cacheBase, `tmp-${randomUUID()}`)\n try {\n await cacheMarketplaceToTempDir(validatedSource.data, tempDir)\n const manifest = readMarketplaceFromDirectory(tempDir)\n const marketplaceName = manifest.name\n\n if (config[marketplaceName]) {\n throw new Error(\n `Marketplace '${marketplaceName}' is already installed. Remove it first to re-add.`,\n )\n }\n\n const installLocation = join(cacheBase, marketplaceName)\n if (existsSync(installLocation)) {\n throw new Error(\n `Marketplace cache directory already exists: ${installLocation}`,\n )\n }\n\n renameSync(tempDir, installLocation)\n config[marketplaceName] = {\n source: validatedSource.data,\n installLocation,\n lastUpdated: new Date().toISOString(),\n }\n saveKnownMarketplaces(config)\n return { name: marketplaceName }\n } catch (error) {\n if (existsSync(tempDir)) rmSync(tempDir, { recursive: true, force: true })\n throw error\n }\n}\n\nexport function removeMarketplace(name: string): void {\n const trimmed = name.trim()\n if (!trimmed) throw new Error('Marketplace name is required')\n\n const config = loadKnownMarketplaces()\n const entry = config[trimmed]\n if (!entry) throw new Error(`Marketplace '${trimmed}' not found`)\n\n delete config[trimmed]\n saveKnownMarketplaces(config)\n\n try {\n if (existsSync(entry.installLocation)) {\n rmSync(entry.installLocation, { recursive: true, force: true })\n }\n } catch {\n }\n}\n\nexport async function refreshMarketplaceAsync(name: string): Promise<void> {\n const trimmed = name.trim()\n if (!trimmed) throw new Error('Marketplace name is required')\n\n const config = loadKnownMarketplaces()\n const entry = config[trimmed]\n if (!entry) throw new Error(`Marketplace '${trimmed}' not found`)\n\n const cacheBase = marketplaceCacheBaseDir()\n ensureDir(cacheBase)\n\n const tempDir = join(cacheBase, `tmp-${randomUUID()}`)\n try {\n await cacheMarketplaceToTempDir(entry.source, tempDir)\n const manifest = readMarketplaceFromDirectory(tempDir)\n if (manifest.name !== trimmed) {\n throw new Error(\n `Marketplace name mismatch on refresh: expected ${trimmed}, got ${manifest.name}`,\n )\n }\n\n if (existsSync(entry.installLocation)) {\n rmSync(entry.installLocation, { recursive: true, force: true })\n }\n renameSync(tempDir, entry.installLocation)\n config[trimmed] = {\n ...entry,\n lastUpdated: new Date().toISOString(),\n }\n saveKnownMarketplaces(config)\n } catch (error) {\n if (existsSync(tempDir)) rmSync(tempDir, { recursive: true, force: true })\n throw error\n }\n}\n\nexport async function refreshAllMarketplacesAsync(\n onProgress?: (message: string) => void,\n): Promise<{ refreshed: string[]; failed: { name: string; error: string }[] }> {\n const config = loadKnownMarketplaces()\n const names = Object.keys(config).sort()\n\n const refreshed: string[] = []\n const failed: { name: string; error: string }[] = []\n\n for (const name of names) {\n try {\n onProgress?.(`Updating marketplace: ${name}...`)\n await refreshMarketplaceAsync(name)\n refreshed.push(name)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n failed.push({ name, error: message })\n onProgress?.(`Failed to refresh marketplace ${name}: ${message}`)\n }\n }\n\n return { refreshed, failed }\n}\n\nexport function getMarketplaceManifest(marketplaceName: string): {\n manifest: MarketplaceManifest\n rootDir: string\n source: MarketplaceSource\n} {\n const config = loadKnownMarketplaces()\n const entry = config[marketplaceName]\n if (!entry) {\n const available = Object.keys(config).sort().join(', ')\n throw new Error(\n `Marketplace '${marketplaceName}' not found. Available marketplaces: ${available || '(none)'}`,\n )\n }\n const manifest = readMarketplaceFromDirectory(entry.installLocation)\n return { manifest, rootDir: entry.installLocation, source: entry.source }\n}\n\nfunction ensurePluginInstallState(): InstalledSkillPluginsFile {\n ensureDir(userKodeDir())\n const state = readJsonFile<Record<string, any>>(\n installedSkillPluginsPath(),\n {},\n )\n for (const record of Object.values(state)) {\n if (!record || typeof record !== 'object') continue\n if (\n record.scope !== 'user' &&\n record.scope !== 'project' &&\n record.scope !== 'local'\n ) {\n record.scope = 'user'\n }\n if (record.kind !== 'skill-pack' && record.kind !== 'plugin-pack') {\n record.kind =\n typeof record.pluginRoot === 'string' ? 'plugin-pack' : 'skill-pack'\n }\n if (record.isEnabled === undefined) record.isEnabled = true\n }\n return state as InstalledSkillPluginsFile\n}\n\nfunction savePluginInstallState(state: InstalledSkillPluginsFile): void {\n writeJsonFile(installedSkillPluginsPath(), state)\n}\n\nexport function installSkillPlugin(\n pluginInput: string,\n options?: { scope?: PluginScope; project?: boolean; force?: boolean },\n): {\n pluginSpec: string\n installedSkills: string[]\n installedCommands: string[]\n} {\n const scope = normalizePluginScope(options)\n const { plugin, marketplace, pluginSpec } =\n resolvePluginForInstall(pluginInput)\n const { manifest, rootDir, source } = getMarketplaceManifest(marketplace)\n\n const entry = manifest.plugins.find(p => p.name === plugin)\n if (!entry) {\n const available = manifest.plugins\n .map(p => p.name)\n .sort()\n .join(', ')\n throw new Error(\n `Plugin '${plugin}' not found in marketplace '${marketplace}'. Available plugins: ${available || '(none)'}`,\n )\n }\n\n const installState = ensurePluginInstallState()\n const existing = installState[pluginSpec]\n if (existing && existing.scope !== scope && options?.force !== true) {\n throw new Error(\n `Plugin '${pluginSpec}' is already installed with scope=${existing.scope}. Uninstall it first to install with scope=${scope}.`,\n )\n }\n if (existing && options?.force !== true) {\n throw new Error(\n `Plugin '${pluginSpec}' is already installed. Re-run with --force to reinstall.`,\n )\n }\n\n const entrySourceBase = resolve(rootDir, entry.source ?? './')\n const primaryManifestPath = join(\n entrySourceBase,\n '.kode-plugin',\n 'plugin.json',\n )\n const legacyManifestPath = join(\n entrySourceBase,\n '.claude-plugin',\n 'plugin.json',\n )\n const pluginManifestPath = existsSync(primaryManifestPath)\n ? primaryManifestPath\n : legacyManifestPath\n\n if (\n existsSync(pluginManifestPath) &&\n lstatSync(pluginManifestPath).isFile()\n ) {\n const pluginRoot = scopeInstalledPluginRoot(scope, plugin, marketplace)\n if (existsSync(pluginRoot) && options?.force !== true) {\n throw new Error(`Destination already exists: ${pluginRoot}`)\n }\n ensureEmptyDir(pluginRoot)\n safeCopyDirectory(entrySourceBase, pluginRoot)\n\n installState[pluginSpec] = {\n plugin,\n marketplace,\n scope,\n kind: 'plugin-pack',\n pluginRoot,\n isEnabled: true,\n projectPath: scope === 'user' ? undefined : getCwd(),\n installedAt: new Date().toISOString(),\n skills: [],\n commands: [],\n sourceMarketplacePath:\n source.source === 'file' || source.source === 'directory'\n ? source.path\n : source.source === 'github'\n ? `github:${source.repo}`\n : source.source === 'url'\n ? source.url\n : source.source === 'git'\n ? source.url\n : `npm:${source.package}`,\n }\n savePluginInstallState(installState)\n\n return { pluginSpec, installedSkills: [], installedCommands: [] }\n }\n\n const skillsDestBase = scopeSkillsDir(scope)\n const commandsDestBase = join(scopeCommandsDir(scope), plugin, marketplace)\n\n ensureDir(skillsDestBase)\n ensureDir(commandsDestBase)\n\n const installedSkills: string[] = []\n const installedCommands: string[] = []\n\n const skillPaths = entry.skills ?? []\n for (const rel of skillPaths) {\n const src = safeJoinWithin(entrySourceBase, rel)\n if (!existsSync(src) || !lstatSync(src).isDirectory()) {\n throw new Error(`Skill path not found or not a directory: ${src}`)\n }\n const skillName = basename(src)\n const dest = join(skillsDestBase, skillName)\n\n if (existsSync(dest) && options?.force !== true) {\n throw new Error(`Destination already exists: ${dest}`)\n }\n ensureEmptyDir(dest)\n safeCopyDirectory(src, dest)\n installedSkills.push(skillName)\n }\n\n const commandPaths = entry.commands ?? []\n for (const rel of commandPaths) {\n const src = safeJoinWithin(entrySourceBase, rel)\n if (!existsSync(src)) {\n throw new Error(`Command path not found: ${src}`)\n }\n const stat = lstatSync(src)\n if (stat.isDirectory()) {\n const dest = join(commandsDestBase, basename(src))\n if (existsSync(dest) && options?.force !== true) {\n throw new Error(`Destination already exists: ${dest}`)\n }\n ensureEmptyDir(dest)\n safeCopyDirectory(src, dest)\n installedCommands.push(dest)\n continue\n }\n if (stat.isFile()) {\n const dest = join(commandsDestBase, basename(src))\n ensureDir(dirname(dest))\n if (existsSync(dest) && options?.force !== true) {\n throw new Error(`Destination already exists: ${dest}`)\n }\n copyFileSync(src, dest)\n installedCommands.push(dest)\n continue\n }\n }\n\n installState[pluginSpec] = {\n plugin,\n marketplace,\n scope,\n kind: 'skill-pack',\n isEnabled: true,\n projectPath: scope === 'user' ? undefined : getCwd(),\n installedAt: new Date().toISOString(),\n skills: installedSkills,\n commands: installedCommands,\n sourceMarketplacePath:\n source.source === 'file' || source.source === 'directory'\n ? source.path\n : source.source === 'github'\n ? `github:${source.repo}`\n : source.source === 'url'\n ? source.url\n : source.source === 'git'\n ? source.url\n : `npm:${source.package}`,\n }\n savePluginInstallState(installState)\n\n return { pluginSpec, installedSkills, installedCommands }\n}\n\nexport function uninstallSkillPlugin(\n pluginInput: string,\n options?: { scope?: PluginScope; project?: boolean },\n): { pluginSpec: string; removedSkills: string[]; removedCommands: string[] } {\n const requestedScope = normalizePluginScope(options)\n const state = ensurePluginInstallState()\n const pluginSpec = resolveInstalledPluginSpec(pluginInput, state)\n const record = state[pluginSpec]\n if (!record) {\n throw new Error(`Plugin '${pluginSpec}' is not installed`)\n }\n\n if (record.scope !== requestedScope) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed with scope=${record.scope}. Re-run with --scope ${record.scope}.`,\n )\n }\n if (record.scope !== 'user') {\n const projectPath = record.projectPath?.trim() || ''\n const cwd = getCwd()\n if (!projectPath || projectPath !== cwd) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed for a different directory. Expected cwd=${projectPath || '(missing)'}, got cwd=${cwd}`,\n )\n }\n }\n\n if (record.kind === 'plugin-pack') {\n const baseDir = baseDirForInstallRecord(record)\n const pluginRoot =\n typeof record.pluginRoot === 'string' && record.pluginRoot.trim()\n ? record.pluginRoot\n : join(\n baseDir,\n 'plugins',\n 'installed',\n record.plugin,\n record.marketplace,\n )\n\n const removedCommands: string[] = []\n if (existsSync(pluginRoot)) {\n rmSync(pluginRoot, { recursive: true, force: true })\n removedCommands.push(pluginRoot)\n }\n\n delete state[pluginSpec]\n savePluginInstallState(state)\n\n return { pluginSpec, removedSkills: [], removedCommands }\n }\n\n const baseDir = baseDirForInstallRecord(record)\n const skillsDestBase = join(baseDir, 'skills')\n const commandsDestBase = join(\n baseDir,\n 'commands',\n record.plugin,\n record.marketplace,\n )\n const disabledSkillsBase = join(\n baseDir,\n 'skills.disabled',\n record.plugin,\n record.marketplace,\n )\n const disabledCommandsBase = join(\n baseDir,\n 'commands.disabled',\n record.plugin,\n record.marketplace,\n )\n\n const removedSkills: string[] = []\n for (const skillName of record.skills) {\n const dest = join(skillsDestBase, skillName)\n if (existsSync(dest)) rmSync(dest, { recursive: true, force: true })\n const disabledDest = join(disabledSkillsBase, skillName)\n if (existsSync(disabledDest))\n rmSync(disabledDest, { recursive: true, force: true })\n removedSkills.push(skillName)\n }\n\n const removedCommands: string[] = []\n if (existsSync(commandsDestBase)) {\n rmSync(commandsDestBase, { recursive: true, force: true })\n removedCommands.push(commandsDestBase)\n }\n if (existsSync(disabledCommandsBase)) {\n rmSync(disabledCommandsBase, { recursive: true, force: true })\n removedCommands.push(disabledCommandsBase)\n }\n\n delete state[pluginSpec]\n savePluginInstallState(state)\n\n return { pluginSpec, removedSkills, removedCommands }\n}\n\nexport function disableSkillPlugin(\n pluginInput: string,\n options?: { scope?: PluginScope; project?: boolean },\n): {\n pluginSpec: string\n disabledSkills: string[]\n disabledCommands: string[]\n} {\n const requestedScope = normalizePluginScope(options)\n const state = ensurePluginInstallState()\n const pluginSpec = resolveInstalledPluginSpec(pluginInput, state)\n const record = state[pluginSpec]\n if (!record) throw new Error(`Plugin '${pluginSpec}' is not installed`)\n\n if (record.scope !== requestedScope) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed with scope=${record.scope}. Re-run with --scope ${record.scope}.`,\n )\n }\n if (record.scope !== 'user') {\n const projectPath = record.projectPath?.trim() || ''\n const cwd = getCwd()\n if (!projectPath || projectPath !== cwd) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed for a different directory. Expected cwd=${projectPath || '(missing)'}, got cwd=${cwd}`,\n )\n }\n }\n\n if (record.isEnabled === false) {\n return { pluginSpec, disabledSkills: [], disabledCommands: [] }\n }\n\n if (record.kind === 'plugin-pack') {\n record.isEnabled = false\n state[pluginSpec] = record\n savePluginInstallState(state)\n return { pluginSpec, disabledSkills: [], disabledCommands: [] }\n }\n\n const baseDir = baseDirForInstallRecord(record)\n const skillsDir = join(baseDir, 'skills')\n const commandsDir = join(\n baseDir,\n 'commands',\n record.plugin,\n record.marketplace,\n )\n const disabledSkillsBase = join(\n baseDir,\n 'skills.disabled',\n record.plugin,\n record.marketplace,\n )\n const disabledCommandsDir = join(\n baseDir,\n 'commands.disabled',\n record.plugin,\n record.marketplace,\n )\n\n const disabledSkills: string[] = []\n for (const skillName of record.skills) {\n const src = join(skillsDir, skillName)\n if (!existsSync(src)) continue\n const dest = join(disabledSkillsBase, skillName)\n ensureDir(dirname(dest))\n if (existsSync(dest)) rmSync(dest, { recursive: true, force: true })\n renameSync(src, dest)\n disabledSkills.push(skillName)\n }\n\n const disabledCommands: string[] = []\n if (existsSync(commandsDir)) {\n ensureDir(dirname(disabledCommandsDir))\n if (existsSync(disabledCommandsDir)) {\n rmSync(disabledCommandsDir, { recursive: true, force: true })\n }\n renameSync(commandsDir, disabledCommandsDir)\n disabledCommands.push(disabledCommandsDir)\n }\n\n record.isEnabled = false\n state[pluginSpec] = record\n savePluginInstallState(state)\n\n return { pluginSpec, disabledSkills, disabledCommands }\n}\n\nexport function enableSkillPlugin(\n pluginInput: string,\n options?: { scope?: PluginScope; project?: boolean },\n): { pluginSpec: string; enabledSkills: string[]; enabledCommands: string[] } {\n const requestedScope = normalizePluginScope(options)\n const state = ensurePluginInstallState()\n const pluginSpec = resolveInstalledPluginSpec(pluginInput, state)\n const record = state[pluginSpec]\n if (!record) throw new Error(`Plugin '${pluginSpec}' is not installed`)\n\n if (record.scope !== requestedScope) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed with scope=${record.scope}. Re-run with --scope ${record.scope}.`,\n )\n }\n if (record.scope !== 'user') {\n const projectPath = record.projectPath?.trim() || ''\n const cwd = getCwd()\n if (!projectPath || projectPath !== cwd) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed for a different directory. Expected cwd=${projectPath || '(missing)'}, got cwd=${cwd}`,\n )\n }\n }\n\n if (record.isEnabled !== false) {\n return { pluginSpec, enabledSkills: [], enabledCommands: [] }\n }\n\n if (record.kind === 'plugin-pack') {\n record.isEnabled = true\n state[pluginSpec] = record\n savePluginInstallState(state)\n return { pluginSpec, enabledSkills: [], enabledCommands: [] }\n }\n\n const baseDir = baseDirForInstallRecord(record)\n const skillsDir = join(baseDir, 'skills')\n const commandsDir = join(\n baseDir,\n 'commands',\n record.plugin,\n record.marketplace,\n )\n const disabledSkillsBase = join(\n baseDir,\n 'skills.disabled',\n record.plugin,\n record.marketplace,\n )\n const disabledCommandsDir = join(\n baseDir,\n 'commands.disabled',\n record.plugin,\n record.marketplace,\n )\n\n const enabledSkills: string[] = []\n for (const skillName of record.skills) {\n const src = join(disabledSkillsBase, skillName)\n if (!existsSync(src)) continue\n const dest = join(skillsDir, skillName)\n ensureDir(dirname(dest))\n if (existsSync(dest)) {\n throw new Error(`Destination already exists: ${dest}`)\n }\n renameSync(src, dest)\n enabledSkills.push(skillName)\n }\n\n const enabledCommands: string[] = []\n if (existsSync(disabledCommandsDir)) {\n ensureDir(dirname(commandsDir))\n if (existsSync(commandsDir)) {\n throw new Error(`Destination already exists: ${commandsDir}`)\n }\n renameSync(disabledCommandsDir, commandsDir)\n enabledCommands.push(commandsDir)\n }\n\n record.isEnabled = true\n state[pluginSpec] = record\n savePluginInstallState(state)\n\n return { pluginSpec, enabledSkills, enabledCommands }\n}\n\nexport function listInstalledSkillPlugins(): InstalledSkillPluginsFile {\n return ensurePluginInstallState()\n}\n\nexport function listEnabledInstalledPluginPackRoots(): string[] {\n const state = ensurePluginInstallState()\n const cwd = getCwd()\n const roots: string[] = []\n\n for (const spec of Object.keys(state).sort()) {\n const record = state[spec]\n if (!record || record.kind !== 'plugin-pack') continue\n if (record.isEnabled === false) continue\n\n if (record.scope !== 'user') {\n const projectPath = record.projectPath?.trim() || ''\n if (!projectPath || projectPath !== cwd) continue\n }\n\n const baseDir = baseDirForInstallRecord(record)\n const pluginRoot =\n typeof record.pluginRoot === 'string' && record.pluginRoot.trim()\n ? record.pluginRoot\n : join(\n baseDir,\n 'plugins',\n 'installed',\n record.plugin,\n record.marketplace,\n )\n\n try {\n if (!existsSync(pluginRoot) || !lstatSync(pluginRoot).isDirectory())\n continue\n roots.push(pluginRoot)\n } catch {\n continue\n }\n }\n\n return roots\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["parsed", "repo", "baseDir", "removedCommands"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/utils/permissions/toolPermissionSettings.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\n ToolPermissionContext,\n ToolPermissionContextUpdate,\n ToolPermissionRuleBehavior,\n ToolPermissionUpdateDestination,\n} from '@kode-types/toolPermissionContext'\nimport {\n createDefaultToolPermissionContext,\n isPersistableToolPermissionDestination,\n} from '@kode-types/toolPermissionContext'\nimport { getCurrentProjectConfig } from '@utils/config'\nimport { getCwd } from '@utils/state'\nimport { logError } from '@utils/log'\nimport {\n getSettingsFileCandidates,\n loadSettingsWithLegacyFallback,\n saveSettingsToPrimaryAndSyncLegacy,\n type SettingsFile,\n} from '@utils/config/settingsFiles'\n\ntype SettingsPermissions = {\n allow?: unknown\n deny?: unknown\n ask?: unknown\n additionalDirectories?: unknown\n}\n\ntype SettingsFileWithPermissions = {\n permissions?: SettingsPermissions\n [key: string]: unknown\n}\n\nfunction uniqueStrings(value: unknown): string[] {\n if (!Array.isArray(value)) return []\n const out: string[] = []\n const seen = new Set<string>()\n for (const item of value) {\n if (typeof item !== 'string') continue\n if (seen.has(item)) continue\n seen.add(item)\n out.push(item)\n }\n return out\n}\n\nfunction getPrimarySettingsFilePathForDestination(options: {\n destination: ToolPermissionUpdateDestination\n projectDir?: string\n homeDir?: string\n}): string | null {\n const candidates = getSettingsFileCandidates({\n destination: options.destination as any,\n projectDir: options.projectDir,\n homeDir: options.homeDir,\n })\n return candidates?.primary ?? null\n}\n\nexport function loadToolPermissionContextFromDisk(options?: {\n projectDir?: string\n homeDir?: string\n includeKodeProjectConfig?: boolean\n isBypassPermissionsModeAvailable?: boolean\n}): ToolPermissionContext {\n const projectDir = options?.projectDir ?? getCwd()\n const homeDir = options?.homeDir\n const includeKodeProjectConfig = options?.includeKodeProjectConfig ?? true\n\n const base = createDefaultToolPermissionContext({\n isBypassPermissionsModeAvailable:\n options?.isBypassPermissionsModeAvailable ?? false,\n })\n\n const destinations: ToolPermissionUpdateDestination[] = [\n 'userSettings',\n 'projectSettings',\n 'localSettings',\n ]\n\n for (const destination of destinations) {\n const settings = loadSettingsWithLegacyFallback({\n destination: destination as any,\n projectDir,\n homeDir,\n migrateToPrimary: true,\n }).settings as SettingsFileWithPermissions | null\n const perms = settings?.permissions\n const allow = uniqueStrings(perms?.allow)\n const deny = uniqueStrings(perms?.deny)\n const ask = uniqueStrings(perms?.ask)\n const additionalDirectories = uniqueStrings(perms?.additionalDirectories)\n\n if (allow.length > 0) base.alwaysAllowRules[destination] = allow\n if (deny.length > 0) base.alwaysDenyRules[destination] = deny\n if (ask.length > 0) base.alwaysAskRules[destination] = ask\n\n for (const dir of additionalDirectories) {\n base.additionalWorkingDirectories.set(dir, {\n path: dir,\n source: destination,\n })\n }\n }\n\n if (includeKodeProjectConfig) {\n try {\n const cfg = getCurrentProjectConfig()\n const allow = Array.isArray(cfg.allowedTools) ? cfg.allowedTools : []\n const deny = Array.isArray((cfg as any).deniedTools)\n ? (cfg as any).deniedTools\n : []\n const ask = Array.isArray((cfg as any).askedTools)\n ? (cfg as any).askedTools\n : []\n\n if (allow.length > 0) {\n const prev = base.alwaysAllowRules.localSettings ?? []\n base.alwaysAllowRules.localSettings = [...new Set([...prev, ...allow])]\n }\n if (deny.length > 0) {\n const prev = base.alwaysDenyRules.localSettings ?? []\n base.alwaysDenyRules.localSettings = [...new Set([...prev, ...deny])]\n }\n if (ask.length > 0) {\n const prev = base.alwaysAskRules.localSettings ?? []\n base.alwaysAskRules.localSettings = [...new Set([...prev, ...ask])]\n }\n } catch (error) {\n logError(error)\n }\n }\n\n return base\n}\n\nfunction getOrCreatePermissions(\n settings: SettingsFileWithPermissions,\n): Required<SettingsFileWithPermissions>['permissions'] {\n const existing = settings.permissions\n if (existing && typeof existing === 'object') {\n return existing as SettingsPermissions\n }\n settings.permissions = {}\n return settings.permissions as SettingsPermissions\n}\n\nfunction behaviorKey(\n behavior: ToolPermissionRuleBehavior,\n): keyof SettingsPermissions {\n switch (behavior) {\n case 'allow':\n return 'allow'\n case 'deny':\n return 'deny'\n case 'ask':\n return 'ask'\n }\n}\n\nexport function persistToolPermissionUpdateToDisk(options: {\n update: ToolPermissionContextUpdate\n projectDir?: string\n homeDir?: string\n}): { persisted: boolean } {\n const update = options.update\n if (!isPersistableToolPermissionDestination(update.destination)) {\n return { persisted: false }\n }\n if (update.type === 'setMode') {\n return { persisted: false }\n }\n\n const filePath = getPrimarySettingsFilePathForDestination({\n destination: update.destination,\n projectDir: options.projectDir,\n homeDir: options.homeDir,\n })\n if (!filePath) return { persisted: false }\n\n const existing =\n (loadSettingsWithLegacyFallback({\n destination: update.destination as any,\n projectDir: options.projectDir,\n homeDir: options.homeDir,\n migrateToPrimary: true,\n }).settings as SettingsFileWithPermissions | null) ?? {}\n const permissions = getOrCreatePermissions(existing)\n\n try {\n switch (update.type) {\n case 'addRules':\n case 'replaceRules':\n case 'removeRules': {\n const key = behaviorKey(update.behavior)\n const current = uniqueStrings(permissions[key])\n\n if (update.type === 'addRules') {\n const merged = [...new Set([...current, ...update.rules])]\n permissions[key] = merged\n } else if (update.type === 'replaceRules') {\n permissions[key] = uniqueStrings(update.rules)\n } else {\n const toRemove = new Set(update.rules)\n permissions[key] = current.filter(rule => !toRemove.has(rule))\n }\n break\n }\n case 'addDirectories':\n case 'removeDirectories': {\n const current = uniqueStrings(permissions.additionalDirectories)\n if (update.type === 'addDirectories') {\n permissions.additionalDirectories = [\n ...new Set([...current, ...update.directories]),\n ]\n } else {\n const toRemove = new Set(update.directories)\n permissions.additionalDirectories = current.filter(\n dir => !toRemove.has(dir),\n )\n }\n break\n }\n default:\n return { persisted: false }\n }\n\n saveSettingsToPrimaryAndSyncLegacy({\n destination: update.destination as any,\n projectDir: options.projectDir,\n homeDir: options.homeDir,\n settings: existing as SettingsFile,\n syncLegacyIfExists: true,\n })\n return { persisted: true }\n } catch (error) {\n logError(error)\n return { persisted: false }\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAgCA,SAAS,cAAc,OAA0B;AAC/C,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,QAAM,MAAgB,CAAC;AACvB,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,QAAQ,OAAO;AACxB,QAAI,OAAO,SAAS,SAAU;AAC9B,QAAI,KAAK,IAAI,IAAI,EAAG;AACpB,SAAK,IAAI,IAAI;AACb,QAAI,KAAK,IAAI;AAAA,EACf;AACA,SAAO;AACT;AAEA,SAAS,yCAAyC,SAIhC;AAChB,QAAM,aAAa,0BAA0B;AAAA,IAC3C,aAAa,QAAQ;AAAA,IACrB,YAAY,QAAQ;AAAA,IACpB,SAAS,QAAQ;AAAA,EACnB,CAAC;AACD,SAAO,YAAY,WAAW;AAChC;AAEO,SAAS,kCAAkC,SAKxB;AACxB,QAAM,aAAa,SAAS,cAAc,OAAO;AACjD,QAAM,UAAU,SAAS;AACzB,QAAM,2BAA2B,SAAS,4BAA4B;AAEtE,QAAM,OAAO,mCAAmC;AAAA,IAC9C,kCACE,SAAS,oCAAoC;AAAA,EACjD,CAAC;AAED,QAAM,eAAkD;AAAA,IACtD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,eAAe,cAAc;AACtC,UAAM,WAAW,+BAA+B;AAAA,MAC9C;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,IACpB,CAAC,EAAE;AACH,UAAM,QAAQ,UAAU;AACxB,UAAM,QAAQ,cAAc,OAAO,KAAK;AACxC,UAAM,OAAO,cAAc,OAAO,IAAI;AACtC,UAAM,MAAM,cAAc,OAAO,GAAG;AACpC,UAAM,wBAAwB,cAAc,OAAO,qBAAqB;AAExE,QAAI,MAAM,SAAS,EAAG,MAAK,iBAAiB,WAAW,IAAI;AAC3D,QAAI,KAAK,SAAS,EAAG,MAAK,gBAAgB,WAAW,IAAI;AACzD,QAAI,IAAI,SAAS,EAAG,MAAK,eAAe,WAAW,IAAI;AAEvD,eAAW,OAAO,uBAAuB;AACvC,WAAK,6BAA6B,IAAI,KAAK;AAAA,QACzC,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,0BAA0B;AAC5B,QAAI;AACF,YAAM,MAAM,wBAAwB;AACpC,YAAM,QAAQ,MAAM,QAAQ,IAAI,YAAY,IAAI,IAAI,eAAe,CAAC;AACpE,YAAM,OAAO,MAAM,QAAS,IAAY,WAAW,IAC9C,IAAY,cACb,CAAC;AACL,YAAM,MAAM,MAAM,QAAS,IAAY,UAAU,IAC5C,IAAY,aACb,CAAC;AAEL,UAAI,MAAM,SAAS,GAAG;AACpB,cAAM,OAAO,KAAK,iBAAiB,iBAAiB,CAAC;AACrD,aAAK,iBAAiB,gBAAgB,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC;AAAA,MACxE;AACA,UAAI,KAAK,SAAS,GAAG;AACnB,cAAM,OAAO,KAAK,gBAAgB,iBAAiB,CAAC;AACpD,aAAK,gBAAgB,gBAAgB,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;AAAA,MACtE;AACA,UAAI,IAAI,SAAS,GAAG;AAClB,cAAM,OAAO,KAAK,eAAe,iBAAiB,CAAC;AACnD,aAAK,eAAe,gBAAgB,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,MAAM,GAAG,GAAG,CAAC,CAAC;AAAA,MACpE;AAAA,IACF,SAAS,OAAO;AACd,eAAS,KAAK;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBACP,UACsD;AACtD,QAAM,WAAW,SAAS;AAC1B,MAAI,YAAY,OAAO,aAAa,UAAU;AAC5C,WAAO;AAAA,EACT;AACA,WAAS,cAAc,CAAC;AACxB,SAAO,SAAS;AAClB;AAEA,SAAS,YACP,UAC2B;AAC3B,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEO,SAAS,kCAAkC,SAIvB;AACzB,QAAM,SAAS,QAAQ;AACvB,MAAI,CAAC,uCAAuC,OAAO,WAAW,GAAG;AAC/D,WAAO,EAAE,WAAW,MAAM;AAAA,EAC5B;AACA,MAAI,OAAO,SAAS,WAAW;AAC7B,WAAO,EAAE,WAAW,MAAM;AAAA,EAC5B;AAEA,QAAM,WAAW,yCAAyC;AAAA,IACxD,aAAa,OAAO;AAAA,IACpB,YAAY,QAAQ;AAAA,IACpB,SAAS,QAAQ;AAAA,EACnB,CAAC;AACD,MAAI,CAAC,SAAU,QAAO,EAAE,WAAW,MAAM;AAEzC,QAAM,WACH,+BAA+B;AAAA,IAC9B,aAAa,OAAO;AAAA,IACpB,YAAY,QAAQ;AAAA,IACpB,SAAS,QAAQ;AAAA,IACjB,kBAAkB;AAAA,EACpB,CAAC,EAAE,YAAmD,CAAC;AACzD,QAAM,cAAc,uBAAuB,QAAQ;AAEnD,MAAI;AACF,YAAQ,OAAO,MAAM;AAAA,MACnB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,eAAe;AAClB,cAAM,MAAM,YAAY,OAAO,QAAQ;AACvC,cAAM,UAAU,cAAc,YAAY,GAAG,CAAC;AAE9C,YAAI,OAAO,SAAS,YAAY;AAC9B,gBAAM,SAAS,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,SAAS,GAAG,OAAO,KAAK,CAAC,CAAC;AACzD,sBAAY,GAAG,IAAI;AAAA,QACrB,WAAW,OAAO,SAAS,gBAAgB;AACzC,sBAAY,GAAG,IAAI,cAAc,OAAO,KAAK;AAAA,QAC/C,OAAO;AACL,gBAAM,WAAW,IAAI,IAAI,OAAO,KAAK;AACrC,sBAAY,GAAG,IAAI,QAAQ,OAAO,UAAQ,CAAC,SAAS,IAAI,IAAI,CAAC;AAAA,QAC/D;AACA;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,qBAAqB;AACxB,cAAM,UAAU,cAAc,YAAY,qBAAqB;AAC/D,YAAI,OAAO,SAAS,kBAAkB;AACpC,sBAAY,wBAAwB;AAAA,YAClC,GAAG,oBAAI,IAAI,CAAC,GAAG,SAAS,GAAG,OAAO,WAAW,CAAC;AAAA,UAChD;AAAA,QACF,OAAO;AACL,gBAAM,WAAW,IAAI,IAAI,OAAO,WAAW;AAC3C,sBAAY,wBAAwB,QAAQ;AAAA,YAC1C,SAAO,CAAC,SAAS,IAAI,GAAG;AAAA,UAC1B;AAAA,QACF;AACA;AAAA,MACF;AAAA,MACA;AACE,eAAO,EAAE,WAAW,MAAM;AAAA,IAC9B;AAEA,uCAAmC;AAAA,MACjC,aAAa,OAAO;AAAA,MACpB,YAAY,QAAQ;AAAA,MACpB,SAAS,QAAQ;AAAA,MACjB,UAAU;AAAA,MACV,oBAAoB;AAAA,IACtB,CAAC;AACD,WAAO,EAAE,WAAW,KAAK;AAAA,EAC3B,SAAS,OAAO;AACd,aAAS,KAAK;AACd,WAAO,EAAE,WAAW,MAAM;AAAA,EAC5B;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|