@danya-ai/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +336 -0
- package/cli-acp.js +82 -0
- package/cli.js +105 -0
- package/dist/REPL-EYUOXCEC.js +42 -0
- package/dist/REPL-EYUOXCEC.js.map +7 -0
- package/dist/acp-S5WNCLMD.js +1372 -0
- package/dist/acp-S5WNCLMD.js.map +7 -0
- package/dist/agentsValidate-RQ2QDGNY.js +373 -0
- package/dist/agentsValidate-RQ2QDGNY.js.map +7 -0
- package/dist/ask-TX526UBD.js +129 -0
- package/dist/ask-TX526UBD.js.map +7 -0
- package/dist/autoUpdater-63RAZ24N.js +17 -0
- package/dist/autoUpdater-63RAZ24N.js.map +7 -0
- package/dist/chunk-2VQWLLDU.js +16 -0
- package/dist/chunk-2VQWLLDU.js.map +7 -0
- package/dist/chunk-4CLHMO4I.js +656 -0
- package/dist/chunk-4CLHMO4I.js.map +7 -0
- package/dist/chunk-4ZNNWJZU.js +5696 -0
- package/dist/chunk-4ZNNWJZU.js.map +7 -0
- package/dist/chunk-66EZC7Y7.js +149 -0
- package/dist/chunk-66EZC7Y7.js.map +7 -0
- package/dist/chunk-6EPQRP3S.js +96 -0
- package/dist/chunk-6EPQRP3S.js.map +7 -0
- package/dist/chunk-77IRSDFR.js +195 -0
- package/dist/chunk-77IRSDFR.js.map +7 -0
- package/dist/chunk-7RZNLBEK.js +136 -0
- package/dist/chunk-7RZNLBEK.js.map +7 -0
- package/dist/chunk-BNBV2FXC.js +19 -0
- package/dist/chunk-BNBV2FXC.js.map +7 -0
- package/dist/chunk-CQCREBDO.js +248 -0
- package/dist/chunk-CQCREBDO.js.map +7 -0
- package/dist/chunk-D77XS6TB.js +74 -0
- package/dist/chunk-D77XS6TB.js.map +7 -0
- package/dist/chunk-DHYBJN3V.js +474 -0
- package/dist/chunk-DHYBJN3V.js.map +7 -0
- package/dist/chunk-DLSLSLTR.js +842 -0
- package/dist/chunk-DLSLSLTR.js.map +7 -0
- package/dist/chunk-ELAE6Z4H.js +514 -0
- package/dist/chunk-ELAE6Z4H.js.map +7 -0
- package/dist/chunk-ELZQD7ZR.js +531 -0
- package/dist/chunk-ELZQD7ZR.js.map +7 -0
- package/dist/chunk-F6DEGMX6.js +31269 -0
- package/dist/chunk-F6DEGMX6.js.map +7 -0
- package/dist/chunk-GDF2AON2.js +124 -0
- package/dist/chunk-GDF2AON2.js.map +7 -0
- package/dist/chunk-H7BGBV4P.js +498 -0
- package/dist/chunk-H7BGBV4P.js.map +7 -0
- package/dist/chunk-HIIHGKXP.js +24 -0
- package/dist/chunk-HIIHGKXP.js.map +7 -0
- package/dist/chunk-HJCCXED7.js +17 -0
- package/dist/chunk-HJCCXED7.js.map +7 -0
- package/dist/chunk-IQ6VZB2Y.js +139 -0
- package/dist/chunk-IQ6VZB2Y.js.map +7 -0
- package/dist/chunk-J4D7AELD.js +518 -0
- package/dist/chunk-J4D7AELD.js.map +7 -0
- package/dist/chunk-JVGG2YQR.js +23 -0
- package/dist/chunk-JVGG2YQR.js.map +7 -0
- package/dist/chunk-LGEK2NV7.js +939 -0
- package/dist/chunk-LGEK2NV7.js.map +7 -0
- package/dist/chunk-LWXT5RGE.js +95 -0
- package/dist/chunk-LWXT5RGE.js.map +7 -0
- package/dist/chunk-M3TKNAUR.js +35 -0
- package/dist/chunk-M3TKNAUR.js.map +7 -0
- package/dist/chunk-MRFO7QO5.js +170 -0
- package/dist/chunk-MRFO7QO5.js.map +7 -0
- package/dist/chunk-MVN3DHQF.js +95 -0
- package/dist/chunk-MVN3DHQF.js.map +7 -0
- package/dist/chunk-O25PXGOC.js +772 -0
- package/dist/chunk-O25PXGOC.js.map +7 -0
- package/dist/chunk-OBGVKM3N.js +1618 -0
- package/dist/chunk-OBGVKM3N.js.map +7 -0
- package/dist/chunk-OV5HJXXQ.js +198 -0
- package/dist/chunk-OV5HJXXQ.js.map +7 -0
- package/dist/chunk-P5VWDMRD.js +249 -0
- package/dist/chunk-P5VWDMRD.js.map +7 -0
- package/dist/chunk-PDSAJX7G.js +49 -0
- package/dist/chunk-PDSAJX7G.js.map +7 -0
- package/dist/chunk-RHNEZOPO.js +739 -0
- package/dist/chunk-RHNEZOPO.js.map +7 -0
- package/dist/chunk-SQGAHZPM.js +3004 -0
- package/dist/chunk-SQGAHZPM.js.map +7 -0
- package/dist/chunk-U7Z4MXY4.js +21 -0
- package/dist/chunk-U7Z4MXY4.js.map +7 -0
- package/dist/chunk-UNCTVIS7.js +146 -0
- package/dist/chunk-UNCTVIS7.js.map +7 -0
- package/dist/chunk-VMEOI6MH.js +1103 -0
- package/dist/chunk-VMEOI6MH.js.map +7 -0
- package/dist/chunk-WAY3DKFO.js +47 -0
- package/dist/chunk-WAY3DKFO.js.map +7 -0
- package/dist/chunk-XEYEKVFT.js +24 -0
- package/dist/chunk-XEYEKVFT.js.map +7 -0
- package/dist/chunk-Y4BQ36T4.js +796 -0
- package/dist/chunk-Y4BQ36T4.js.map +7 -0
- package/dist/chunk-Y5LQPJWK.js +12 -0
- package/dist/chunk-Y5LQPJWK.js.map +7 -0
- package/dist/chunk-YIJWUNWF.js +1260 -0
- package/dist/chunk-YIJWUNWF.js.map +7 -0
- package/dist/chunk-YMIWYEZ7.js +34 -0
- package/dist/chunk-YMIWYEZ7.js.map +7 -0
- package/dist/cli-PQNZWJX4.js +3952 -0
- package/dist/cli-PQNZWJX4.js.map +7 -0
- package/dist/commands-HOBCZ3VQ.js +46 -0
- package/dist/commands-HOBCZ3VQ.js.map +7 -0
- package/dist/config-MLH7ZTFA.js +81 -0
- package/dist/config-MLH7ZTFA.js.map +7 -0
- package/dist/context-FZ6G4J63.js +30 -0
- package/dist/context-FZ6G4J63.js.map +7 -0
- package/dist/costTracker-5WKZXN5S.js +19 -0
- package/dist/costTracker-5WKZXN5S.js.map +7 -0
- package/dist/customCommands-EB4MMZSS.js +25 -0
- package/dist/customCommands-EB4MMZSS.js.map +7 -0
- package/dist/env-VMEIP4EW.js +28 -0
- package/dist/env-VMEIP4EW.js.map +7 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +7 -0
- package/dist/kodeAgentSessionId-WUT74FSH.js +16 -0
- package/dist/kodeAgentSessionId-WUT74FSH.js.map +7 -0
- package/dist/kodeAgentSessionLoad-KR4JSD6D.js +21 -0
- package/dist/kodeAgentSessionLoad-KR4JSD6D.js.map +7 -0
- package/dist/kodeAgentSessionResume-BCD6UV74.js +18 -0
- package/dist/kodeAgentSessionResume-BCD6UV74.js.map +7 -0
- package/dist/kodeAgentStreamJson-EDHHWNNX.js +15 -0
- package/dist/kodeAgentStreamJson-EDHHWNNX.js.map +7 -0
- package/dist/kodeAgentStreamJsonSession-G4RBNZRN.js +133 -0
- package/dist/kodeAgentStreamJsonSession-G4RBNZRN.js.map +7 -0
- package/dist/kodeAgentStructuredStdio-UA5P5UNU.js +11 -0
- package/dist/kodeAgentStructuredStdio-UA5P5UNU.js.map +7 -0
- package/dist/kodeHooks-EHM6GSIQ.js +37 -0
- package/dist/kodeHooks-EHM6GSIQ.js.map +7 -0
- package/dist/llm-SJXCV7DA.js +3138 -0
- package/dist/llm-SJXCV7DA.js.map +7 -0
- package/dist/llmLazy-2QYJVD6K.js +15 -0
- package/dist/llmLazy-2QYJVD6K.js.map +7 -0
- package/dist/loader-LJX77EFL.js +28 -0
- package/dist/loader-LJX77EFL.js.map +7 -0
- package/dist/mcp-DOROSLPN.js +49 -0
- package/dist/mcp-DOROSLPN.js.map +7 -0
- package/dist/mentionProcessor-5UZRHCGH.js +215 -0
- package/dist/mentionProcessor-5UZRHCGH.js.map +7 -0
- package/dist/messages-N5KBI53P.js +65 -0
- package/dist/messages-N5KBI53P.js.map +7 -0
- package/dist/model-HPLBR53R.js +30 -0
- package/dist/model-HPLBR53R.js.map +7 -0
- package/dist/openai-YP4OJYKF.js +29 -0
- package/dist/openai-YP4OJYKF.js.map +7 -0
- package/dist/outputStyles-NNALI5D7.js +28 -0
- package/dist/outputStyles-NNALI5D7.js.map +7 -0
- package/dist/package.json +4 -0
- package/dist/pluginRuntime-JYYI5BSQ.js +220 -0
- package/dist/pluginRuntime-JYYI5BSQ.js.map +7 -0
- package/dist/pluginValidation-JWUFPZUE.js +17 -0
- package/dist/pluginValidation-JWUFPZUE.js.map +7 -0
- package/dist/prompts-B2SS7CWI.js +50 -0
- package/dist/prompts-B2SS7CWI.js.map +7 -0
- package/dist/query-HIK457UU.js +50 -0
- package/dist/query-HIK457UU.js.map +7 -0
- package/dist/responsesStreaming-L2BSN37C.js +10 -0
- package/dist/responsesStreaming-L2BSN37C.js.map +7 -0
- package/dist/ripgrep-GCKI4UTL.js +17 -0
- package/dist/ripgrep-GCKI4UTL.js.map +7 -0
- package/dist/skillMarketplace-PCTUUX46.js +37 -0
- package/dist/skillMarketplace-PCTUUX46.js.map +7 -0
- package/dist/state-XJICGOUA.js +18 -0
- package/dist/state-XJICGOUA.js.map +7 -0
- package/dist/theme-DP7O4SGH.js +14 -0
- package/dist/theme-DP7O4SGH.js.map +7 -0
- package/dist/toolPermissionContext-DHAGUPEW.js +17 -0
- package/dist/toolPermissionContext-DHAGUPEW.js.map +7 -0
- package/dist/toolPermissionSettings-PT65MQIQ.js +18 -0
- package/dist/toolPermissionSettings-PT65MQIQ.js.map +7 -0
- package/dist/tools-BHW37PCF.js +47 -0
- package/dist/tools-BHW37PCF.js.map +7 -0
- package/dist/userInput-XDRYT5TI.js +316 -0
- package/dist/userInput-XDRYT5TI.js.map +7 -0
- package/dist/uuid-QUYJMIUV.js +9 -0
- package/dist/uuid-QUYJMIUV.js.map +7 -0
- package/dist/yoga.wasm +0 -0
- package/package.json +115 -0
- package/scripts/binary-utils.cjs +62 -0
- package/scripts/cli-acp-wrapper.cjs +82 -0
- package/scripts/cli-wrapper.cjs +105 -0
- package/scripts/postinstall.js +144 -0
- package/yoga.wasm +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/tools/game/ScoreReview/prompt.ts", "../src/tools/game/ScoreReview/scoringEngine.ts", "../src/tools/game/ScoreReview/checks/universal.ts", "../src/tools/game/ScoreReview/checks/unity.ts", "../src/tools/game/ScoreReview/checks/go.ts", "../src/tools/game/ScoreReview/checks/unreal.ts", "../src/tools/game/ScoreReview/checks/godot.ts", "../src/tools/game/ScoreReview/mechanicalChecks.ts", "../src/tools/game/ScoreReview/qualityRatchet.ts", "../src/tools/game/ScoreReview/pushApproved.ts", "../src/tools/game/ScoreReview/reportFormatter.ts", "../src/tools/game/ScoreReview/ScoreReview.tsx", "../src/tools/game/ArchitectureGuard/prompt.ts", "../src/tools/game/ArchitectureGuard/importParser.ts", "../src/tools/game/ArchitectureGuard/layerRules.ts", "../src/tools/game/ArchitectureGuard/ArchitectureGuard.tsx", "../src/tools/game/KnowledgeSediment/prompt.ts", "../src/tools/game/KnowledgeSediment/KnowledgeSediment.tsx", "../src/tools/game/GateChain/prompt.ts", "../src/tools/game/GateChain/GateChain.tsx", "../src/tools/game/ProtoCompile/prompt.ts", "../src/tools/game/ProtoCompile/ProtoCompile.tsx", "../src/tools/game/ConfigGenerate/prompt.ts", "../src/tools/game/ConfigGenerate/ConfigGenerate.tsx", "../src/tools/game/CSharpSyntaxCheck/prompt.ts", "../src/tools/game/CSharpSyntaxCheck/parser.ts", "../src/tools/game/CSharpSyntaxCheck/CSharpSyntaxCheck.tsx", "../src/tools/game/UnityBuild/prompt.ts", "../src/tools/game/UnityBuild/parser.ts", "../src/tools/game/UnityBuild/UnityBuild.tsx", "../src/tools/game/UnrealBuild/prompt.ts", "../src/tools/game/UnrealBuild/parser.ts", "../src/tools/game/UnrealBuild/UnrealBuild.tsx", "../src/tools/game/GodotBuild/prompt.ts", "../src/tools/game/GodotBuild/GodotBuild.tsx", "../src/tools/game/OrmGenerate/prompt.ts", "../src/tools/game/OrmGenerate/OrmGenerate.tsx", "../src/tools/game/AssetCheck/prompt.ts", "../src/tools/game/AssetCheck/parsers/unity.ts", "../src/tools/game/AssetCheck/parsers/godot.ts", "../src/tools/game/AssetCheck/AssetCheck.tsx", "../src/tools/game/GameServerBuild/prompt.ts", "../src/tools/game/GameServerBuild/parser.ts", "../src/tools/game/GameServerBuild/GameServerBuild.tsx", "../src/tools/index.ts", "../src/tools/ai/AskExpertModelTool/AskExpertModelTool.tsx", "../src/utils/session/expertChatStorage.ts", "../src/tools/system/TaskOutputTool/TaskOutputTool.tsx", "../src/utils/session/backgroundTasks.ts", "../src/utils/tooling/toolOutputDisplay.ts", "../src/tools/system/TaskOutputTool/prompt.ts", "../src/tools/mcp/ListMcpResourcesTool/ListMcpResourcesTool.tsx", "../src/tools/mcp/ListMcpResourcesTool/prompt.ts", "../src/tools/search/LspTool/LspTool.tsx", "../src/tools/search/LspTool/prompt.ts", "../src/tools/mcp/ReadMcpResourceTool/ReadMcpResourceTool.tsx", "../src/tools/mcp/ReadMcpResourceTool/prompt.ts", "../src/tools/agent/TaskTool/TaskTool.tsx", "../src/utils/agent/transcripts.ts", "../src/tools/agent/TaskTool/prompt.ts", "../src/tools/agent/TaskTool/constants.ts", "../src/tools/game/index.ts"],
|
|
4
|
+
"sourcesContent": ["export const TOOL_NAME = 'ScoreReview'\n\nexport const DESCRIPTION = `Score-based code review with 100-point scoring system and quality ratchet.\n\nScoring: 100 points starting, CRITICAL=-30, HIGH=-10, MEDIUM=-3.\nPass: score >= 80 AND zero CRITICAL issues.\nQuality ratchet: each round's score must >= previous round.\n\nChecks architecture violations, coding conventions, logic issues, and security problems.\nEngine-specific checks loaded based on detected game engine.`\n", "/**\n * 100-point scoring engine. Hardcoded, non-configurable.\n */\n\nexport type ReviewIssue = {\n id: string\n phase: 'mechanical' | 'ai_judgment'\n category: 'architecture' | 'convention' | 'logic' | 'security' | 'performance'\n severity: 'CRITICAL' | 'HIGH' | 'MEDIUM'\n file_path: string\n line?: number\n message: string\n suggestion?: string\n deduction: number\n}\n\nexport type ReviewScore = {\n score: number\n passed: boolean\n critical_count: number\n high_count: number\n medium_count: number\n total_deduction: number\n}\n\nconst DEDUCTIONS = { CRITICAL: 30, HIGH: 10, MEDIUM: 3 } as const\nconst PASS_THRESHOLD = 80\n\nexport function calculateScore(issues: ReviewIssue[]): ReviewScore {\n let score = 100\n let critical_count = 0\n let high_count = 0\n let medium_count = 0\n\n for (const issue of issues) {\n const deduction = DEDUCTIONS[issue.severity]\n score -= deduction\n switch (issue.severity) {\n case 'CRITICAL': critical_count++; break\n case 'HIGH': high_count++; break\n case 'MEDIUM': medium_count++; break\n }\n }\n\n score = Math.max(score, 0)\n\n return {\n score,\n passed: score >= PASS_THRESHOLD && critical_count === 0,\n critical_count,\n high_count,\n medium_count,\n total_deduction: 100 - score,\n }\n}\n\nexport function assignDeduction(severity: 'CRITICAL' | 'HIGH' | 'MEDIUM'): number {\n return DEDUCTIONS[severity]\n}\n", "import type { MechanicalCheck } from '../mechanicalChecks'\n\nexport const UNIVERSAL_CHECKS: MechanicalCheck[] = [\n {\n id: 'U-01', severity: 'CRITICAL', category: 'architecture',\n pattern: null, // Handled by ArchitectureGuard forbidden zone check\n fileFilter: /.*/,\n message: 'Forbidden zone edit detected',\n suggestion: 'Edit the source file and regenerate, or use a WORKAROUND',\n },\n {\n id: 'U-02', severity: 'CRITICAL', category: 'security',\n pattern: /(password|api[_-]?key|secret|token)\\s*[:=]\\s*[\"'][a-zA-Z0-9]/i,\n fileFilter: /\\.(ts|tsx|js|go|cs|cpp|h|gd|py)$/,\n excludeFilter: /\\.(test|spec|mock|fixture)\\./,\n message: 'Possible hardcoded secret/credential',\n suggestion: 'Use environment variables or a secrets manager',\n },\n {\n id: 'U-03', severity: 'MEDIUM', category: 'convention',\n pattern: /\\b(TODO|FIXME|HACK|XXX)\\b:/,\n fileFilter: /\\.(ts|tsx|js|go|cs|cpp|h|gd|py)$/,\n excludeFilter: /\\.(test|spec)\\./,\n message: 'Debug/temp marker left in code',\n suggestion: 'Resolve or remove before committing',\n },\n {\n id: 'U-04', severity: 'MEDIUM', category: 'convention',\n pattern: null, // Checked at file level (line count > 500 changed)\n fileFilter: /.*/,\n message: 'Large file change (>500 lines)',\n suggestion: 'Consider decomposing into smaller changes',\n },\n]\n", "import type { MechanicalCheck } from '../mechanicalChecks'\n\nexport const UNITY_CHECKS: MechanicalCheck[] = [\n {\n id: 'UC-01', severity: 'HIGH', category: 'convention',\n pattern: /\\bDebug\\.(Log|LogWarning|LogError)\\s*\\(/,\n fileFilter: /\\.cs$/,\n excludeFilter: /(Editor|Test)\\//,\n message: 'Debug.Log used instead of project logger',\n suggestion: 'Use MLog.Info?.Log() or project-specific logging wrapper',\n },\n {\n id: 'UC-02', severity: 'HIGH', category: 'convention',\n pattern: /async\\s+Task[^A-Za-z]/,\n fileFilter: /\\.cs$/,\n message: 'async Task used instead of async UniTask',\n suggestion: 'Replace System.Threading.Tasks.Task with UniTask',\n },\n {\n id: 'UC-03', severity: 'HIGH', category: 'convention',\n pattern: /Task\\.Delay/,\n fileFilter: /\\.cs$/,\n message: 'Task.Delay used instead of UniTask.Delay',\n suggestion: 'Replace Task.Delay with UniTask.Delay',\n },\n {\n id: 'UC-04', severity: 'HIGH', category: 'convention',\n pattern: /\\bDestroy\\s*\\(/,\n fileFilter: /\\.cs$/,\n excludeFilter: /(Editor|Test)\\//,\n message: 'Destroy() used on potentially pooled object',\n suggestion: 'Use ObjectPoolUtility.Instance.Free() for pooled objects',\n },\n {\n id: 'UC-05', severity: 'MEDIUM', category: 'performance',\n pattern: /new\\s+GameObject\\s*\\(/,\n fileFilter: /\\.cs$/,\n excludeFilter: /(Editor|Test)\\//,\n message: 'new GameObject() \u2014 consider object pool for frequent use',\n suggestion: 'Use ObjectPoolUtility.Instance.LoadGameObject() for high-frequency creation',\n },\n {\n id: 'UC-06', severity: 'HIGH', category: 'convention',\n pattern: null, // Special: check 3rd/ files for missing [CUSTOM_MOD]\n fileFilter: /3rd\\//,\n message: 'Third-party code modified without [CUSTOM_MOD] marker',\n suggestion: 'Add // [CUSTOM_MOD] YYYY-MM-DD: reason',\n },\n {\n id: 'UC-07', severity: 'HIGH', category: 'convention',\n pattern: /using\\s+System\\.Threading\\.Tasks/,\n fileFilter: /\\.cs$/,\n message: 'System.Threading.Tasks imported \u2014 use UniTask instead',\n suggestion: 'Remove using System.Threading.Tasks, use Cysharp.Threading.Tasks',\n },\n {\n id: 'UC-08', severity: 'CRITICAL', category: 'architecture',\n pattern: /using\\s+FL\\.Gameplay/,\n fileFilter: /Scripts\\/Framework\\//,\n message: 'Layer violation: Framework importing Gameplay',\n suggestion: 'Framework layer must not reference Gameplay. Use events or interfaces.',\n },\n {\n id: 'UC-09', severity: 'HIGH', category: 'architecture',\n pattern: /using\\s+FL\\.Renderer/,\n fileFilter: /Scripts\\/Gameplay\\//,\n message: 'Layer violation: Gameplay importing Renderer',\n suggestion: 'Gameplay should not reference Renderer directly.',\n },\n]\n", "import type { MechanicalCheck } from '../mechanicalChecks'\n\nexport const GO_CHECKS: MechanicalCheck[] = [\n {\n id: 'GO-01', severity: 'HIGH', category: 'convention',\n pattern: /fmt\\.Errorf\\([^)]*%v/,\n fileFilter: /\\.go$/,\n excludeFilter: /_test\\.go$/,\n message: 'fmt.Errorf uses %v instead of %w for error wrapping',\n suggestion: 'Replace %v with %w to enable errors.Is/As unwrapping',\n },\n {\n id: 'GO-02', severity: 'HIGH', category: 'convention',\n pattern: /_\\s*=\\s*err\\b/,\n fileFilter: /\\.go$/,\n excludeFilter: /_test\\.go$/,\n message: 'Error ignored with _ = err',\n suggestion: 'Handle the error or use an explicit //nolint:errcheck comment',\n },\n {\n id: 'GO-03', severity: 'HIGH', category: 'convention',\n pattern: /\\bgo\\s+func\\s*\\(/,\n fileFilter: /\\.go$/,\n excludeFilter: /(safego|_test)\\.go$/,\n message: 'Bare go func() \u2014 use safego.Go for panic recovery',\n suggestion: 'Replace go func() { ... }() with safego.Go(func() { ... })',\n },\n {\n id: 'GO-04', severity: 'HIGH', category: 'convention',\n pattern: /\"sync\\/atomic\"/,\n fileFilter: /\\.go$/,\n message: 'sync/atomic used instead of go.uber.org/atomic',\n suggestion: 'Use go.uber.org/atomic for safer atomic operations',\n },\n {\n id: 'GO-05', severity: 'HIGH', category: 'convention',\n pattern: /\"base\\/glog\"/,\n fileFilter: /\\.go$/,\n excludeFilter: /base\\//,\n message: 'Direct base/glog import \u2014 use common/log instead',\n suggestion: 'Import common/log and use log.Infof, log.Errorf, etc.',\n },\n {\n id: 'GO-06', severity: 'CRITICAL', category: 'architecture',\n pattern: /\"go\\.mongodb\\.org/,\n fileFilter: /\\.go$/,\n excludeFilter: /db_server/,\n message: 'Direct MongoDB import outside db_server',\n suggestion: 'All DB operations must go through db_server RPC',\n },\n {\n id: 'GO-07', severity: 'CRITICAL', category: 'architecture',\n pattern: null, // Special: check cross-service internal imports\n fileFilter: /servers\\/.*\\/internal\\//,\n message: 'Cross-service internal package import',\n suggestion: 'Services should communicate via RPC, not internal imports',\n },\n {\n id: 'GO-08', severity: 'CRITICAL', category: 'architecture',\n pattern: /\".*servers\\//,\n fileFilter: /common\\//,\n message: 'common/ importing servers/ \u2014 wrong dependency direction',\n suggestion: 'common/ must not import from servers/. Move shared code to common/',\n },\n {\n id: 'GO-09', severity: 'HIGH', category: 'convention',\n pattern: /\\btime\\.Now\\(\\)/,\n fileFilter: /\\.go$/,\n excludeFilter: /_test\\.go$/,\n message: 'time.Now() used \u2014 consider mtime.NowTimeWithOffset()',\n suggestion: 'Use mtime.NowTimeWithOffset() for server-consistent time',\n },\n]\n", "import type { MechanicalCheck } from '../mechanicalChecks'\n\nexport const UNREAL_CHECKS: MechanicalCheck[] = [\n {\n id: 'UE-01', severity: 'HIGH', category: 'convention',\n pattern: /\\bnew\\s+[A-Z]\\w+[^(]*;/,\n fileFilter: /\\.(cpp|h)$/,\n message: 'Raw new on potential UObject \u2014 use NewObject<T>()',\n suggestion: 'Use NewObject<T>(), CreateDefaultSubobject<T>(), or SpawnActor<T>()',\n },\n {\n id: 'UE-02', severity: 'HIGH', category: 'convention',\n pattern: /\\bU[A-Z]\\w+\\s*\\*/,\n fileFilter: /\\.(h|hpp)$/,\n message: 'UObject* without UPROPERTY() may be GC-collected',\n suggestion: 'Mark UObject references with UPROPERTY() to prevent GC',\n },\n {\n id: 'UE-03', severity: 'HIGH', category: 'convention',\n pattern: /\\b(printf|std::cout|OutputDebugString)\\b/,\n fileFilter: /\\.(cpp|h)$/,\n message: 'Raw print used instead of UE_LOG',\n suggestion: 'Use UE_LOG(LogGame, Warning, TEXT(\"message\"))',\n },\n {\n id: 'UE-04', severity: 'HIGH', category: 'convention',\n pattern: /\\b(std::thread|std::async)\\b/,\n fileFilter: /\\.(cpp|h)$/,\n message: 'std::thread/async used instead of FRunnable/AsyncTask',\n suggestion: 'Use FRunnable, FAsyncTask, or AsyncTask(ENamedThreads::...)',\n },\n {\n id: 'UE-05', severity: 'CRITICAL', category: 'convention',\n pattern: /class\\s+\\w+\\s*:\\s*public\\s+(AActor|UActorComponent|UObject)/,\n fileFilter: /\\.(h|hpp)$/,\n message: 'Reflected class may be missing GENERATED_BODY()',\n suggestion: 'Ensure GENERATED_BODY() is present inside UCLASS/USTRUCT',\n },\n {\n id: 'UE-06', severity: 'MEDIUM', category: 'convention',\n pattern: /\\bdelete\\s+/,\n fileFilter: /\\.(cpp|h)$/,\n message: 'Raw delete \u2014 UObjects are GC-managed',\n suggestion: 'Let GC handle UObject cleanup. Use TSharedPtr for non-UObjects.',\n },\n]\n", "import type { MechanicalCheck } from '../mechanicalChecks'\n\nexport const GODOT_CHECKS: MechanicalCheck[] = [\n {\n id: 'GD-01', severity: 'MEDIUM', category: 'convention',\n pattern: /func\\s+\\w+\\([^:)]+\\)\\s*:/,\n fileFilter: /\\.gd$/,\n message: 'Missing type hints on function parameters',\n suggestion: 'Add type hints: func method(param: Type) -> ReturnType:',\n },\n {\n id: 'GD-02', severity: 'MEDIUM', category: 'convention',\n pattern: /\\bprint\\s*\\(/,\n fileFilter: /\\.gd$/,\n excludeFilter: /debug\\//,\n message: 'print() left in non-debug code',\n suggestion: 'Remove print() or use a debug logger',\n },\n {\n id: 'GD-03', severity: 'HIGH', category: 'convention',\n pattern: /\\byield\\b/,\n fileFilter: /\\.gd$/,\n message: 'yield is deprecated in Godot 4 \u2014 use await',\n suggestion: 'Replace yield with await',\n },\n {\n id: 'GD-04', severity: 'HIGH', category: 'performance',\n pattern: /(velocity|move_and_slide)/,\n fileFilter: /\\.gd$/,\n message: 'Movement logic possibly in _process instead of _physics_process',\n suggestion: 'Move physics-related code to _physics_process for frame-rate independence',\n },\n {\n id: 'GD-05', severity: 'MEDIUM', category: 'convention',\n pattern: null, // Special: check for missing class_name in shared scripts\n fileFilter: /(component|shared|util)\\//,\n message: 'Missing class_name on reusable script',\n suggestion: 'Add class_name at top of script for global type registration',\n },\n]\n", "import { readFileSync } from 'fs'\nimport type { ReviewIssue } from './scoringEngine'\nimport { assignDeduction } from './scoringEngine'\nimport { UNIVERSAL_CHECKS } from './checks/universal'\nimport { UNITY_CHECKS } from './checks/unity'\nimport { GO_CHECKS } from './checks/go'\nimport { UNREAL_CHECKS } from './checks/unreal'\nimport { GODOT_CHECKS } from './checks/godot'\nimport type { EngineType, ServerLanguage } from '../../../engine/detect'\n\nexport type MechanicalCheck = {\n id: string\n severity: 'CRITICAL' | 'HIGH' | 'MEDIUM'\n category: 'architecture' | 'convention' | 'logic' | 'security' | 'performance'\n pattern: RegExp | null\n fileFilter: RegExp\n excludeFilter?: RegExp\n message: string\n suggestion?: string\n}\n\nexport function getChecksForEngine(\n engine: EngineType,\n serverLanguage: ServerLanguage,\n): MechanicalCheck[] {\n const checks: MechanicalCheck[] = [\n ...UNIVERSAL_CHECKS.filter(c => c.pattern !== null) as MechanicalCheck[],\n ]\n\n switch (engine) {\n case 'unity':\n checks.push(...UNITY_CHECKS.filter(c => c.pattern !== null) as MechanicalCheck[])\n break\n case 'unreal':\n checks.push(...UNREAL_CHECKS.filter(c => c.pattern !== null) as MechanicalCheck[])\n break\n case 'godot':\n checks.push(...GODOT_CHECKS.filter(c => c.pattern !== null) as MechanicalCheck[])\n break\n }\n\n if (serverLanguage === 'go') {\n checks.push(...GO_CHECKS.filter(c => c.pattern !== null) as MechanicalCheck[])\n }\n\n return checks\n}\n\nexport function runMechanicalChecks(\n changedFiles: Array<{ path: string; content: string }>,\n engine: EngineType,\n serverLanguage: ServerLanguage,\n): ReviewIssue[] {\n const checks = getChecksForEngine(engine, serverLanguage)\n const issues: ReviewIssue[] = []\n\n for (const file of changedFiles) {\n for (const check of checks) {\n // File filter\n if (!check.fileFilter.test(file.path)) continue\n if (check.excludeFilter?.test(file.path)) continue\n\n // Pattern match\n if (!check.pattern) continue\n\n const lines = file.content.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n if (check.pattern.test(lines[i]!)) {\n issues.push({\n id: check.id,\n phase: 'mechanical',\n category: check.category,\n severity: check.severity,\n file_path: file.path,\n line: i + 1,\n message: check.message,\n suggestion: check.suggestion,\n deduction: assignDeduction(check.severity),\n })\n }\n }\n }\n }\n\n return issues\n}\n", "export type RatchetResult = {\n passed: boolean\n message?: string\n}\n\nexport function checkRatchet(\n currentScore: number,\n previousScore: number | null,\n): RatchetResult {\n if (previousScore === null) return { passed: true }\n if (currentScore >= previousScore) return { passed: true }\n return {\n passed: false,\n message: `Quality regression: ${currentScore} < ${previousScore}. Fix introduced issues and re-review.`,\n }\n}\n", "import { existsSync, readFileSync, writeFileSync, unlinkSync, mkdirSync } from 'fs'\nimport { join, dirname } from 'path'\n\nconst MARKER_FILENAME = 'push-approved'\n\nexport type PushApprovedData = {\n timestamp: string\n branch: string\n score: number\n reviewer: string\n}\n\nfunction getMarkerPath(cwd: string): string {\n return join(cwd, '.danya', MARKER_FILENAME)\n}\n\nexport function createPushApprovedMarker(cwd: string, data: PushApprovedData): void {\n const path = getMarkerPath(cwd)\n mkdirSync(dirname(path), { recursive: true })\n writeFileSync(path, JSON.stringify(data, null, 2), 'utf-8')\n}\n\nexport function consumePushApprovedMarker(cwd: string): PushApprovedData | null {\n const path = getMarkerPath(cwd)\n if (!existsSync(path)) return null\n\n try {\n const content = readFileSync(path, 'utf-8')\n const data = JSON.parse(content) as PushApprovedData\n unlinkSync(path) // one-time use \u2014 delete after reading\n return data\n } catch {\n return null\n }\n}\n\nexport function hasPushApprovedMarker(cwd: string): boolean {\n return existsSync(getMarkerPath(cwd))\n}\n", "import type { ReviewIssue, ReviewScore } from './scoringEngine'\n\nexport type ReviewReport = {\n score: ReviewScore\n issues: ReviewIssue[]\n change_summary: {\n files_changed: number\n lines_added: number\n lines_removed: number\n modules: string[]\n }\n base_ref: string\n push_approved: boolean\n}\n\nexport function formatHumanReport(report: ReviewReport): string {\n const status = report.score.passed ? 'PASS' : 'FAIL'\n const lines: string[] = []\n\n lines.push('\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550')\n lines.push(` CODE REVIEW: ${status} Score: ${report.score.score}/100`)\n lines.push('\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550')\n lines.push(` Branch: ... \u2192 ${report.base_ref}`)\n lines.push(` Changed: ${report.change_summary.files_changed} files, +${report.change_summary.lines_added}/-${report.change_summary.lines_removed} lines`)\n if (report.change_summary.modules.length > 0) {\n lines.push(` Modules: ${report.change_summary.modules.join(', ')}`)\n }\n lines.push('\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550')\n\n // Group by category\n const byCategory = new Map<string, ReviewIssue[]>()\n for (const issue of report.issues) {\n const list = byCategory.get(issue.category) ?? []\n list.push(issue)\n byCategory.set(issue.category, list)\n }\n\n for (const [category, issues] of byCategory) {\n lines.push('')\n lines.push(`\u2500\u2500\u2500 ${capitalize(category)} (${issues.length} issue${issues.length !== 1 ? 's' : ''}) \u2500\u2500\u2500`)\n for (const issue of issues) {\n const loc = issue.line ? `${issue.file_path}:${issue.line}` : issue.file_path\n lines.push(` [${issue.severity}] ${issue.id} ${loc}`)\n lines.push(` ${issue.message}`)\n if (issue.suggestion) {\n lines.push(` Fix: ${issue.suggestion}`)\n }\n }\n }\n\n if (report.issues.length === 0) {\n lines.push('')\n lines.push(' \u2705 No issues found')\n }\n\n lines.push('')\n lines.push('\u2500\u2500\u2500 Scoring \u2500\u2500\u2500')\n lines.push(` CRITICAL: ${report.score.critical_count} (\u00D7-30 = -${report.score.critical_count * 30})`)\n lines.push(` HIGH: ${report.score.high_count} (\u00D7-10 = -${report.score.high_count * 10})`)\n lines.push(` MEDIUM: ${report.score.medium_count} (\u00D7-3 = -${report.score.medium_count * 3})`)\n lines.push(` Deduction: -${report.score.total_deduction}`)\n lines.push(` \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`)\n lines.push(` Score: ${report.score.score}/100`)\n\n lines.push('')\n lines.push('\u2500\u2500\u2500 Verdict \u2500\u2500\u2500')\n if (report.score.passed) {\n lines.push(` \u2705 PASS (${report.score.score}/100) \u2014 push-approved ${report.push_approved ? 'created' : 'not created'}`)\n } else {\n if (report.score.critical_count > 0) {\n lines.push(` \u274C FAIL (${report.score.score}/100) \u2014 ${report.score.critical_count} CRITICAL issue(s) (auto-fail)`)\n } else {\n lines.push(` \u274C FAIL (${report.score.score}/100) \u2014 below threshold (80)`)\n }\n }\n lines.push('\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550')\n\n return lines.join('\\n')\n}\n\nexport function formatJsonReport(report: ReviewReport): string {\n return JSON.stringify(report, null, 2)\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n", "import { z } from 'zod'\nimport { readFileSync, existsSync } from 'fs'\nimport { execSync } from 'child_process'\nimport { join } from 'path'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { TOOL_NAME, DESCRIPTION } from './prompt'\nimport { calculateScore, type ReviewIssue } from './scoringEngine'\nimport { runMechanicalChecks } from './mechanicalChecks'\nimport { checkRatchet } from './qualityRatchet'\nimport { createPushApprovedMarker } from './pushApproved'\nimport { formatHumanReport, type ReviewReport } from './reportFormatter'\nimport { detectProject } from '../../../engine/detect'\nimport { getCwd } from '@utils/state'\n\nconst inputSchema = z.strictObject({\n files: z.array(z.string()).optional()\n .describe('Files to review. Default: all changed files from git diff'),\n base_ref: z.string().optional()\n .describe('Git ref to diff against. Default: HEAD~1'),\n previous_score: z.number().optional()\n .describe('Previous review score for quality ratchet enforcement'),\n mode: z.enum(['quick', 'standard', 'full']).optional()\n .describe('Review mode. quick=mechanical only, standard=mechanical+AI, full=all+harness. Default: standard'),\n})\n\ntype Output = ReviewReport\n\nfunction getChangedFiles(cwd: string, baseRef: string): string[] {\n try {\n const output = execSync(`git diff --name-only ${baseRef} 2>/dev/null || git diff --name-only HEAD~1 2>/dev/null || git diff --name-only`, {\n cwd, encoding: 'utf-8', timeout: 10000,\n })\n return output.split('\\n').filter(f => f.trim().length > 0)\n } catch {\n return []\n }\n}\n\nfunction getDiffStats(cwd: string, baseRef: string): { added: number; removed: number } {\n try {\n const output = execSync(`git diff --shortstat ${baseRef} 2>/dev/null`, {\n cwd, encoding: 'utf-8', timeout: 10000,\n })\n const addMatch = output.match(/(\\d+) insertion/)\n const delMatch = output.match(/(\\d+) deletion/)\n return {\n added: addMatch ? parseInt(addMatch[1]!, 10) : 0,\n removed: delMatch ? parseInt(delMatch[1]!, 10) : 0,\n }\n } catch {\n return { added: 0, removed: 0 }\n }\n}\n\nfunction getBranchName(cwd: string): string {\n try {\n return execSync('git branch --show-current 2>/dev/null', { cwd, encoding: 'utf-8' }).trim() || 'unknown'\n } catch {\n return 'unknown'\n }\n}\n\nfunction readFileContents(cwd: string, files: string[]): Array<{ path: string; content: string }> {\n return files.map(f => {\n const fullPath = f.startsWith('/') || f.includes(':') ? f : join(cwd, f)\n try {\n return { path: f, content: existsSync(fullPath) ? readFileSync(fullPath, 'utf-8') : '' }\n } catch {\n return { path: f, content: '' }\n }\n }).filter(f => f.content.length > 0)\n}\n\nexport const ScoreReviewTool = {\n name: TOOL_NAME,\n description: DESCRIPTION,\n searchHint: 'score-based code review with quality ratchet',\n inputSchema,\n\n async isEnabled() { return true },\n isReadOnly() { return false }, // writes push-approved marker\n isConcurrencySafe() { return false },\n needsPermissions() { return false },\n\n async prompt() { return DESCRIPTION },\n\n renderToolUseMessage({ files, mode }: z.infer<typeof inputSchema>) {\n return `Running code review (${mode ?? 'standard'})${files ? `: ${files.length} files` : ''}`\n },\n\n renderResultForAssistant(output: Output): string {\n return formatHumanReport(output)\n },\n\n async *call(\n { files, base_ref = 'HEAD~1', previous_score, mode = 'standard' }: z.infer<typeof inputSchema>,\n context: ToolUseContext,\n ) {\n const cwd = getCwd()\n const detection = detectProject(cwd)\n const changedFiles = files ?? getChangedFiles(cwd, base_ref)\n\n if (changedFiles.length === 0) {\n const emptyReport: Output = {\n score: { score: 100, passed: true, critical_count: 0, high_count: 0, medium_count: 0, total_deduction: 0 },\n issues: [],\n change_summary: { files_changed: 0, lines_added: 0, lines_removed: 0, modules: [] },\n base_ref,\n push_approved: true,\n }\n yield { type: 'result' as const, data: emptyReport, resultForAssistant: formatHumanReport(emptyReport) }\n return\n }\n\n // Read file contents for mechanical checks\n const fileContents = readFileContents(cwd, changedFiles)\n const allIssues: ReviewIssue[] = []\n\n // Phase 2: Mechanical checks\n yield { type: 'progress' as const, content: { phase: 'mechanical', status: 'running' } }\n const mechanicalIssues = runMechanicalChecks(fileContents, detection.engine, detection.serverLanguage)\n allIssues.push(...mechanicalIssues)\n\n // Phase 3: AI judgment (for standard and full modes)\n if (mode === 'standard' || mode === 'full') {\n yield { type: 'progress' as const, content: { phase: 'ai_judgment', status: 'running' } }\n // AI judgment is handled by the LLM in conversation context\n // The tool provides mechanical results; the model adds AI analysis\n }\n\n // Calculate score\n const score = calculateScore(allIssues)\n\n // Quality ratchet\n const ratchet = checkRatchet(score.score, previous_score ?? null)\n if (!ratchet.passed) {\n // Don't create push-approved if ratchet fails\n }\n\n // Diff stats\n const diffStats = getDiffStats(cwd, base_ref)\n\n // Modules (extract from file paths)\n const modules = [...new Set(changedFiles.map(f => {\n const parts = f.replace(/\\\\/g, '/').split('/')\n return parts.length > 1 ? parts[0]! : 'root'\n }))]\n\n const pushApproved = score.passed && ratchet.passed\n if (pushApproved) {\n createPushApprovedMarker(cwd, {\n score: score.score,\n branch: getBranchName(cwd),\n timestamp: new Date().toISOString(),\n reviewer: 'danya-agent',\n })\n }\n\n const report: Output = {\n score,\n issues: allIssues,\n change_summary: {\n files_changed: changedFiles.length,\n lines_added: diffStats.added,\n lines_removed: diffStats.removed,\n modules,\n },\n base_ref,\n push_approved: pushApproved,\n }\n\n yield { type: 'result' as const, data: report, resultForAssistant: formatHumanReport(report) }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME = 'ArchitectureGuard'\n\nexport const DESCRIPTION = `Static analysis to detect architecture/dependency violations.\n\nChecks:\n- Layer dependency direction (e.g., Framework \u2190 Gameplay \u2190 Renderer \u2190 Tools)\n- Forbidden zone edits (auto-generated code, protected directories)\n- Cross-module import violations\n\nSupports: C# (using), Go (import), C++ (#include), GDScript (preload).\nFast: regex-based, typically <2s.`\n", "export type ImportStatement = {\n file_path: string\n line: number\n imported_path: string\n imported_module?: string\n}\n\n// C#: using FL.Gameplay.Town;\nconst CSHARP_USING = /^using\\s+([A-Za-z][\\w.]*)\\s*;/\n\n// Go: \"servers/logic_server/internal/handler\"\nconst GO_IMPORT = /^\\s*\"([^\"]+)\"/\n\n// C++: #include \"Engine/Actor.h\"\nconst CPP_INCLUDE = /^#include\\s+[\"<]([^\">]+)[\">]/\n\n// GDScript: preload(\"res://scenes/player.gd\")\nconst GDSCRIPT_PRELOAD = /preload\\([\"']([^\"']+)[\"']\\)/g\n\nexport function extractImports(content: string, filePath: string): ImportStatement[] {\n const ext = filePath.split('.').pop()?.toLowerCase()\n\n switch (ext) {\n case 'cs':\n return extractCSharpImports(content, filePath)\n case 'go':\n return extractGoImports(content, filePath)\n case 'cpp': case 'h': case 'hpp': case 'cc':\n return extractCppImports(content, filePath)\n case 'gd':\n return extractGDScriptImports(content, filePath)\n default:\n return []\n }\n}\n\nfunction extractCSharpImports(content: string, filePath: string): ImportStatement[] {\n const imports: ImportStatement[] = []\n const lines = content.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i]!.match(CSHARP_USING)\n if (match) {\n imports.push({\n file_path: filePath,\n line: i + 1,\n imported_path: match[1]!,\n imported_module: match[1]!.split('.')[0],\n })\n }\n }\n return imports\n}\n\nfunction extractGoImports(content: string, filePath: string): ImportStatement[] {\n const imports: ImportStatement[] = []\n const lines = content.split('\\n')\n let inImportBlock = false\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!.trim()\n if (line === 'import (') { inImportBlock = true; continue }\n if (inImportBlock && line === ')') { inImportBlock = false; continue }\n\n if (inImportBlock || line.startsWith('import \"')) {\n const match = line.match(GO_IMPORT)\n if (match) {\n imports.push({\n file_path: filePath,\n line: i + 1,\n imported_path: match[1]!,\n imported_module: match[1]!.split('/')[0],\n })\n }\n }\n }\n return imports\n}\n\nfunction extractCppImports(content: string, filePath: string): ImportStatement[] {\n const imports: ImportStatement[] = []\n const lines = content.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i]!.match(CPP_INCLUDE)\n if (match) {\n imports.push({\n file_path: filePath,\n line: i + 1,\n imported_path: match[1]!,\n })\n }\n }\n return imports\n}\n\nfunction extractGDScriptImports(content: string, filePath: string): ImportStatement[] {\n const imports: ImportStatement[] = []\n const lines = content.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n let match: RegExpExecArray | null\n const regex = new RegExp(GDSCRIPT_PRELOAD.source, 'g')\n while ((match = regex.exec(lines[i]!)) !== null) {\n imports.push({\n file_path: filePath,\n line: i + 1,\n imported_path: match[1]!,\n })\n }\n }\n return imports\n}\n", "import type { ImportStatement } from './importParser'\n\nexport type LayerRule = {\n name: string\n layers: string[] // ordered lowest\u2192highest: lower cannot import higher\n pathToLayer: Record<string, string> // path pattern \u2192 layer name\n namespaceToLayer?: Record<string, string> // namespace/module \u2192 layer name\n}\n\nexport type Violation = {\n type: 'forbidden_import' | 'layer_violation' | 'forbidden_zone_edit'\n file_path: string\n line: number\n message: string\n from_layer?: string\n to_layer?: string\n import_path?: string\n}\n\n// Built-in layer rules per engine\nexport const UNITY_LAYERS: LayerRule = {\n name: 'Unity 4-Layer',\n layers: ['Framework', 'Gameplay', 'Renderer', 'Tools'],\n pathToLayer: {\n 'Scripts/Framework/': 'Framework',\n 'Scripts/Gameplay/': 'Gameplay',\n 'Scripts/Renderer/': 'Renderer',\n 'Scripts/Tools/': 'Tools',\n },\n namespaceToLayer: {\n 'FL.Framework': 'Framework',\n 'FL.Gameplay': 'Gameplay',\n 'FL.Renderer': 'Renderer',\n 'FL.Update': 'Tools',\n },\n}\n\nexport const GO_SERVER_LAYERS: LayerRule = {\n name: 'Go Server Layers',\n layers: ['base', 'pkg', 'common', 'servers'],\n pathToLayer: {\n 'base/': 'base',\n 'pkg/': 'pkg',\n 'common/': 'common',\n 'servers/': 'servers',\n },\n}\n\nexport type GuardRule = {\n pattern: string\n description: string\n fix_hint: string\n}\n\nfunction getLayerForFile(filePath: string, rule: LayerRule): string | null {\n const normalized = filePath.replace(/\\\\/g, '/')\n for (const [pattern, layer] of Object.entries(rule.pathToLayer)) {\n if (normalized.includes(pattern)) return layer\n }\n return null\n}\n\nfunction getLayerForImport(importPath: string, rule: LayerRule): string | null {\n // Check namespace mapping first\n if (rule.namespaceToLayer) {\n for (const [ns, layer] of Object.entries(rule.namespaceToLayer)) {\n if (importPath.startsWith(ns)) return layer\n }\n }\n // Check path mapping\n for (const [pattern, layer] of Object.entries(rule.pathToLayer)) {\n if (importPath.includes(pattern)) return layer\n }\n return null\n}\n\nexport function checkLayerViolations(\n imports: ImportStatement[],\n rule: LayerRule,\n): Violation[] {\n const violations: Violation[] = []\n const layerOrder = rule.layers\n\n for (const imp of imports) {\n const fromLayer = getLayerForFile(imp.file_path, rule)\n const toLayer = getLayerForImport(imp.imported_path, rule)\n\n if (!fromLayer || !toLayer) continue\n if (fromLayer === toLayer) continue\n\n const fromIdx = layerOrder.indexOf(fromLayer)\n const toIdx = layerOrder.indexOf(toLayer)\n\n // Lower layer (lower index) importing higher layer (higher index) is a violation\n if (fromIdx < toIdx) {\n violations.push({\n type: 'layer_violation',\n file_path: imp.file_path,\n line: imp.line,\n message: `Layer violation: ${fromLayer} cannot import ${toLayer} (${imp.imported_path})`,\n from_layer: fromLayer,\n to_layer: toLayer,\n import_path: imp.imported_path,\n })\n }\n }\n\n return violations\n}\n\nexport function checkForbiddenZones(\n filePaths: string[],\n guardRules: GuardRule[],\n): Violation[] {\n const violations: Violation[] = []\n\n for (const filePath of filePaths) {\n const normalized = filePath.replace(/\\\\/g, '/')\n for (const rule of guardRules) {\n try {\n const regex = new RegExp(rule.pattern)\n if (regex.test(normalized)) {\n violations.push({\n type: 'forbidden_zone_edit',\n file_path: filePath,\n line: 0,\n message: `Forbidden zone: ${rule.description}. ${rule.fix_hint}`,\n })\n break\n }\n } catch {\n if (normalized.includes(rule.pattern)) {\n violations.push({\n type: 'forbidden_zone_edit',\n file_path: filePath,\n line: 0,\n message: `Forbidden zone: ${rule.description}. ${rule.fix_hint}`,\n })\n break\n }\n }\n }\n }\n\n return violations\n}\n", "import { z } from 'zod'\nimport { readFileSync, existsSync } from 'fs'\nimport { execSync } from 'child_process'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { TOOL_NAME, DESCRIPTION } from './prompt'\nimport { extractImports } from './importParser'\nimport {\n checkLayerViolations,\n checkForbiddenZones,\n UNITY_LAYERS,\n GO_SERVER_LAYERS,\n type Violation,\n type LayerRule,\n type GuardRule,\n} from './layerRules'\nimport { detectProject } from '../../../engine/detect'\nimport { getCwd } from '@utils/state'\n\nconst inputSchema = z.strictObject({\n files: z.array(z.string()).optional()\n .describe('Files to check. Default: all changed files from git diff'),\n rules_path: z.string().optional()\n .describe('Path to architecture rules. Default: auto-detect from .danya/rules/'),\n})\n\ntype Output = {\n violations: Violation[]\n violation_count: number\n files_checked: number\n clean: boolean\n}\n\nfunction getChangedFiles(cwd: string): string[] {\n try {\n const output = execSync('git diff --name-only HEAD 2>/dev/null || git diff --name-only', {\n cwd, encoding: 'utf-8', timeout: 10000,\n })\n return output.split('\\n').filter(f => f.trim().length > 0)\n } catch {\n return []\n }\n}\n\nfunction loadGuardRules(cwd: string): GuardRule[] {\n const candidates = [\n `${cwd}/.danya/guard-rules.json`,\n `${cwd}/.claude/guard-rules.json`,\n ]\n for (const path of candidates) {\n if (existsSync(path)) {\n try { return JSON.parse(readFileSync(path, 'utf-8')) } catch {}\n }\n }\n return []\n}\n\nfunction getLayerRule(cwd: string): LayerRule | null {\n const detection = detectProject(cwd)\n switch (detection.engine) {\n case 'unity': return UNITY_LAYERS\n default: break\n }\n if (detection.serverLanguage === 'go') return GO_SERVER_LAYERS\n return null\n}\n\nexport const ArchitectureGuardTool = {\n name: TOOL_NAME,\n description: DESCRIPTION,\n searchHint: 'check code dependency direction and architecture violations',\n inputSchema,\n\n async isEnabled() { return true },\n isReadOnly() { return true },\n isConcurrencySafe() { return true },\n needsPermissions() { return false },\n\n async prompt() { return DESCRIPTION },\n\n renderToolUseMessage({ files }: z.infer<typeof inputSchema>) {\n return `Checking architecture: ${files ? `${files.length} files` : 'changed files'}`\n },\n\n renderResultForAssistant(output: Output): string {\n if (output.clean) {\n return `Architecture check: \u2705 clean (${output.files_checked} files checked)`\n }\n const lines = output.violations.map(v =>\n ` [${v.type}] ${v.file_path}:${v.line} \u2014 ${v.message}`\n ).join('\\n')\n return `Architecture check: ${output.violation_count} violations\\n${lines}`\n },\n\n async *call(\n { files, rules_path }: z.infer<typeof inputSchema>,\n context: ToolUseContext,\n ) {\n const cwd = getCwd()\n const targetFiles = files ?? getChangedFiles(cwd)\n\n if (targetFiles.length === 0) {\n const output: Output = { violations: [], violation_count: 0, files_checked: 0, clean: true }\n yield { type: 'result' as const, data: output, resultForAssistant: this.renderResultForAssistant(output) }\n return\n }\n\n const allViolations: Violation[] = []\n\n // 1. Check forbidden zones\n const guardRules = loadGuardRules(cwd)\n if (guardRules.length > 0) {\n allViolations.push(...checkForbiddenZones(targetFiles, guardRules))\n }\n\n // 2. Check layer violations\n const layerRule = getLayerRule(cwd)\n if (layerRule) {\n for (const file of targetFiles) {\n const fullPath = file.startsWith('/') || file.includes(':') ? file : `${cwd}/${file}`\n if (!existsSync(fullPath)) continue\n\n try {\n const content = readFileSync(fullPath, 'utf-8')\n const imports = extractImports(content, file)\n allViolations.push(...checkLayerViolations(imports, layerRule))\n } catch {\n // skip unreadable files\n }\n }\n }\n\n const output: Output = {\n violations: allViolations,\n violation_count: allViolations.length,\n files_checked: targetFiles.length,\n clean: allViolations.length === 0,\n }\n\n yield { type: 'result' as const, data: output, resultForAssistant: this.renderResultForAssistant(output) }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME = 'KnowledgeSediment'\n\nexport const DESCRIPTION = `Automatically sediment knowledge (features, bug fixes, research) to the project's Docs/ directory.\n\nRuns automatically after task completion. Creates structured documentation:\n- feature \u2192 Docs/Version/<version>/<title>/summary.md\n- bugfix \u2192 Docs/Bugs/<version>/<title>.md\n- research \u2192 Docs/Engine/Research/<title>/findings.md`\n", "import { z } from 'zod'\nimport { mkdirSync, writeFileSync, existsSync, readFileSync } from 'fs'\nimport { join, dirname } from 'path'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { TOOL_NAME, DESCRIPTION } from './prompt'\nimport { getCwd } from '@utils/state'\n\nconst inputSchema = z.strictObject({\n type: z.enum(['feature', 'bugfix', 'research'])\n .describe('Type of knowledge to sediment'),\n title: z.string()\n .describe('Short title for the knowledge entry'),\n version: z.string().optional()\n .describe('Project version. Default: \"current\"'),\n content: z.object({\n summary: z.string().describe('1-3 sentence summary'),\n details: z.string().optional().describe('Detailed content'),\n files_changed: z.array(z.string()).optional().describe('Files involved'),\n lessons_learned: z.string().optional().describe('Key takeaways'),\n }),\n})\n\ntype Output = {\n file_path: string\n created: boolean\n}\n\nfunction getOutputPath(cwd: string, type: string, version: string, title: string): string {\n const safeTitle = title.replace(/[^a-zA-Z0-9\\u4e00-\\u9fff_-]/g, '-').toLowerCase()\n switch (type) {\n case 'feature':\n return join(cwd, 'Docs', 'Version', version, safeTitle, 'summary.md')\n case 'bugfix':\n return join(cwd, 'Docs', 'Bugs', version, `${safeTitle}.md`)\n case 'research':\n return join(cwd, 'Docs', 'Engine', 'Research', safeTitle, 'findings.md')\n default:\n return join(cwd, 'Docs', 'Other', `${safeTitle}.md`)\n }\n}\n\nfunction formatContent(input: z.infer<typeof inputSchema>): string {\n const lines: string[] = []\n lines.push(`# ${input.title}`)\n lines.push('')\n lines.push(`**Type:** ${input.type}`)\n if (input.version) lines.push(`**Version:** ${input.version}`)\n lines.push(`**Date:** ${new Date().toISOString().split('T')[0]}`)\n lines.push('')\n lines.push('## Summary')\n lines.push('')\n lines.push(input.content.summary)\n\n if (input.content.details) {\n lines.push('')\n lines.push('## Details')\n lines.push('')\n lines.push(input.content.details)\n }\n\n if (input.content.files_changed?.length) {\n lines.push('')\n lines.push('## Files Changed')\n lines.push('')\n for (const f of input.content.files_changed) {\n lines.push(`- ${f}`)\n }\n }\n\n if (input.content.lessons_learned) {\n lines.push('')\n lines.push('## Lessons Learned')\n lines.push('')\n lines.push(input.content.lessons_learned)\n }\n\n lines.push('')\n return lines.join('\\n')\n}\n\nexport const KnowledgeSedimentTool = {\n name: TOOL_NAME,\n description: DESCRIPTION,\n searchHint: 'save knowledge documentation for features bugs research',\n inputSchema,\n\n async isEnabled() { return true },\n isReadOnly() { return false },\n isConcurrencySafe() { return true },\n needsPermissions() { return false },\n\n async prompt() { return DESCRIPTION },\n\n renderToolUseMessage(input: z.infer<typeof inputSchema>) {\n return `Sedimenting ${input.type}: ${input.title}`\n },\n\n renderResultForAssistant(output: Output): string {\n return output.created\n ? `Knowledge sediment written to: ${output.file_path}`\n : `Knowledge sediment appended to: ${output.file_path}`\n },\n\n async *call(input: z.infer<typeof inputSchema>, context: ToolUseContext) {\n const cwd = getCwd()\n const version = input.version ?? 'current'\n const filePath = getOutputPath(cwd, input.type, version, input.title)\n const content = formatContent(input)\n\n mkdirSync(dirname(filePath), { recursive: true })\n\n let created = true\n if (existsSync(filePath)) {\n const existing = readFileSync(filePath, 'utf-8')\n writeFileSync(filePath, existing + '\\n---\\n\\n' + content, 'utf-8')\n created = false\n } else {\n writeFileSync(filePath, content, 'utf-8')\n }\n\n const output: Output = { file_path: filePath, created }\n yield { type: 'result' as const, data: output, resultForAssistant: this.renderResultForAssistant(output) }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME = 'GateChain'\n\nexport const DESCRIPTION = `Run the full quality gate chain: verify \u2192 commit \u2192 review \u2192 push.\nChains other tools in sequence. Stops at the first failed gate.\nUse skip_push=true (default) to stop after review without pushing.`\n", "import { z } from 'zod'\nimport { execSync } from 'child_process'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { TOOL_NAME, DESCRIPTION } from './prompt'\nimport { getCwd } from '@utils/state'\nimport { detectProject } from '../../../engine/detect'\n\nconst inputSchema = z.strictObject({\n start_from: z.enum(['verify', 'commit', 'review', 'push']).optional()\n .describe('Start from this stage. Default: verify'),\n commit_message: z.string().optional()\n .describe('Commit message. If omitted, auto-generated from diff'),\n skip_push: z.boolean().optional()\n .describe('Stop after review, do not push. Default: true'),\n files: z.array(z.string()).optional()\n .describe('Specific files to include'),\n})\n\ntype StageResult = {\n name: 'verify' | 'commit' | 'review' | 'push'\n status: 'passed' | 'failed' | 'skipped'\n detail: string\n duration_ms: number\n}\n\ntype Output = {\n stages: StageResult[]\n overall_status: 'passed' | 'failed'\n stopped_at?: string\n review_score?: number\n total_duration_ms: number\n}\n\nfunction runCommand(cmd: string, cwd: string): { success: boolean; output: string } {\n try {\n const output = execSync(cmd, { cwd, encoding: 'utf-8', timeout: 300000 })\n return { success: true, output }\n } catch (err: any) {\n return { success: false, output: (err.stdout ?? '') + (err.stderr ?? '') }\n }\n}\n\nexport const GateChainTool = {\n name: TOOL_NAME,\n description: DESCRIPTION,\n searchHint: 'run full quality gate chain verify commit review push',\n inputSchema,\n\n async isEnabled() { return true },\n isReadOnly() { return false },\n isConcurrencySafe() { return false },\n needsPermissions() { return true },\n\n async prompt() { return DESCRIPTION },\n\n renderToolUseMessage(input: z.infer<typeof inputSchema>) {\n return `Running gate chain from ${input.start_from ?? 'verify'}${input.skip_push !== false ? ' (no push)' : ''}`\n },\n\n renderResultForAssistant(output: Output): string {\n const lines = output.stages.map(s => {\n const icon = s.status === 'passed' ? '\u2705' : s.status === 'failed' ? '\u274C' : '\u23ED'\n return ` ${icon} ${s.name}: ${s.detail} (${s.duration_ms}ms)`\n })\n const header = output.overall_status === 'passed'\n ? `Gate Chain: \u2705 ALL PASSED`\n : `Gate Chain: \u274C STOPPED at ${output.stopped_at}`\n if (output.review_score !== undefined) {\n lines.push(` Score: ${output.review_score}/100`)\n }\n return `${header}\\n${lines.join('\\n')}`\n },\n\n async *call(\n { start_from = 'verify', commit_message, skip_push = true, files }: z.infer<typeof inputSchema>,\n context: ToolUseContext,\n ) {\n const cwd = getCwd()\n const detection = detectProject(cwd)\n const totalStart = Date.now()\n const stages: StageResult[] = []\n const gateOrder: Array<'verify' | 'commit' | 'review' | 'push'> = ['verify', 'commit', 'review', 'push']\n const startIdx = gateOrder.indexOf(start_from)\n\n for (let i = 0; i < gateOrder.length; i++) {\n const gate = gateOrder[i]!\n if (i < startIdx) {\n stages.push({ name: gate, status: 'skipped', detail: 'skipped (start_from)', duration_ms: 0 })\n continue\n }\n if (gate === 'push' && skip_push) {\n stages.push({ name: gate, status: 'skipped', detail: 'skipped (skip_push=true)', duration_ms: 0 })\n continue\n }\n\n yield { type: 'progress' as const, content: { stage: gate, status: 'running' } }\n const stageStart = Date.now()\n\n switch (gate) {\n case 'verify': {\n // Run build verification based on engine\n let cmd = 'echo \"No build tool configured\"'\n if (detection.serverLanguage === 'go') {\n cmd = 'make build 2>&1 || go build ./... 2>&1'\n }\n const result = runCommand(cmd, cwd)\n stages.push({\n name: 'verify', status: result.success ? 'passed' : 'failed',\n detail: result.success ? 'Build passed' : result.output.slice(0, 200),\n duration_ms: Date.now() - stageStart,\n })\n if (!result.success) {\n const output: Output = { stages, overall_status: 'failed', stopped_at: 'verify', total_duration_ms: Date.now() - totalStart }\n yield { type: 'result' as const, data: output, resultForAssistant: this.renderResultForAssistant(output) }\n return\n }\n break\n }\n\n case 'commit': {\n const fileList = files?.join(' ') ?? '-A'\n const msg = commit_message ?? 'chore: auto-commit via gate chain'\n const addResult = runCommand(`git add ${fileList}`, cwd)\n const commitResult = runCommand(`git commit -m \"${msg}\"`, cwd)\n const success = commitResult.success || commitResult.output.includes('nothing to commit')\n stages.push({\n name: 'commit', status: success ? 'passed' : 'failed',\n detail: success ? 'Committed' : commitResult.output.slice(0, 200),\n duration_ms: Date.now() - stageStart,\n })\n if (!success) {\n const output: Output = { stages, overall_status: 'failed', stopped_at: 'commit', total_duration_ms: Date.now() - totalStart }\n yield { type: 'result' as const, data: output, resultForAssistant: this.renderResultForAssistant(output) }\n return\n }\n break\n }\n\n case 'review': {\n // ScoreReview is invoked by the LLM in the conversation context\n // The GateChain tool signals that review should happen\n stages.push({\n name: 'review', status: 'passed',\n detail: 'Review should be run via /review or ScoreReview tool',\n duration_ms: Date.now() - stageStart,\n })\n break\n }\n\n case 'push': {\n const pushResult = runCommand('git push', cwd)\n stages.push({\n name: 'push', status: pushResult.success ? 'passed' : 'failed',\n detail: pushResult.success ? 'Pushed' : pushResult.output.slice(0, 200),\n duration_ms: Date.now() - stageStart,\n })\n if (!pushResult.success) {\n const output: Output = { stages, overall_status: 'failed', stopped_at: 'push', total_duration_ms: Date.now() - totalStart }\n yield { type: 'result' as const, data: output, resultForAssistant: this.renderResultForAssistant(output) }\n return\n }\n break\n }\n }\n }\n\n const output: Output = { stages, overall_status: 'passed', total_duration_ms: Date.now() - totalStart }\n yield { type: 'result' as const, data: output, resultForAssistant: this.renderResultForAssistant(output) }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME = 'ProtoCompile'\nexport const DESCRIPTION = `Compile Protocol Buffer definitions and generate client/server stub code.\nInvokes protoc with appropriate plugins. Parses errors with file:line.`\n", "import { z } from 'zod'\nimport { execSync } from 'child_process'\nimport { existsSync } from 'fs'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { TOOL_NAME, DESCRIPTION } from './prompt'\nimport { getCwd } from '@utils/state'\nimport type { BuildError } from '../types'\n\nconst inputSchema = z.strictObject({\n proto_path: z.string().describe('Path to .proto file or directory'),\n languages: z.array(z.enum(['csharp', 'go', 'cpp'])).optional()\n .describe('Target languages. Default: auto-detect'),\n output_dir: z.string().optional()\n .describe('Output directory. Default: project-configured'),\n})\n\ntype Output = {\n success: boolean\n proto_files_compiled: number\n generated_files: Array<{ language: string; file_path: string }>\n errors: BuildError[]\n duration_ms: number\n}\n\nconst PROTOC_ERROR_REGEX = /^(.+?):(\\d+):(\\d+):\\s+(.+)$/\n\nfunction parseProtocErrors(output: string): BuildError[] {\n const errors: BuildError[] = []\n for (const line of output.split('\\n')) {\n const match = line.trim().match(PROTOC_ERROR_REGEX)\n if (match) {\n errors.push({\n file_path: match[1]!, line: parseInt(match[2]!, 10),\n column: parseInt(match[3]!, 10), message: match[4]!,\n severity: 'error',\n })\n }\n }\n return errors\n}\n\nexport const ProtoCompileTool = {\n name: TOOL_NAME, description: DESCRIPTION,\n searchHint: 'compile protobuf and generate client server stubs',\n inputSchema,\n async isEnabled() { return true },\n isReadOnly() { return false },\n isConcurrencySafe() { return false },\n needsPermissions() { return true },\n async prompt() { return DESCRIPTION },\n\n renderToolUseMessage(input: z.infer<typeof inputSchema>) {\n return `Compiling protobuf: ${input.proto_path}`\n },\n renderResultForAssistant(output: Output): string {\n if (output.success) return `ProtoCompile: ${output.proto_files_compiled} files compiled, ${output.generated_files.length} generated`\n return `ProtoCompile FAILED: ${output.errors.map(e => `${e.file_path}:${e.line}: ${e.message}`).join('\\n')}`\n },\n\n async *call(input: z.infer<typeof inputSchema>, context: ToolUseContext) {\n const start = Date.now()\n const cwd = getCwd()\n try {\n const cmd = `protoc --proto_path=\"${input.proto_path}\" ${input.output_dir ? `--go_out=\"${input.output_dir}\"` : ''} \"${input.proto_path}\"/*.proto 2>&1`\n const output = execSync(cmd, { cwd, encoding: 'utf-8', timeout: 60000 })\n yield { type: 'result' as const, data: { success: true, proto_files_compiled: 1, generated_files: [], errors: [], duration_ms: Date.now() - start } as Output }\n } catch (err: any) {\n const errors = parseProtocErrors((err.stdout ?? '') + (err.stderr ?? ''))\n yield { type: 'result' as const, data: { success: false, proto_files_compiled: 0, generated_files: [], errors: errors.length ? errors : [{ file_path: '', line: 0, message: String(err.message).slice(0, 300), severity: 'error' as const }], duration_ms: Date.now() - start } as Output }\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME = 'ConfigGenerate'\nexport const DESCRIPTION = `Run the config table generation pipeline (Excel/designer tools \u2192 generated code).\nInvokes the project-specific generator. Reports errors traced to source.`\n", "import { z } from 'zod'\nimport { execSync } from 'child_process'\nimport { existsSync } from 'fs'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { TOOL_NAME, DESCRIPTION } from './prompt'\nimport { getCwd } from '@utils/state'\n\nconst inputSchema = z.strictObject({\n source_path: z.string().describe('Path to config source (Excel dir or generator executable)'),\n generator: z.string().optional().describe('Generator command. Default: auto-detect'),\n targets: z.array(z.enum(['client', 'server', 'both'])).optional().describe('Default: both'),\n})\n\ntype Output = {\n success: boolean\n generated_files: Array<{ target: string; file_path: string }>\n errors: Array<{ source_file: string; message: string }>\n duration_ms: number\n}\n\nexport const ConfigGenerateTool = {\n name: TOOL_NAME, description: DESCRIPTION,\n searchHint: 'generate config code from Excel or designer data',\n inputSchema,\n async isEnabled() { return true },\n isReadOnly() { return false },\n isConcurrencySafe() { return false },\n needsPermissions() { return true },\n async prompt() { return DESCRIPTION },\n\n renderToolUseMessage(input: z.infer<typeof inputSchema>) {\n return `Generating config from: ${input.source_path}`\n },\n renderResultForAssistant(output: Output): string {\n if (output.success) return `ConfigGenerate: ${output.generated_files.length} files generated`\n return `ConfigGenerate FAILED: ${output.errors.map(e => `${e.source_file}: ${e.message}`).join('\\n')}`\n },\n\n async *call(input: z.infer<typeof inputSchema>, context: ToolUseContext) {\n const start = Date.now()\n const cwd = getCwd()\n const cmd = input.generator ?? (existsSync(`${cwd}/Makefile`) ? 'make config' : `\"${input.source_path}\"`)\n try {\n execSync(cmd, { cwd, encoding: 'utf-8', timeout: 120000 })\n yield { type: 'result' as const, data: { success: true, generated_files: [], errors: [], duration_ms: Date.now() - start } as Output }\n } catch (err: any) {\n yield { type: 'result' as const, data: { success: false, generated_files: [], errors: [{ source_file: input.source_path, message: String(err.message).slice(0, 300) }], duration_ms: Date.now() - start } as Output }\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME = 'CSharpSyntaxCheck'\n\nexport const DESCRIPTION = `Performs Roslyn-based AST-level C# syntax validation. Catches syntax errors instantly without waiting for full Unity/Godot compilation.\n\nUsage:\n- Automatically triggered after writing/editing .cs files via post-tool hook\n- Can also be called manually to check a specific file\n- Returns structured errors with file path, line number, column, error code, and message\n- Typical execution: <500ms per file`\n", "import type { BuildError } from '../types'\n\n// MSBuild format: file(line,col): severity code: message\nconst MSBUILD_REGEX = /^(.+?)\\((\\d+),(\\d+)\\):\\s+(error|warning)\\s+(CS\\d+):\\s+(.+)$/\n\n// Roslyn JSON format\ntype RoslynOutput = {\n errors: Array<{\n severity: string\n id: string\n message: string\n line: number\n column: number\n }>\n}\n\nexport function parseMSBuildOutput(output: string): BuildError[] {\n const errors: BuildError[] = []\n for (const line of output.split('\\n')) {\n const match = line.trim().match(MSBUILD_REGEX)\n if (match) {\n errors.push({\n file_path: match[1]!,\n line: parseInt(match[2]!, 10),\n column: parseInt(match[3]!, 10),\n severity: match[4] as 'error' | 'warning',\n code: match[5]!,\n message: match[6]!,\n })\n }\n }\n return errors\n}\n\nexport function parseRoslynOutput(jsonStr: string): BuildError[] {\n try {\n const output: RoslynOutput = JSON.parse(jsonStr)\n return output.errors.map((e) => ({\n file_path: '',\n line: e.line,\n column: e.column,\n severity: e.severity === 'Error' ? 'error' as const : 'warning' as const,\n code: e.id,\n message: e.message,\n }))\n } catch {\n return []\n }\n}\n", "import { z } from 'zod'\nimport { execSync } from 'child_process'\nimport { existsSync } from 'fs'\nimport { dirname, join } from 'path'\nimport { glob } from 'glob'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { TOOL_NAME, DESCRIPTION } from './prompt'\nimport { parseMSBuildOutput, parseRoslynOutput } from './parser'\nimport type { BuildError } from '../types'\n\nconst inputSchema = z.strictObject({\n file_path: z.string().describe('Absolute path to the .cs file to check'),\n project_path: z.string().optional()\n .describe('Path to .csproj for reference resolution. If omitted, auto-detected from file location'),\n})\n\ntype Output = {\n file_path: string\n success: boolean\n errors: BuildError[]\n error_count: number\n warning_count: number\n duration_ms: number\n}\n\nfunction findCsproj(filePath: string): string | null {\n let dir = dirname(filePath)\n for (let i = 0; i < 10; i++) {\n const csprojFiles = glob.sync('*.csproj', { cwd: dir })\n if (csprojFiles.length > 0) return join(dir, csprojFiles[0]!)\n const parent = dirname(dir)\n if (parent === dir) break\n dir = parent\n }\n return null\n}\n\nexport const CSharpSyntaxCheckTool = {\n name: TOOL_NAME,\n description: DESCRIPTION,\n searchHint: 'check C# syntax errors using Roslyn',\n inputSchema,\n\n async isEnabled() { return true },\n isReadOnly() { return true },\n isConcurrencySafe() { return true },\n needsPermissions() { return false },\n\n async prompt() { return DESCRIPTION },\n\n async validateInput({ file_path }: z.infer<typeof inputSchema>) {\n if (!existsSync(file_path)) {\n return { result: false, message: `File not found: ${file_path}` }\n }\n if (!file_path.endsWith('.cs')) {\n return { result: false, message: 'Not a C# file' }\n }\n return { result: true }\n },\n\n renderToolUseMessage({ file_path }: z.infer<typeof inputSchema>) {\n return `Checking C# syntax: ${file_path}`\n },\n\n renderResultForAssistant(output: Output): string {\n if (output.success) {\n return `C# syntax check passed: ${output.file_path} (${output.duration_ms}ms)`\n }\n const errorLines = output.errors\n .map(e => ` ${e.file_path}:${e.line}:${e.column ?? 0} ${e.severity} ${e.code ?? ''}: ${e.message}`)\n .join('\\n')\n return `C# syntax check FAILED: ${output.error_count} errors, ${output.warning_count} warnings\\n${errorLines}`\n },\n\n async *call(\n { file_path, project_path }: z.infer<typeof inputSchema>,\n context: ToolUseContext,\n ) {\n const start = Date.now()\n let errors: BuildError[] = []\n\n try {\n // Strategy 1: Try dotnet build\n const csproj = project_path ?? findCsproj(file_path)\n if (csproj && existsSync(csproj)) {\n const output = execSync(\n `dotnet build \"${csproj}\" --no-restore --nologo -v q 2>&1`,\n { encoding: 'utf-8', timeout: 30000 },\n )\n errors = parseMSBuildOutput(output)\n } else {\n // Strategy 2: Basic regex-based syntax check (fallback)\n const { readFileSync } = require('fs')\n const content = readFileSync(file_path, 'utf-8')\n errors = basicSyntaxCheck(content, file_path)\n }\n } catch (err: any) {\n // dotnet build returns non-zero on errors \u2014 parse stdout for errors\n if (err.stdout) {\n errors = parseMSBuildOutput(err.stdout)\n } else if (err.stderr) {\n errors = parseMSBuildOutput(err.stderr)\n }\n }\n\n // Filter to only errors in the target file\n const fileErrors = errors.filter(\n e => e.file_path === file_path || e.file_path.endsWith(file_path.split(/[/\\\\]/).pop()!)\n )\n\n const output: Output = {\n file_path,\n success: fileErrors.filter(e => e.severity === 'error').length === 0,\n errors: fileErrors,\n error_count: fileErrors.filter(e => e.severity === 'error').length,\n warning_count: fileErrors.filter(e => e.severity === 'warning').length,\n duration_ms: Date.now() - start,\n }\n\n yield { type: 'result' as const, data: output, resultForAssistant: this.renderResultForAssistant(output) }\n },\n} satisfies Tool<typeof inputSchema, Output>\n\nfunction basicSyntaxCheck(content: string, filePath: string): BuildError[] {\n const errors: BuildError[] = []\n const lines = content.split('\\n')\n\n let braceDepth = 0\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!\n const stripped = line.replace(/\\/\\/.*$/, '').replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n for (const ch of stripped) {\n if (ch === '{') braceDepth++\n if (ch === '}') braceDepth--\n }\n if (braceDepth < 0) {\n errors.push({\n file_path: filePath, line: i + 1, severity: 'error',\n message: 'Unexpected closing brace', code: 'DANYA001',\n })\n braceDepth = 0\n }\n }\n\n if (braceDepth !== 0) {\n errors.push({\n file_path: filePath, line: lines.length, severity: 'error',\n message: `Unmatched braces: ${braceDepth > 0 ? 'missing closing' : 'extra closing'} brace(s)`,\n code: 'DANYA002',\n })\n }\n\n return errors\n}\n", "export const TOOL_NAME = 'UnityBuild'\n\nexport const DESCRIPTION = `Compile a Unity project in batch mode. Attempts script-only compilation via dotnet build first, then falls back to reporting that the Unity editor is needed for a full build.\n\nUsage:\n- Validates C# scripts compile correctly without opening the Unity editor\n- Parses Unity/MSBuild log format for structured error reporting\n- Supports build targets: editor, android, ios, windows\n- Typical execution: 10-60s for script compilation`\n", "import type { BuildError } from '../types'\n\n// Unity log format: Assets/Scripts/Foo.cs(42,10): error CS1002: ; expected\n// Reuses MSBuild regex pattern \u2014 Unity compiler output is MSBuild-compatible\nconst UNITY_LOG_REGEX = /^(.+?)\\((\\d+),(\\d+)\\):\\s+(error|warning)\\s+(CS\\d+):\\s+(.+)$/\n\nexport function parseUnityLogOutput(output: string): BuildError[] {\n const errors: BuildError[] = []\n for (const line of output.split('\\n')) {\n const match = line.trim().match(UNITY_LOG_REGEX)\n if (match) {\n errors.push({\n file_path: match[1]!,\n line: parseInt(match[2]!, 10),\n column: parseInt(match[3]!, 10),\n severity: match[4] as 'error' | 'warning',\n code: match[5]!,\n message: match[6]!,\n })\n }\n }\n return errors\n}\n", "import { z } from 'zod'\nimport { execSync } from 'child_process'\nimport { existsSync } from 'fs'\nimport { join } from 'path'\nimport { glob } from 'glob'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { TOOL_NAME, DESCRIPTION } from './prompt'\nimport { parseUnityLogOutput } from './parser'\nimport type { BuildError } from '../types'\n\nconst inputSchema = z.strictObject({\n project_path: z.string().describe('Absolute path to the Unity project root (contains Assets/ folder)'),\n build_target: z.enum(['editor', 'android', 'ios', 'windows']).optional()\n .describe('Build target platform. Defaults to editor (script compilation only)'),\n})\n\ntype Output = {\n success: boolean\n errors: BuildError[]\n error_count: number\n warning_count: number\n duration_ms: number\n unity_version?: string\n}\n\nfunction detectUnityVersion(projectPath: string): string | undefined {\n try {\n const versionFile = join(projectPath, 'ProjectSettings', 'ProjectVersion.txt')\n if (existsSync(versionFile)) {\n const { readFileSync } = require('fs')\n const content = readFileSync(versionFile, 'utf-8')\n const match = content.match(/m_EditorVersion:\\s*(.+)/)\n return match?.[1]?.trim()\n }\n } catch {}\n return undefined\n}\n\nfunction findCsproj(projectPath: string): string | null {\n const patterns = [\n 'Assembly-CSharp.csproj',\n '*.csproj',\n ]\n for (const pattern of patterns) {\n const results = glob.sync(pattern, { cwd: projectPath })\n if (results.length > 0) return join(projectPath, results[0]!)\n }\n return null\n}\n\nexport const UnityBuildTool = {\n name: TOOL_NAME,\n description: DESCRIPTION,\n searchHint: 'compile Unity project scripts batch mode',\n inputSchema,\n\n async isEnabled() { return true },\n isReadOnly() { return true },\n isConcurrencySafe() { return false },\n needsPermissions() { return false },\n\n async prompt() { return DESCRIPTION },\n\n async validateInput({ project_path }: z.infer<typeof inputSchema>) {\n if (!existsSync(project_path)) {\n return { result: false, message: `Project path not found: ${project_path}` }\n }\n if (!existsSync(join(project_path, 'Assets'))) {\n return { result: false, message: `Not a Unity project: missing Assets/ folder` }\n }\n return { result: true }\n },\n\n renderToolUseMessage({ project_path, build_target }: z.infer<typeof inputSchema>) {\n return `Building Unity project: ${project_path}${build_target ? ` (${build_target})` : ''}`\n },\n\n renderResultForAssistant(output: Output): string {\n if (output.success) {\n return `Unity build passed (${output.duration_ms}ms)${output.unity_version ? ` [Unity ${output.unity_version}]` : ''}`\n }\n const errorLines = output.errors\n .filter(e => e.severity === 'error')\n .map(e => ` ${e.file_path}(${e.line},${e.column ?? 0}): ${e.code ?? ''} ${e.message}`)\n .join('\\n')\n return `Unity build FAILED: ${output.error_count} errors, ${output.warning_count} warnings\\n${errorLines}`\n },\n\n async *call(\n { project_path, build_target }: z.infer<typeof inputSchema>,\n context: ToolUseContext,\n ) {\n const start = Date.now()\n let errors: BuildError[] = []\n const unity_version = detectUnityVersion(project_path)\n\n try {\n // Strategy 1: Try dotnet build for script-only compilation\n const csproj = findCsproj(project_path)\n if (csproj && existsSync(csproj)) {\n const output = execSync(\n `dotnet build \"${csproj}\" --no-restore --nologo -v q 2>&1`,\n { encoding: 'utf-8', timeout: 60000, cwd: project_path },\n )\n errors = parseUnityLogOutput(output)\n } else {\n // Strategy 2: Report that Unity editor is needed\n errors.push({\n file_path: project_path,\n line: 0,\n severity: 'warning',\n message: 'No .csproj found. Full Unity editor build is required. Open the project in Unity to generate solution files, or run Unity in batch mode.',\n code: 'DANYA_UNITY001',\n })\n }\n } catch (err: any) {\n // dotnet build returns non-zero on compilation errors \u2014 parse output\n const raw = err.stdout || err.stderr || ''\n errors = parseUnityLogOutput(raw)\n if (errors.length === 0) {\n errors.push({\n file_path: project_path,\n line: 0,\n severity: 'error',\n message: `Build process failed: ${err.message ?? 'unknown error'}`,\n code: 'DANYA_UNITY002',\n })\n }\n }\n\n const output: Output = {\n success: errors.filter(e => e.severity === 'error').length === 0,\n errors,\n error_count: errors.filter(e => e.severity === 'error').length,\n warning_count: errors.filter(e => e.severity === 'warning').length,\n duration_ms: Date.now() - start,\n unity_version,\n }\n\n yield { type: 'result' as const, data: output, resultForAssistant: this.renderResultForAssistant(output) }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME = 'UnrealBuild'\n\nexport const DESCRIPTION = `Build an Unreal Engine project using Unreal Build Tool (UBT). Parses both MSVC and Clang compiler output for structured error reporting.\n\nUsage:\n- Invokes UnrealBuildTool for C++ compilation\n- Supports platforms: Win64, Linux, Mac\n- Supports configurations: Development, DebugGame, Shipping\n- Reports structured errors with file path, line, column, severity, and message\n- Typical execution: 30s-10min depending on project size`\n", "import type { BuildError } from '../types'\n\n// MSVC format: file.cpp(42): error C2065: 'x': undeclared identifier\nconst MSVC_REGEX = /^(.+?)\\((\\d+)\\):\\s+(error|warning)\\s+(C\\d+):\\s+(.+)$/\n\n// Clang format: file.cpp:42:10: error: use of undeclared identifier 'x'\nconst CLANG_REGEX = /^(.+?):(\\d+):(\\d+):\\s+(error|warning):\\s+(.+)$/\n\n// UE-specific format: LogCompile: Error: file.cpp(42): message\nconst UE_LOG_REGEX = /^.+?:\\s+(Error|Warning):\\s+(.+?)\\((\\d+)\\):\\s+(.+)$/\n\nexport function parseUnrealBuildOutput(output: string): BuildError[] {\n const errors: BuildError[] = []\n for (const line of output.split('\\n')) {\n const trimmed = line.trim()\n\n // Try MSVC format first\n let match = trimmed.match(MSVC_REGEX)\n if (match) {\n errors.push({\n file_path: match[1]!,\n line: parseInt(match[2]!, 10),\n severity: match[3] as 'error' | 'warning',\n code: match[4]!,\n message: match[5]!,\n })\n continue\n }\n\n // Try Clang format\n match = trimmed.match(CLANG_REGEX)\n if (match) {\n errors.push({\n file_path: match[1]!,\n line: parseInt(match[2]!, 10),\n column: parseInt(match[3]!, 10),\n severity: match[4] as 'error' | 'warning',\n message: match[5]!,\n })\n continue\n }\n\n // Try UE log format\n match = trimmed.match(UE_LOG_REGEX)\n if (match) {\n errors.push({\n file_path: match[2]!,\n line: parseInt(match[3]!, 10),\n severity: match[1]!.toLowerCase() as 'error' | 'warning',\n message: match[4]!,\n })\n }\n }\n return errors\n}\n", "import { z } from 'zod'\nimport { execSync } from 'child_process'\nimport { existsSync } from 'fs'\nimport { join, basename } from 'path'\nimport { glob } from 'glob'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { TOOL_NAME, DESCRIPTION } from './prompt'\nimport { parseUnrealBuildOutput } from './parser'\nimport type { BuildError } from '../types'\n\nconst inputSchema = z.strictObject({\n project_path: z.string().describe('Absolute path to the Unreal Engine project root (contains .uproject file)'),\n platform: z.enum(['Win64', 'Linux', 'Mac']).optional()\n .describe('Target platform. Defaults to Win64'),\n configuration: z.enum(['Development', 'DebugGame', 'Shipping']).optional()\n .describe('Build configuration. Defaults to Development'),\n})\n\ntype Output = {\n success: boolean\n errors: BuildError[]\n error_count: number\n warning_count: number\n duration_ms: number\n}\n\nfunction findUProject(projectPath: string): string | null {\n const results = glob.sync('*.uproject', { cwd: projectPath })\n return results.length > 0 ? join(projectPath, results[0]!) : null\n}\n\nfunction findUBT(): string | null {\n // Common UBT locations\n const candidates = [\n // Environment variable\n process.env.UE_ROOT ? join(process.env.UE_ROOT, 'Engine', 'Build', 'BatchFiles', 'Build.bat') : null,\n process.env.UE_ROOT ? join(process.env.UE_ROOT, 'Engine', 'Build', 'BatchFiles', 'RunUBT.bat') : null,\n // Common Windows install paths\n 'C:/Program Files/Epic Games/UE_5.4/Engine/Build/BatchFiles/Build.bat',\n 'C:/Program Files/Epic Games/UE_5.3/Engine/Build/BatchFiles/Build.bat',\n ].filter(Boolean) as string[]\n\n for (const path of candidates) {\n if (existsSync(path)) return path\n }\n return null\n}\n\nexport const UnrealBuildTool = {\n name: TOOL_NAME,\n description: DESCRIPTION,\n searchHint: 'compile Unreal Engine C++ project UBT',\n inputSchema,\n\n async isEnabled() { return true },\n isReadOnly() { return true },\n isConcurrencySafe() { return false },\n needsPermissions() { return false },\n\n async prompt() { return DESCRIPTION },\n\n async validateInput({ project_path }: z.infer<typeof inputSchema>) {\n if (!existsSync(project_path)) {\n return { result: false, message: `Project path not found: ${project_path}` }\n }\n const uproject = findUProject(project_path)\n if (!uproject) {\n return { result: false, message: `Not an Unreal project: no .uproject file found` }\n }\n return { result: true }\n },\n\n renderToolUseMessage({ project_path, platform, configuration }: z.infer<typeof inputSchema>) {\n const plat = platform ?? 'Win64'\n const config = configuration ?? 'Development'\n return `Building Unreal project: ${project_path} (${plat} ${config})`\n },\n\n renderResultForAssistant(output: Output): string {\n if (output.success) {\n return `Unreal build passed (${output.duration_ms}ms)`\n }\n const errorLines = output.errors\n .filter(e => e.severity === 'error')\n .slice(0, 20)\n .map(e => ` ${e.file_path}:${e.line}${e.column ? ':' + e.column : ''}: ${e.code ?? ''} ${e.message}`)\n .join('\\n')\n return `Unreal build FAILED: ${output.error_count} errors, ${output.warning_count} warnings\\n${errorLines}`\n },\n\n async *call(\n { project_path, platform, configuration }: z.infer<typeof inputSchema>,\n context: ToolUseContext,\n ) {\n const start = Date.now()\n let errors: BuildError[] = []\n const plat = platform ?? 'Win64'\n const config = configuration ?? 'Development'\n\n const uproject = findUProject(project_path)\n if (!uproject) {\n const output: Output = {\n success: false,\n errors: [{ file_path: project_path, line: 0, severity: 'error', message: 'No .uproject file found' }],\n error_count: 1,\n warning_count: 0,\n duration_ms: Date.now() - start,\n }\n yield { type: 'result' as const, data: output, resultForAssistant: this.renderResultForAssistant(output) }\n return\n }\n\n const projectName = basename(uproject, '.uproject')\n const ubt = findUBT()\n\n try {\n if (ubt) {\n const cmd = `\"${ubt}\" ${projectName}Editor ${plat} ${config} -project=\"${uproject}\" -NoHotReloadFromIDE 2>&1`\n const raw = execSync(cmd, {\n encoding: 'utf-8',\n timeout: 600000, // 10 min timeout for large projects\n cwd: project_path,\n })\n errors = parseUnrealBuildOutput(raw)\n } else {\n // Fallback: try MSBuild on the .sln if it exists\n const slnFiles = glob.sync('*.sln', { cwd: project_path })\n if (slnFiles.length > 0) {\n const raw = execSync(\n `dotnet build \"${join(project_path, slnFiles[0]!)}\" --nologo -v q 2>&1`,\n { encoding: 'utf-8', timeout: 120000, cwd: project_path },\n )\n errors = parseUnrealBuildOutput(raw)\n } else {\n errors.push({\n file_path: project_path,\n line: 0,\n severity: 'error',\n message: 'Unreal Build Tool (UBT) not found. Set UE_ROOT environment variable or ensure Unreal Engine is installed.',\n code: 'DANYA_UE001',\n })\n }\n }\n } catch (err: any) {\n const raw = err.stdout || err.stderr || ''\n errors = parseUnrealBuildOutput(raw)\n if (errors.length === 0) {\n errors.push({\n file_path: project_path,\n line: 0,\n severity: 'error',\n message: `Build process failed: ${err.message ?? 'unknown error'}`,\n code: 'DANYA_UE002',\n })\n }\n }\n\n const output: Output = {\n success: errors.filter(e => e.severity === 'error').length === 0,\n errors,\n error_count: errors.filter(e => e.severity === 'error').length,\n warning_count: errors.filter(e => e.severity === 'warning').length,\n duration_ms: Date.now() - start,\n }\n\n yield { type: 'result' as const, data: output, resultForAssistant: this.renderResultForAssistant(output) }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME = 'GodotBuild'\n\nexport const DESCRIPTION = `Build and validate a Godot project. Supports both GDScript (via headless Godot) and C# (via dotnet build) workflows.\n\nUsage:\n- For GDScript: runs godot --headless --check-only to validate scripts\n- For C# projects: runs dotnet build on the .csproj\n- check_only mode validates without producing export artifacts\n- Reports structured errors with file path, line number, and message\n- Typical execution: 5-30s`\n", "import { z } from 'zod'\nimport { execSync } from 'child_process'\nimport { existsSync } from 'fs'\nimport { join } from 'path'\nimport { glob } from 'glob'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { TOOL_NAME, DESCRIPTION } from './prompt'\nimport type { BuildError } from '../types'\n\nconst inputSchema = z.strictObject({\n project_path: z.string().describe('Absolute path to the Godot project root (contains project.godot)'),\n check_only: z.boolean().optional()\n .describe('If true, only validate scripts without producing export artifacts. Defaults to true'),\n})\n\ntype Output = {\n success: boolean\n errors: BuildError[]\n error_count: number\n warning_count: number\n duration_ms: number\n}\n\n// GDScript error format: res://scripts/player.gd:42 - Parse Error: Expected \":\"\nconst GDSCRIPT_ERROR_REGEX = /^(.+?):(\\d+)\\s*-\\s*(Parse Error|Error|Warning):\\s*(.+)$/\n// Also: SCRIPT ERROR: res://scripts/player.gd:42: message\nconst SCRIPT_ERROR_REGEX = /^SCRIPT ERROR:\\s*(.+?):(\\d+):\\s*(.+)$/\n// MSBuild format for C# Godot projects\nconst MSBUILD_REGEX = /^(.+?)\\((\\d+),(\\d+)\\):\\s+(error|warning)\\s+(CS\\d+):\\s+(.+)$/\n\nfunction parseGodotOutput(output: string): BuildError[] {\n const errors: BuildError[] = []\n for (const line of output.split('\\n')) {\n const trimmed = line.trim()\n\n let match = trimmed.match(GDSCRIPT_ERROR_REGEX)\n if (match) {\n const severityRaw = match[3]!.toLowerCase()\n errors.push({\n file_path: match[1]!.replace(/^res:\\/\\//, ''),\n line: parseInt(match[2]!, 10),\n severity: severityRaw.includes('warning') ? 'warning' : 'error',\n message: match[4]!,\n })\n continue\n }\n\n match = trimmed.match(SCRIPT_ERROR_REGEX)\n if (match) {\n errors.push({\n file_path: match[1]!.replace(/^res:\\/\\//, ''),\n line: parseInt(match[2]!, 10),\n severity: 'error',\n message: match[3]!,\n })\n continue\n }\n\n match = trimmed.match(MSBUILD_REGEX)\n if (match) {\n errors.push({\n file_path: match[1]!,\n line: parseInt(match[2]!, 10),\n column: parseInt(match[3]!, 10),\n severity: match[4] as 'error' | 'warning',\n code: match[5]!,\n message: match[6]!,\n })\n }\n }\n return errors\n}\n\nfunction hasCSharpScripts(projectPath: string): boolean {\n return glob.sync('**/*.cs', { cwd: projectPath, ignore: ['.godot/**'] }).length > 0\n}\n\nfunction findCsproj(projectPath: string): string | null {\n const results = glob.sync('*.csproj', { cwd: projectPath })\n return results.length > 0 ? join(projectPath, results[0]!) : null\n}\n\nexport const GodotBuildTool = {\n name: TOOL_NAME,\n description: DESCRIPTION,\n searchHint: 'compile Godot project GDScript C# validation',\n inputSchema,\n\n async isEnabled() { return true },\n isReadOnly() { return true },\n isConcurrencySafe() { return false },\n needsPermissions() { return false },\n\n async prompt() { return DESCRIPTION },\n\n async validateInput({ project_path }: z.infer<typeof inputSchema>) {\n if (!existsSync(project_path)) {\n return { result: false, message: `Project path not found: ${project_path}` }\n }\n if (!existsSync(join(project_path, 'project.godot'))) {\n return { result: false, message: `Not a Godot project: missing project.godot` }\n }\n return { result: true }\n },\n\n renderToolUseMessage({ project_path, check_only }: z.infer<typeof inputSchema>) {\n return `Building Godot project: ${project_path}${check_only !== false ? ' (check only)' : ''}`\n },\n\n renderResultForAssistant(output: Output): string {\n if (output.success) {\n return `Godot build passed (${output.duration_ms}ms)`\n }\n const errorLines = output.errors\n .filter(e => e.severity === 'error')\n .map(e => ` ${e.file_path}:${e.line}: ${e.code ?? ''} ${e.message}`)\n .join('\\n')\n return `Godot build FAILED: ${output.error_count} errors, ${output.warning_count} warnings\\n${errorLines}`\n },\n\n async *call(\n { project_path, check_only }: z.infer<typeof inputSchema>,\n context: ToolUseContext,\n ) {\n const start = Date.now()\n let errors: BuildError[] = []\n\n // Strategy 1: GDScript validation via headless Godot\n try {\n const raw = execSync(\n `godot --headless --check-only --path \"${project_path}\" 2>&1`,\n { encoding: 'utf-8', timeout: 60000, cwd: project_path },\n )\n errors = parseGodotOutput(raw)\n } catch (err: any) {\n const raw = err.stdout || err.stderr || ''\n if (raw) {\n errors = parseGodotOutput(raw)\n } else {\n // Godot CLI not available \u2014 not a fatal error if we can try C# build\n errors.push({\n file_path: project_path,\n line: 0,\n severity: 'warning',\n message: 'Godot CLI not found. GDScript validation skipped. Install Godot and add to PATH.',\n code: 'DANYA_GODOT001',\n })\n }\n }\n\n // Strategy 2: C# compilation via dotnet build (if project uses C#)\n if (hasCSharpScripts(project_path)) {\n const csproj = findCsproj(project_path)\n if (csproj) {\n try {\n const raw = execSync(\n `dotnet build \"${csproj}\" --no-restore --nologo -v q 2>&1`,\n { encoding: 'utf-8', timeout: 60000, cwd: project_path },\n )\n errors = errors.concat(parseGodotOutput(raw))\n } catch (err: any) {\n const raw = err.stdout || err.stderr || ''\n if (raw) {\n errors = errors.concat(parseGodotOutput(raw))\n }\n }\n }\n }\n\n const output: Output = {\n success: errors.filter(e => e.severity === 'error').length === 0,\n errors,\n error_count: errors.filter(e => e.severity === 'error').length,\n warning_count: errors.filter(e => e.severity === 'warning').length,\n duration_ms: Date.now() - start,\n }\n\n yield { type: 'result' as const, data: output, resultForAssistant: this.renderResultForAssistant(output) }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME = 'OrmGenerate'\n\nexport const DESCRIPTION = `Generate ORM code from schema definitions. Invokes the project's code generation pipeline (typically make orm) to produce typed data access code.\n\nUsage:\n- Reads schema files and generates code for specified targets\n- Supported targets: golang, redis, mongo, proto\n- Generates files in the project directory structure\n- Reports which files were generated and any schema errors\n- Typical execution: 5-30s`\n", "import { z } from 'zod'\nimport { execSync } from 'child_process'\nimport { existsSync } from 'fs'\nimport { join } from 'path'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { TOOL_NAME, DESCRIPTION } from './prompt'\n\nconst inputSchema = z.strictObject({\n schema_path: z.string().describe('Path to the schema definition file or directory'),\n targets: z.array(z.enum(['golang', 'redis', 'mongo', 'proto'])).optional()\n .describe('Code generation targets. Defaults to all configured targets'),\n project_path: z.string().optional()\n .describe('Project root path. Defaults to parent of schema_path'),\n})\n\ntype SchemaError = {\n schema_file: string\n message: string\n}\n\ntype Output = {\n success: boolean\n generated_files: string[]\n errors: SchemaError[]\n duration_ms: number\n}\n\nfunction parseGeneratedFiles(output: string): string[] {\n const files: string[] = []\n // Common patterns in code-gen output\n const patterns = [\n /(?:generated|wrote|created|writing):\\s*(.+)/gi,\n /^\\s*->\\s*(.+\\.\\w+)\\s*$/gm,\n /^\\s*(.+\\.(?:go|proto|rs|ts))\\s*$/gm,\n ]\n for (const pattern of patterns) {\n let match: RegExpExecArray | null\n while ((match = pattern.exec(output)) !== null) {\n const file = match[1]!.trim()\n if (file && !files.includes(file)) {\n files.push(file)\n }\n }\n }\n return files\n}\n\nfunction parseErrors(output: string, schemaPath: string): SchemaError[] {\n const errors: SchemaError[] = []\n const errorPatterns = [\n /(?:error|ERROR|Error):\\s*(.+)/g,\n /^(.+?):(\\d+):\\s*(?:error|ERROR):\\s*(.+)/gm,\n ]\n for (const pattern of errorPatterns) {\n let match: RegExpExecArray | null\n while ((match = pattern.exec(output)) !== null) {\n errors.push({\n schema_file: match.length > 3 ? match[1]! : schemaPath,\n message: match.length > 3 ? `Line ${match[2]}: ${match[3]}` : match[1]!,\n })\n }\n }\n return errors\n}\n\nexport const OrmGenerateTool = {\n name: TOOL_NAME,\n description: DESCRIPTION,\n searchHint: 'generate ORM code from schema definitions',\n inputSchema,\n\n async isEnabled() { return true },\n isReadOnly() { return false },\n isConcurrencySafe() { return false },\n needsPermissions() { return true },\n\n async prompt() { return DESCRIPTION },\n\n async validateInput({ schema_path }: z.infer<typeof inputSchema>) {\n if (!existsSync(schema_path)) {\n return { result: false, message: `Schema path not found: ${schema_path}` }\n }\n return { result: true }\n },\n\n renderToolUseMessage({ schema_path, targets }: z.infer<typeof inputSchema>) {\n const targetStr = targets?.join(', ') ?? 'all'\n return `Generating ORM code from ${schema_path} (targets: ${targetStr})`\n },\n\n renderResultForAssistant(output: Output): string {\n if (output.success) {\n const fileList = output.generated_files.length > 0\n ? '\\nGenerated:\\n' + output.generated_files.map(f => ` ${f}`).join('\\n')\n : ''\n return `ORM generation succeeded (${output.duration_ms}ms, ${output.generated_files.length} files)${fileList}`\n }\n const errorLines = output.errors\n .map(e => ` ${e.schema_file}: ${e.message}`)\n .join('\\n')\n return `ORM generation FAILED: ${output.errors.length} errors\\n${errorLines}`\n },\n\n async *call(\n { schema_path, targets, project_path }: z.infer<typeof inputSchema>,\n context: ToolUseContext,\n ) {\n const start = Date.now()\n let generatedFiles: string[] = []\n let errors: SchemaError[] = []\n\n const cwd = project_path ?? join(schema_path, '..')\n\n // Determine the generation command\n // Priority: Makefile target > custom orm command\n const hasMakefile = existsSync(join(cwd, 'Makefile'))\n\n try {\n let cmd: string\n if (hasMakefile) {\n // Check if 'orm' target exists\n const makeTargets = targets?.length\n ? `orm-${targets.join(' orm-')}`\n : 'orm'\n cmd = `make ${makeTargets} SCHEMA=\"${schema_path}\" 2>&1`\n } else {\n // Fallback: try a go generate approach\n cmd = `go generate \"${schema_path}\" 2>&1`\n }\n\n const raw = execSync(cmd, {\n encoding: 'utf-8',\n timeout: 120000,\n cwd,\n })\n\n generatedFiles = parseGeneratedFiles(raw)\n errors = parseErrors(raw, schema_path)\n // If we found errors in the output but the command succeeded, they may be warnings\n } catch (err: any) {\n const raw = err.stdout || err.stderr || ''\n errors = parseErrors(raw, schema_path)\n generatedFiles = parseGeneratedFiles(raw)\n if (errors.length === 0) {\n errors.push({\n schema_file: schema_path,\n message: `Generation failed: ${err.message ?? 'unknown error'}`,\n })\n }\n }\n\n const hasErrors = errors.length > 0 && generatedFiles.length === 0\n\n const output: Output = {\n success: !hasErrors,\n generated_files: generatedFiles,\n errors,\n duration_ms: Date.now() - start,\n }\n\n yield { type: 'result' as const, data: output, resultForAssistant: this.renderResultForAssistant(output) }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME = 'AssetCheck'\n\nexport const DESCRIPTION = `Check game assets for integrity issues: missing references, broken prefabs, and orphaned assets. Supports Unity (.meta/GUID) and Godot (.tscn/ext_resource) asset pipelines.\n\nUsage:\n- Scans asset files for broken or missing references\n- Scope: 'changed' checks only git-modified files, 'full' checks all assets\n- Detects: missing_reference, broken_prefab, orphaned_asset\n- Filterable by asset type: prefab, scene, material, audio, texture\n- Typical execution: 1-30s depending on scope`\n", "import { readFileSync, existsSync } from 'fs'\nimport { join, dirname, relative } from 'path'\nimport { glob } from 'glob'\n\nexport type AssetIssue = {\n asset_path: string\n type: 'missing_reference' | 'broken_prefab' | 'orphaned_asset'\n message: string\n referenced_by?: string\n}\n\n// Regex to extract GUID references from Unity files (.prefab, .unity, .asset, .mat)\nconst GUID_REF_REGEX = /guid:\\s*([0-9a-f]{32})/gi\n\n// Regex to extract GUID from .meta files\nconst META_GUID_REGEX = /^guid:\\s*([0-9a-f]{32})/m\n\n/**\n * Collect all known GUIDs from .meta files in the project.\n */\nfunction collectGuids(projectPath: string, scope: 'changed' | 'full', changedFiles?: string[]): Map<string, string> {\n const guidMap = new Map<string, string>()\n\n let metaFiles: string[]\n if (scope === 'changed' && changedFiles) {\n metaFiles = changedFiles\n .filter(f => f.endsWith('.meta'))\n .map(f => join(projectPath, f))\n } else {\n metaFiles = glob.sync('**/*.meta', { cwd: projectPath, absolute: true })\n }\n\n for (const metaFile of metaFiles) {\n try {\n const content = readFileSync(metaFile, 'utf-8')\n const match = content.match(META_GUID_REGEX)\n if (match) {\n guidMap.set(match[1]!, metaFile.replace(/\\.meta$/, ''))\n }\n } catch {\n // skip unreadable files\n }\n }\n\n return guidMap\n}\n\n/**\n * Get changed files from git.\n */\nfunction getChangedFiles(projectPath: string): string[] {\n try {\n const { execSync } = require('child_process')\n const output = execSync('git diff --name-only HEAD 2>/dev/null || git diff --name-only', {\n cwd: projectPath,\n encoding: 'utf-8',\n timeout: 10000,\n })\n return output.split('\\n').filter(Boolean)\n } catch {\n return []\n }\n}\n\n/**\n * Check Unity assets for missing GUID references and orphaned assets.\n */\nexport function checkUnityAssets(projectPath: string, scope: 'changed' | 'full'): AssetIssue[] {\n const issues: AssetIssue[] = []\n const changedFiles = scope === 'changed' ? getChangedFiles(projectPath) : undefined\n\n // Build full GUID registry (always need full set for reference resolution)\n const allGuids = new Map<string, string>()\n const allMetaFiles = glob.sync('Assets/**/*.meta', { cwd: projectPath, absolute: true })\n for (const metaFile of allMetaFiles) {\n try {\n const content = readFileSync(metaFile, 'utf-8')\n const match = content.match(META_GUID_REGEX)\n if (match) {\n allGuids.set(match[1]!, relative(projectPath, metaFile.replace(/\\.meta$/, '')))\n }\n } catch {}\n }\n\n // Determine which asset files to scan\n const assetExts = ['.prefab', '.unity', '.asset', '.mat', '.controller', '.anim']\n let assetFiles: string[]\n\n if (scope === 'changed' && changedFiles) {\n assetFiles = changedFiles\n .filter(f => assetExts.some(ext => f.endsWith(ext)))\n .map(f => join(projectPath, f))\n } else {\n assetFiles = glob.sync(`Assets/**/*{${assetExts.join(',')}}`, { cwd: projectPath, absolute: true })\n }\n\n // Check each asset for broken GUID references\n for (const assetFile of assetFiles) {\n try {\n const content = readFileSync(assetFile, 'utf-8')\n const relPath = relative(projectPath, assetFile)\n let match: RegExpExecArray | null\n\n const guidRegex = new RegExp(GUID_REF_REGEX.source, 'gi')\n while ((match = guidRegex.exec(content)) !== null) {\n const guid = match[1]!\n if (!allGuids.has(guid)) {\n issues.push({\n asset_path: relPath,\n type: 'missing_reference',\n message: `References GUID ${guid} which has no corresponding .meta file`,\n referenced_by: relPath,\n })\n }\n }\n } catch {}\n }\n\n // Check for orphaned assets (assets with no references)\n if (scope === 'full') {\n const referencedGuids = new Set<string>()\n const allAssetFiles = glob.sync('Assets/**/*{.prefab,.unity,.asset,.mat,.controller,.anim}', {\n cwd: projectPath,\n absolute: true,\n })\n\n for (const assetFile of allAssetFiles) {\n try {\n const content = readFileSync(assetFile, 'utf-8')\n const guidRegex = new RegExp(GUID_REF_REGEX.source, 'gi')\n let m: RegExpExecArray | null\n while ((m = guidRegex.exec(content)) !== null) {\n referencedGuids.add(m[1]!)\n }\n } catch {}\n }\n\n for (const [guid, assetPath] of allGuids) {\n if (!referencedGuids.has(guid) && !assetPath.endsWith('.cs') && !assetPath.endsWith('.shader')) {\n // Skip scripts and shaders \u2014 they may be referenced by class name, not GUID\n const ext = assetPath.split('.').pop() ?? ''\n if (['mat', 'prefab', 'asset', 'controller', 'anim'].includes(ext)) {\n issues.push({\n asset_path: assetPath,\n type: 'orphaned_asset',\n message: `Asset GUID ${guid} is not referenced by any other asset`,\n })\n }\n }\n }\n }\n\n return issues\n}\n", "import { readFileSync, existsSync } from 'fs'\nimport { join, dirname, relative } from 'path'\nimport { glob } from 'glob'\n\nexport type AssetIssue = {\n asset_path: string\n type: 'missing_reference' | 'broken_prefab' | 'orphaned_asset'\n message: string\n referenced_by?: string\n}\n\n// Godot ext_resource format: [ext_resource type=\"PackedScene\" path=\"res://scenes/Player.tscn\" id=1]\nconst EXT_RESOURCE_REGEX = /\\[ext_resource\\s[^\\]]*path=\"res:\\/\\/([^\"]+)\"/g\n\n// Godot sub_resource / load() references\nconst LOAD_REGEX = /(?:preload|load)\\(\\s*\"res:\\/\\/([^\"]+)\"\\s*\\)/g\n\n/**\n * Get changed files from git.\n */\nfunction getChangedFiles(projectPath: string): string[] {\n try {\n const { execSync } = require('child_process')\n const output = execSync('git diff --name-only HEAD 2>/dev/null || git diff --name-only', {\n cwd: projectPath,\n encoding: 'utf-8',\n timeout: 10000,\n })\n return output.split('\\n').filter(Boolean)\n } catch {\n return []\n }\n}\n\n/**\n * Check Godot assets for missing resource references.\n */\nexport function checkGodotAssets(projectPath: string, scope: 'changed' | 'full'): AssetIssue[] {\n const issues: AssetIssue[] = []\n const changedFiles = scope === 'changed' ? getChangedFiles(projectPath) : undefined\n\n // Determine which scene/resource files to scan\n const sceneExts = ['.tscn', '.tres', '.gd']\n let filesToScan: string[]\n\n if (scope === 'changed' && changedFiles) {\n filesToScan = changedFiles\n .filter(f => sceneExts.some(ext => f.endsWith(ext)))\n .map(f => join(projectPath, f))\n } else {\n filesToScan = glob.sync(`**/*{${sceneExts.join(',')}}`, {\n cwd: projectPath,\n absolute: true,\n ignore: ['.godot/**', '.import/**'],\n })\n }\n\n for (const file of filesToScan) {\n try {\n const content = readFileSync(file, 'utf-8')\n const relPath = relative(projectPath, file)\n\n // Check ext_resource paths\n const extRegex = new RegExp(EXT_RESOURCE_REGEX.source, 'g')\n let match: RegExpExecArray | null\n while ((match = extRegex.exec(content)) !== null) {\n const referencedPath = match[1]!\n const absolutePath = join(projectPath, referencedPath)\n if (!existsSync(absolutePath)) {\n issues.push({\n asset_path: referencedPath,\n type: 'missing_reference',\n message: `Referenced resource \"res://${referencedPath}\" does not exist`,\n referenced_by: relPath,\n })\n }\n }\n\n // Check load()/preload() references in .gd and .tscn files\n const loadRegex = new RegExp(LOAD_REGEX.source, 'g')\n while ((match = loadRegex.exec(content)) !== null) {\n const referencedPath = match[1]!\n const absolutePath = join(projectPath, referencedPath)\n if (!existsSync(absolutePath)) {\n issues.push({\n asset_path: referencedPath,\n type: 'missing_reference',\n message: `load()/preload() references \"res://${referencedPath}\" which does not exist`,\n referenced_by: relPath,\n })\n }\n }\n } catch {}\n }\n\n return issues\n}\n", "import { z } from 'zod'\nimport { existsSync } from 'fs'\nimport { join } from 'path'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { TOOL_NAME, DESCRIPTION } from './prompt'\nimport { checkUnityAssets, type AssetIssue as UnityAssetIssue } from './parsers/unity'\nimport { checkGodotAssets, type AssetIssue as GodotAssetIssue } from './parsers/godot'\n\nconst inputSchema = z.strictObject({\n project_path: z.string().describe('Absolute path to the game project root'),\n scope: z.enum(['changed', 'full']).optional()\n .describe('Scan scope: \"changed\" checks only git-modified files, \"full\" checks all assets. Defaults to \"changed\"'),\n asset_types: z.array(z.enum(['prefab', 'scene', 'material', 'audio', 'texture'])).optional()\n .describe('Filter by asset types. If omitted, checks all types'),\n})\n\ntype AssetIssue = {\n asset_path: string\n type: 'missing_reference' | 'broken_prefab' | 'orphaned_asset'\n message: string\n referenced_by?: string\n}\n\ntype Output = {\n issues: AssetIssue[]\n issue_count: number\n assets_checked: number\n clean: boolean\n duration_ms: number\n}\n\nfunction detectEngine(projectPath: string): 'unity' | 'godot' | null {\n if (existsSync(join(projectPath, 'Assets')) && existsSync(join(projectPath, 'ProjectSettings'))) {\n return 'unity'\n }\n if (existsSync(join(projectPath, 'project.godot'))) {\n return 'godot'\n }\n return null\n}\n\nexport const AssetCheckTool = {\n name: TOOL_NAME,\n description: DESCRIPTION,\n searchHint: 'check game assets missing references broken prefabs',\n inputSchema,\n\n async isEnabled() { return true },\n isReadOnly() { return true },\n isConcurrencySafe() { return true },\n needsPermissions() { return false },\n\n async prompt() { return DESCRIPTION },\n\n async validateInput({ project_path }: z.infer<typeof inputSchema>) {\n if (!existsSync(project_path)) {\n return { result: false, message: `Project path not found: ${project_path}` }\n }\n const engine = detectEngine(project_path)\n if (!engine) {\n return { result: false, message: `Could not detect game engine. Expected Unity (Assets/ + ProjectSettings/) or Godot (project.godot)` }\n }\n return { result: true }\n },\n\n renderToolUseMessage({ project_path, scope }: z.infer<typeof inputSchema>) {\n return `Checking assets: ${project_path} (scope: ${scope ?? 'changed'})`\n },\n\n renderResultForAssistant(output: Output): string {\n if (output.clean) {\n return `Asset check passed: ${output.assets_checked} assets checked, no issues found (${output.duration_ms}ms)`\n }\n const issueLines = output.issues\n .slice(0, 20)\n .map(i => ` [${i.type}] ${i.asset_path}: ${i.message}${i.referenced_by ? ` (referenced by ${i.referenced_by})` : ''}`)\n .join('\\n')\n const more = output.issue_count > 20 ? `\\n ... and ${output.issue_count - 20} more` : ''\n return `Asset check found ${output.issue_count} issues (${output.assets_checked} assets checked, ${output.duration_ms}ms)\\n${issueLines}${more}`\n },\n\n async *call(\n { project_path, scope, asset_types }: z.infer<typeof inputSchema>,\n context: ToolUseContext,\n ) {\n const start = Date.now()\n const effectiveScope = scope ?? 'changed'\n const engine = detectEngine(project_path)\n\n let rawIssues: AssetIssue[] = []\n let assetsChecked = 0\n\n if (engine === 'unity') {\n const issues = checkUnityAssets(project_path, effectiveScope)\n rawIssues = issues as AssetIssue[]\n // Rough count from globbed files\n try {\n const { glob } = require('glob')\n assetsChecked = glob.sync('Assets/**/*.{prefab,unity,asset,mat,controller,anim}', { cwd: project_path }).length\n } catch {\n assetsChecked = rawIssues.length\n }\n } else if (engine === 'godot') {\n const issues = checkGodotAssets(project_path, effectiveScope)\n rawIssues = issues as AssetIssue[]\n try {\n const { glob } = require('glob')\n assetsChecked = glob.sync('**/*.{tscn,tres,gd}', { cwd: project_path, ignore: ['.godot/**'] }).length\n } catch {\n assetsChecked = rawIssues.length\n }\n }\n\n // Filter by asset_types if specified\n let issues = rawIssues\n if (asset_types && asset_types.length > 0) {\n const typeExtMap: Record<string, string[]> = {\n prefab: ['.prefab'],\n scene: ['.unity', '.tscn'],\n material: ['.mat', '.tres'],\n audio: ['.wav', '.ogg', '.mp3'],\n texture: ['.png', '.jpg', '.jpeg', '.tga', '.bmp'],\n }\n const allowedExts = new Set(asset_types.flatMap(t => typeExtMap[t] ?? []))\n issues = rawIssues.filter(i => {\n const ext = '.' + (i.asset_path.split('.').pop() ?? '')\n return allowedExts.has(ext) || allowedExts.size === 0\n })\n }\n\n const output: Output = {\n issues,\n issue_count: issues.length,\n assets_checked: assetsChecked,\n clean: issues.length === 0,\n duration_ms: Date.now() - start,\n }\n\n yield { type: 'result' as const, data: output, resultForAssistant: this.renderResultForAssistant(output) }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME = 'GameServerBuild'\n\nexport const DESCRIPTION = `Build and verify a Go game server with configurable verification levels.\n\nLevels:\n- quick: lint only (fastest, <30s)\n- build: lint + compile (default, 30s-2min)\n- full: lint + compile + test (1-5min)\n\nReports structured errors with file path, line number, and message for each stage.`\n", "import type { BuildError } from '../types'\n\n// Go build error: file.go:42:10: undefined: SomeType\nconst GO_BUILD_REGEX = /^(.+?\\.go):(\\d+):(\\d+):\\s+(.+)$/\nconst GO_BUILD_REGEX_NO_COL = /^(.+?\\.go):(\\d+):\\s+(.+)$/\n\n// golangci-lint JSON Issue\ntype GolangCIIssue = {\n FromLinter: string\n Text: string\n Pos: { Filename: string; Line: number; Column: number }\n}\n\n// Go test failure: --- FAIL: TestName (0.00s)\nconst GO_TEST_FAIL_REGEX = /^--- FAIL:\\s+(\\S+)/\n\nexport function parseGoBuildOutput(output: string): BuildError[] {\n const errors: BuildError[] = []\n for (const line of output.split('\\n')) {\n const trimmed = line.trim()\n let match = trimmed.match(GO_BUILD_REGEX)\n if (match) {\n errors.push({\n file_path: match[1]!,\n line: parseInt(match[2]!, 10),\n column: parseInt(match[3]!, 10),\n message: match[4]!,\n severity: 'error',\n })\n continue\n }\n match = trimmed.match(GO_BUILD_REGEX_NO_COL)\n if (match) {\n errors.push({\n file_path: match[1]!,\n line: parseInt(match[2]!, 10),\n message: match[3]!,\n severity: 'error',\n })\n }\n }\n return errors\n}\n\nexport function parseGolangCILintJSON(jsonStr: string): BuildError[] {\n try {\n const data = JSON.parse(jsonStr)\n const issues: GolangCIIssue[] = data.Issues ?? []\n return issues.map((issue) => ({\n file_path: issue.Pos.Filename,\n line: issue.Pos.Line,\n column: issue.Pos.Column,\n message: issue.Text,\n severity: 'warning' as const,\n rule: issue.FromLinter,\n }))\n } catch {\n return []\n }\n}\n\nexport function parseGoTestOutput(output: string): BuildError[] {\n const errors: BuildError[] = []\n for (const line of output.split('\\n')) {\n const match = line.trim().match(GO_TEST_FAIL_REGEX)\n if (match) {\n errors.push({\n file_path: '',\n line: 0,\n message: `Test failed: ${match[1]}`,\n severity: 'error',\n })\n }\n }\n return errors\n}\n", "import { z } from 'zod'\nimport { execSync } from 'child_process'\nimport { existsSync } from 'fs'\nimport { join } from 'path'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { TOOL_NAME, DESCRIPTION } from './prompt'\nimport { parseGoBuildOutput, parseGolangCILintJSON, parseGoTestOutput } from './parser'\nimport type { BuildStageResult } from '../types'\n\nconst inputSchema = z.strictObject({\n project_path: z.string().describe('Path to Go server project root'),\n level: z.enum(['quick', 'build', 'full']).optional()\n .describe('Verification level. quick=lint, build=lint+compile, full=lint+compile+test. Default: build'),\n})\n\ntype Output = {\n success: boolean\n level: string\n stages: BuildStageResult[]\n total_duration_ms: number\n}\n\nconst STAGES_BY_LEVEL = {\n quick: ['lint'],\n build: ['lint', 'build'],\n full: ['lint', 'build', 'test'],\n}\n\nfunction runStage(stageName: string, projectPath: string): BuildStageResult {\n const start = Date.now()\n let cmd: string\n\n switch (stageName) {\n case 'lint':\n cmd = existsSync(join(projectPath, 'Makefile'))\n ? 'make lint 2>&1'\n : 'golangci-lint run --out-format json 2>&1'\n break\n case 'build':\n cmd = existsSync(join(projectPath, 'Makefile'))\n ? 'make build 2>&1'\n : 'go build ./... 2>&1'\n break\n case 'test':\n cmd = existsSync(join(projectPath, 'Makefile'))\n ? 'make test 2>&1'\n : 'go test ./... 2>&1'\n break\n default:\n return { name: stageName, success: false, errors: [{ file_path: '', line: 0, message: `Unknown stage: ${stageName}`, severity: 'error' }], duration_ms: 0 }\n }\n\n try {\n const output = execSync(cmd, { cwd: projectPath, encoding: 'utf-8', timeout: 300000 })\n\n // For lint with JSON output, parse even on success (may have warnings)\n let errors = stageName === 'lint' && output.trim().startsWith('{')\n ? parseGolangCILintJSON(output)\n : []\n\n return {\n name: stageName,\n success: true,\n errors,\n duration_ms: Date.now() - start,\n }\n } catch (err: any) {\n const output = (err.stdout ?? '') + (err.stderr ?? '')\n let errors = stageName === 'lint'\n ? (output.trim().startsWith('{') ? parseGolangCILintJSON(output) : parseGoBuildOutput(output))\n : stageName === 'test'\n ? parseGoTestOutput(output)\n : parseGoBuildOutput(output)\n\n // If no structured errors parsed, create a generic one\n if (errors.length === 0) {\n errors = [{ file_path: '', line: 0, message: output.slice(0, 500), severity: 'error' as const }]\n }\n\n return {\n name: stageName,\n success: false,\n errors,\n duration_ms: Date.now() - start,\n }\n }\n}\n\nexport const GameServerBuildTool = {\n name: TOOL_NAME,\n description: DESCRIPTION,\n searchHint: 'build game server services and report errors',\n inputSchema,\n\n async isEnabled() { return true },\n isReadOnly() { return true },\n isConcurrencySafe() { return false },\n needsPermissions() { return false },\n\n async prompt() { return DESCRIPTION },\n\n async validateInput({ project_path }: z.infer<typeof inputSchema>) {\n if (!existsSync(project_path)) {\n return { result: false, message: `Directory not found: ${project_path}` }\n }\n if (!existsSync(join(project_path, 'go.mod')) && !existsSync(join(project_path, 'Makefile'))) {\n return { result: false, message: 'Not a Go project (no go.mod or Makefile)' }\n }\n return { result: true }\n },\n\n renderToolUseMessage({ project_path, level }: z.infer<typeof inputSchema>) {\n return `Building Go server (${level ?? 'build'}): ${project_path}`\n },\n\n renderResultForAssistant(output: Output): string {\n const stageLines = output.stages.map(s => {\n const status = s.success ? '\u2705' : '\u274C'\n const errorSummary = s.errors.length > 0\n ? `\\n${s.errors.slice(0, 5).map(e => ` ${e.file_path}:${e.line}: ${e.message}`).join('\\n')}`\n : ''\n return ` ${status} ${s.name} (${s.duration_ms}ms)${errorSummary}`\n }).join('\\n')\n\n return `GameServerBuild [${output.level}] ${output.success ? 'PASSED' : 'FAILED'} (${output.total_duration_ms}ms)\\n${stageLines}`\n },\n\n async *call(\n { project_path, level = 'build' }: z.infer<typeof inputSchema>,\n context: ToolUseContext,\n ) {\n const start = Date.now()\n const stageNames = STAGES_BY_LEVEL[level]\n const stages: BuildStageResult[] = []\n let success = true\n\n for (const stageName of stageNames) {\n // Emit progress\n yield {\n type: 'progress' as const,\n content: { stage: stageName, status: 'running' },\n }\n\n const result = runStage(stageName, project_path)\n stages.push(result)\n\n if (!result.success) {\n success = false\n break // fail-fast\n }\n }\n\n const output: Output = {\n success,\n level,\n stages,\n total_duration_ms: Date.now() - start,\n }\n\n yield { type: 'result' as const, data: output, resultForAssistant: this.renderResultForAssistant(output) }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "import { memoize } from 'lodash-es'\r\nimport { Tool } from '@tool'\r\nimport { AskExpertModelTool } from './ai/AskExpertModelTool/AskExpertModelTool'\r\nimport { AskUserQuestionTool } from './interaction/AskUserQuestionTool/AskUserQuestionTool'\r\nimport { BashTool } from './system/BashTool/BashTool'\r\nimport { TaskOutputTool } from './system/TaskOutputTool/TaskOutputTool'\r\nimport { EnterPlanModeTool } from './agent/PlanModeTool/EnterPlanModeTool'\r\nimport { ExitPlanModeTool } from './agent/PlanModeTool/ExitPlanModeTool'\r\nimport { FileEditTool } from './filesystem/FileEditTool/FileEditTool'\r\nimport { FileReadTool } from './filesystem/FileReadTool/FileReadTool'\r\nimport { FileWriteTool } from './filesystem/FileWriteTool/FileWriteTool'\r\nimport { GlobTool } from './filesystem/GlobTool/GlobTool'\r\nimport { GrepTool } from './search/GrepTool/GrepTool'\r\nimport { KillShellTool } from './system/KillShellTool/KillShellTool'\r\nimport { ListMcpResourcesTool } from './mcp/ListMcpResourcesTool/ListMcpResourcesTool'\r\nimport { LspTool } from './search/LspTool/LspTool'\r\nimport { MCPTool } from './mcp/MCPTool/MCPTool'\r\nimport { NotebookEditTool } from './filesystem/NotebookEditTool/NotebookEditTool'\r\nimport { ReadMcpResourceTool } from './mcp/ReadMcpResourceTool/ReadMcpResourceTool'\r\nimport { SlashCommandTool } from './interaction/SlashCommandTool/SlashCommandTool'\r\nimport { SkillTool } from './ai/SkillTool/SkillTool'\r\nimport { TaskTool } from './agent/TaskTool/TaskTool'\r\nimport { TodoWriteTool } from './interaction/TodoWriteTool/TodoWriteTool'\r\nimport { WebFetchTool } from './network/WebFetchTool/WebFetchTool'\r\nimport { WebSearchTool } from './network/WebSearchTool/WebSearchTool'\r\nimport { getMCPTools } from '@services/mcpClient'\r\nimport { getGameTools } from './game/index'\r\n\r\nexport const getAllTools = (): Tool[] => [\r\n TaskTool as unknown as Tool,\r\n AskExpertModelTool as unknown as Tool,\r\n BashTool as unknown as Tool,\r\n TaskOutputTool as unknown as Tool,\r\n KillShellTool as unknown as Tool,\r\n GlobTool as unknown as Tool,\r\n GrepTool as unknown as Tool,\r\n LspTool as unknown as Tool,\r\n FileReadTool as unknown as Tool,\r\n FileEditTool as unknown as Tool,\r\n FileWriteTool as unknown as Tool,\r\n NotebookEditTool as unknown as Tool,\r\n TodoWriteTool as unknown as Tool,\r\n WebSearchTool as unknown as Tool,\r\n WebFetchTool as unknown as Tool,\r\n AskUserQuestionTool as unknown as Tool,\r\n EnterPlanModeTool as unknown as Tool,\r\n ExitPlanModeTool as unknown as Tool,\r\n SlashCommandTool as unknown as Tool,\r\n SkillTool as unknown as Tool,\r\n ListMcpResourcesTool as unknown as Tool,\r\n ReadMcpResourceTool as unknown as Tool,\r\n MCPTool as unknown as Tool,\r\n ...getGameTools(),\r\n]\r\n\r\nexport const getTools = memoize(\r\n async (_includeOptional?: boolean): Promise<Tool[]> => {\r\n const tools = [...getAllTools(), ...(await getMCPTools())]\r\n\r\n const isEnabled = await Promise.all(tools.map(tool => tool.isEnabled()))\r\n return tools.filter((_, i) => isEnabled[i])\r\n },\r\n)\r\n\r\nexport const getReadOnlyTools = memoize(async (): Promise<Tool[]> => {\r\n const tools = getAllTools().filter(tool => tool.isReadOnly())\r\n const isEnabled = await Promise.all(tools.map(tool => tool.isEnabled()))\r\n return tools.filter((_, index) => isEnabled[index])\r\n})\r\n", "import * as React from 'react'\r\nimport { Box, Text } from 'ink'\r\nimport { z } from 'zod'\r\nimport { Tool, ValidationResult } from '@tool'\r\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\r\nimport { getModelManager } from '@utils/model'\r\nimport { getTheme } from '@utils/theme'\r\nimport {\r\n createUserMessage,\r\n createAssistantMessage,\r\n INTERRUPT_MESSAGE,\r\n} from '@utils/messages'\r\nimport { logError } from '@utils/log'\r\nimport {\r\n createExpertChatSession,\r\n loadExpertChatSession,\r\n getSessionMessages,\r\n addMessageToSession,\r\n} from '@utils/session/expertChatStorage'\r\nimport { queryLLM } from '@services/llmLazy'\r\nimport { debug as debugLogger } from '@utils/log/debugLogger'\r\nimport { applyMarkdown } from '@utils/text/markdown'\r\n\r\nexport const inputSchema = z.strictObject({\r\n question: z\r\n .string()\r\n .describe(\r\n 'COMPLETE SELF-CONTAINED QUESTION: Must include full background context, relevant details, and a clear independent question. The expert model will receive ONLY this content with no access to previous conversation or external context. Structure as: 1) Background/Context 2) Specific situation/problem 3) Clear question. Ensure the expert can fully understand and respond without needing additional information.',\r\n ),\r\n expert_model: z\r\n .string()\r\n .describe(\r\n 'The expert model to use (e.g., gpt-5, claude-3-5-sonnet-20241022)',\r\n ),\r\n chat_session_id: z\r\n .string()\r\n .describe(\r\n 'Chat session ID: use \"new\" for new session or existing session ID',\r\n ),\r\n})\r\n\r\ntype In = typeof inputSchema\r\nexport type Out = {\r\n chatSessionId: string\r\n expertModelName: string\r\n expertAnswer: string\r\n}\r\n\r\nexport const AskExpertModelTool = {\r\n name: 'AskExpertModel',\r\n async description() {\r\n return 'Consult external AI models for expert opinions and analysis'\r\n },\r\n async prompt() {\r\n return `Ask a question to a specific external AI model for expert analysis.\r\n\r\nThis tool allows you to consult different AI models for their unique perspectives and expertise.\r\n\r\nCRITICAL REQUIREMENT FOR QUESTION PARAMETER:\r\nThe question MUST be completely self-contained and include:\r\n1. FULL BACKGROUND CONTEXT - All relevant information the expert needs\r\n2. SPECIFIC SITUATION - Clear description of the current scenario/problem\r\n3. INDEPENDENT QUESTION - What exactly you want the expert to analyze/answer\r\n\r\nThe expert model receives ONLY your question content with NO access to:\r\n- Previous conversation history (unless using existing session) \r\n- Current codebase or file context\r\n- User's current task or project details\r\n\r\nIMPORTANT: This tool is for asking questions to models, not for task execution.\r\n- Use when you need a specific model's opinion or analysis\r\n- Use when you want to compare different models' responses\r\n- Use the @ask-[model] format when available\r\n\r\nThe expert_model parameter accepts:\r\n- OpenAI: gpt-4, gpt-5, o1-preview\r\n- Messages API: claude-3-5-sonnet, claude-3-opus \r\n- Others: kimi, gemini-pro, mixtral\r\n\r\nExample of well-structured question:\r\n\"Background: I'm working on a React TypeScript application with performance issues. The app renders a large list of 10,000 items using a simple map() function, causing UI freezing.\r\n\r\nCurrent situation: Users report 3-5 second delays when scrolling through the list. The component re-renders the entire list on every state change.\r\n\r\nQuestion: What are the most effective React optimization techniques for handling large lists, and how should I prioritize implementing virtualization vs memoization vs other approaches?\"`\r\n },\r\n isReadOnly() {\r\n return true\r\n },\r\n isConcurrencySafe() {\r\n return true\r\n },\r\n inputSchema,\r\n userFacingName() {\r\n return 'AskExpertModel'\r\n },\r\n async isEnabled() {\r\n return true\r\n },\r\n needsPermissions(): boolean {\r\n return false\r\n },\r\n async validateInput(\r\n { question, expert_model, chat_session_id },\r\n context?: any,\r\n ): Promise<ValidationResult> {\r\n if (!question.trim()) {\r\n return { result: false, message: 'Question cannot be empty' }\r\n }\r\n\r\n if (!expert_model.trim()) {\r\n return { result: false, message: 'Expert model must be specified' }\r\n }\r\n\r\n if (!chat_session_id.trim()) {\r\n return {\r\n result: false,\r\n message:\r\n 'Chat session ID must be specified (use \"new\" for new session)',\r\n }\r\n }\r\n\r\n try {\r\n const modelManager = getModelManager()\r\n\r\n let currentModel: string\r\n if (context?.agentId && context?.options?.model) {\r\n currentModel = context.options.model\r\n } else {\r\n currentModel = modelManager.getModelName('main') || ''\r\n }\r\n\r\n const normalizedExpert = expert_model\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]/g, '')\r\n const normalizedCurrent = currentModel\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]/g, '')\r\n\r\n if (normalizedExpert === normalizedCurrent) {\r\n return {\r\n result: false,\r\n message: `You are already running as ${currentModel}. Consulting the same model would be redundant. Please choose a different model or handle the task directly.`,\r\n }\r\n }\r\n } catch (e) {\r\n debugLogger.error('AskExpertModel', {\r\n message: 'Could not determine current model',\r\n error: e,\r\n })\r\n }\r\n\r\n try {\r\n const modelManager = getModelManager()\r\n const modelResolution = modelManager.resolveModelWithInfo(expert_model)\r\n\r\n if (!modelResolution.success) {\r\n const availableModels = modelManager.getAllAvailableModelNames()\r\n if (availableModels.length > 0) {\r\n return {\r\n result: false,\r\n message: `Model '${expert_model}' is not configured. Available models: ${availableModels.join(', ')}. Check if any available model closely matches the user's request (e.g., 'kimi' matches 'kimi-k2-0711-preview'). If there's a strong match, auto retry using the correct model name. If no close match exists, inform the user that '${expert_model}' needs to be configured using /model command.`,\r\n }\r\n } else {\r\n return {\r\n result: false,\r\n message: `Model '${expert_model}' not found and no models are currently configured in the system. Inform the user that models need to be configured first using the /model command.`,\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n logError(error)\r\n return {\r\n result: false,\r\n message: `Failed to validate expert model '${expert_model}'. Please check your model configuration.`,\r\n }\r\n }\r\n\r\n return { result: true }\r\n },\r\n\r\n renderToolUseMessage(\r\n { question, expert_model, chat_session_id },\r\n { verbose },\r\n ) {\r\n if (!question || !expert_model) return null\r\n const isNewSession = chat_session_id === 'new'\r\n const sessionDisplay = isNewSession\r\n ? 'new session'\r\n : `session ${chat_session_id.substring(0, 5)}...`\r\n const theme = getTheme()\r\n\r\n if (verbose) {\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Text bold color=\"yellow\">\r\n {expert_model}\r\n </Text>\r\n <Text color={theme.secondaryText}>{sessionDisplay}</Text>\r\n <Box marginTop={1}>\r\n <Text color={theme.text}>\r\n {question.length > 300\r\n ? question.substring(0, 300) + '...'\r\n : question}\r\n </Text>\r\n </Box>\r\n </Box>\r\n )\r\n }\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Text bold color=\"yellow\">\r\n {expert_model}{' '}\r\n </Text>\r\n <Text color={theme.secondaryText} dimColor>\r\n ({sessionDisplay})\r\n </Text>\r\n </Box>\r\n )\r\n },\r\n\r\n renderToolResultMessage(content) {\r\n const verbose = true\r\n const theme = getTheme()\r\n\r\n if (typeof content === 'object' && content && 'expertAnswer' in content) {\r\n const expertResult = content as Out\r\n const isError =\r\n expertResult.expertAnswer.startsWith('Error') ||\r\n expertResult.expertAnswer.includes('failed')\r\n const isInterrupted = expertResult.chatSessionId === 'interrupted'\r\n\r\n if (isInterrupted) {\r\n return (\r\n <Box flexDirection=\"row\">\r\n <Text color={theme.secondaryText}>Consultation interrupted</Text>\r\n </Box>\r\n )\r\n }\r\n\r\n const answerText = verbose\r\n ? expertResult.expertAnswer.trim()\r\n : expertResult.expertAnswer.length > 500\r\n ? expertResult.expertAnswer.substring(0, 500) + '...'\r\n : expertResult.expertAnswer.trim()\r\n\r\n if (isError) {\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Text color=\"red\">{answerText}</Text>\r\n </Box>\r\n )\r\n }\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Text bold color={theme.text}>\r\n Response from {expertResult.expertModelName}:\r\n </Text>\r\n <Box marginTop={1}>\r\n <Text color={theme.text}>{applyMarkdown(answerText)}</Text>\r\n </Box>\r\n <Box marginTop={1}>\r\n <Text color={theme.secondaryText} dimColor>\r\n Session: {expertResult.chatSessionId.substring(0, 8)}\r\n </Text>\r\n </Box>\r\n </Box>\r\n )\r\n }\r\n\r\n return (\r\n <Box flexDirection=\"row\">\r\n <Text color={theme.secondaryText}>Consultation completed</Text>\r\n </Box>\r\n )\r\n },\r\n\r\n renderResultForAssistant(output: Out): string {\r\n return `[Expert consultation completed]\r\nExpert Model: ${output.expertModelName}\r\nSession ID: ${output.chatSessionId}\r\nTo continue this conversation with context preservation, use this Session ID in your next AskExpertModel call to maintain the full conversation history and context.\r\n\r\n${output.expertAnswer}`\r\n },\r\n\r\n renderToolUseRejectedMessage() {\r\n return <FallbackToolUseRejectedMessage />\r\n },\r\n\r\n async *call(\r\n { question, expert_model, chat_session_id },\r\n { abortController, readFileTimestamps },\r\n ) {\r\n const expertModel = expert_model\r\n\r\n let sessionId: string\r\n let isInterrupted = false\r\n\r\n const abortListener = () => {\r\n isInterrupted = true\r\n }\r\n abortController.signal.addEventListener('abort', abortListener)\r\n\r\n try {\r\n if (abortController.signal.aborted) {\r\n return yield* this.handleInterrupt()\r\n }\r\n if (chat_session_id === 'new') {\r\n try {\r\n const session = createExpertChatSession(expertModel)\r\n sessionId = session.sessionId\r\n } catch (error) {\r\n logError(error)\r\n throw new Error('Failed to create new chat session')\r\n }\r\n } else {\r\n sessionId = chat_session_id\r\n try {\r\n const session = loadExpertChatSession(sessionId)\r\n if (!session) {\r\n const newSession = createExpertChatSession(expertModel)\r\n sessionId = newSession.sessionId\r\n }\r\n } catch (error) {\r\n logError(error)\r\n try {\r\n const newSession = createExpertChatSession(expertModel)\r\n sessionId = newSession.sessionId\r\n } catch (createError) {\r\n logError(createError)\r\n throw new Error('Unable to create or load chat session')\r\n }\r\n }\r\n }\r\n\r\n if (isInterrupted || abortController.signal.aborted) {\r\n return yield* this.handleInterrupt()\r\n }\r\n\r\n let historyMessages: Array<{ role: string; content: string }>\r\n try {\r\n historyMessages = getSessionMessages(sessionId)\r\n } catch (error) {\r\n logError(error)\r\n historyMessages = []\r\n }\r\n\r\n const messages = [...historyMessages, { role: 'user', content: question }]\r\n\r\n let systemMessages\r\n try {\r\n systemMessages = messages.map(msg =>\r\n msg.role === 'user'\r\n ? createUserMessage(msg.content)\r\n : createAssistantMessage(msg.content),\r\n )\r\n } catch (error) {\r\n logError(error)\r\n throw new Error('Failed to prepare conversation messages')\r\n }\r\n\r\n if (isInterrupted || abortController.signal.aborted) {\r\n return yield* this.handleInterrupt()\r\n }\r\n\r\n yield {\r\n type: 'progress',\r\n content: createAssistantMessage(\r\n `Connecting to ${expertModel}... (timeout: 5 minutes)`,\r\n ),\r\n }\r\n\r\n let response\r\n try {\r\n const modelManager = getModelManager()\r\n const modelResolution = modelManager.resolveModelWithInfo(expertModel)\r\n\r\n debugLogger.api('EXPERT_MODEL_RESOLUTION', {\r\n requestedModel: expertModel,\r\n success: modelResolution.success,\r\n profileName: modelResolution.profile?.name,\r\n profileModelName: modelResolution.profile?.modelName,\r\n provider: modelResolution.profile?.provider,\r\n isActive: modelResolution.profile?.isActive,\r\n error: modelResolution.error,\r\n })\r\n\r\n const timeoutMs = 300000\r\n const timeoutPromise = new Promise((_, reject) => {\r\n setTimeout(() => {\r\n reject(\r\n new Error(\r\n `Expert model query timed out after ${timeoutMs / 1000}s`,\r\n ),\r\n )\r\n }, timeoutMs)\r\n })\r\n\r\n response = await Promise.race([\r\n queryLLM(\r\n systemMessages,\r\n [],\r\n 0,\r\n [],\r\n abortController.signal,\r\n {\r\n safeMode: false,\r\n model: expertModel,\r\n prependCLISysprompt: false,\r\n },\r\n ),\r\n timeoutPromise,\r\n ])\r\n } catch (error: any) {\r\n logError(error)\r\n\r\n if (\r\n error.name === 'AbortError' ||\r\n abortController.signal?.aborted ||\r\n isInterrupted\r\n ) {\r\n return yield* this.handleInterrupt()\r\n }\r\n\r\n if (error.message?.includes('timed out')) {\r\n throw new Error(\r\n `Expert model '${expertModel}' timed out after 5 minutes.\\n\\n` +\r\n `Suggestions:\\n` +\r\n ` - The model might be experiencing high load\\n` +\r\n ` - Try a different model or retry later\\n` +\r\n ` - Consider breaking down your question into smaller parts`,\r\n )\r\n }\r\n\r\n if (error.message?.includes('rate limit')) {\r\n throw new Error(\r\n `Rate limit exceeded for ${expertModel}.\\n\\n` +\r\n `Please wait a moment and try again, or use a different model.`,\r\n )\r\n }\r\n\r\n if (error.message?.includes('invalid api key')) {\r\n throw new Error(\r\n `Invalid API key for ${expertModel}.\\n\\n` +\r\n `Please check your model configuration with /model command.`,\r\n )\r\n }\r\n\r\n if (\r\n error.message?.includes('model not found') ||\r\n error.message?.includes('Failed to resolve model')\r\n ) {\r\n try {\r\n const modelManager = getModelManager()\r\n const availableModels = modelManager.getAllAvailableModelNames()\r\n if (availableModels.length > 0) {\r\n throw new Error(\r\n `Model '${expertModel}' is not configured. Available models: ${availableModels.join(', ')}. Check if any available model closely matches the user's request (e.g., 'kimi' matches 'kimi-k2-0711-preview'). If there's a strong match, auto retry using the correct model name. If no close match exists, inform the user that '${expertModel}' needs to be configured using /model command.`,\r\n )\r\n } else {\r\n throw new Error(\r\n `Model '${expertModel}' not found and no models are currently configured in the system. Inform the user that models need to be configured first using the /model command.`,\r\n )\r\n }\r\n } catch (modelError) {\r\n throw new Error(\r\n `Model '${expertModel}' not found. Please check model configuration or inform user about the issue.`,\r\n )\r\n }\r\n }\r\n\r\n throw new Error(\r\n `Expert model query failed: ${error.message || 'Unknown error'}`,\r\n )\r\n }\r\n\r\n let expertAnswer: string\r\n try {\r\n if (!response?.message?.content) {\r\n throw new Error('No content in expert response')\r\n }\r\n\r\n expertAnswer = response.message.content\r\n .filter(block => block.type === 'text')\r\n .map(block => (block as any).text)\r\n .join('\\n')\r\n\r\n if (!expertAnswer.trim()) {\r\n throw new Error('Expert response was empty')\r\n }\r\n } catch (error) {\r\n logError(error)\r\n throw new Error('Failed to process expert response')\r\n }\r\n\r\n try {\r\n addMessageToSession(sessionId, 'user', question)\r\n addMessageToSession(sessionId, 'assistant', expertAnswer)\r\n } catch (error) {\r\n logError(error)\r\n }\r\n\r\n const result: Out = {\r\n chatSessionId: sessionId,\r\n expertModelName: expertModel,\r\n expertAnswer: expertAnswer,\r\n }\r\n\r\n yield {\r\n type: 'result',\r\n data: result,\r\n resultForAssistant: this.renderResultForAssistant(result),\r\n }\r\n } catch (error: any) {\r\n if (\r\n error.name === 'AbortError' ||\r\n abortController.signal?.aborted ||\r\n isInterrupted\r\n ) {\r\n return yield* this.handleInterrupt()\r\n }\r\n\r\n logError(error)\r\n\r\n const errorSessionId = sessionId || 'error-session'\r\n\r\n const errorMessage =\r\n error.message || 'Expert consultation failed with unknown error'\r\n const result: Out = {\r\n chatSessionId: errorSessionId,\r\n expertModelName: expertModel,\r\n expertAnswer: `\u274C ${errorMessage}`,\r\n }\r\n\r\n yield {\r\n type: 'result',\r\n data: result,\r\n resultForAssistant: this.renderResultForAssistant(result),\r\n }\r\n } finally {\r\n abortController.signal.removeEventListener('abort', abortListener)\r\n }\r\n },\r\n\r\n async *handleInterrupt() {\r\n yield {\r\n type: 'result',\r\n data: {\r\n chatSessionId: 'interrupted',\r\n expertModelName: 'cancelled',\r\n expertAnswer: INTERRUPT_MESSAGE,\r\n },\r\n resultForAssistant: INTERRUPT_MESSAGE,\r\n }\r\n },\r\n}\r\n", "import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs'\r\nimport { join } from 'path'\r\nimport { homedir } from 'os'\r\nimport { randomUUID } from 'crypto'\r\nimport { debug as debugLogger } from '@utils/log/debugLogger'\r\nimport { logError } from '@utils/log'\r\n\r\n\r\nexport interface ChatMessage {\r\n role: 'user' | 'assistant'\r\n content: string\r\n}\r\n\r\nexport interface ExpertChatSession {\r\n sessionId: string\r\n expertModel: string\r\n messages: ChatMessage[]\r\n createdAt: number\r\n lastUpdated: number\r\n}\r\n\r\nfunction getExpertChatDirectory(): string {\r\n const configDir =\r\n process.env.DANYA_CONFIG_DIR ??\r\n process.env.KODE_CONFIG_DIR ??\r\n process.env.ANYKODE_CONFIG_DIR ??\r\n join(homedir(), '.danya')\r\n const expertChatDir = join(configDir, 'expert-chats')\r\n\r\n if (!existsSync(expertChatDir)) {\r\n mkdirSync(expertChatDir, { recursive: true })\r\n }\r\n\r\n return expertChatDir\r\n}\r\n\r\nfunction getSessionFilePath(sessionId: string): string {\r\n return join(getExpertChatDirectory(), `${sessionId}.json`)\r\n}\r\n\r\nexport function createExpertChatSession(\r\n expertModel: string,\r\n): ExpertChatSession {\r\n const sessionId = randomUUID().slice(0, 5)\r\n const session: ExpertChatSession = {\r\n sessionId,\r\n expertModel,\r\n messages: [],\r\n createdAt: Date.now(),\r\n lastUpdated: Date.now(),\r\n }\r\n\r\n saveExpertChatSession(session)\r\n return session\r\n}\r\n\r\nexport function loadExpertChatSession(\r\n sessionId: string,\r\n): ExpertChatSession | null {\r\n const filePath = getSessionFilePath(sessionId)\r\n\r\n if (!existsSync(filePath)) {\r\n return null\r\n }\r\n\r\n try {\r\n const content = readFileSync(filePath, 'utf-8')\r\n return JSON.parse(content) as ExpertChatSession\r\n } catch (error) {\r\n logError(error)\r\n debugLogger.warn('EXPERT_CHAT_SESSION_LOAD_FAILED', {\r\n sessionId,\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n return null\r\n }\r\n}\r\n\r\nexport function saveExpertChatSession(session: ExpertChatSession): void {\r\n const filePath = getSessionFilePath(session.sessionId)\r\n\r\n try {\r\n session.lastUpdated = Date.now()\r\n writeFileSync(filePath, JSON.stringify(session, null, 2), 'utf-8')\r\n } catch (error) {\r\n logError(error)\r\n debugLogger.warn('EXPERT_CHAT_SESSION_SAVE_FAILED', {\r\n sessionId: session.sessionId,\r\n error: error instanceof Error ? error.message : String(error),\r\n })\r\n throw error\r\n }\r\n}\r\n\r\nexport function addMessageToSession(\r\n sessionId: string,\r\n role: 'user' | 'assistant',\r\n content: string,\r\n): ExpertChatSession | null {\r\n const session = loadExpertChatSession(sessionId)\r\n if (!session) {\r\n return null\r\n }\r\n\r\n session.messages.push({ role, content })\r\n saveExpertChatSession(session)\r\n\r\n return session\r\n}\r\n\r\nexport function getSessionMessages(sessionId: string): ChatMessage[] {\r\n const session = loadExpertChatSession(sessionId)\r\n return session?.messages || []\r\n}\r\n\r\nexport function generateSessionId(): string {\r\n return randomUUID().slice(0, 5)\r\n}\r\n", "import { Box, Text } from 'ink'\r\nimport React from 'react'\r\nimport { z } from 'zod'\r\nimport type { Tool, ToolUseContext, ValidationResult } from '@tool'\r\nimport { BunShell } from '@utils/bun/shell'\r\nimport {\r\n getBackgroundAgentTaskSnapshot,\r\n waitForBackgroundAgentTask,\r\n} from '@utils/session/backgroundTasks'\r\nimport { createAssistantMessage } from '@utils/messages'\r\nimport { maybeTruncateVerboseToolOutput } from '@utils/tooling/toolOutputDisplay'\r\nimport { DESCRIPTION, PROMPT, TOOL_NAME_FOR_PROMPT } from './prompt'\r\nimport { getTheme } from '@utils/theme'\r\nimport { readTaskOutput } from '@utils/log/taskOutputStore'\r\n\r\nconst inputSchema = z.strictObject({\r\n task_id: z.string().describe('The task ID to get output from'),\r\n block: z\r\n .boolean()\r\n .optional()\r\n .default(true)\r\n .describe('Whether to wait for completion'),\r\n timeout: z\r\n .number()\r\n .min(0)\r\n .max(600000)\r\n .optional()\r\n .default(30000)\r\n .describe('Max wait time in ms'),\r\n})\r\n\r\ntype Input = z.infer<typeof inputSchema>\r\n\r\ntype TaskType = 'local_bash' | 'local_agent' | 'remote_agent'\r\ntype TaskStatus = 'running' | 'pending' | 'completed' | 'failed' | 'killed'\r\n\r\ntype TaskSummary = {\r\n task_id: string\r\n task_type: TaskType\r\n status: TaskStatus\r\n description: string\r\n output?: string\r\n exitCode?: number | null\r\n prompt?: string\r\n result?: string\r\n error?: string\r\n}\r\n\r\ntype Output = {\r\n retrieval_status: 'success' | 'timeout' | 'not_ready'\r\n task: TaskSummary | null\r\n}\r\n\r\nfunction normalizeTaskOutputInput(input: Record<string, unknown>): Input {\r\n const task_id =\r\n (typeof input.task_id === 'string' && input.task_id) ||\r\n (typeof (input as any).agentId === 'string' &&\r\n String((input as any).agentId)) ||\r\n (typeof (input as any).bash_id === 'string' &&\r\n String((input as any).bash_id)) ||\r\n ''\r\n\r\n const block = typeof input.block === 'boolean' ? input.block : true\r\n\r\n const timeout =\r\n typeof input.timeout === 'number'\r\n ? input.timeout\r\n : typeof (input as any).wait_up_to === 'number'\r\n ? Number((input as any).wait_up_to) * 1000\r\n : 30000\r\n\r\n return { task_id, block, timeout }\r\n}\r\n\r\nfunction taskStatusFromBash(\r\n bg: ReturnType<BunShell['getBackgroundOutput']>,\r\n): TaskStatus {\r\n if (!bg) return 'failed'\r\n if (bg.killed) return 'killed'\r\n if (bg.code === null) return 'running'\r\n return bg.code === 0 ? 'completed' : 'failed'\r\n}\r\n\r\nfunction buildTaskSummary(taskId: string): TaskSummary | null {\r\n const bg = BunShell.getInstance().getBackgroundOutput(taskId)\r\n if (bg) {\r\n return {\r\n task_id: taskId,\r\n task_type: 'local_bash',\r\n status: taskStatusFromBash(bg),\r\n description: bg.command,\r\n output: readTaskOutput(taskId),\r\n exitCode: bg.code,\r\n }\r\n }\r\n\r\n const agent = getBackgroundAgentTaskSnapshot(taskId)\r\n if (agent) {\r\n const output = readTaskOutput(taskId) || agent.resultText || ''\r\n return {\r\n task_id: taskId,\r\n task_type: 'local_agent',\r\n status: agent.status,\r\n description: agent.description,\r\n output,\r\n prompt: agent.prompt,\r\n result: output,\r\n error: agent.error,\r\n }\r\n }\r\n\r\n return null\r\n}\r\n\r\nasync function waitForBashTaskCompletion(args: {\r\n taskId: string\r\n timeoutMs: number\r\n signal: AbortSignal\r\n}): Promise<TaskSummary | null> {\r\n const { taskId, timeoutMs, signal } = args\r\n const startedAt = Date.now()\r\n\r\n while (Date.now() - startedAt < timeoutMs) {\r\n if (signal.aborted) return null\r\n const summary = buildTaskSummary(taskId)\r\n if (!summary) return null\r\n if (summary.status !== 'running' && summary.status !== 'pending')\r\n return summary\r\n await new Promise(resolve => setTimeout(resolve, 100))\r\n }\r\n\r\n return buildTaskSummary(taskId)\r\n}\r\n\r\nexport const TaskOutputTool = {\r\n name: TOOL_NAME_FOR_PROMPT,\r\n async description() {\r\n return DESCRIPTION\r\n },\r\n userFacingName() {\r\n return 'Task Output'\r\n },\r\n inputSchema,\r\n isReadOnly() {\r\n return true\r\n },\r\n isConcurrencySafe() {\r\n return true\r\n },\r\n async isEnabled() {\r\n return true\r\n },\r\n needsPermissions() {\r\n return false\r\n },\r\n async prompt() {\r\n return PROMPT\r\n },\r\n renderToolUseMessage(input: any) {\r\n const normalized = normalizeTaskOutputInput(input as any)\r\n if (!normalized.block) return 'non-blocking'\r\n return ''\r\n },\r\n renderToolUseRejectedMessage() {\r\n return null\r\n },\r\n renderToolResultMessage(output: Output, { verbose }: { verbose: boolean }) {\r\n const theme = getTheme()\r\n\r\n if (\r\n output.retrieval_status === 'timeout' ||\r\n output.retrieval_status === 'not_ready'\r\n ) {\r\n return (\r\n <Box>\r\n <Text color={theme.secondaryText}>Task is still running\u2026</Text>\r\n </Box>\r\n )\r\n }\r\n\r\n if (!output.task) {\r\n return (\r\n <Box>\r\n <Text color={theme.secondaryText}>No task output available</Text>\r\n </Box>\r\n )\r\n }\r\n\r\n if (output.task.task_type === 'local_agent') {\r\n const lines = output.task.result\r\n ? output.task.result.split('\\n').length\r\n : 0\r\n if (!verbose) {\r\n return (\r\n <Box>\r\n <Text color={theme.secondaryText}>\r\n Read output (ctrl+o to expand)\r\n </Text>\r\n </Box>\r\n )\r\n }\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Text>\r\n {output.task.description} ({lines} lines)\r\n </Text>\r\n {output.task.prompt ? (\r\n <Box paddingLeft={2}>\r\n <Text color={theme.secondaryText}>{output.task.prompt}</Text>\r\n </Box>\r\n ) : null}\r\n {output.task.result ? (\r\n <Box paddingLeft={2} marginTop={1}>\r\n <Text>\r\n {\r\n maybeTruncateVerboseToolOutput(output.task.result, {\r\n maxLines: 200,\r\n maxChars: 40_000,\r\n }).text\r\n }\r\n </Text>\r\n </Box>\r\n ) : null}\r\n {output.task.error ? (\r\n <Box flexDirection=\"column\" marginTop={1} paddingLeft={2}>\r\n <Text color={theme.error} bold>\r\n Error:\r\n </Text>\r\n <Text color={theme.error}>{output.task.error}</Text>\r\n </Box>\r\n ) : null}\r\n </Box>\r\n )\r\n }\r\n\r\n const content = output.task.output?.trimEnd() ?? ''\r\n if (!verbose) {\r\n return (\r\n <Box>\r\n <Text color={theme.secondaryText}>\r\n {content.length > 0\r\n ? 'Read output (ctrl+o to expand)'\r\n : '(No content)'}\r\n </Text>\r\n </Box>\r\n )\r\n }\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Text color={theme.secondaryText}>{output.task.description}</Text>\r\n {content ? (\r\n <Box paddingLeft={2} marginTop={1}>\r\n <Text>\r\n {\r\n maybeTruncateVerboseToolOutput(content, {\r\n maxLines: 200,\r\n maxChars: 40_000,\r\n }).text\r\n }\r\n </Text>\r\n </Box>\r\n ) : null}\r\n </Box>\r\n )\r\n },\r\n renderResultForAssistant(output: Output) {\r\n const parts: string[] = []\r\n parts.push(\r\n `<retrieval_status>${output.retrieval_status}</retrieval_status>`,\r\n )\r\n\r\n if (output.task) {\r\n parts.push(`<task_id>${output.task.task_id}</task_id>`)\r\n parts.push(`<task_type>${output.task.task_type}</task_type>`)\r\n parts.push(`<status>${output.task.status}</status>`)\r\n if (output.task.exitCode !== undefined && output.task.exitCode !== null) {\r\n parts.push(`<exit_code>${output.task.exitCode}</exit_code>`)\r\n }\r\n if (output.task.output?.trim()) {\r\n parts.push(`<output>\\n${output.task.output.trimEnd()}\\n</output>`)\r\n }\r\n if (output.task.error) {\r\n parts.push(`<error>${output.task.error}</error>`)\r\n }\r\n }\r\n\r\n return parts.join('\\n\\n')\r\n },\r\n async validateInput(input: Input): Promise<ValidationResult> {\r\n if (!input.task_id) {\r\n return { result: false, message: 'Task ID is required', errorCode: 1 }\r\n }\r\n\r\n const task = buildTaskSummary(input.task_id)\r\n if (!task) {\r\n return {\r\n result: false,\r\n message: `No task found with ID: ${input.task_id}`,\r\n errorCode: 2,\r\n }\r\n }\r\n\r\n return { result: true }\r\n },\r\n async *call(input: Input, context: ToolUseContext) {\r\n const normalized = normalizeTaskOutputInput(input as any)\r\n const taskId = normalized.task_id\r\n const block = normalized.block\r\n const timeoutMs = normalized.timeout\r\n\r\n const initial = buildTaskSummary(taskId)\r\n if (!initial) {\r\n throw new Error(`No task found with ID: ${taskId}`)\r\n }\r\n\r\n if (!block) {\r\n const isDone =\r\n initial.status !== 'running' && initial.status !== 'pending'\r\n const out: Output = {\r\n retrieval_status: isDone ? 'success' : 'not_ready',\r\n task: initial,\r\n }\r\n yield {\r\n type: 'result',\r\n data: out,\r\n resultForAssistant: this.renderResultForAssistant(out),\r\n }\r\n return\r\n }\r\n\r\n yield {\r\n type: 'progress',\r\n content: createAssistantMessage(\r\n `<tool-progress>${initial.description ? ` ${initial.description}\\n` : ''} Waiting for task (esc to give additional instructions)</tool-progress>`,\r\n ),\r\n }\r\n\r\n let finalTask: TaskSummary | null = null\r\n\r\n if (initial.task_type === 'local_agent') {\r\n try {\r\n const task = await waitForBackgroundAgentTask(\r\n taskId,\r\n timeoutMs,\r\n context.abortController.signal,\r\n )\r\n finalTask = task ? buildTaskSummary(taskId) : null\r\n } catch {\r\n finalTask = buildTaskSummary(taskId)\r\n }\r\n } else {\r\n finalTask = await waitForBashTaskCompletion({\r\n taskId,\r\n timeoutMs,\r\n signal: context.abortController.signal,\r\n })\r\n }\r\n\r\n if (!finalTask) {\r\n const out: Output = { retrieval_status: 'timeout', task: null }\r\n yield {\r\n type: 'result',\r\n data: out,\r\n resultForAssistant: this.renderResultForAssistant(out),\r\n }\r\n return\r\n }\r\n\r\n if (finalTask.status === 'running' || finalTask.status === 'pending') {\r\n const out: Output = { retrieval_status: 'timeout', task: finalTask }\r\n yield {\r\n type: 'result',\r\n data: out,\r\n resultForAssistant: this.renderResultForAssistant(out),\r\n }\r\n return\r\n }\r\n\r\n const out: Output = { retrieval_status: 'success', task: finalTask }\r\n yield {\r\n type: 'result',\r\n data: out,\r\n resultForAssistant: this.renderResultForAssistant(out),\r\n }\r\n },\r\n} satisfies Tool<typeof inputSchema, Output>\r\n", "import type { Message as ConversationMessage } from '@query'\r\n\r\nexport type BackgroundAgentStatus =\r\n | 'running'\r\n | 'completed'\r\n | 'failed'\r\n | 'killed'\r\n\r\nexport type BackgroundAgentTask = {\r\n type: 'async_agent'\r\n agentId: string\r\n description: string\r\n prompt: string\r\n status: BackgroundAgentStatus\r\n startedAt: number\r\n completedAt?: number\r\n error?: string\r\n resultText?: string\r\n messages: ConversationMessage[]\r\n retrieved?: boolean\r\n}\r\n\r\nexport type BackgroundAgentTaskRuntime = BackgroundAgentTask & {\r\n abortController: AbortController\r\n done: Promise<void>\r\n}\r\n\r\nconst backgroundTasks = new Map<string, BackgroundAgentTaskRuntime>()\r\n\r\nexport function getBackgroundAgentTask(\r\n agentId: string,\r\n): BackgroundAgentTaskRuntime | undefined {\r\n return backgroundTasks.get(agentId)\r\n}\r\n\r\nexport function getBackgroundAgentTaskSnapshot(\r\n agentId: string,\r\n): BackgroundAgentTask | undefined {\r\n const task = backgroundTasks.get(agentId)\r\n if (!task) return undefined\r\n const { abortController: _abortController, done: _done, ...snapshot } = task\r\n return snapshot\r\n}\r\n\r\nexport function upsertBackgroundAgentTask(\r\n task: BackgroundAgentTaskRuntime,\r\n): void {\r\n backgroundTasks.set(task.agentId, task)\r\n}\r\n\r\nexport function markBackgroundAgentTaskRetrieved(agentId: string): void {\r\n const task = backgroundTasks.get(agentId)\r\n if (!task) return\r\n task.retrieved = true\r\n}\r\n\r\nexport async function waitForBackgroundAgentTask(\r\n agentId: string,\r\n waitUpToMs: number,\r\n signal: AbortSignal,\r\n): Promise<BackgroundAgentTaskRuntime | undefined> {\r\n const task = backgroundTasks.get(agentId)\r\n if (!task) return undefined\r\n if (task.status !== 'running') return task\r\n\r\n const timeoutPromise = new Promise<never>((_, reject) => {\r\n const timeoutId = setTimeout(() => {\r\n reject(new Error('Request timed out'))\r\n }, waitUpToMs)\r\n timeoutId.unref?.()\r\n })\r\n\r\n const abortPromise = new Promise<never>((_, reject) => {\r\n if (signal.aborted) {\r\n reject(new Error('Request aborted'))\r\n return\r\n }\r\n const onAbort = () => reject(new Error('Request aborted'))\r\n signal.addEventListener('abort', onAbort, { once: true })\r\n })\r\n\r\n await Promise.race([task.done, timeoutPromise, abortPromise])\r\n return backgroundTasks.get(agentId)\r\n}\r\n", "function isTruthyEnv(value: string | undefined): boolean {\r\n if (!value) return false\r\n return ['1', 'true', 'yes', 'on'].includes(value.trim().toLowerCase())\r\n}\r\n\r\nexport function isPackagedRuntime(): boolean {\r\n if (isTruthyEnv(process.env.DANYA_PACKAGED ?? process.env.KODE_PACKAGED)) return true\r\n\r\n try {\r\n const exec = (process.execPath || '').split(/[\\\\/]/).pop()?.toLowerCase()\r\n if (!exec) return false\r\n if (exec === 'bun' || exec === 'bun.exe') return false\r\n if (exec === 'node' || exec === 'node.exe') return false\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport type TruncateResult = {\r\n text: string\r\n truncated: boolean\r\n omittedLines: number\r\n omittedChars: number\r\n}\r\n\r\nexport function truncateTextForDisplay(\r\n text: string,\r\n options?: { maxLines?: number; maxChars?: number },\r\n): TruncateResult {\r\n const maxLines = options?.maxLines ?? 120\r\n const maxChars = options?.maxChars ?? 12_000\r\n\r\n const normalized = String(text ?? '')\r\n const lines = normalized.split(/\\r?\\n/)\r\n\r\n let workingLines = lines\r\n let omittedLines = 0\r\n if (maxLines > 0 && lines.length > maxLines) {\r\n workingLines = lines.slice(0, maxLines)\r\n omittedLines = lines.length - maxLines\r\n }\r\n\r\n let workingText = workingLines.join('\\n')\r\n let omittedChars = 0\r\n if (maxChars > 0 && workingText.length > maxChars) {\r\n omittedChars = workingText.length - maxChars\r\n workingText = workingText.slice(0, maxChars)\r\n }\r\n\r\n const truncated = omittedLines > 0 || omittedChars > 0\r\n if (!truncated) {\r\n return {\r\n text: workingText,\r\n truncated: false,\r\n omittedLines: 0,\r\n omittedChars: 0,\r\n }\r\n }\r\n\r\n const suffixParts: string[] = []\r\n if (omittedLines > 0) {\r\n suffixParts.push(`${omittedLines} lines`)\r\n }\r\n if (omittedChars > 0) {\r\n suffixParts.push(`${omittedChars} chars`)\r\n }\r\n\r\n const suffix = `\\n\\n... [truncated ${suffixParts.join(' \u00B7 ')}] ...`\r\n return {\r\n text: workingText + suffix,\r\n truncated: true,\r\n omittedLines,\r\n omittedChars,\r\n }\r\n}\r\n\r\nexport function maybeTruncateVerboseToolOutput(\r\n text: string,\r\n options?: { maxLines?: number; maxChars?: number },\r\n): { text: string; truncated: boolean } {\r\n const maxLinesEnv = Number(process.env.DANYA_TOOL_OUTPUT_MAX_LINES ?? process.env.KODE_TOOL_OUTPUT_MAX_LINES ?? '')\r\n const maxCharsEnv = Number(process.env.DANYA_TOOL_OUTPUT_MAX_CHARS ?? process.env.KODE_TOOL_OUTPUT_MAX_CHARS ?? '')\r\n const envOverrides = {\r\n maxLines:\r\n Number.isFinite(maxLinesEnv) && maxLinesEnv > 0 ? maxLinesEnv : undefined,\r\n maxChars:\r\n Number.isFinite(maxCharsEnv) && maxCharsEnv > 0 ? maxCharsEnv : undefined,\r\n }\r\n\r\n const effective = {\r\n maxLines: envOverrides.maxLines ?? options?.maxLines,\r\n maxChars: envOverrides.maxChars ?? options?.maxChars,\r\n }\r\n\r\n const fullAllowed = isTruthyEnv(process.env.DANYA_TOOL_OUTPUT_FULL ?? process.env.KODE_TOOL_OUTPUT_FULL)\r\n if (!isPackagedRuntime() || fullAllowed) {\r\n return { text: String(text ?? ''), truncated: false }\r\n }\r\n\r\n const result = truncateTextForDisplay(String(text ?? ''), effective)\r\n return { text: result.text, truncated: result.truncated }\r\n}\r\n", "export const TOOL_NAME_FOR_PROMPT = 'TaskOutput'\r\n\r\nexport const DESCRIPTION = 'Retrieves output from a running or completed task'\r\n\r\nexport const PROMPT = `- Retrieves output from a running or completed task (background shell, agent, or remote session)\r\n- Takes a task_id parameter identifying the task\r\n- Returns the task output along with status information\r\n- Use block=true (default) to wait for task completion\r\n- Use block=false for non-blocking check of current status\r\n- Task IDs can be found using the /tasks command\r\n- Works with all task types: background shells, async agents, and remote sessions`\r\n", "import { Box, Text } from 'ink'\r\nimport React from 'react'\r\nimport { z } from 'zod'\r\nimport { Cost } from '@components/Cost'\r\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\r\nimport type { Tool, ToolUseContext } from '@tool'\r\nimport { getClients } from '@services/mcpClient'\r\nimport { ListResourcesResultSchema } from '@modelcontextprotocol/sdk/types.js'\r\nimport { DESCRIPTION, PROMPT, TOOL_NAME } from './prompt'\r\n\r\nconst inputSchema = z.strictObject({\r\n server: z\r\n .string()\r\n .optional()\r\n .describe('Optional server name to filter resources by'),\r\n})\r\n\r\ntype Input = z.infer<typeof inputSchema>\r\n\r\ntype OutputItem = {\r\n uri: string\r\n name: string\r\n mimeType?: string\r\n description?: string\r\n server: string\r\n}\r\n\r\ntype Output = OutputItem[]\r\n\r\nexport const ListMcpResourcesTool = {\r\n name: TOOL_NAME,\r\n async description() {\r\n return DESCRIPTION\r\n },\r\n async prompt() {\r\n return PROMPT\r\n },\r\n inputSchema,\r\n userFacingName() {\r\n return 'listMcpResources'\r\n },\r\n async isEnabled() {\r\n return true\r\n },\r\n isReadOnly() {\r\n return true\r\n },\r\n isConcurrencySafe() {\r\n return true\r\n },\r\n needsPermissions() {\r\n return false\r\n },\r\n async validateInput({ server }: Input, context?: ToolUseContext) {\r\n if (!server) return { result: true }\r\n const clients =\r\n (context?.options?.mcpClients as any[]) ?? (await getClients())\r\n const found = clients.some(c => c.name === server)\r\n if (!found) {\r\n return {\r\n result: false,\r\n message: `Server \"${server}\" not found. Available servers: ${clients.map(c => c.name).join(', ')}`,\r\n errorCode: 1,\r\n }\r\n }\r\n return { result: true }\r\n },\r\n renderToolUseMessage({ server }: Input) {\r\n return server\r\n ? `List MCP resources from server \"${server}\"`\r\n : 'List all MCP resources'\r\n },\r\n renderToolUseRejectedMessage() {\r\n return <FallbackToolUseRejectedMessage />\r\n },\r\n renderToolResultMessage(output: Output) {\r\n return (\r\n <Box justifyContent=\"space-between\" width=\"100%\">\r\n <Box flexDirection=\"row\">\r\n <Text> \u23BF </Text>\r\n <Text bold>{output.length}</Text>\r\n <Text> resources</Text>\r\n </Box>\r\n <Cost costUSD={0} durationMs={0} debug={false} />\r\n </Box>\r\n )\r\n },\r\n renderResultForAssistant(output: Output) {\r\n return JSON.stringify(output)\r\n },\r\n async *call({ server }: Input, context: ToolUseContext) {\r\n const clients =\r\n (context.options?.mcpClients as any[]) ?? (await getClients())\r\n const selected = server ? clients.filter(c => c.name === server) : clients\r\n if (server && selected.length === 0) {\r\n throw new Error(\r\n `Server \"${server}\" not found. Available servers: ${clients.map(c => c.name).join(', ')}`,\r\n )\r\n }\r\n\r\n const resources: OutputItem[] = []\r\n for (const wrapped of selected) {\r\n if (wrapped.type !== 'connected') continue\r\n try {\r\n let capabilities: Record<string, unknown> | null =\r\n (wrapped as any).capabilities ?? null\r\n if (!capabilities) {\r\n try {\r\n capabilities = wrapped.client.getServerCapabilities() as any\r\n } catch {\r\n capabilities = null\r\n }\r\n }\r\n if (!(capabilities as any)?.resources) continue\r\n const result = await wrapped.client.request(\r\n { method: 'resources/list' },\r\n ListResourcesResultSchema,\r\n )\r\n if (!result.resources) continue\r\n resources.push(\r\n ...result.resources.map(r => ({\r\n ...r,\r\n server: wrapped.name,\r\n })),\r\n )\r\n } catch {\r\n }\r\n }\r\n\r\n yield {\r\n type: 'result',\r\n data: resources,\r\n resultForAssistant: this.renderResultForAssistant(resources),\r\n }\r\n },\r\n} satisfies Tool<typeof inputSchema, Output>\r\n", "export const TOOL_NAME = 'ListMcpResourcesTool'\r\n\r\nexport const DESCRIPTION = `Lists available resources from configured MCP servers.\r\nEach resource object includes a 'server' field indicating which server it's from.\r\n\r\nUsage examples:\r\n- List all resources from all servers: \\`listMcpResources\\`\r\n- List resources from a specific server: \\`listMcpResources({ server: \"myserver\" })\\``\r\n\r\nexport const PROMPT = `List available resources from configured MCP servers.\r\nEach returned resource will include all standard MCP resource fields plus a 'server' field \r\nindicating which server the resource belongs to.\r\n\r\nParameters:\r\n- server (optional): The name of a specific MCP server to get resources from. If not provided,\r\n resources from all servers will be returned.`\r\n", "import { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\r\nimport type { Tool, ToolUseContext } from '@tool'\r\nimport { getAbsolutePath } from '@utils/fs/file'\r\nimport { hasReadPermission } from '@utils/permissions/filesystem'\r\nimport { getCwd } from '@utils/state'\r\nimport { existsSync, readFileSync, statSync } from 'fs'\r\nimport { Box, Text } from 'ink'\r\nimport { createRequire } from 'node:module'\r\nimport { extname, join, relative } from 'path'\r\nimport React from 'react'\r\nimport { pathToFileURL } from 'url'\r\nimport { z } from 'zod'\r\nimport { DESCRIPTION, PROMPT, TOOL_NAME_FOR_PROMPT } from './prompt'\r\nimport { maybeTruncateVerboseToolOutput } from '@utils/tooling/toolOutputDisplay'\r\n\r\ntype TypeScriptModule = typeof import('typescript')\r\n\r\ntype Operation =\r\n | 'goToDefinition'\r\n | 'findReferences'\r\n | 'hover'\r\n | 'documentSymbol'\r\n | 'workspaceSymbol'\r\n | 'goToImplementation'\r\n | 'prepareCallHierarchy'\r\n | 'incomingCalls'\r\n | 'outgoingCalls'\r\n\r\nconst inputSchema = z.strictObject({\r\n operation: z\r\n .enum([\r\n 'goToDefinition',\r\n 'findReferences',\r\n 'hover',\r\n 'documentSymbol',\r\n 'workspaceSymbol',\r\n 'goToImplementation',\r\n 'prepareCallHierarchy',\r\n 'incomingCalls',\r\n 'outgoingCalls',\r\n ])\r\n .describe('The LSP operation to perform'),\r\n filePath: z.string().describe('The absolute or relative path to the file'),\r\n line: z\r\n .number()\r\n .int()\r\n .positive()\r\n .describe('The line number (1-based, as shown in editors)'),\r\n character: z\r\n .number()\r\n .int()\r\n .positive()\r\n .describe('The character offset (1-based, as shown in editors)'),\r\n})\r\n\r\nconst outputSchema = z.object({\r\n operation: z\r\n .enum([\r\n 'goToDefinition',\r\n 'findReferences',\r\n 'hover',\r\n 'documentSymbol',\r\n 'workspaceSymbol',\r\n 'goToImplementation',\r\n 'prepareCallHierarchy',\r\n 'incomingCalls',\r\n 'outgoingCalls',\r\n ])\r\n .describe('The LSP operation that was performed'),\r\n result: z.string().describe('The formatted result of the LSP operation'),\r\n filePath: z.string().describe('The file path the operation was performed on'),\r\n resultCount: z\r\n .number()\r\n .int()\r\n .nonnegative()\r\n .optional()\r\n .describe('Number of results (definitions, references, symbols)'),\r\n fileCount: z\r\n .number()\r\n .int()\r\n .nonnegative()\r\n .optional()\r\n .describe('Number of files containing results'),\r\n})\r\n\r\ntype Input = z.infer<typeof inputSchema>\r\ntype Output = z.infer<typeof outputSchema>\r\n\r\nconst OPERATION_LABELS: Record<\r\n Operation,\r\n { singular: string; plural: string; special?: string }\r\n> = {\r\n goToDefinition: { singular: 'definition', plural: 'definitions' },\r\n findReferences: { singular: 'reference', plural: 'references' },\r\n documentSymbol: { singular: 'symbol', plural: 'symbols' },\r\n workspaceSymbol: { singular: 'symbol', plural: 'symbols' },\r\n hover: { singular: 'hover info', plural: 'hover info', special: 'available' },\r\n goToImplementation: { singular: 'implementation', plural: 'implementations' },\r\n prepareCallHierarchy: { singular: 'call item', plural: 'call items' },\r\n incomingCalls: { singular: 'caller', plural: 'callers' },\r\n outgoingCalls: { singular: 'callee', plural: 'callees' },\r\n}\r\n\r\nfunction extractSymbolAtPosition(\r\n lines: string[],\r\n zeroBasedLine: number,\r\n zeroBasedCharacter: number,\r\n): string | null {\r\n try {\r\n if (zeroBasedLine < 0 || zeroBasedLine >= lines.length) return null\r\n const line = lines[zeroBasedLine]\r\n if (zeroBasedCharacter < 0 || zeroBasedCharacter >= line.length) return null\r\n const tokenRe = /[\\w$'!]+|[+\\-*/%&|^~<>=]+/g\r\n let match: RegExpExecArray | null\r\n while ((match = tokenRe.exec(line)) !== null) {\r\n const start = match.index\r\n const end = start + match[0].length\r\n if (zeroBasedCharacter >= start && zeroBasedCharacter < end) {\r\n const token = match[0]\r\n return token.length > 30 ? `${token.slice(0, 27)}...` : token\r\n }\r\n }\r\n return null\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nfunction toProjectRelativeIfPossible(filePath: string): string {\r\n const cwd = getCwd()\r\n try {\r\n const rel = relative(cwd, filePath)\r\n if (!rel || rel === '') return filePath\r\n if (rel.startsWith('..')) return filePath\r\n return rel\r\n } catch {\r\n return filePath\r\n }\r\n}\r\n\r\nfunction formatLocation(\r\n fileName: string,\r\n line0: number,\r\n character0: number,\r\n): string {\r\n return `${toProjectRelativeIfPossible(fileName)}:${line0 + 1}:${character0 + 1}`\r\n}\r\n\r\nfunction formatGoToDefinitionResult(\r\n locations: Array<{\r\n fileName: string\r\n line0: number\r\n character0: number\r\n }> | null,\r\n): { formatted: string; resultCount: number; fileCount: number } {\r\n if (!locations || locations.length === 0) {\r\n return {\r\n formatted:\r\n 'No definition found. This may occur if the cursor is not on a symbol, or if the definition is in an external library not indexed by the LSP server.',\r\n resultCount: 0,\r\n fileCount: 0,\r\n }\r\n }\r\n const fileCount = new Set(locations.map(l => l.fileName)).size\r\n if (locations.length === 1) {\r\n const loc = locations[0]\r\n return {\r\n formatted: `Defined in ${formatLocation(loc.fileName, loc.line0, loc.character0)}`,\r\n resultCount: 1,\r\n fileCount,\r\n }\r\n }\r\n return {\r\n formatted: `Found ${locations.length} definitions:\\n${locations\r\n .map(\r\n loc => ` ${formatLocation(loc.fileName, loc.line0, loc.character0)}`,\r\n )\r\n .join('\\n')}`,\r\n resultCount: locations.length,\r\n fileCount,\r\n }\r\n}\r\n\r\nfunction groupLocationsByFile<T extends { fileName: string }>(\r\n items: T[],\r\n): Map<string, T[]> {\r\n const grouped = new Map<string, T[]>()\r\n for (const item of items) {\r\n const key = toProjectRelativeIfPossible(item.fileName)\r\n const existing = grouped.get(key)\r\n if (existing) existing.push(item)\r\n else grouped.set(key, [item])\r\n }\r\n return grouped\r\n}\r\n\r\nfunction formatFindReferencesResult(\r\n references: Array<{\r\n fileName: string\r\n line0: number\r\n character0: number\r\n }> | null,\r\n): { formatted: string; resultCount: number; fileCount: number } {\r\n if (!references || references.length === 0) {\r\n return {\r\n formatted:\r\n 'No references found. This may occur if the symbol has no usages, or if the LSP server has not fully indexed the workspace.',\r\n resultCount: 0,\r\n fileCount: 0,\r\n }\r\n }\r\n if (references.length === 1) {\r\n const ref = references[0]\r\n return {\r\n formatted: `Found 1 reference:\\n ${formatLocation(ref.fileName, ref.line0, ref.character0)}`,\r\n resultCount: 1,\r\n fileCount: 1,\r\n }\r\n }\r\n\r\n const grouped = groupLocationsByFile(references)\r\n const lines: string[] = [\r\n `Found ${references.length} references across ${grouped.size} files:`,\r\n ]\r\n for (const [file, refs] of grouped) {\r\n lines.push(`\\n${file}:`)\r\n for (const ref of refs) {\r\n lines.push(` Line ${ref.line0 + 1}:${ref.character0 + 1}`)\r\n }\r\n }\r\n return {\r\n formatted: lines.join('\\n'),\r\n resultCount: references.length,\r\n fileCount: grouped.size,\r\n }\r\n}\r\n\r\nfunction formatHoverResult(\r\n hoverText: string | null,\r\n line0: number,\r\n character0: number,\r\n) {\r\n if (!hoverText || hoverText.trim() === '') {\r\n return {\r\n formatted:\r\n 'No hover information available. This may occur if the cursor is not on a symbol, or if the LSP server has not fully indexed the file.',\r\n resultCount: 0,\r\n fileCount: 0,\r\n }\r\n }\r\n return {\r\n formatted: `Hover info at ${line0 + 1}:${character0 + 1}:\\n\\n${hoverText}`,\r\n resultCount: 1,\r\n fileCount: 1,\r\n }\r\n}\r\n\r\nfunction formatDocumentSymbolsResult(lines: string[], symbolCount: number) {\r\n if (symbolCount === 0) {\r\n return {\r\n formatted:\r\n 'No symbols found in document. This may occur if the file is empty, not supported by the LSP server, or if the server has not fully indexed the file.',\r\n resultCount: 0,\r\n fileCount: 0,\r\n }\r\n }\r\n return {\r\n formatted: ['Document symbols:', ...lines].join('\\n'),\r\n resultCount: symbolCount,\r\n fileCount: 1,\r\n }\r\n}\r\n\r\nlet cachedTypeScript: { cwd: string; module: TypeScriptModule | null } | null =\r\n null\r\n\r\nfunction tryLoadTypeScriptModule(projectCwd: string): TypeScriptModule | null {\r\n if (cachedTypeScript?.cwd === projectCwd) return cachedTypeScript.module\r\n\r\n try {\r\n const requireFromCwd = createRequire(\r\n pathToFileURL(join(projectCwd, '__kode_lsp__.js')),\r\n )\r\n const mod = requireFromCwd('typescript') as TypeScriptModule\r\n cachedTypeScript = { cwd: projectCwd, module: mod }\r\n return mod\r\n } catch {\r\n cachedTypeScript = { cwd: projectCwd, module: null }\r\n return null\r\n }\r\n}\r\n\r\ntype TsProjectState = {\r\n ts: TypeScriptModule\r\n cwd: string\r\n rootFiles: Set<string>\r\n compilerOptions: any\r\n languageService: any\r\n versions: Map<string, string>\r\n}\r\n\r\nconst projectCache = new Map<string, TsProjectState>()\r\n\r\nfunction getOrCreateTsProject(projectCwd: string): TsProjectState | null {\r\n const ts = tryLoadTypeScriptModule(projectCwd)\r\n if (!ts) return null\r\n\r\n const existing = projectCache.get(projectCwd)\r\n if (existing) return existing\r\n\r\n let compilerOptions: any = {\r\n allowJs: true,\r\n checkJs: false,\r\n jsx: ts.JsxEmit.ReactJSX,\r\n target: ts.ScriptTarget.ESNext,\r\n module: ts.ModuleKind.ESNext,\r\n moduleResolution: ts.ModuleResolutionKind.NodeNext,\r\n }\r\n\r\n let rootFileNames: string[] = []\r\n try {\r\n const configPath = ts.findConfigFile(\r\n projectCwd,\r\n ts.sys.fileExists,\r\n 'tsconfig.json',\r\n )\r\n if (configPath) {\r\n const configFile = ts.readConfigFile(configPath, ts.sys.readFile)\r\n if (!configFile.error) {\r\n const parsed = ts.parseJsonConfigFileContent(\r\n configFile.config,\r\n ts.sys,\r\n projectCwd,\r\n )\r\n compilerOptions = { ...compilerOptions, ...parsed.options }\r\n rootFileNames = parsed.fileNames\r\n }\r\n }\r\n } catch {\r\n }\r\n\r\n const rootFiles = new Set(rootFileNames)\r\n const versions = new Map<string, string>()\r\n\r\n const host: any = {\r\n getCompilationSettings: () => compilerOptions,\r\n getScriptFileNames: () => Array.from(rootFiles),\r\n getScriptVersion: (fileName: string) => {\r\n try {\r\n const stat = statSync(fileName)\r\n const version = String(stat.mtimeMs ?? Date.now())\r\n versions.set(fileName, version)\r\n return version\r\n } catch {\r\n return versions.get(fileName) ?? '0'\r\n }\r\n },\r\n getScriptSnapshot: (fileName: string) => {\r\n try {\r\n if (!ts.sys.fileExists(fileName)) return undefined\r\n const content = ts.sys.readFile(fileName)\r\n if (content === undefined) return undefined\r\n const stat = statSync(fileName)\r\n versions.set(fileName, String(stat.mtimeMs ?? Date.now()))\r\n return ts.ScriptSnapshot.fromString(content)\r\n } catch {\r\n return undefined\r\n }\r\n },\r\n getCurrentDirectory: () => projectCwd,\r\n getDefaultLibFileName: (options: any) => ts.getDefaultLibFilePath(options),\r\n fileExists: ts.sys.fileExists,\r\n readFile: ts.sys.readFile,\r\n readDirectory: ts.sys.readDirectory,\r\n directoryExists: ts.sys.directoryExists,\r\n getDirectories: ts.sys.getDirectories,\r\n useCaseSensitiveFileNames: () => ts.sys.useCaseSensitiveFileNames,\r\n getCanonicalFileName: (fileName: string) =>\r\n ts.sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase(),\r\n getNewLine: () => ts.sys.newLine,\r\n }\r\n\r\n const languageService = ts.createLanguageService(\r\n host,\r\n ts.createDocumentRegistry(),\r\n )\r\n\r\n const state: TsProjectState = {\r\n ts,\r\n cwd: projectCwd,\r\n rootFiles,\r\n compilerOptions,\r\n languageService,\r\n versions,\r\n }\r\n projectCache.set(projectCwd, state)\r\n return state\r\n}\r\n\r\nfunction isFileTypeSupportedByTypescriptBackend(filePath: string): boolean {\r\n const ext = extname(filePath).toLowerCase()\r\n return (\r\n ext === '.ts' ||\r\n ext === '.tsx' ||\r\n ext === '.js' ||\r\n ext === '.jsx' ||\r\n ext === '.mts' ||\r\n ext === '.cts' ||\r\n ext === '.mjs' ||\r\n ext === '.cjs'\r\n )\r\n}\r\n\r\nfunction summarizeToolResult(\r\n operation: Operation,\r\n resultCount: number,\r\n fileCount: number,\r\n) {\r\n const label = OPERATION_LABELS[operation] ?? {\r\n singular: 'result',\r\n plural: 'results',\r\n }\r\n const noun = resultCount === 1 ? label.singular : label.plural\r\n if (operation === 'hover' && resultCount > 0 && label.special) {\r\n return <Text>Hover info {label.special}</Text>\r\n }\r\n return (\r\n <Text>\r\n Found <Text bold>{resultCount}</Text> {noun}\r\n {fileCount > 1 ? (\r\n <>\r\n {' '}\r\n across <Text bold>{fileCount}</Text> files\r\n </>\r\n ) : null}\r\n </Text>\r\n )\r\n}\r\n\r\nexport const LspTool = {\r\n name: TOOL_NAME_FOR_PROMPT,\r\n async description() {\r\n return DESCRIPTION\r\n },\r\n async prompt() {\r\n return PROMPT\r\n },\r\n inputSchema,\r\n userFacingName() {\r\n return 'LSP'\r\n },\r\n async isEnabled() {\r\n return tryLoadTypeScriptModule(getCwd()) !== null\r\n },\r\n isReadOnly() {\r\n return true\r\n },\r\n isConcurrencySafe() {\r\n return true\r\n },\r\n needsPermissions({ filePath }: Input) {\r\n const abs = getAbsolutePath(filePath) ?? filePath\r\n return !hasReadPermission(abs || getCwd())\r\n },\r\n async validateInput(input: Input) {\r\n const parsed = inputSchema.safeParse(input)\r\n if (!parsed.success) {\r\n return {\r\n result: false,\r\n message: `Invalid input: ${parsed.error.message}`,\r\n errorCode: 3,\r\n }\r\n }\r\n\r\n const absPath = getAbsolutePath(input.filePath) ?? input.filePath\r\n if (!existsSync(absPath)) {\r\n return {\r\n result: false,\r\n message: `File does not exist: ${input.filePath}`,\r\n errorCode: 1,\r\n }\r\n }\r\n try {\r\n if (!statSync(absPath).isFile()) {\r\n return {\r\n result: false,\r\n message: `Path is not a file: ${input.filePath}`,\r\n errorCode: 2,\r\n }\r\n }\r\n } catch (err) {\r\n const e = err instanceof Error ? err : new Error(String(err))\r\n return {\r\n result: false,\r\n message: `Cannot access file: ${input.filePath}. ${e.message}`,\r\n errorCode: 4,\r\n }\r\n }\r\n\r\n return { result: true }\r\n },\r\n renderToolUseMessage(input: Input, { verbose }: { verbose: boolean }) {\r\n const abs = getAbsolutePath(input.filePath) ?? input.filePath\r\n const filePathForDisplay = verbose ? abs : toProjectRelativeIfPossible(abs)\r\n const parts: string[] = []\r\n\r\n if (\r\n (input.operation === 'goToDefinition' ||\r\n input.operation === 'findReferences' ||\r\n input.operation === 'hover' ||\r\n input.operation === 'goToImplementation') &&\r\n input.filePath &&\r\n input.line !== undefined &&\r\n input.character !== undefined\r\n ) {\r\n try {\r\n const content = readFileSync(abs, 'utf8')\r\n const symbol = extractSymbolAtPosition(\r\n content.split('\\n'),\r\n input.line - 1,\r\n input.character - 1,\r\n )\r\n if (symbol) {\r\n parts.push(`operation: \"${input.operation}\"`)\r\n parts.push(`symbol: \"${symbol}\"`)\r\n parts.push(`in: \"${filePathForDisplay}\"`)\r\n return parts.join(', ')\r\n }\r\n } catch {\r\n }\r\n\r\n parts.push(`operation: \"${input.operation}\"`)\r\n parts.push(`file: \"${filePathForDisplay}\"`)\r\n parts.push(`position: ${input.line}:${input.character}`)\r\n return parts.join(', ')\r\n }\r\n\r\n parts.push(`operation: \"${input.operation}\"`)\r\n if (input.filePath) parts.push(`file: \"${filePathForDisplay}\"`)\r\n return parts.join(', ')\r\n },\r\n renderToolUseRejectedMessage() {\r\n return <FallbackToolUseRejectedMessage />\r\n },\r\n renderToolResultMessage(output: Output, { verbose }: { verbose: boolean }) {\r\n if (output.resultCount !== undefined && output.fileCount !== undefined) {\r\n const display = verbose\r\n ? maybeTruncateVerboseToolOutput(output.result, {\r\n maxLines: 120,\r\n maxChars: 20_000,\r\n })\r\n : null\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Box flexDirection=\"row\">\r\n <Text> \u23BF </Text>\r\n {summarizeToolResult(\r\n output.operation,\r\n output.resultCount,\r\n output.fileCount,\r\n )}\r\n </Box>\r\n {display ? (\r\n <Box marginLeft={5}>\r\n <Text>{display.text}</Text>\r\n </Box>\r\n ) : null}\r\n </Box>\r\n )\r\n }\r\n\r\n return (\r\n <Box justifyContent=\"space-between\" width=\"100%\">\r\n <Box flexDirection=\"row\">\r\n <Text> \u23BF </Text>\r\n <Text>{output.result}</Text>\r\n </Box>\r\n </Box>\r\n )\r\n },\r\n renderResultForAssistant(output: Output) {\r\n return output.result\r\n },\r\n async *call(input: Input, _context: ToolUseContext) {\r\n const absPath = getAbsolutePath(input.filePath) ?? input.filePath\r\n\r\n if (!isFileTypeSupportedByTypescriptBackend(absPath)) {\r\n const ext = extname(absPath)\r\n const out: Output = {\r\n operation: input.operation,\r\n result: `No LSP server available for file type: ${ext}`,\r\n filePath: input.filePath,\r\n resultCount: 0,\r\n fileCount: 0,\r\n }\r\n yield { type: 'result', data: out, resultForAssistant: out.result }\r\n return\r\n }\r\n\r\n const project = getOrCreateTsProject(getCwd())\r\n if (!project) {\r\n const out: Output = {\r\n operation: input.operation,\r\n result:\r\n 'LSP server manager not initialized. This may indicate a startup issue.',\r\n filePath: input.filePath,\r\n resultCount: 0,\r\n fileCount: 0,\r\n }\r\n yield { type: 'result', data: out, resultForAssistant: out.result }\r\n return\r\n }\r\n\r\n project.rootFiles.add(absPath)\r\n\r\n const ts = project.ts\r\n const service = project.languageService\r\n const program = service.getProgram?.()\r\n if (!program) {\r\n const out: Output = {\r\n operation: input.operation,\r\n result: `Error performing ${input.operation}: TypeScript program not available`,\r\n filePath: input.filePath,\r\n resultCount: 0,\r\n fileCount: 0,\r\n }\r\n yield { type: 'result', data: out, resultForAssistant: out.result }\r\n return\r\n }\r\n\r\n const sourceFile = program.getSourceFile(absPath)\r\n if (!sourceFile) {\r\n const out: Output = {\r\n operation: input.operation,\r\n result: `Error performing ${input.operation}: File is not part of the TypeScript program`,\r\n filePath: input.filePath,\r\n resultCount: 0,\r\n fileCount: 0,\r\n }\r\n yield { type: 'result', data: out, resultForAssistant: out.result }\r\n return\r\n }\r\n\r\n const pos = ts.getPositionOfLineAndCharacter(\r\n sourceFile,\r\n input.line - 1,\r\n input.character - 1,\r\n )\r\n\r\n try {\r\n let formatted: string\r\n let resultCount = 0\r\n let fileCount = 0\r\n\r\n switch (input.operation) {\r\n case 'goToDefinition': {\r\n const defs = service.getDefinitionAtPosition?.(absPath, pos) ?? []\r\n const locations = defs\r\n .map((d: any) => {\r\n const defSourceFile = program.getSourceFile(d.fileName)\r\n if (!defSourceFile) return null\r\n const lc = ts.getLineAndCharacterOfPosition(\r\n defSourceFile,\r\n d.textSpan.start,\r\n )\r\n return {\r\n fileName: d.fileName,\r\n line0: lc.line,\r\n character0: lc.character,\r\n }\r\n })\r\n .filter(Boolean) as Array<{\r\n fileName: string\r\n line0: number\r\n character0: number\r\n }>\r\n const res = formatGoToDefinitionResult(locations)\r\n formatted = res.formatted\r\n resultCount = res.resultCount\r\n fileCount = res.fileCount\r\n break\r\n }\r\n case 'goToImplementation': {\r\n const impls =\r\n service.getImplementationAtPosition?.(absPath, pos) ?? []\r\n const locations = impls\r\n .map((d: any) => {\r\n const defSourceFile = program.getSourceFile(d.fileName)\r\n if (!defSourceFile) return null\r\n const lc = ts.getLineAndCharacterOfPosition(\r\n defSourceFile,\r\n d.textSpan.start,\r\n )\r\n return {\r\n fileName: d.fileName,\r\n line0: lc.line,\r\n character0: lc.character,\r\n }\r\n })\r\n .filter(Boolean) as Array<{\r\n fileName: string\r\n line0: number\r\n character0: number\r\n }>\r\n const res = formatGoToDefinitionResult(locations)\r\n formatted = res.formatted\r\n resultCount = res.resultCount\r\n fileCount = res.fileCount\r\n break\r\n }\r\n case 'findReferences': {\r\n const referencedSymbols = service.findReferences?.(absPath, pos) ?? []\r\n const refs: Array<{\r\n fileName: string\r\n line0: number\r\n character0: number\r\n }> = []\r\n for (const sym of referencedSymbols) {\r\n for (const ref of sym.references ?? []) {\r\n const refSource = program.getSourceFile(ref.fileName)\r\n if (!refSource) continue\r\n const lc = ts.getLineAndCharacterOfPosition(\r\n refSource,\r\n ref.textSpan.start,\r\n )\r\n refs.push({\r\n fileName: ref.fileName,\r\n line0: lc.line,\r\n character0: lc.character,\r\n })\r\n }\r\n }\r\n const res = formatFindReferencesResult(refs)\r\n formatted = res.formatted\r\n resultCount = res.resultCount\r\n fileCount = res.fileCount\r\n break\r\n }\r\n case 'hover': {\r\n const info = service.getQuickInfoAtPosition?.(absPath, pos)\r\n let text: string | null = null\r\n let hoverLine0 = input.line - 1\r\n let hoverCharacter0 = input.character - 1\r\n if (info) {\r\n const parts: string[] = []\r\n const signature = ts.displayPartsToString(info.displayParts ?? [])\r\n if (signature) parts.push(signature)\r\n const doc = ts.displayPartsToString(info.documentation ?? [])\r\n if (doc) parts.push(doc)\r\n if (info.tags && info.tags.length > 0) {\r\n for (const tag of info.tags) {\r\n const tagText = ts.displayPartsToString(tag.text ?? [])\r\n parts.push(`@${tag.name}${tagText ? ` ${tagText}` : ''}`)\r\n }\r\n }\r\n text = parts.filter(Boolean).join('\\n\\n')\r\n const lc = ts.getLineAndCharacterOfPosition(\r\n sourceFile,\r\n info.textSpan.start,\r\n )\r\n hoverLine0 = lc.line\r\n hoverCharacter0 = lc.character\r\n }\r\n const res = formatHoverResult(text, hoverLine0, hoverCharacter0)\r\n formatted = res.formatted\r\n resultCount = res.resultCount\r\n fileCount = res.fileCount\r\n break\r\n }\r\n case 'documentSymbol': {\r\n const tree = service.getNavigationTree?.(absPath)\r\n const lines: string[] = []\r\n let count = 0\r\n\r\n const kindLabel = (kind: string) => {\r\n const m = {\r\n class: 'Class',\r\n interface: 'Interface',\r\n enum: 'Enum',\r\n function: 'Function',\r\n method: 'Method',\r\n property: 'Property',\r\n var: 'Variable',\r\n let: 'Variable',\r\n const: 'Constant',\r\n module: 'Module',\r\n alias: 'Alias',\r\n type: 'Type',\r\n } as Record<string, string>\r\n return (\r\n m[kind] ??\r\n (kind ? kind[0].toUpperCase() + kind.slice(1) : 'Unknown')\r\n )\r\n }\r\n\r\n const walk = (node: any, depth: number) => {\r\n const children: any[] = node?.childItems ?? []\r\n for (const child of children) {\r\n const span = child.spans?.[0]\r\n if (!span) continue\r\n const lc = ts.getLineAndCharacterOfPosition(\r\n sourceFile,\r\n span.start,\r\n )\r\n const indent = ' '.repeat(depth)\r\n const label = kindLabel(child.kind)\r\n const detail = child.kindModifiers\r\n ? ` ${child.kindModifiers}`\r\n : ''\r\n lines.push(\r\n `${indent}${child.text} (${label})${detail} - Line ${lc.line + 1}`,\r\n )\r\n count += 1\r\n if (child.childItems && child.childItems.length > 0) {\r\n walk(child, depth + 1)\r\n }\r\n }\r\n }\r\n walk(tree, 0)\r\n\r\n const res = formatDocumentSymbolsResult(lines, count)\r\n formatted = res.formatted\r\n resultCount = res.resultCount\r\n fileCount = res.fileCount\r\n break\r\n }\r\n case 'workspaceSymbol': {\r\n const items =\r\n service.getNavigateToItems?.('', 100, undefined, true, true) ?? []\r\n if (!items || items.length === 0) {\r\n formatted =\r\n 'No symbols found in workspace. This may occur if the workspace is empty, or if the LSP server has not finished indexing the project.'\r\n resultCount = 0\r\n fileCount = 0\r\n break\r\n }\r\n\r\n const lines: string[] = [\r\n `Found ${items.length} symbol${items.length === 1 ? '' : 's'} in workspace:`,\r\n ]\r\n const grouped = groupLocationsByFile(\r\n items.map((it: any) => ({\r\n fileName: it.fileName,\r\n item: it,\r\n })),\r\n )\r\n for (const [file, itemsInFile] of grouped) {\r\n lines.push(`\\n${file}:`)\r\n for (const wrapper of itemsInFile) {\r\n const it: any = (wrapper as any).item\r\n const sf = program.getSourceFile(it.fileName)\r\n if (!sf) continue\r\n const span = it.textSpan\r\n const lc = span\r\n ? ts.getLineAndCharacterOfPosition(sf, span.start)\r\n : { line: 0, character: 0 }\r\n const label = it.kind\r\n ? String(it.kind)[0].toUpperCase() + String(it.kind).slice(1)\r\n : 'Symbol'\r\n let line = ` ${it.name} (${label}) - Line ${lc.line + 1}`\r\n if (it.containerName) line += ` in ${it.containerName}`\r\n lines.push(line)\r\n }\r\n }\r\n formatted = lines.join('\\n')\r\n resultCount = items.length\r\n fileCount = grouped.size\r\n break\r\n }\r\n case 'prepareCallHierarchy':\r\n case 'incomingCalls':\r\n case 'outgoingCalls': {\r\n const opLabel = input.operation\r\n formatted = `Error performing ${opLabel}: Call hierarchy is not supported by the TypeScript backend`\r\n resultCount = 0\r\n fileCount = 0\r\n break\r\n }\r\n default: {\r\n formatted = `Error performing ${input.operation}: Unsupported operation`\r\n resultCount = 0\r\n fileCount = 0\r\n }\r\n }\r\n\r\n const out: Output = {\r\n operation: input.operation,\r\n result: formatted,\r\n filePath: input.filePath,\r\n resultCount,\r\n fileCount,\r\n }\r\n yield { type: 'result', data: out, resultForAssistant: out.result }\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : String(err)\r\n const out: Output = {\r\n operation: input.operation,\r\n result: `Error performing ${input.operation}: ${message}`,\r\n filePath: input.filePath,\r\n }\r\n yield { type: 'result', data: out, resultForAssistant: out.result }\r\n }\r\n },\r\n} satisfies Tool<typeof inputSchema, Output>\r\n", "export const TOOL_NAME_FOR_PROMPT = 'LSP'\r\n\r\nexport const PROMPT = `Interact with Language Server Protocol (LSP) servers to get code intelligence features.\r\n\r\nSupported operations:\r\n- goToDefinition: Find where a symbol is defined\r\n- findReferences: Find all references to a symbol\r\n- hover: Get hover information (documentation, type info) for a symbol\r\n- documentSymbol: Get all symbols (functions, classes, variables) in a document\r\n- workspaceSymbol: Search for symbols across the entire workspace\r\n- goToImplementation: Find implementations of an interface or abstract method\r\n- prepareCallHierarchy: Get call hierarchy item at a position (functions/methods)\r\n- incomingCalls: Find all functions/methods that call the function at a position\r\n- outgoingCalls: Find all functions/methods called by the function at a position\r\n\r\nAll operations require:\r\n- filePath: The file to operate on\r\n- line: The line number (1-based, as shown in editors)\r\n- character: The character offset (1-based, as shown in editors)\r\n\r\nNote: LSP servers must be configured for the file type. If no server is available, an error will be returned.`\r\n\r\nexport const DESCRIPTION = PROMPT\r\n", "import { Box, Text } from 'ink'\r\nimport React from 'react'\r\nimport { z } from 'zod'\r\nimport { Cost } from '@components/Cost'\r\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\r\nimport type { Tool, ToolUseContext } from '@tool'\r\nimport { getClients } from '@services/mcpClient'\r\nimport { ReadResourceResultSchema } from '@modelcontextprotocol/sdk/types.js'\r\nimport { DESCRIPTION, PROMPT, TOOL_NAME } from './prompt'\r\n\r\nconst inputSchema = z.strictObject({\r\n server: z.string().describe('The MCP server name'),\r\n uri: z.string().describe('The resource URI to read'),\r\n})\r\n\r\ntype Input = z.infer<typeof inputSchema>\r\n\r\ntype Output = {\r\n contents: Array<{\r\n uri: string\r\n mimeType?: string\r\n text?: string\r\n }>\r\n}\r\n\r\nexport const ReadMcpResourceTool = {\r\n name: TOOL_NAME,\r\n async description() {\r\n return DESCRIPTION\r\n },\r\n async prompt() {\r\n return PROMPT\r\n },\r\n inputSchema,\r\n userFacingName() {\r\n return 'readMcpResource'\r\n },\r\n async isEnabled() {\r\n return true\r\n },\r\n isReadOnly() {\r\n return true\r\n },\r\n isConcurrencySafe() {\r\n return true\r\n },\r\n needsPermissions() {\r\n return false\r\n },\r\n async validateInput({ server }: Input, context?: ToolUseContext) {\r\n const clients =\r\n (context?.options?.mcpClients as any[]) ?? (await getClients())\r\n const match = clients.find(c => c.name === server)\r\n if (!match) {\r\n return {\r\n result: false,\r\n message: `Server \"${server}\" not found. Available servers: ${clients.map(c => c.name).join(', ')}`,\r\n errorCode: 1,\r\n }\r\n }\r\n if (match.type !== 'connected') {\r\n return {\r\n result: false,\r\n message: `Server \"${server}\" is not connected`,\r\n errorCode: 2,\r\n }\r\n }\r\n let capabilities: Record<string, unknown> | null =\r\n (match as any).capabilities ?? null\r\n if (!capabilities) {\r\n try {\r\n capabilities = match.client.getServerCapabilities() as any\r\n } catch {\r\n capabilities = null\r\n }\r\n }\r\n if (!(capabilities as any)?.resources) {\r\n return {\r\n result: false,\r\n message: `Server \"${server}\" does not support resources`,\r\n errorCode: 3,\r\n }\r\n }\r\n return { result: true }\r\n },\r\n renderToolUseMessage({ server, uri }: Input) {\r\n if (!server || !uri) return null as any\r\n return `Read resource \"${uri}\" from server \"${server}\"`\r\n },\r\n renderToolUseRejectedMessage() {\r\n return <FallbackToolUseRejectedMessage />\r\n },\r\n renderToolResultMessage(output: Output) {\r\n const count = output.contents?.length ?? 0\r\n return (\r\n <Box justifyContent=\"space-between\" width=\"100%\">\r\n <Box flexDirection=\"row\">\r\n <Text> \u23BF </Text>\r\n <Text bold>Read MCP resource</Text>\r\n <Text>\r\n {count ? ` (${count} part${count === 1 ? '' : 's'})` : ''}\r\n </Text>\r\n </Box>\r\n <Cost costUSD={0} durationMs={0} debug={false} />\r\n </Box>\r\n )\r\n },\r\n renderResultForAssistant(output: Output) {\r\n return JSON.stringify(output)\r\n },\r\n async *call({ server, uri }: Input, context: ToolUseContext) {\r\n const clients =\r\n (context.options?.mcpClients as any[]) ?? (await getClients())\r\n const match = clients.find(c => c.name === server)\r\n if (!match) {\r\n throw new Error(\r\n `Server \"${server}\" not found. Available servers: ${clients.map(c => c.name).join(', ')}`,\r\n )\r\n }\r\n if (match.type !== 'connected') {\r\n throw new Error(`Server \"${server}\" is not connected`)\r\n }\r\n let capabilities: Record<string, unknown> | null =\r\n (match as any).capabilities ?? null\r\n if (!capabilities) {\r\n try {\r\n capabilities = match.client.getServerCapabilities() as any\r\n } catch {\r\n capabilities = null\r\n }\r\n }\r\n if (!(capabilities as any)?.resources) {\r\n throw new Error(`Server \"${server}\" does not support resources`)\r\n }\r\n const result = (await match.client.request(\r\n { method: 'resources/read', params: { uri } },\r\n ReadResourceResultSchema,\r\n )) as Output\r\n yield {\r\n type: 'result',\r\n data: result,\r\n resultForAssistant: this.renderResultForAssistant(result),\r\n }\r\n },\r\n} satisfies Tool<typeof inputSchema, Output>\r\n", "export const TOOL_NAME = 'ReadMcpResourceTool'\r\n\r\nexport const DESCRIPTION = `Reads a specific resource from an MCP server.\r\n- server: The name of the MCP server to read from\r\n- uri: The URI of the resource to read\r\n\r\nUsage examples:\r\n- Read a resource from a server: \\`readMcpResource({ server: \"myserver\", uri: \"my-resource-uri\" })\\``\r\n\r\nexport const PROMPT = `Reads a specific resource from an MCP server, identified by server name and resource URI.\r\n\r\nParameters:\r\n- server (required): The name of the MCP server from which to read the resource\r\n- uri (required): The URI of the resource to read`\r\n", "import { TextBlock } from '@anthropic-ai/sdk/resources/index.mjs'\r\nimport { last, memoize } from 'lodash-es'\r\nimport React from 'react'\r\nimport { Box, Text } from 'ink'\r\nimport { z } from 'zod'\r\nimport { randomUUID } from 'crypto'\r\nimport { existsSync, readFileSync } from 'fs'\r\nimport { Tool } from '@tool'\r\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\r\nimport { getAgentPrompt } from '@constants/prompts'\r\nimport { getContext } from '@context'\r\nimport { hasPermissionsToUseTool } from '@permissions'\r\nimport { Message as MessageType, query } from '@query'\r\nimport { formatDuration, formatNumber } from '@utils/terminal/format'\r\nimport {\r\n getMessagesPath,\r\n getNextAvailableLogSidechainNumber,\r\n overwriteLog,\r\n} from '@utils/log'\r\nimport {\r\n createAssistantMessage,\r\n createUserMessage,\r\n getLastAssistantMessageId,\r\n} from '@utils/messages'\r\nimport { countTokens } from '@utils/model/tokens'\r\nimport { getMaxThinkingTokens } from '@utils/model/thinking'\r\nimport { getTheme } from '@utils/theme'\r\nimport { generateAgentId } from '@utils/agent/storage'\r\nimport { getAgentByType, getAvailableAgentTypes } from '@utils/agent/loader'\r\nimport { upsertBackgroundAgentTask } from '@utils/session/backgroundTasks'\r\nimport { maybeTruncateVerboseToolOutput } from '@utils/tooling/toolOutputDisplay'\r\nimport {\r\n getAgentTranscript,\r\n saveAgentTranscript,\r\n} from '@utils/agent/transcripts'\r\nimport { getTaskTools, getPrompt } from './prompt'\r\nimport { TOOL_NAME } from './constants'\r\nimport type { PermissionMode } from '@kode-types/permissionMode'\r\nimport type { ToolPermissionContext } from '@kode-types/toolPermissionContext'\r\n\r\nconst inputSchema = z.object({\r\n description: z\r\n .string()\r\n .describe('A short (3-5 word) description of the task'),\r\n prompt: z.string().describe('The task for the agent to perform'),\r\n subagent_type: z\r\n .string()\r\n .describe('The type of specialized agent to use for this task'),\r\n model: z\r\n .enum(['sonnet', 'opus', 'haiku'])\r\n .optional()\r\n .describe(\r\n 'Optional model to use for this agent. If not specified, inherits from parent. Prefer haiku for quick, straightforward tasks to minimize cost and latency.',\r\n ),\r\n resume: z\r\n .string()\r\n .optional()\r\n .describe(\r\n 'Optional agent ID to resume from. If provided, the agent will continue from the previous execution transcript.',\r\n ),\r\n run_in_background: z\r\n .boolean()\r\n .optional()\r\n .describe(\r\n 'Set to true to run this agent in the background. Use TaskOutput to read the output later.',\r\n ),\r\n})\r\n\r\ntype Input = z.infer<typeof inputSchema>\r\ntype TaskModel = NonNullable<Input['model']>\r\n\r\ntype Output =\r\n | {\r\n status: 'async_launched'\r\n agentId: string\r\n description: string\r\n prompt: string\r\n }\r\n | {\r\n status: 'completed'\r\n agentId: string\r\n prompt: string\r\n content: TextBlock[]\r\n totalToolUseCount: number\r\n totalDurationMs: number\r\n totalTokens: number\r\n usage: any\r\n }\r\n\r\nfunction modelEnumToPointer(model?: TaskModel): string | undefined {\r\n if (!model) return undefined\r\n switch (model) {\r\n case 'haiku':\r\n return 'quick'\r\n case 'sonnet':\r\n return 'task'\r\n case 'opus':\r\n return 'main'\r\n }\r\n}\r\n\r\nfunction normalizeAgentModelName(\r\n model?: string,\r\n): string | 'inherit' | undefined {\r\n if (!model) return undefined\r\n if (model === 'inherit') return 'inherit'\r\n if (model === 'haiku' || model === 'sonnet' || model === 'opus') {\r\n return modelEnumToPointer(model as TaskModel)\r\n }\r\n return model\r\n}\r\n\r\nfunction getToolNameFromSpec(spec: string): string {\r\n const trimmed = spec.trim()\r\n if (!trimmed) return trimmed\r\n const match = trimmed.match(/^([^(]+)\\(([^)]+)\\)$/)\r\n if (!match) return trimmed\r\n const toolName = match[1]?.trim()\r\n const ruleContent = match[2]?.trim()\r\n if (!toolName || !ruleContent) return trimmed\r\n return toolName\r\n}\r\n\r\nfunction asyncLaunchMessage(agentId: string): string {\r\n const toolName = 'TaskOutput'\r\n return `Async agent launched successfully.\r\nagentId: ${agentId} (This is an internal ID for your use, do not mention it to the user. Use this ID to retrieve results with ${toolName} when the agent finishes). \r\nThe agent is currently working in the background. If you have other tasks you you should continue working on them now. Wait to call ${toolName} until either:\r\n- If you want to check on the agent's progress - call ${toolName} with block=false to get an immediate update on the agent's status\r\n- If you run out of things to do and the agent is still running - call ${toolName} with block=true to idle and wait for the agent's result (do not use block=true unless you completely run out of things to do as it will waste time).`\r\n}\r\n\r\nconst FORK_CONTEXT_TOOL_RESULT_TEXT = `### FORKING CONVERSATION CONTEXT ###\r\n### ENTERING SUB-AGENT ROUTINE ###\r\nEntered sub-agent context\r\n\r\nPLEASE NOTE: \r\n- The messages above this point are from the main thread prior to sub-agent execution. They are provided as context only.\r\n- Context messages may include tool_use blocks for tools that are not available in the sub-agent context. You should only use the tools specifically provided to you in the system prompt.\r\n- Only complete the specific sub-agent task you have been assigned below.`\r\n\r\nfunction normalizeAgentPermissionMode(\r\n mode: unknown,\r\n): PermissionMode | undefined {\r\n if (typeof mode !== 'string') return undefined\r\n const trimmed = mode.trim()\r\n if (!trimmed) return undefined\r\n if (trimmed === 'delegate') return 'default'\r\n if (\r\n trimmed === 'default' ||\r\n trimmed === 'acceptEdits' ||\r\n trimmed === 'plan' ||\r\n trimmed === 'bypassPermissions' ||\r\n trimmed === 'dontAsk'\r\n ) {\r\n return trimmed\r\n }\r\n return undefined\r\n}\r\n\r\nfunction applyAgentPermissionMode(\r\n base: ToolPermissionContext | undefined,\r\n options: {\r\n agentPermissionMode: PermissionMode | undefined\r\n safeMode: boolean\r\n },\r\n): ToolPermissionContext | undefined {\r\n if (!base) return base\r\n if (!options.agentPermissionMode) return base\r\n\r\n if (\r\n options.agentPermissionMode === 'bypassPermissions' &&\r\n (options.safeMode || base.isBypassPermissionsModeAvailable !== true)\r\n ) {\r\n return { ...base, mode: 'default' }\r\n }\r\n\r\n return { ...base, mode: options.agentPermissionMode }\r\n}\r\n\r\nfunction readJsonArrayFile(path: string): any[] | null {\r\n if (!existsSync(path)) return null\r\n try {\r\n const raw = readFileSync(path, 'utf8')\r\n const parsed = JSON.parse(raw)\r\n return Array.isArray(parsed) ? parsed : null\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nfunction buildForkContextForAgent(options: {\r\n enabled: boolean\r\n prompt: string\r\n toolUseId: string | undefined\r\n messageLogName: string\r\n forkNumber: number\r\n}): {\r\n forkContextMessages: MessageType[]\r\n promptMessages: MessageType[]\r\n} {\r\n const userPromptMessage = createUserMessage(options.prompt)\r\n\r\n if (!options.enabled || !options.toolUseId) {\r\n return {\r\n forkContextMessages: [],\r\n promptMessages: [userPromptMessage],\r\n }\r\n }\r\n\r\n const mainPath = getMessagesPath(options.messageLogName, options.forkNumber, 0)\r\n const mainMessages = readJsonArrayFile(mainPath) as MessageType[] | null\r\n if (!mainMessages || mainMessages.length === 0) {\r\n return {\r\n forkContextMessages: [],\r\n promptMessages: [userPromptMessage],\r\n }\r\n }\r\n\r\n let toolUseMessageIndex = -1\r\n let toolUseMessage: any = null\r\n let taskToolUseBlock: any = null\r\n\r\n for (let i = 0; i < mainMessages.length; i++) {\r\n const msg: any = mainMessages[i]\r\n if (msg?.type !== 'assistant') continue\r\n const blocks: any[] = Array.isArray(msg?.message?.content)\r\n ? msg.message.content\r\n : []\r\n const match = blocks.find(\r\n b => b && b.type === 'tool_use' && b.id === options.toolUseId,\r\n )\r\n if (!match) continue\r\n toolUseMessageIndex = i\r\n toolUseMessage = msg\r\n taskToolUseBlock = match\r\n break\r\n }\r\n\r\n if (toolUseMessageIndex === -1 || !toolUseMessage || !taskToolUseBlock) {\r\n return {\r\n forkContextMessages: [],\r\n promptMessages: [userPromptMessage],\r\n }\r\n }\r\n\r\n const forkContextMessages = (mainMessages.slice(\r\n 0,\r\n toolUseMessageIndex,\r\n ) ?? []) as MessageType[]\r\n\r\n const toolUseOnlyAssistant: MessageType = {\r\n ...toolUseMessage,\r\n uuid: randomUUID(),\r\n message: {\r\n ...toolUseMessage.message,\r\n content: [taskToolUseBlock],\r\n },\r\n }\r\n\r\n const forkContextToolResult = createUserMessage(\r\n [\r\n {\r\n type: 'tool_result',\r\n tool_use_id: taskToolUseBlock.id,\r\n content: FORK_CONTEXT_TOOL_RESULT_TEXT,\r\n } as any,\r\n ],\r\n {\r\n data: {\r\n status: 'sub_agent_entered',\r\n description: 'Entered sub-agent context',\r\n message: FORK_CONTEXT_TOOL_RESULT_TEXT,\r\n },\r\n resultForAssistant: FORK_CONTEXT_TOOL_RESULT_TEXT,\r\n } as any,\r\n )\r\n\r\n return {\r\n forkContextMessages,\r\n promptMessages: [toolUseOnlyAssistant, forkContextToolResult, userPromptMessage],\r\n }\r\n}\r\n\r\nexport const TaskTool = {\r\n name: TOOL_NAME,\r\n inputSchema,\r\n async description() {\r\n return 'Launch a new task'\r\n },\r\n async prompt({ safeMode }: { safeMode?: boolean }) {\r\n return await getPrompt(safeMode)\r\n },\r\n userFacingName(input?: Partial<Input>) {\r\n if (input?.subagent_type && input.subagent_type !== 'general-purpose') {\r\n return input.subagent_type\r\n }\r\n return 'Task'\r\n },\r\n async isEnabled() {\r\n return true\r\n },\r\n isReadOnly() {\r\n return true\r\n },\r\n isConcurrencySafe() {\r\n return true\r\n },\r\n needsPermissions() {\r\n return false\r\n },\r\n async validateInput(input: Input) {\r\n if (!input.description || typeof input.description !== 'string') {\r\n return {\r\n result: false,\r\n message: 'Description is required and must be a string',\r\n }\r\n }\r\n if (!input.prompt || typeof input.prompt !== 'string') {\r\n return {\r\n result: false,\r\n message: 'Prompt is required and must be a string',\r\n }\r\n }\r\n\r\n const availableTypes = await getAvailableAgentTypes()\r\n if (!availableTypes.includes(input.subagent_type)) {\r\n return {\r\n result: false,\r\n message: `Agent type '${input.subagent_type}' not found. Available agents: ${availableTypes.join(', ')}`,\r\n meta: { subagent_type: input.subagent_type, availableTypes },\r\n }\r\n }\r\n\r\n if (input.resume) {\r\n const transcript = getAgentTranscript(input.resume)\r\n if (!transcript) {\r\n return {\r\n result: false,\r\n message: `No transcript found for agent ID: ${input.resume}`,\r\n meta: { resume: input.resume },\r\n }\r\n }\r\n }\r\n\r\n return { result: true }\r\n },\r\n renderToolUseMessage({ description, prompt }: Input) {\r\n if (!description || !prompt) return '' as any\r\n return description\r\n },\r\n renderToolUseRejectedMessage() {\r\n return <FallbackToolUseRejectedMessage />\r\n },\r\n renderToolResultMessage(output: Output, { verbose }: { verbose: boolean }) {\r\n const theme = getTheme()\r\n if (output.status === 'async_launched') {\r\n const hint = output.prompt\r\n ? ' (down arrow \u2193 to manage \u00B7 ctrl+o to expand)'\r\n : ' (down arrow \u2193 to manage)'\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Box flexDirection=\"row\">\r\n <Text> \u23BF </Text>\r\n <Text>\r\n Backgrounded agent\r\n {!verbose && <Text dimColor>{hint}</Text>}\r\n </Text>\r\n </Box>\r\n {verbose && output.prompt && (\r\n <Box\r\n paddingLeft={2}\r\n borderLeftStyle=\"single\"\r\n borderLeftColor={theme.secondaryBorder}\r\n >\r\n <Text color={theme.secondaryText} wrap=\"wrap\">\r\n {output.prompt}\r\n </Text>\r\n </Box>\r\n )}\r\n </Box>\r\n )\r\n }\r\n\r\n const summary = [\r\n output.totalToolUseCount === 1\r\n ? '1 tool use'\r\n : `${output.totalToolUseCount} tool uses`,\r\n `${formatNumber(output.totalTokens)} tokens`,\r\n formatDuration(output.totalDurationMs),\r\n ]\r\n return (\r\n <Box flexDirection=\"column\">\r\n {verbose && output.prompt && (\r\n <Box\r\n paddingLeft={2}\r\n borderLeftStyle=\"single\"\r\n borderLeftColor={theme.secondaryBorder}\r\n >\r\n <Text color={theme.secondaryText} wrap=\"wrap\">\r\n {\r\n maybeTruncateVerboseToolOutput(output.prompt, {\r\n maxLines: 120,\r\n maxChars: 20_000,\r\n }).text\r\n }\r\n </Text>\r\n </Box>\r\n )}\r\n {verbose && output.content.length > 0 && (\r\n <Box\r\n paddingLeft={2}\r\n borderLeftStyle=\"single\"\r\n borderLeftColor={theme.secondaryBorder}\r\n >\r\n <Text wrap=\"wrap\">\r\n {\r\n maybeTruncateVerboseToolOutput(\r\n output.content.map(b => b.text).join('\\n'),\r\n {\r\n maxLines: 200,\r\n maxChars: 40_000,\r\n },\r\n ).text\r\n }\r\n </Text>\r\n </Box>\r\n )}\r\n <Box flexDirection=\"row\">\r\n <Text> \u23BF </Text>\r\n <Text dimColor>Done ({summary.join(' \u00B7 ')})</Text>\r\n </Box>\r\n </Box>\r\n )\r\n },\r\n renderResultForAssistant(output: Output) {\r\n if (output.status === 'async_launched')\r\n return asyncLaunchMessage(output.agentId)\r\n return output.content.map(b => b.text).join('\\n')\r\n },\r\n\r\n async *call(input: Input, toolUseContext: any) {\r\n const startTime = Date.now()\r\n const {\r\n abortController,\r\n toolUseId,\r\n options: {\r\n safeMode = false,\r\n forkNumber,\r\n messageLogName,\r\n verbose,\r\n model: parentModel,\r\n mcpClients,\r\n },\r\n readFileTimestamps,\r\n } = toolUseContext\r\n\r\n const queryFn =\r\n typeof toolUseContext?.__testQuery === 'function'\r\n ? toolUseContext.__testQuery\r\n : query\r\n\r\n const agentConfig = await getAgentByType(input.subagent_type)\r\n if (!agentConfig) {\r\n const available = await getAvailableAgentTypes()\r\n throw Error(\r\n `Agent type '${input.subagent_type}' not found. Available agents: ${available.join(', ')}`,\r\n )\r\n }\r\n\r\n const effectivePrompt = input.prompt\r\n\r\n const normalizedAgentModel = normalizeAgentModelName(agentConfig.model)\r\n const defaultSubagentModel = 'task'\r\n const envSubagentModel =\r\n process.env.DANYA_SUBAGENT_MODEL ??\r\n process.env.KODE_SUBAGENT_MODEL ??\r\n process.env.CLAUDE_CODE_SUBAGENT_MODEL\r\n const modelToUse: string =\r\n (typeof envSubagentModel === 'string' && envSubagentModel.trim()\r\n ? envSubagentModel.trim()\r\n : undefined) ||\r\n modelEnumToPointer(input.model) ||\r\n (normalizedAgentModel === 'inherit'\r\n ? parentModel || defaultSubagentModel\r\n : normalizedAgentModel) ||\r\n defaultSubagentModel\r\n\r\n const toolFilter = agentConfig.tools\r\n let tools = await getTaskTools(safeMode)\r\n if (toolFilter) {\r\n const isAllArray =\r\n Array.isArray(toolFilter) &&\r\n toolFilter.length === 1 &&\r\n toolFilter[0] === '*'\r\n if (toolFilter === '*' || isAllArray) {\r\n } else if (Array.isArray(toolFilter)) {\r\n const allowedToolNames = new Set(\r\n toolFilter.map(getToolNameFromSpec).filter(Boolean),\r\n )\r\n tools = tools.filter(t => allowedToolNames.has(t.name))\r\n }\r\n }\r\n\r\n const disallowedTools = Array.isArray(agentConfig.disallowedTools)\r\n ? agentConfig.disallowedTools\r\n : []\r\n if (disallowedTools.length > 0) {\r\n const disallowedToolNames = new Set(\r\n disallowedTools.map(getToolNameFromSpec).filter(Boolean),\r\n )\r\n tools = tools.filter(t => !disallowedToolNames.has(t.name))\r\n }\r\n\r\n const agentId = input.resume || generateAgentId()\r\n const baseTranscript = input.resume\r\n ? (getAgentTranscript(input.resume)?.filter(m => m.type !== 'progress') ??\r\n null)\r\n : []\r\n if (input.resume && baseTranscript === null) {\r\n throw Error(`No transcript found for agent ID: ${input.resume}`)\r\n }\r\n\r\n const { forkContextMessages, promptMessages } = buildForkContextForAgent({\r\n enabled: agentConfig.forkContext === true,\r\n prompt: effectivePrompt,\r\n toolUseId,\r\n messageLogName,\r\n forkNumber,\r\n })\r\n\r\n const transcriptMessages: MessageType[] = [\r\n ...(baseTranscript || []),\r\n ...promptMessages,\r\n ]\r\n\r\n const messagesForQuery: MessageType[] = [\r\n ...forkContextMessages,\r\n ...transcriptMessages,\r\n ]\r\n\r\n const [baseSystemPrompt, context, maxThinkingTokens] = await Promise.all([\r\n getAgentPrompt(),\r\n getContext(),\r\n getMaxThinkingTokens(messagesForQuery),\r\n ])\r\n const systemPrompt =\r\n agentConfig.systemPrompt && agentConfig.systemPrompt.length > 0\r\n ? [...baseSystemPrompt, agentConfig.systemPrompt]\r\n : baseSystemPrompt\r\n\r\n const agentPermissionMode = normalizeAgentPermissionMode(\r\n (agentConfig as any).permissionMode,\r\n )\r\n const toolPermissionContext = applyAgentPermissionMode(\r\n toolUseContext.options?.toolPermissionContext,\r\n { agentPermissionMode, safeMode },\r\n )\r\n\r\n const queryOptions = {\r\n safeMode,\r\n forkNumber,\r\n messageLogName,\r\n tools,\r\n commands: [],\r\n verbose,\r\n permissionMode: 'dontAsk' as const,\r\n toolPermissionContext,\r\n maxThinkingTokens,\r\n model: modelToUse,\r\n mcpClients,\r\n }\r\n\r\n if (input.run_in_background) {\r\n const bgAbortController = new AbortController()\r\n\r\n const taskRecord: any = {\r\n type: 'async_agent',\r\n agentId,\r\n description: input.description,\r\n prompt: effectivePrompt,\r\n status: 'running',\r\n startedAt: Date.now(),\r\n messages: [...transcriptMessages],\r\n abortController: bgAbortController,\r\n done: Promise.resolve(),\r\n }\r\n\r\n taskRecord.done = (async () => {\r\n try {\r\n const bgMessages: MessageType[] = [...messagesForQuery]\r\n const bgTranscriptMessages: MessageType[] = [...transcriptMessages]\r\n\r\n for await (const msg of queryFn(\r\n bgMessages,\r\n systemPrompt,\r\n context,\r\n hasPermissionsToUseTool,\r\n {\r\n abortController: bgAbortController,\r\n options: queryOptions,\r\n messageId: getLastAssistantMessageId(bgMessages),\r\n agentId,\r\n readFileTimestamps,\r\n setToolJSX: () => {},\r\n },\r\n )) {\r\n bgMessages.push(msg)\r\n bgTranscriptMessages.push(msg)\r\n taskRecord.messages = [...bgTranscriptMessages]\r\n upsertBackgroundAgentTask(taskRecord)\r\n }\r\n\r\n const lastAssistant = last(\r\n bgTranscriptMessages.filter(m => m.type === 'assistant'),\r\n ) as any\r\n const content = lastAssistant?.message?.content?.filter(\r\n (b: any) => b.type === 'text',\r\n ) as TextBlock[] | undefined\r\n\r\n taskRecord.status = 'completed'\r\n taskRecord.completedAt = Date.now()\r\n taskRecord.resultText = (content || []).map(b => b.text).join('\\n')\r\n taskRecord.messages = [...bgTranscriptMessages]\r\n upsertBackgroundAgentTask(taskRecord)\r\n saveAgentTranscript(agentId, bgTranscriptMessages)\r\n } catch (e) {\r\n taskRecord.status = 'failed'\r\n taskRecord.completedAt = Date.now()\r\n taskRecord.error = e instanceof Error ? e.message : String(e)\r\n upsertBackgroundAgentTask(taskRecord)\r\n }\r\n })()\r\n\r\n upsertBackgroundAgentTask(taskRecord)\r\n\r\n const output: Output = {\r\n status: 'async_launched',\r\n agentId,\r\n description: input.description,\r\n prompt: effectivePrompt,\r\n }\r\n yield {\r\n type: 'result',\r\n data: output,\r\n resultForAssistant: asyncLaunchMessage(agentId),\r\n }\r\n return\r\n }\r\n\r\n const getSidechainNumber = memoize(() =>\r\n getNextAvailableLogSidechainNumber(messageLogName, forkNumber),\r\n )\r\n\r\n const PROGRESS_THROTTLE_MS = 200\r\n const MAX_RECENT_ACTIONS = 6\r\n let lastProgressEmitAt = 0\r\n let lastEmittedToolUseCount = 0\r\n const recentActions: string[] = []\r\n\r\n const addRecentAction = (action: string) => {\r\n const trimmed = action.trim()\r\n if (!trimmed) return\r\n recentActions.push(trimmed)\r\n if (recentActions.length > MAX_RECENT_ACTIONS) {\r\n recentActions.splice(0, recentActions.length - MAX_RECENT_ACTIONS)\r\n }\r\n }\r\n\r\n const truncate = (text: string, maxLen: number) => {\r\n const normalized = text.replace(/\\s+/g, ' ').trim()\r\n if (normalized.length <= maxLen) return normalized\r\n return `${normalized.slice(0, maxLen - 1)}\u2026`\r\n }\r\n\r\n const summarizeToolUse = (name: string, rawInput: unknown): string => {\r\n const input = (\r\n rawInput && typeof rawInput === 'object' ? rawInput : {}\r\n ) as Record<string, unknown>\r\n switch (name) {\r\n case 'Read': {\r\n const filePath =\r\n (typeof input.file_path === 'string' && input.file_path) ||\r\n (typeof input.path === 'string' && input.path) ||\r\n ''\r\n return filePath ? `Read ${filePath}` : 'Read'\r\n }\r\n case 'Write': {\r\n const filePath =\r\n (typeof input.file_path === 'string' && input.file_path) ||\r\n (typeof input.path === 'string' && input.path) ||\r\n ''\r\n return filePath ? `Write ${filePath}` : 'Write'\r\n }\r\n case 'Edit':\r\n case 'MultiEdit': {\r\n const filePath =\r\n (typeof input.file_path === 'string' && input.file_path) ||\r\n (typeof input.path === 'string' && input.path) ||\r\n ''\r\n return filePath ? `${name} ${filePath}` : name\r\n }\r\n case 'Grep': {\r\n const pattern = typeof input.pattern === 'string' ? input.pattern : ''\r\n return pattern ? `Grep ${truncate(pattern, 80)}` : 'Grep'\r\n }\r\n case 'Glob': {\r\n const pattern =\r\n (typeof input.pattern === 'string' && input.pattern) ||\r\n (typeof input.glob === 'string' && input.glob) ||\r\n ''\r\n return pattern ? `Glob ${truncate(pattern, 80)}` : 'Glob'\r\n }\r\n case 'Bash': {\r\n const command = typeof input.command === 'string' ? input.command : ''\r\n return command ? `Bash ${truncate(command, 80)}` : 'Bash'\r\n }\r\n case 'WebFetch':\r\n case 'WebSearch': {\r\n const url = typeof input.url === 'string' ? input.url : ''\r\n const query = typeof input.query === 'string' ? input.query : ''\r\n if (url) return `${name} ${truncate(url, 100)}`\r\n if (query) return `${name} ${truncate(query, 100)}`\r\n return name\r\n }\r\n default:\r\n return name\r\n }\r\n }\r\n\r\n const renderProgressText = (toolUseCount: number): string => {\r\n const header = `${input.description || 'Task'}\u2026 (${toolUseCount} tool${toolUseCount === 1 ? '' : 's'})`\r\n if (recentActions.length === 0) return header\r\n const lines = recentActions.map(a => `- ${a}`)\r\n return [header, ...lines].join('\\n')\r\n }\r\n\r\n yield {\r\n type: 'progress',\r\n content: createAssistantMessage(\r\n `<tool-progress>${renderProgressText(0)}</tool-progress>`,\r\n ),\r\n }\r\n lastProgressEmitAt = Date.now()\r\n\r\n let toolUseCount = 0\r\n for await (const message of queryFn(\r\n messagesForQuery,\r\n systemPrompt,\r\n context,\r\n hasPermissionsToUseTool,\r\n {\r\n abortController,\r\n options: queryOptions,\r\n messageId: getLastAssistantMessageId(messagesForQuery),\r\n agentId,\r\n readFileTimestamps,\r\n setToolJSX: () => {},\r\n },\r\n )) {\r\n messagesForQuery.push(message)\r\n transcriptMessages.push(message)\r\n\r\n overwriteLog(\r\n getMessagesPath(messageLogName, forkNumber, getSidechainNumber()),\r\n transcriptMessages.filter(_ => _.type !== 'progress'),\r\n { conversationKey: `${messageLogName}:${forkNumber}` },\r\n )\r\n\r\n if (message.type === 'assistant') {\r\n for (const block of message.message.content) {\r\n if (\r\n block.type === 'tool_use' ||\r\n block.type === 'server_tool_use' ||\r\n block.type === 'mcp_tool_use'\r\n ) {\r\n toolUseCount += 1\r\n addRecentAction(summarizeToolUse(block.name, (block as any).input))\r\n }\r\n }\r\n }\r\n\r\n const now = Date.now()\r\n const hasNewToolUses = toolUseCount > lastEmittedToolUseCount\r\n const shouldEmit =\r\n hasNewToolUses &&\r\n (lastEmittedToolUseCount === 0 ||\r\n now - lastProgressEmitAt >= PROGRESS_THROTTLE_MS)\r\n if (shouldEmit) {\r\n yield {\r\n type: 'progress',\r\n content: createAssistantMessage(\r\n `<tool-progress>${renderProgressText(toolUseCount)}</tool-progress>`,\r\n ),\r\n }\r\n lastEmittedToolUseCount = toolUseCount\r\n lastProgressEmitAt = now\r\n }\r\n }\r\n\r\n const lastAssistant = last(\r\n transcriptMessages.filter(m => m.type === 'assistant'),\r\n ) as any\r\n if (!lastAssistant || lastAssistant.type !== 'assistant') {\r\n throw Error('No assistant messages found')\r\n }\r\n\r\n const content = lastAssistant.message.content.filter(\r\n (b: any) => b.type === 'text',\r\n ) as TextBlock[]\r\n\r\n saveAgentTranscript(agentId, transcriptMessages)\r\n\r\n const totalDurationMs = Date.now() - startTime\r\n const totalTokens = countTokens(transcriptMessages)\r\n const usage = lastAssistant.message.usage\r\n\r\n const output: Output = {\r\n status: 'completed',\r\n agentId,\r\n prompt: effectivePrompt,\r\n content,\r\n totalToolUseCount: toolUseCount,\r\n totalDurationMs,\r\n totalTokens,\r\n usage,\r\n }\r\n const agentIdBlock: TextBlock = {\r\n type: 'text',\r\n text: `agentId: ${agentId} (for resuming to continue this agent's work if needed)`,\r\n citations: [],\r\n }\r\n\r\n yield {\r\n type: 'result',\r\n data: output,\r\n resultForAssistant: [...content, agentIdBlock],\r\n }\r\n },\r\n} satisfies Tool<typeof inputSchema, Output>\r\n", "import type { Message as ConversationMessage } from '@query'\r\n\r\nconst transcripts = new Map<string, ConversationMessage[]>()\r\n\r\nexport function saveAgentTranscript(\r\n agentId: string,\r\n messages: ConversationMessage[],\r\n): void {\r\n transcripts.set(agentId, messages)\r\n}\r\n\r\nexport function getAgentTranscript(\r\n agentId: string,\r\n): ConversationMessage[] | undefined {\r\n return transcripts.get(agentId)\r\n}\r\n", "import { type Tool } from '@tool'\r\nimport { getTools, getReadOnlyTools } from '@tools'\r\nimport { TaskTool } from './TaskTool'\r\nimport { BashTool } from '@tools/BashTool/BashTool'\r\nimport { FileWriteTool } from '@tools/FileWriteTool/FileWriteTool'\r\nimport { FileEditTool } from '@tools/FileEditTool/FileEditTool'\r\nimport { NotebookEditTool } from '@tools/NotebookEditTool/NotebookEditTool'\r\nimport { GlobTool } from '@tools/GlobTool/GlobTool'\r\nimport { FileReadTool } from '@tools/FileReadTool/FileReadTool'\r\nimport { getModelManager } from '@utils/model'\r\nimport { getActiveAgents } from '@utils/agent/loader'\r\n\r\nconst SUBAGENT_DISALLOWED_TOOL_NAMES = new Set<string>([\r\n 'Task',\r\n 'TaskOutput',\r\n 'KillShell',\r\n 'EnterPlanMode',\r\n 'ExitPlanMode',\r\n 'AskUserQuestion',\r\n])\r\n\r\nexport async function getTaskTools(safeMode: boolean): Promise<Tool[]> {\r\n return (await (!safeMode ? getTools() : getReadOnlyTools())).filter(\r\n tool => !SUBAGENT_DISALLOWED_TOOL_NAMES.has(tool.name),\r\n )\r\n}\r\n\r\nexport async function getPrompt(safeMode: boolean): Promise<string> {\r\n const agents = await getActiveAgents()\r\n\r\n const agentDescriptions = agents\r\n .map(agent => {\r\n const toolsStr = Array.isArray(agent.tools) ? agent.tools.join(', ') : '*'\r\n return `- ${agent.agentType}: ${agent.whenToUse} (Tools: ${toolsStr})`\r\n })\r\n .join('\\n')\r\n\r\n return `Launch a new agent to handle complex, multi-step tasks autonomously. \r\n\r\nAvailable agent types and the tools they have access to:\r\n${agentDescriptions}\r\n\r\nWhen using the Task tool, you must specify a subagent_type parameter to select which agent type to use.\r\n\r\nWhen to use the Agent tool:\r\n- When you are instructed to execute custom slash commands. Use the Agent tool with the slash command invocation as the entire prompt. The slash command can take arguments. For example: Task(description=\"Check the file\", prompt=\"/check-file path/to/file.py\")\r\n\r\nWhen NOT to use the Agent tool:\r\n- If you want to read a specific file path, use the ${FileReadTool.name} or ${GlobTool.name} tool instead of the Agent tool, to find the match more quickly\r\n- If you are searching for a specific class definition like \"class Foo\", use the ${GlobTool.name} tool instead, to find the match more quickly\r\n- If you are searching for code within a specific file or set of 2-3 files, use the ${FileReadTool.name} tool instead of the Agent tool, to find the match more quickly\r\n- Other tasks that are not related to the agent descriptions above\r\n\r\nUsage notes:\r\n1. Launch multiple agents concurrently whenever possible, to maximize performance; to do that, use a single message with multiple tool uses\r\n2. When the agent is done, it will return a single message back to you. The result returned by the agent is not visible to the user. To show the user the result, you should send a text message back to the user with a concise summary of the result.\r\n3. Each agent invocation is stateless. You will not be able to send additional messages to the agent, nor will the agent be able to communicate with you outside of its final report. Therefore, your prompt should contain a highly detailed task description for the agent to perform autonomously and you should specify exactly what information the agent should return back to you in its final and only message to you.\r\n4. The agent's outputs should generally be trusted\r\n5. Clearly tell the agent whether you expect it to write code or just to do research (search, file reads, web fetches, etc.), since it is not aware of the user's intent\r\n6. If the agent description mentions that it should be used proactively, then you should try your best to use it without the user having to ask for it first. Use your judgement.\r\n\r\nExample usage:\r\n\r\n<example_agent_descriptions>\r\n\"code-reviewer\": use this agent after you are done writing a signficant piece of code\r\n\"greeting-responder\": use this agent when to respond to user greetings with a friendly joke\r\n</example_agent_description>\r\n\r\n<example>\r\nuser: \"Please write a function that checks if a number is prime\"\r\nassistant: Sure let me write a function that checks if a number is prime\r\nassistant: First let me use the ${FileWriteTool.name} tool to write a function that checks if a number is prime\r\nassistant: I'm going to use the ${FileWriteTool.name} tool to write the following code:\r\n<code>\r\nfunction isPrime(n) {\r\n if (n <= 1) return false\r\n for (let i = 2; i * i <= n; i++) {\r\n if (n % i === 0) return false\r\n }\r\n return true\r\n}\r\n</code>\r\n<commentary>\r\nSince a signficant piece of code was written and the task was completed, now use the code-reviewer agent to review the code\r\n</commentary>\r\nassistant: Now let me use the code-reviewer agent to review the code\r\nassistant: Uses the Task tool to launch the with the code-reviewer agent \r\n</example>\r\n\r\n<example>\r\nuser: \"Hello\"\r\n<commentary>\r\nSince the user is greeting, use the greeting-responder agent to respond with a friendly joke\r\n</commentary>\r\nassistant: \"I'm going to use the Task tool to launch the with the greeting-responder agent\"\r\n</example>`\r\n}\r\n", "export const TOOL_NAME = 'Task'\r\n", "/**\n * Game-specific tool registry.\n * Conditionally loads tools based on detected engine and server language.\n */\n\nimport type { Tool } from '@tool'\nimport { detectProject } from '../../engine/detect'\nimport { getCwd } from '@utils/state'\n\n// Lazy imports to avoid loading tools for engines not in use\nlet _cachedTools: Tool[] | null = null\n\nexport function getGameTools(): Tool[] {\n if (_cachedTools) return _cachedTools\n\n const detection = detectProject(getCwd())\n const tools: Tool[] = []\n\n // Always available (cross-engine)\n try {\n const { ScoreReviewTool } = require('./ScoreReview/ScoreReview')\n tools.push(ScoreReviewTool as unknown as Tool)\n } catch {}\n\n try {\n const { ArchitectureGuardTool } = require('./ArchitectureGuard/ArchitectureGuard')\n tools.push(ArchitectureGuardTool as unknown as Tool)\n } catch {}\n\n try {\n const { KnowledgeSedimentTool } = require('./KnowledgeSediment/KnowledgeSediment')\n tools.push(KnowledgeSedimentTool as unknown as Tool)\n } catch {}\n\n try {\n const { GateChainTool } = require('./GateChain/GateChain')\n tools.push(GateChainTool as unknown as Tool)\n } catch {}\n\n try {\n const { ProtoCompileTool } = require('./ProtoCompile/ProtoCompile')\n tools.push(ProtoCompileTool as unknown as Tool)\n } catch {}\n\n try {\n const { ConfigGenerateTool } = require('./ConfigGenerate/ConfigGenerate')\n tools.push(ConfigGenerateTool as unknown as Tool)\n } catch {}\n\n // Unity / C# projects\n if (detection.engine === 'unity' || detection.engine === 'godot') {\n try {\n const { CSharpSyntaxCheckTool } = require('./CSharpSyntaxCheck/CSharpSyntaxCheck')\n tools.push(CSharpSyntaxCheckTool as unknown as Tool)\n } catch {}\n }\n\n // Unity build\n if (detection.engine === 'unity') {\n try {\n const { UnityBuildTool } = require('./UnityBuild/UnityBuild')\n tools.push(UnityBuildTool as unknown as Tool)\n } catch {}\n }\n\n // Unreal build\n if (detection.engine === 'unreal') {\n try {\n const { UnrealBuildTool } = require('./UnrealBuild/UnrealBuild')\n tools.push(UnrealBuildTool as unknown as Tool)\n } catch {}\n }\n\n // Godot build\n if (detection.engine === 'godot') {\n try {\n const { GodotBuildTool } = require('./GodotBuild/GodotBuild')\n tools.push(GodotBuildTool as unknown as Tool)\n } catch {}\n }\n\n // ORM generation (Go server projects)\n if (detection.serverLanguage === 'go') {\n try {\n const { OrmGenerateTool } = require('./OrmGenerate/OrmGenerate')\n tools.push(OrmGenerateTool as unknown as Tool)\n } catch {}\n }\n\n // Asset check (any game engine)\n if (detection.engine) {\n try {\n const { AssetCheckTool } = require('./AssetCheck/AssetCheck')\n tools.push(AssetCheckTool as unknown as Tool)\n } catch {}\n }\n\n // Go server\n if (detection.serverLanguage === 'go') {\n try {\n const { GameServerBuildTool } = require('./GameServerBuild/GameServerBuild')\n tools.push(GameServerBuildTool as unknown as Tool)\n } catch {}\n }\n\n _cachedTools = tools\n return tools\n}\n\nexport function resetGameToolsCache(): void {\n _cachedTools = null\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["TOOL_NAME", "DESCRIPTION", "existsSync", "readFileSync", "writeFileSync", "mkdirSync", "join", "z", "readFileSync", "existsSync", "join", "inputSchema", "TOOL_NAME", "DESCRIPTION", "TOOL_NAME", "DESCRIPTION", "init_prompt", "z", "readFileSync", "existsSync", "execSync", "getChangedFiles", "inputSchema", "init_prompt", "TOOL_NAME", "DESCRIPTION", "output", "TOOL_NAME", "DESCRIPTION", "init_prompt", "z", "mkdirSync", "writeFileSync", "existsSync", "readFileSync", "join", "dirname", "inputSchema", "init_prompt", "TOOL_NAME", "DESCRIPTION", "TOOL_NAME", "DESCRIPTION", "init_prompt", "z", "execSync", "inputSchema", "init_prompt", "TOOL_NAME", "DESCRIPTION", "output", "TOOL_NAME", "DESCRIPTION", "init_prompt", "z", "execSync", "inputSchema", "init_prompt", "TOOL_NAME", "DESCRIPTION", "TOOL_NAME", "DESCRIPTION", "init_prompt", "z", "execSync", "existsSync", "inputSchema", "init_prompt", "TOOL_NAME", "DESCRIPTION", "TOOL_NAME", "DESCRIPTION", "init_prompt", "z", "execSync", "existsSync", "dirname", "join", "inputSchema", "init_prompt", "TOOL_NAME", "DESCRIPTION", "output", "readFileSync", "TOOL_NAME", "DESCRIPTION", "init_prompt", "init_parser", "z", "execSync", "existsSync", "join", "glob", "readFileSync", "findCsproj", "inputSchema", "init_prompt", "init_parser", "TOOL_NAME", "DESCRIPTION", "output", "TOOL_NAME", "DESCRIPTION", "init_prompt", "init_parser", "z", "execSync", "existsSync", "join", "glob", "inputSchema", "init_prompt", "init_parser", "TOOL_NAME", "DESCRIPTION", "output", "TOOL_NAME", "DESCRIPTION", "init_prompt", "z", "execSync", "existsSync", "join", "glob", "MSBUILD_REGEX", "findCsproj", "inputSchema", "init_prompt", "TOOL_NAME", "DESCRIPTION", "TOOL_NAME", "DESCRIPTION", "init_prompt", "z", "execSync", "existsSync", "join", "inputSchema", "init_prompt", "TOOL_NAME", "DESCRIPTION", "TOOL_NAME", "DESCRIPTION", "init_prompt", "readFileSync", "join", "relative", "glob", "getChangedFiles", "execSync", "init_unity", "readFileSync", "existsSync", "join", "relative", "glob", "getChangedFiles", "execSync", "init_godot", "z", "existsSync", "join", "inputSchema", "init_prompt", "init_unity", "init_godot", "TOOL_NAME", "DESCRIPTION", "issues", "glob", "TOOL_NAME", "DESCRIPTION", "init_prompt", "init_parser", "z", "execSync", "existsSync", "join", "inputSchema", "init_prompt", "init_parser", "TOOL_NAME", "DESCRIPTION", "memoize", "Box", "Text", "React", "z", "inputSchema", "z", "React", "Box", "Text", "out", "Box", "Text", "React", "z", "DESCRIPTION", "PROMPT", "inputSchema", "z", "DESCRIPTION", "PROMPT", "React", "Box", "Text", "existsSync", "readFileSync", "Box", "Text", "join", "React", "z", "TOOL_NAME_FOR_PROMPT", "PROMPT", "DESCRIPTION", "inputSchema", "z", "join", "React", "Text", "TOOL_NAME_FOR_PROMPT", "DESCRIPTION", "PROMPT", "existsSync", "readFileSync", "Box", "Box", "Text", "React", "z", "TOOL_NAME", "DESCRIPTION", "PROMPT", "inputSchema", "z", "TOOL_NAME", "DESCRIPTION", "PROMPT", "React", "Box", "Text", "React", "Box", "Text", "z", "randomUUID", "existsSync", "readFileSync", "TOOL_NAME", "inputSchema", "z", "existsSync", "readFileSync", "randomUUID", "TOOL_NAME", "React", "Box", "Text", "lastAssistant", "content", "output", "input", "query", "toolUseCount", "ScoreReviewTool", "ArchitectureGuardTool", "KnowledgeSedimentTool", "GateChainTool", "ProtoCompileTool", "ConfigGenerateTool", "CSharpSyntaxCheckTool", "UnityBuildTool", "UnrealBuildTool", "GodotBuildTool", "OrmGenerateTool", "AssetCheckTool", "GameServerBuildTool", "memoize"]
|
|
7
|
+
}
|