cast-code 1.0.3 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +150 -150
- package/dist/common/services/llm.service.js +1 -1
- package/dist/common/services/llm.service.js.map +1 -1
- package/dist/common/services/multi-llm.service.js +2 -2
- package/dist/common/services/multi-llm.service.js.map +1 -1
- package/dist/modules/config/services/config-commands.service.js +9 -3
- package/dist/modules/config/services/config-commands.service.js.map +1 -1
- package/dist/modules/config/services/init-config.service.js +8 -3
- package/dist/modules/config/services/init-config.service.js.map +1 -1
- package/dist/modules/core/services/deep-agent.service.js +27 -7
- package/dist/modules/core/services/deep-agent.service.js.map +1 -1
- package/dist/modules/git/services/commit-generator.service.js +21 -5
- package/dist/modules/git/services/commit-generator.service.js.map +1 -1
- package/dist/modules/repl/services/repl.service.js +2 -0
- package/dist/modules/repl/services/repl.service.js.map +1 -1
- package/dist/modules/repl/services/smart-input.js +30 -30
- package/dist/modules/repl/services/smart-input.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/git/services/commit-generator.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { execSync } from 'child_process';\nimport { HumanMessage, SystemMessage } from '@langchain/core/messages';\nimport { MultiLlmService } from '../../../common/services/multi-llm.service';\nimport { MonorepoDetectorService } from './monorepo-detector.service';\nimport { GitDiffInfo, SplitCommit, CommitGroup, MonorepoInfo } from '../types/git.types';\n\n@Injectable()\nexport class CommitGeneratorService {\n constructor(\n private readonly multiLlmService: MultiLlmService,\n private readonly monorepoDetector: MonorepoDetectorService,\n ) {}\n\n getDiffInfo(): GitDiffInfo | null {\n try {\n const cwd = process.cwd();\n const staged = execSync('git diff --cached', { cwd, encoding: 'utf-8' });\n const unstaged = execSync('git diff', { cwd, encoding: 'utf-8' });\n const stats = execSync('git diff --stat', { cwd, encoding: 'utf-8' });\n\n return {\n staged,\n unstaged,\n stagedFiles: this.extractFiles(staged),\n unstagedFiles: this.extractFiles(unstaged),\n stats,\n };\n } catch {\n return null;\n }\n }\n\n hasChanges(): boolean {\n try {\n const output = execSync('git status --porcelain', { cwd: process.cwd(), encoding: 'utf-8' });\n return output.trim().length > 0;\n } catch {\n return false;\n }\n }\n\n async generateCommitMessage(): Promise<string | null> {\n const diffInfo = this.getDiffInfo();\n if (!diffInfo) return null;\n\n const monorepoInfo = this.monorepoDetector.detectMonorepo(process.cwd());\n const allFiles = [...diffInfo.stagedFiles, ...diffInfo.unstagedFiles];\n const scope = this.monorepoDetector.determineScope(allFiles, monorepoInfo);\n\n const llm = this.multiLlmService.createModel('cheap');\n const prompt = this.buildCommitPrompt(diffInfo, scope);\n\n const response = await llm.invoke([\n new SystemMessage(this.getCommitSystemPrompt()),\n new HumanMessage(prompt),\n ]);\n\n const message = this.extractContent(response.content);\n return this.cleanCommitMessage(message);\n }\n\n async splitCommits(): Promise<SplitCommit[] | null> {\n const diffInfo = this.getDiffInfo();\n if (!diffInfo) return null;\n\n const monorepoInfo = this.monorepoDetector.detectMonorepo(process.cwd());\n const allFiles = [...diffInfo.stagedFiles, ...diffInfo.unstagedFiles];\n\n const llm = this.multiLlmService.createModel('cheap');\n const splitPrompt = this.buildSplitPrompt(diffInfo, allFiles);\n\n const splitResponse = await llm.invoke([\n new SystemMessage(this.getSplitSystemPrompt()),\n new HumanMessage(splitPrompt),\n ]);\n\n const splitContent = this.extractContent(splitResponse.content);\n const commitGroups = this.parseCommitGroups(splitContent);\n\n if (!commitGroups?.length) return null;\n\n const validGroups = commitGroups.filter((group) => Array.isArray(group.files) && group.files.length > 0);\n if (validGroups.length === 0) return null;\n\n for (const group of validGroups) {\n if (!group.scope) {\n group.scope = this.monorepoDetector.determineScope(group.files, monorepoInfo);\n }\n }\n\n const splitCommits: SplitCommit[] = [];\n for (const group of validGroups) {\n const message = await this.generateMessageForGroup(group, diffInfo);\n splitCommits.push({ ...group, message });\n }\n\n return splitCommits;\n }\n\n executeCommit(message: string, autoStage = true): boolean {\n try {\n const cwd = process.cwd();\n if (autoStage) {\n execSync('git add -A', { cwd });\n }\n execSync('git commit -F -', { cwd, input: `${message}\\n`, encoding: 'utf-8' });\n return true;\n } catch {\n return false;\n }\n }\n\n executePush(): { success: boolean; error?: string } {\n try {\n const cwd = process.cwd();\n const branch = execSync('git branch --show-current', { cwd, encoding: 'utf-8' }).trim();\n execSync(`git push origin ${branch}`, { cwd, encoding: 'utf-8' });\n return { success: true };\n } catch (error: any) {\n const message = error.message || 'Push failed';\n if (message.includes('rejected') || message.includes('diverged')) {\n return { success: false, error: 'Push rejected. Run \"git pull --rebase\" first.' };\n }\n return { success: false, error: message };\n }\n }\n\n executeSplitCommits(commits: SplitCommit[]): { success: boolean; committed: number; error?: string; originalHead?: string } {\n const cwd = process.cwd();\n let committedCount = 0;\n let originalHead: string | undefined;\n\n try {\n originalHead = execSync('git rev-parse HEAD', { cwd, encoding: 'utf-8' }).trim();\n\n for (const commit of commits) {\n execSync('git reset', { cwd });\n\n for (const file of commit.files) {\n try {\n execSync(`git add \"${file}\"`, { cwd });\n } catch {}\n }\n\n const staged = execSync('git diff --cached --name-only', { cwd, encoding: 'utf-8' });\n if (!staged.trim()) continue;\n\n execSync('git commit -F -', { cwd, input: `${commit.message}\\n`, encoding: 'utf-8' });\n committedCount++;\n }\n\n return { success: true, committed: committedCount };\n } catch (error: any) {\n return {\n success: false,\n committed: committedCount,\n error: error.message || 'Failed to execute commits',\n originalHead\n };\n }\n }\n\n async refineCommitMessage(\n currentMessage: string,\n userSuggestion: string,\n diffInfo: GitDiffInfo,\n ): Promise<string> {\n const llm = this.multiLlmService.createModel('cheap');\n\n const prompt = `Current commit message: ${currentMessage}\\n\\nUser suggestion: ${userSuggestion}\\n\\nDiff:\\n${diffInfo.staged.slice(0, 3000)}`;\n\n const response = await llm.invoke([\n new SystemMessage(this.getRefineSystemPrompt()),\n new HumanMessage(prompt),\n ]);\n\n const message = this.extractContent(response.content);\n return this.cleanCommitMessage(message);\n }\n\n private extractFiles(diff: string): string[] {\n const files = new Set<string>();\n const lines = diff.split('\\n');\n\n for (const line of lines) {\n if (line.startsWith('diff --git')) {\n const match = line.match(/diff --git a\\/(.+?) b\\/(.+?)$/);\n if (match) {\n files.add(match[2]);\n }\n }\n }\n\n return Array.from(files);\n }\n\n private extractContent(content: unknown): string {\n if (typeof content === 'string') return content;\n if (Array.isArray(content) && content.length > 0) {\n const first = content[0];\n if (typeof first === 'object' && first !== null && 'text' in first) {\n return String(first.text);\n }\n }\n return String(content);\n }\n\n private cleanCommitMessage(message: string): string {\n return message\n .trim()\n .replace(/^[\"']|[\"']$/g, '')\n .replace(/\\n/g, ' ')\n .trim();\n }\n\n private buildCommitPrompt(diffInfo: GitDiffInfo, scope?: string): string {\n const scopeHint = scope ? `\\n\\nThis is a monorepo. The changes are primarily in the \"${scope}\" module.` : '';\n\n let fullDiff = '';\n if (diffInfo.staged) {\n fullDiff += `=== Staged changes ===\\n${diffInfo.staged}\\n\\n`;\n }\n if (diffInfo.unstaged) {\n fullDiff += `=== Unstaged changes ===\\n${diffInfo.unstaged}\\n\\n`;\n }\n\n const maxLength = 10000;\n if (fullDiff.length > maxLength) {\n fullDiff = fullDiff.slice(0, maxLength) + '\\n\\n... (truncated)';\n }\n\n return `Generate a conventional commit message for the following changes.${scopeHint}\\n\\nFiles changed:\\n${diffInfo.stats}\\n\\n${fullDiff}`;\n }\n\n private buildSplitPrompt(diffInfo: GitDiffInfo, files: string[]): string {\n let fullDiff = '';\n if (diffInfo.staged) {\n fullDiff += `=== Staged changes ===\\n${diffInfo.staged}\\n\\n`;\n }\n if (diffInfo.unstaged) {\n fullDiff += `=== Unstaged changes ===\\n${diffInfo.unstaged}\\n\\n`;\n }\n\n const maxLength = 8000;\n if (fullDiff.length > maxLength) {\n fullDiff = fullDiff.slice(0, maxLength) + '\\n\\n... (truncated)';\n }\n\n return `Analyze all the files below and group them into logical commits.\\n\\nFiles: ${files.join(', ')}\\n\\nStats:\\n${diffInfo.stats}\\n\\n${fullDiff}`;\n }\n\n private async generateMessageForGroup(group: CommitGroup, diffInfo: GitDiffInfo): Promise<string> {\n const llm = this.multiLlmService.createModel('cheap');\n\n const scopePart = group.scope ? `(${group.scope})` : '';\n\n const prompt = `Generate a conventional commit message (max 72 chars) for:\\n\\nType: ${group.type}${scopePart}\\nFiles: ${group.files.join(', ')}\\nDescription: ${group.description}\\n\\nIMPORTANT: Return ONLY the commit message in format: \"type(scope): description\" or \"type: description\"\\nThe message MUST be in English.`;\n\n const response = await llm.invoke([\n new SystemMessage(this.getCommitSystemPrompt()),\n new HumanMessage(prompt),\n ]);\n\n let message = this.extractContent(response.content);\n message = this.cleanCommitMessage(message);\n\n if (!message.includes(':')) {\n const scope = group.scope ? `(${group.scope})` : '';\n message = `${group.type}${scope}: ${message}`;\n }\n\n return message;\n }\n\n private parseCommitGroups(content: string): CommitGroup[] | null {\n const jsonMatch = content.match(/```json\\s*([\\s\\S]*?)\\s*```/);\n if (jsonMatch) {\n try {\n const parsed = JSON.parse(jsonMatch[1]);\n if (parsed.commits && Array.isArray(parsed.commits)) {\n return parsed.commits;\n }\n } catch {}\n }\n\n try {\n const parsed = JSON.parse(content);\n if (parsed.commits && Array.isArray(parsed.commits)) {\n return parsed.commits;\n }\n } catch {}\n\n return null;\n }\n\n private getCommitSystemPrompt(): string {\n return `You are a Git commit message expert. Generate concise commit messages following Conventional Commits.\n\n**Available types:**\n- feat: new feature\n- fix: bug fix\n- docs: documentation\n- style: formatting (no logic change)\n- refactor: refactoring (no functionality change)\n- perf: performance improvement\n- test: tests\n- build: build/dependencies\n- ci: continuous integration\n- chore: general tasks\n- cleanup: code cleanup\n- remove: code removal\n\n**Format:**\n- With scope: <type>(<scope>): <description>\n- Without scope: <type>: <description>\n\n**Rules:**\n- Maximum 72 characters for the subject line\n- Description in English\n- No period at the end\n- Use imperative mood (\"add\" not \"added\")\n- Be specific but concise\n\nIf this is a monorepo and you can identify the module, include the scope.\n\nReturn ONLY the commit message, nothing else.`;\n }\n\n private getSplitSystemPrompt(): string {\n return `You are a Git commit organization expert. Analyze the changes and divide them into logical commits.\n\n**YOUR TASK:**\nGroup changes into logical commits based on:\n1. **Functional cohesion**: Changes that make sense together\n2. **Change type**: features, fixes, docs, refactorings separated\n3. **Related files**: Files that work together\n\n**RETURN FORMAT (JSON):**\nReturn ONLY valid JSON in this format:\n\\`\\`\\`json\n{\n \"commits\": [\n {\n \"type\": \"feat\",\n \"files\": [\"src/auth.ts\", \"src/models/user.ts\"],\n \"description\": \"add user authentication\"\n },\n {\n \"type\": \"docs\",\n \"files\": [\"README.md\"],\n \"description\": \"update documentation\"\n }\n ]\n}\n\\`\\`\\`\n\n**AVAILABLE TYPES:**\nfeat, fix, docs, style, refactor, perf, test, build, ci, chore\n\n**RULES:**\n- Each commit should have a clear purpose\n- Group functionally related files\n- Separate features from fixes from documentation\n- Maximum 5 files per commit (ideally fewer)\n- If diff is small (<3 files), can be 1 commit only\n- Description must ALWAYS be in English\n- Include ALL files in the result\n\n**IMPORTANT:** Return ONLY the JSON, no additional text.`;\n }\n\n private getRefineSystemPrompt(): string {\n return `You are refining a commit message based on user feedback.\n\n**Instructions:**\n- Keep the message concise (max 72 characters)\n- Follow Conventional Commits format\n- Incorporate the user's suggestion\n- Return ONLY the new commit message, without explanations\n- Message MUST be in English`;\n }\n}\n"],"names":["CommitGeneratorService","getDiffInfo","cwd","process","staged","execSync","encoding","unstaged","stats","stagedFiles","extractFiles","unstagedFiles","hasChanges","output","trim","length","generateCommitMessage","diffInfo","monorepoInfo","monorepoDetector","detectMonorepo","allFiles","scope","determineScope","llm","multiLlmService","createModel","prompt","buildCommitPrompt","response","invoke","SystemMessage","getCommitSystemPrompt","HumanMessage","message","extractContent","content","cleanCommitMessage","splitCommits","splitPrompt","buildSplitPrompt","splitResponse","getSplitSystemPrompt","splitContent","commitGroups","parseCommitGroups","validGroups","filter","group","Array","isArray","files","generateMessageForGroup","push","executeCommit","autoStage","input","executePush","branch","success","error","includes","executeSplitCommits","commits","committedCount","originalHead","commit","file","committed","refineCommitMessage","currentMessage","userSuggestion","slice","getRefineSystemPrompt","diff","Set","lines","split","line","startsWith","match","add","from","first","String","text","replace","scopeHint","fullDiff","maxLength","join","scopePart","type","description","jsonMatch","parsed","JSON","parse"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/git/services/commit-generator.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { execSync } from 'child_process';\nimport { HumanMessage, SystemMessage } from '@langchain/core/messages';\nimport { MultiLlmService } from '../../../common/services/multi-llm.service';\nimport { MonorepoDetectorService } from './monorepo-detector.service';\nimport { GitDiffInfo, SplitCommit, CommitGroup, MonorepoInfo } from '../types/git.types';\n\n@Injectable()\nexport class CommitGeneratorService {\n constructor(\n private readonly multiLlmService: MultiLlmService,\n private readonly monorepoDetector: MonorepoDetectorService,\n ) {}\n\n getDiffInfo(): GitDiffInfo | null {\n try {\n const cwd = process.cwd();\n const staged = execSync('git diff --cached', { cwd, encoding: 'utf-8' });\n const unstaged = execSync('git diff', { cwd, encoding: 'utf-8' });\n const stats = execSync('git diff --stat', { cwd, encoding: 'utf-8' });\n const untrackedRaw = execSync('git ls-files --others --exclude-standard', { cwd, encoding: 'utf-8' });\n const untrackedFiles = untrackedRaw.trim() ? untrackedRaw.trim().split('\\n').filter(f => f.trim()) : [];\n\n return {\n staged,\n unstaged,\n stagedFiles: this.extractFiles(staged),\n unstagedFiles: this.extractFiles(unstaged),\n untrackedFiles,\n stats,\n };\n } catch {\n return null;\n }\n }\n\n hasChanges(): boolean {\n try {\n const output = execSync('git status --porcelain', { cwd: process.cwd(), encoding: 'utf-8' });\n return output.trim().length > 0;\n } catch {\n return false;\n }\n }\n\n async generateCommitMessage(): Promise<string | null> {\n const diffInfo = this.getDiffInfo();\n if (!diffInfo) return null;\n\n const monorepoInfo = this.monorepoDetector.detectMonorepo(process.cwd());\n const allFiles = [...diffInfo.stagedFiles, ...diffInfo.unstagedFiles, ...diffInfo.untrackedFiles];\n const scope = this.monorepoDetector.determineScope(allFiles, monorepoInfo);\n\n const llm = this.multiLlmService.createModel('cheap');\n const prompt = this.buildCommitPrompt(diffInfo, scope);\n\n const response = await llm.invoke([\n new SystemMessage(this.getCommitSystemPrompt()),\n new HumanMessage(prompt),\n ]);\n\n const message = this.extractContent(response.content);\n return this.cleanCommitMessage(message);\n }\n\n async splitCommits(): Promise<SplitCommit[] | null> {\n const diffInfo = this.getDiffInfo();\n if (!diffInfo) return null;\n\n const monorepoInfo = this.monorepoDetector.detectMonorepo(process.cwd());\n const allFiles = [...diffInfo.stagedFiles, ...diffInfo.unstagedFiles, ...diffInfo.untrackedFiles];\n\n const llm = this.multiLlmService.createModel('cheap');\n const splitPrompt = this.buildSplitPrompt(diffInfo, allFiles);\n\n const splitResponse = await llm.invoke([\n new SystemMessage(this.getSplitSystemPrompt()),\n new HumanMessage(splitPrompt),\n ]);\n\n const splitContent = this.extractContent(splitResponse.content);\n const commitGroups = this.parseCommitGroups(splitContent);\n\n if (!commitGroups?.length) return null;\n\n const validGroups = commitGroups.filter((group) => Array.isArray(group.files) && group.files.length > 0);\n if (validGroups.length === 0) return null;\n\n for (const group of validGroups) {\n if (!group.scope) {\n group.scope = this.monorepoDetector.determineScope(group.files, monorepoInfo);\n }\n }\n\n const splitCommits: SplitCommit[] = [];\n for (const group of validGroups) {\n const message = await this.generateMessageForGroup(group, diffInfo);\n splitCommits.push({ ...group, message });\n }\n\n return splitCommits;\n }\n\n executeCommit(message: string, autoStage = true): boolean {\n try {\n const cwd = process.cwd();\n if (autoStage) {\n execSync('git add -A', { cwd });\n }\n execSync('git commit -F -', { cwd, input: `${message}\\n`, encoding: 'utf-8' });\n return true;\n } catch {\n return false;\n }\n }\n\n executePush(): { success: boolean; error?: string } {\n try {\n const cwd = process.cwd();\n const branch = execSync('git branch --show-current', { cwd, encoding: 'utf-8' }).trim();\n execSync(`git push origin ${branch}`, { cwd, encoding: 'utf-8' });\n return { success: true };\n } catch (error: any) {\n const message = error.message || 'Push failed';\n if (message.includes('rejected') || message.includes('diverged')) {\n return { success: false, error: 'Push rejected. Run \"git pull --rebase\" first.' };\n }\n return { success: false, error: message };\n }\n }\n\n executeSplitCommits(commits: SplitCommit[]): { success: boolean; committed: number; error?: string; originalHead?: string } {\n const cwd = process.cwd();\n let committedCount = 0;\n let originalHead: string | undefined;\n\n try {\n originalHead = execSync('git rev-parse HEAD', { cwd, encoding: 'utf-8' }).trim();\n\n for (const commit of commits) {\n execSync('git reset', { cwd });\n\n for (const file of commit.files) {\n try {\n execSync(`git add \"${file}\"`, { cwd });\n } catch {}\n }\n\n const staged = execSync('git diff --cached --name-only', { cwd, encoding: 'utf-8' });\n if (!staged.trim()) continue;\n\n execSync('git commit -F -', { cwd, input: `${commit.message}\\n`, encoding: 'utf-8' });\n committedCount++;\n }\n\n return { success: true, committed: committedCount };\n } catch (error: any) {\n return {\n success: false,\n committed: committedCount,\n error: error.message || 'Failed to execute commits',\n originalHead\n };\n }\n }\n\n async refineCommitMessage(\n currentMessage: string,\n userSuggestion: string,\n diffInfo: GitDiffInfo,\n ): Promise<string> {\n const llm = this.multiLlmService.createModel('cheap');\n\n const prompt = `Current commit message: ${currentMessage}\\n\\nUser suggestion: ${userSuggestion}\\n\\nDiff:\\n${diffInfo.staged.slice(0, 3000)}`;\n\n const response = await llm.invoke([\n new SystemMessage(this.getRefineSystemPrompt()),\n new HumanMessage(prompt),\n ]);\n\n const message = this.extractContent(response.content);\n return this.cleanCommitMessage(message);\n }\n\n private extractFiles(diff: string): string[] {\n const files = new Set<string>();\n const lines = diff.split('\\n');\n\n for (const line of lines) {\n if (line.startsWith('diff --git')) {\n const match = line.match(/diff --git a\\/(.+?) b\\/(.+?)$/);\n if (match) {\n files.add(match[2]);\n }\n }\n }\n\n return Array.from(files);\n }\n\n private extractContent(content: unknown): string {\n if (typeof content === 'string') return content;\n if (Array.isArray(content) && content.length > 0) {\n const first = content[0];\n if (typeof first === 'object' && first !== null && 'text' in first) {\n return String(first.text);\n }\n }\n return String(content);\n }\n\n private cleanCommitMessage(message: string): string {\n const lines = message.trim().split('\\n').map(l => l.trim()).filter(l => l.length > 0);\n const firstCommitLine = lines.find(l => l.includes(':')) || lines[0] || '';\n return firstCommitLine.replace(/^[\"']|[\"']$/g, '').trim();\n }\n\n private buildCommitPrompt(diffInfo: GitDiffInfo, scope?: string): string {\n const scopeHint = scope ? `\\n\\nThis is a monorepo. The changes are primarily in the \"${scope}\" module.` : '';\n\n let fullDiff = '';\n if (diffInfo.staged) {\n fullDiff += `=== Staged changes ===\\n${diffInfo.staged}\\n\\n`;\n }\n if (diffInfo.unstaged) {\n fullDiff += `=== Unstaged changes ===\\n${diffInfo.unstaged}\\n\\n`;\n }\n\n const untrackedHint = diffInfo.untrackedFiles.length > 0\n ? `\\nNew untracked files (will also be committed): ${diffInfo.untrackedFiles.join(', ')}\\n`\n : '';\n\n const maxLength = 10000;\n if (fullDiff.length > maxLength) {\n fullDiff = fullDiff.slice(0, maxLength) + '\\n\\n... (truncated)';\n }\n\n return `Generate a single conventional commit message for ALL of the following changes.${scopeHint}\\n\\nFiles changed:\\n${diffInfo.stats}${untrackedHint}\\n\\n${fullDiff}`;\n }\n\n private buildSplitPrompt(diffInfo: GitDiffInfo, files: string[]): string {\n let fullDiff = '';\n if (diffInfo.staged) {\n fullDiff += `=== Staged changes ===\\n${diffInfo.staged}\\n\\n`;\n }\n if (diffInfo.unstaged) {\n fullDiff += `=== Unstaged changes ===\\n${diffInfo.unstaged}\\n\\n`;\n }\n\n const allFiles = [...files, ...diffInfo.untrackedFiles.filter(f => !files.includes(f))];\n const untrackedHint = diffInfo.untrackedFiles.length > 0\n ? `\\nNew untracked files (must be included in commits): ${diffInfo.untrackedFiles.join(', ')}\\n`\n : '';\n\n const maxLength = 8000;\n if (fullDiff.length > maxLength) {\n fullDiff = fullDiff.slice(0, maxLength) + '\\n\\n... (truncated)';\n }\n\n return `Analyze all the files below and group them into logical commits. Include ALL files in the result.\\n\\nFiles: ${allFiles.join(', ')}${untrackedHint}\\n\\nStats:\\n${diffInfo.stats}\\n\\n${fullDiff}`;\n }\n\n private async generateMessageForGroup(group: CommitGroup, diffInfo: GitDiffInfo): Promise<string> {\n const llm = this.multiLlmService.createModel('cheap');\n\n const scopePart = group.scope ? `(${group.scope})` : '';\n\n const prompt = `Generate a conventional commit message (max 72 chars) for:\\n\\nType: ${group.type}${scopePart}\\nFiles: ${group.files.join(', ')}\\nDescription: ${group.description}\\n\\nIMPORTANT: Return ONLY the commit message in format: \"type(scope): description\" or \"type: description\"\\nThe message MUST be in English.`;\n\n const response = await llm.invoke([\n new SystemMessage(this.getCommitSystemPrompt()),\n new HumanMessage(prompt),\n ]);\n\n let message = this.extractContent(response.content);\n message = this.cleanCommitMessage(message);\n\n if (!message.includes(':')) {\n const scope = group.scope ? `(${group.scope})` : '';\n message = `${group.type}${scope}: ${message}`;\n }\n\n return message;\n }\n\n private parseCommitGroups(content: string): CommitGroup[] | null {\n const jsonMatch = content.match(/```json\\s*([\\s\\S]*?)\\s*```/);\n if (jsonMatch) {\n try {\n const parsed = JSON.parse(jsonMatch[1]);\n if (parsed.commits && Array.isArray(parsed.commits)) {\n return parsed.commits;\n }\n } catch {}\n }\n\n try {\n const parsed = JSON.parse(content);\n if (parsed.commits && Array.isArray(parsed.commits)) {\n return parsed.commits;\n }\n } catch {}\n\n return null;\n }\n\n private getCommitSystemPrompt(): string {\n return `You are a Git commit message expert. Generate concise commit messages following Conventional Commits.\n\n**Available types:**\n- feat: new feature\n- fix: bug fix\n- docs: documentation\n- style: formatting (no logic change)\n- refactor: refactoring (no functionality change)\n- perf: performance improvement\n- test: tests\n- build: build/dependencies\n- ci: continuous integration\n- chore: general tasks\n- cleanup: code cleanup\n- remove: code removal\n\n**Format:**\n- With scope: <type>(<scope>): <description>\n- Without scope: <type>: <description>\n\n**Rules:**\n- Maximum 72 characters for the subject line\n- Description in English\n- No period at the end\n- Use imperative mood (\"add\" not \"added\")\n- Be specific but concise\n\nIf this is a monorepo and you can identify the module, include the scope.\n\nReturn ONLY the commit message, nothing else.`;\n }\n\n private getSplitSystemPrompt(): string {\n return `You are a Git commit organization expert. Analyze the changes and divide them into logical commits.\n\n**YOUR TASK:**\nGroup changes into logical commits based on:\n1. **Functional cohesion**: Changes that make sense together\n2. **Change type**: features, fixes, docs, refactorings separated\n3. **Related files**: Files that work together\n\n**RETURN FORMAT (JSON):**\nReturn ONLY valid JSON in this format:\n\\`\\`\\`json\n{\n \"commits\": [\n {\n \"type\": \"feat\",\n \"files\": [\"src/auth.ts\", \"src/models/user.ts\"],\n \"description\": \"add user authentication\"\n },\n {\n \"type\": \"docs\",\n \"files\": [\"README.md\"],\n \"description\": \"update documentation\"\n }\n ]\n}\n\\`\\`\\`\n\n**AVAILABLE TYPES:**\nfeat, fix, docs, style, refactor, perf, test, build, ci, chore\n\n**RULES:**\n- Each commit should have a clear purpose\n- Group functionally related files\n- Separate features from fixes from documentation\n- Maximum 5 files per commit (ideally fewer)\n- If diff is small (<3 files), can be 1 commit only\n- Description must ALWAYS be in English\n- Include ALL files in the result\n\n**IMPORTANT:** Return ONLY the JSON, no additional text.`;\n }\n\n private getRefineSystemPrompt(): string {\n return `You are refining a commit message based on user feedback.\n\n**Instructions:**\n- Keep the message concise (max 72 characters)\n- Follow Conventional Commits format\n- Incorporate the user's suggestion\n- Return ONLY the new commit message, without explanations\n- Message MUST be in English`;\n }\n}\n"],"names":["CommitGeneratorService","getDiffInfo","cwd","process","staged","execSync","encoding","unstaged","stats","untrackedRaw","untrackedFiles","trim","split","filter","f","stagedFiles","extractFiles","unstagedFiles","hasChanges","output","length","generateCommitMessage","diffInfo","monorepoInfo","monorepoDetector","detectMonorepo","allFiles","scope","determineScope","llm","multiLlmService","createModel","prompt","buildCommitPrompt","response","invoke","SystemMessage","getCommitSystemPrompt","HumanMessage","message","extractContent","content","cleanCommitMessage","splitCommits","splitPrompt","buildSplitPrompt","splitResponse","getSplitSystemPrompt","splitContent","commitGroups","parseCommitGroups","validGroups","group","Array","isArray","files","generateMessageForGroup","push","executeCommit","autoStage","input","executePush","branch","success","error","includes","executeSplitCommits","commits","committedCount","originalHead","commit","file","committed","refineCommitMessage","currentMessage","userSuggestion","slice","getRefineSystemPrompt","diff","Set","lines","line","startsWith","match","add","from","first","String","text","map","l","firstCommitLine","find","replace","scopeHint","fullDiff","untrackedHint","join","maxLength","scopePart","type","description","jsonMatch","parsed","JSON","parse"],"mappings":";;;;+BAQaA;;;eAAAA;;;wBARc;+BACF;0BACmB;iCACZ;yCACQ;;;;;;;;;;AAIjC,IAAA,AAAMA,yBAAN,MAAMA;IAMXC,cAAkC;QAChC,IAAI;YACF,MAAMC,MAAMC,QAAQD,GAAG;YACvB,MAAME,SAASC,IAAAA,uBAAQ,EAAC,qBAAqB;gBAAEH;gBAAKI,UAAU;YAAQ;YACtE,MAAMC,WAAWF,IAAAA,uBAAQ,EAAC,YAAY;gBAAEH;gBAAKI,UAAU;YAAQ;YAC/D,MAAME,QAAQH,IAAAA,uBAAQ,EAAC,mBAAmB;gBAAEH;gBAAKI,UAAU;YAAQ;YACnE,MAAMG,eAAeJ,IAAAA,uBAAQ,EAAC,4CAA4C;gBAAEH;gBAAKI,UAAU;YAAQ;YACnG,MAAMI,iBAAiBD,aAAaE,IAAI,KAAKF,aAAaE,IAAI,GAAGC,KAAK,CAAC,MAAMC,MAAM,CAACC,CAAAA,IAAKA,EAAEH,IAAI,MAAM,EAAE;YAEvG,OAAO;gBACLP;gBACAG;gBACAQ,aAAa,IAAI,CAACC,YAAY,CAACZ;gBAC/Ba,eAAe,IAAI,CAACD,YAAY,CAACT;gBACjCG;gBACAF;YACF;QACF,EAAE,OAAM;YACN,OAAO;QACT;IACF;IAEAU,aAAsB;QACpB,IAAI;YACF,MAAMC,SAASd,IAAAA,uBAAQ,EAAC,0BAA0B;gBAAEH,KAAKC,QAAQD,GAAG;gBAAII,UAAU;YAAQ;YAC1F,OAAOa,OAAOR,IAAI,GAAGS,MAAM,GAAG;QAChC,EAAE,OAAM;YACN,OAAO;QACT;IACF;IAEA,MAAMC,wBAAgD;QACpD,MAAMC,WAAW,IAAI,CAACrB,WAAW;QACjC,IAAI,CAACqB,UAAU,OAAO;QAEtB,MAAMC,eAAe,IAAI,CAACC,gBAAgB,CAACC,cAAc,CAACtB,QAAQD,GAAG;QACrE,MAAMwB,WAAW;eAAIJ,SAASP,WAAW;eAAKO,SAASL,aAAa;eAAKK,SAASZ,cAAc;SAAC;QACjG,MAAMiB,QAAQ,IAAI,CAACH,gBAAgB,CAACI,cAAc,CAACF,UAAUH;QAE7D,MAAMM,MAAM,IAAI,CAACC,eAAe,CAACC,WAAW,CAAC;QAC7C,MAAMC,SAAS,IAAI,CAACC,iBAAiB,CAACX,UAAUK;QAEhD,MAAMO,WAAW,MAAML,IAAIM,MAAM,CAAC;YAChC,IAAIC,uBAAa,CAAC,IAAI,CAACC,qBAAqB;YAC5C,IAAIC,sBAAY,CAACN;SAClB;QAED,MAAMO,UAAU,IAAI,CAACC,cAAc,CAACN,SAASO,OAAO;QACpD,OAAO,IAAI,CAACC,kBAAkB,CAACH;IACjC;IAEA,MAAMI,eAA8C;QAClD,MAAMrB,WAAW,IAAI,CAACrB,WAAW;QACjC,IAAI,CAACqB,UAAU,OAAO;QAEtB,MAAMC,eAAe,IAAI,CAACC,gBAAgB,CAACC,cAAc,CAACtB,QAAQD,GAAG;QACrE,MAAMwB,WAAW;eAAIJ,SAASP,WAAW;eAAKO,SAASL,aAAa;eAAKK,SAASZ,cAAc;SAAC;QAEjG,MAAMmB,MAAM,IAAI,CAACC,eAAe,CAACC,WAAW,CAAC;QAC7C,MAAMa,cAAc,IAAI,CAACC,gBAAgB,CAACvB,UAAUI;QAEpD,MAAMoB,gBAAgB,MAAMjB,IAAIM,MAAM,CAAC;YACrC,IAAIC,uBAAa,CAAC,IAAI,CAACW,oBAAoB;YAC3C,IAAIT,sBAAY,CAACM;SAClB;QAED,MAAMI,eAAe,IAAI,CAACR,cAAc,CAACM,cAAcL,OAAO;QAC9D,MAAMQ,eAAe,IAAI,CAACC,iBAAiB,CAACF;QAE5C,IAAI,CAACC,cAAc7B,QAAQ,OAAO;QAElC,MAAM+B,cAAcF,aAAapC,MAAM,CAAC,CAACuC,QAAUC,MAAMC,OAAO,CAACF,MAAMG,KAAK,KAAKH,MAAMG,KAAK,CAACnC,MAAM,GAAG;QACtG,IAAI+B,YAAY/B,MAAM,KAAK,GAAG,OAAO;QAErC,KAAK,MAAMgC,SAASD,YAAa;YAC/B,IAAI,CAACC,MAAMzB,KAAK,EAAE;gBAChByB,MAAMzB,KAAK,GAAG,IAAI,CAACH,gBAAgB,CAACI,cAAc,CAACwB,MAAMG,KAAK,EAAEhC;YAClE;QACF;QAEA,MAAMoB,eAA8B,EAAE;QACtC,KAAK,MAAMS,SAASD,YAAa;YAC/B,MAAMZ,UAAU,MAAM,IAAI,CAACiB,uBAAuB,CAACJ,OAAO9B;YAC1DqB,aAAac,IAAI,CAAC;gBAAE,GAAGL,KAAK;gBAAEb;YAAQ;QACxC;QAEA,OAAOI;IACT;IAEAe,cAAcnB,OAAe,EAAEoB,YAAY,IAAI,EAAW;QACxD,IAAI;YACF,MAAMzD,MAAMC,QAAQD,GAAG;YACvB,IAAIyD,WAAW;gBACbtD,IAAAA,uBAAQ,EAAC,cAAc;oBAAEH;gBAAI;YAC/B;YACAG,IAAAA,uBAAQ,EAAC,mBAAmB;gBAAEH;gBAAK0D,OAAO,GAAGrB,QAAQ,EAAE,CAAC;gBAAEjC,UAAU;YAAQ;YAC5E,OAAO;QACT,EAAE,OAAM;YACN,OAAO;QACT;IACF;IAEAuD,cAAoD;QAClD,IAAI;YACF,MAAM3D,MAAMC,QAAQD,GAAG;YACvB,MAAM4D,SAASzD,IAAAA,uBAAQ,EAAC,6BAA6B;gBAAEH;gBAAKI,UAAU;YAAQ,GAAGK,IAAI;YACrFN,IAAAA,uBAAQ,EAAC,CAAC,gBAAgB,EAAEyD,QAAQ,EAAE;gBAAE5D;gBAAKI,UAAU;YAAQ;YAC/D,OAAO;gBAAEyD,SAAS;YAAK;QACzB,EAAE,OAAOC,OAAY;YACnB,MAAMzB,UAAUyB,MAAMzB,OAAO,IAAI;YACjC,IAAIA,QAAQ0B,QAAQ,CAAC,eAAe1B,QAAQ0B,QAAQ,CAAC,aAAa;gBAChE,OAAO;oBAAEF,SAAS;oBAAOC,OAAO;gBAAgD;YAClF;YACA,OAAO;gBAAED,SAAS;gBAAOC,OAAOzB;YAAQ;QAC1C;IACF;IAEA2B,oBAAoBC,OAAsB,EAAkF;QAC1H,MAAMjE,MAAMC,QAAQD,GAAG;QACvB,IAAIkE,iBAAiB;QACrB,IAAIC;QAEJ,IAAI;YACFA,eAAehE,IAAAA,uBAAQ,EAAC,sBAAsB;gBAAEH;gBAAKI,UAAU;YAAQ,GAAGK,IAAI;YAE9E,KAAK,MAAM2D,UAAUH,QAAS;gBAC5B9D,IAAAA,uBAAQ,EAAC,aAAa;oBAAEH;gBAAI;gBAE5B,KAAK,MAAMqE,QAAQD,OAAOf,KAAK,CAAE;oBAC/B,IAAI;wBACFlD,IAAAA,uBAAQ,EAAC,CAAC,SAAS,EAAEkE,KAAK,CAAC,CAAC,EAAE;4BAAErE;wBAAI;oBACtC,EAAE,OAAM,CAAC;gBACX;gBAEA,MAAME,SAASC,IAAAA,uBAAQ,EAAC,iCAAiC;oBAAEH;oBAAKI,UAAU;gBAAQ;gBAClF,IAAI,CAACF,OAAOO,IAAI,IAAI;gBAEpBN,IAAAA,uBAAQ,EAAC,mBAAmB;oBAAEH;oBAAK0D,OAAO,GAAGU,OAAO/B,OAAO,CAAC,EAAE,CAAC;oBAAEjC,UAAU;gBAAQ;gBACnF8D;YACF;YAEA,OAAO;gBAAEL,SAAS;gBAAMS,WAAWJ;YAAe;QACpD,EAAE,OAAOJ,OAAY;YACnB,OAAO;gBACLD,SAAS;gBACTS,WAAWJ;gBACXJ,OAAOA,MAAMzB,OAAO,IAAI;gBACxB8B;YACF;QACF;IACF;IAEA,MAAMI,oBACJC,cAAsB,EACtBC,cAAsB,EACtBrD,QAAqB,EACJ;QACjB,MAAMO,MAAM,IAAI,CAACC,eAAe,CAACC,WAAW,CAAC;QAE7C,MAAMC,SAAS,CAAC,wBAAwB,EAAE0C,eAAe,qBAAqB,EAAEC,eAAe,WAAW,EAAErD,SAASlB,MAAM,CAACwE,KAAK,CAAC,GAAG,OAAO;QAE5I,MAAM1C,WAAW,MAAML,IAAIM,MAAM,CAAC;YAChC,IAAIC,uBAAa,CAAC,IAAI,CAACyC,qBAAqB;YAC5C,IAAIvC,sBAAY,CAACN;SAClB;QAED,MAAMO,UAAU,IAAI,CAACC,cAAc,CAACN,SAASO,OAAO;QACpD,OAAO,IAAI,CAACC,kBAAkB,CAACH;IACjC;IAEQvB,aAAa8D,IAAY,EAAY;QAC3C,MAAMvB,QAAQ,IAAIwB;QAClB,MAAMC,QAAQF,KAAKlE,KAAK,CAAC;QAEzB,KAAK,MAAMqE,QAAQD,MAAO;YACxB,IAAIC,KAAKC,UAAU,CAAC,eAAe;gBACjC,MAAMC,QAAQF,KAAKE,KAAK,CAAC;gBACzB,IAAIA,OAAO;oBACT5B,MAAM6B,GAAG,CAACD,KAAK,CAAC,EAAE;gBACpB;YACF;QACF;QAEA,OAAO9B,MAAMgC,IAAI,CAAC9B;IACpB;IAEQf,eAAeC,OAAgB,EAAU;QAC/C,IAAI,OAAOA,YAAY,UAAU,OAAOA;QACxC,IAAIY,MAAMC,OAAO,CAACb,YAAYA,QAAQrB,MAAM,GAAG,GAAG;YAChD,MAAMkE,QAAQ7C,OAAO,CAAC,EAAE;YACxB,IAAI,OAAO6C,UAAU,YAAYA,UAAU,QAAQ,UAAUA,OAAO;gBAClE,OAAOC,OAAOD,MAAME,IAAI;YAC1B;QACF;QACA,OAAOD,OAAO9C;IAChB;IAEQC,mBAAmBH,OAAe,EAAU;QAClD,MAAMyC,QAAQzC,QAAQ5B,IAAI,GAAGC,KAAK,CAAC,MAAM6E,GAAG,CAACC,CAAAA,IAAKA,EAAE/E,IAAI,IAAIE,MAAM,CAAC6E,CAAAA,IAAKA,EAAEtE,MAAM,GAAG;QACnF,MAAMuE,kBAAkBX,MAAMY,IAAI,CAACF,CAAAA,IAAKA,EAAEzB,QAAQ,CAAC,SAASe,KAAK,CAAC,EAAE,IAAI;QACxE,OAAOW,gBAAgBE,OAAO,CAAC,gBAAgB,IAAIlF,IAAI;IACzD;IAEQsB,kBAAkBX,QAAqB,EAAEK,KAAc,EAAU;QACvE,MAAMmE,YAAYnE,QAAQ,CAAC,0DAA0D,EAAEA,MAAM,SAAS,CAAC,GAAG;QAE1G,IAAIoE,WAAW;QACf,IAAIzE,SAASlB,MAAM,EAAE;YACnB2F,YAAY,CAAC,wBAAwB,EAAEzE,SAASlB,MAAM,CAAC,IAAI,CAAC;QAC9D;QACA,IAAIkB,SAASf,QAAQ,EAAE;YACrBwF,YAAY,CAAC,0BAA0B,EAAEzE,SAASf,QAAQ,CAAC,IAAI,CAAC;QAClE;QAEA,MAAMyF,gBAAgB1E,SAASZ,cAAc,CAACU,MAAM,GAAG,IACnD,CAAC,gDAAgD,EAAEE,SAASZ,cAAc,CAACuF,IAAI,CAAC,MAAM,EAAE,CAAC,GACzF;QAEJ,MAAMC,YAAY;QAClB,IAAIH,SAAS3E,MAAM,GAAG8E,WAAW;YAC/BH,WAAWA,SAASnB,KAAK,CAAC,GAAGsB,aAAa;QAC5C;QAEA,OAAO,CAAC,+EAA+E,EAAEJ,UAAU,oBAAoB,EAAExE,SAASd,KAAK,GAAGwF,cAAc,IAAI,EAAED,UAAU;IAC1K;IAEQlD,iBAAiBvB,QAAqB,EAAEiC,KAAe,EAAU;QACvE,IAAIwC,WAAW;QACf,IAAIzE,SAASlB,MAAM,EAAE;YACnB2F,YAAY,CAAC,wBAAwB,EAAEzE,SAASlB,MAAM,CAAC,IAAI,CAAC;QAC9D;QACA,IAAIkB,SAASf,QAAQ,EAAE;YACrBwF,YAAY,CAAC,0BAA0B,EAAEzE,SAASf,QAAQ,CAAC,IAAI,CAAC;QAClE;QAEA,MAAMmB,WAAW;eAAI6B;eAAUjC,SAASZ,cAAc,CAACG,MAAM,CAACC,CAAAA,IAAK,CAACyC,MAAMU,QAAQ,CAACnD;SAAI;QACvF,MAAMkF,gBAAgB1E,SAASZ,cAAc,CAACU,MAAM,GAAG,IACnD,CAAC,qDAAqD,EAAEE,SAASZ,cAAc,CAACuF,IAAI,CAAC,MAAM,EAAE,CAAC,GAC9F;QAEJ,MAAMC,YAAY;QAClB,IAAIH,SAAS3E,MAAM,GAAG8E,WAAW;YAC/BH,WAAWA,SAASnB,KAAK,CAAC,GAAGsB,aAAa;QAC5C;QAEA,OAAO,CAAC,4GAA4G,EAAExE,SAASuE,IAAI,CAAC,QAAQD,cAAc,YAAY,EAAE1E,SAASd,KAAK,CAAC,IAAI,EAAEuF,UAAU;IACzM;IAEA,MAAcvC,wBAAwBJ,KAAkB,EAAE9B,QAAqB,EAAmB;QAChG,MAAMO,MAAM,IAAI,CAACC,eAAe,CAACC,WAAW,CAAC;QAE7C,MAAMoE,YAAY/C,MAAMzB,KAAK,GAAG,CAAC,CAAC,EAAEyB,MAAMzB,KAAK,CAAC,CAAC,CAAC,GAAG;QAErD,MAAMK,SAAS,CAAC,oEAAoE,EAAEoB,MAAMgD,IAAI,GAAGD,UAAU,SAAS,EAAE/C,MAAMG,KAAK,CAAC0C,IAAI,CAAC,MAAM,eAAe,EAAE7C,MAAMiD,WAAW,CAAC,2IAA2I,CAAC;QAE9T,MAAMnE,WAAW,MAAML,IAAIM,MAAM,CAAC;YAChC,IAAIC,uBAAa,CAAC,IAAI,CAACC,qBAAqB;YAC5C,IAAIC,sBAAY,CAACN;SAClB;QAED,IAAIO,UAAU,IAAI,CAACC,cAAc,CAACN,SAASO,OAAO;QAClDF,UAAU,IAAI,CAACG,kBAAkB,CAACH;QAElC,IAAI,CAACA,QAAQ0B,QAAQ,CAAC,MAAM;YAC1B,MAAMtC,QAAQyB,MAAMzB,KAAK,GAAG,CAAC,CAAC,EAAEyB,MAAMzB,KAAK,CAAC,CAAC,CAAC,GAAG;YACjDY,UAAU,GAAGa,MAAMgD,IAAI,GAAGzE,MAAM,EAAE,EAAEY,SAAS;QAC/C;QAEA,OAAOA;IACT;IAEQW,kBAAkBT,OAAe,EAAwB;QAC/D,MAAM6D,YAAY7D,QAAQ0C,KAAK,CAAC;QAChC,IAAImB,WAAW;YACb,IAAI;gBACF,MAAMC,SAASC,KAAKC,KAAK,CAACH,SAAS,CAAC,EAAE;gBACtC,IAAIC,OAAOpC,OAAO,IAAId,MAAMC,OAAO,CAACiD,OAAOpC,OAAO,GAAG;oBACnD,OAAOoC,OAAOpC,OAAO;gBACvB;YACF,EAAE,OAAM,CAAC;QACX;QAEA,IAAI;YACF,MAAMoC,SAASC,KAAKC,KAAK,CAAChE;YAC1B,IAAI8D,OAAOpC,OAAO,IAAId,MAAMC,OAAO,CAACiD,OAAOpC,OAAO,GAAG;gBACnD,OAAOoC,OAAOpC,OAAO;YACvB;QACF,EAAE,OAAM,CAAC;QAET,OAAO;IACT;IAEQ9B,wBAAgC;QACtC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6CA6BiC,CAAC;IAC5C;IAEQU,uBAA+B;QACrC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wDAuC4C,CAAC;IACvD;IAEQ8B,wBAAgC;QACtC,OAAO,CAAC;;;;;;;4BAOgB,CAAC;IAC3B;IA9XA,YACE,AAAiB/C,eAAgC,EACjD,AAAiBN,gBAAyC,CAC1D;aAFiBM,kBAAAA;aACAN,mBAAAA;IAChB;AA4XL"}
|
|
@@ -321,6 +321,8 @@ let ReplService = class ReplService {
|
|
|
321
321
|
break;
|
|
322
322
|
case 'config':
|
|
323
323
|
await this.configCommands.handleConfigCommand(args, this.smartInput);
|
|
324
|
+
await this.configManager.loadConfig();
|
|
325
|
+
await this.deepAgent.reinitializeModel();
|
|
324
326
|
break;
|
|
325
327
|
case 'model':
|
|
326
328
|
this.replCommands.cmdModel(args);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/repl/services/repl.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { DeepAgentService } from '../../core/services/deep-agent.service';\nimport { ConfigService } from '../../../common/services/config.service';\nimport { ConfigManagerService } from '../../config/services/config-manager.service';\nimport { MentionsService } from '../../mentions/services/mentions.service';\nimport { McpRegistryService } from '../../mcp/services/mcp-registry.service';\nimport { AgentRegistryService } from '../../agents/services/agent-registry.service';\nimport { SkillRegistryService } from '../../skills/services/skill-registry.service';\nimport { PlanModeService } from '../../core/services/plan-mode.service';\nimport { SmartInput } from './smart-input';\nimport { WelcomeScreenService } from './welcome-screen.service';\nimport { ReplCommandsService } from './commands/repl-commands.service';\nimport { GitCommandsService } from './commands/git-commands.service';\nimport { AgentCommandsService } from './commands/agent-commands.service';\nimport { McpCommandsService } from './commands/mcp-commands.service';\nimport { ConfigCommandsService } from '../../config/services/config-commands.service';\nimport { ProjectCommandsService } from './commands/project-commands.service';\nimport { ToolsRegistryService } from '../../tools/services/tools-registry.service';\nimport { Colors, Icons } from '../utils/theme';\n\n@Injectable()\nexport class ReplService {\n private smartInput: SmartInput | null = null;\n private abortController: AbortController | null = null;\n private isProcessing = false;\n private spinnerTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n private readonly deepAgent: DeepAgentService,\n private readonly configService: ConfigService,\n private readonly configManager: ConfigManagerService,\n private readonly mentionsService: MentionsService,\n private readonly mcpRegistry: McpRegistryService,\n private readonly agentRegistry: AgentRegistryService,\n private readonly skillRegistry: SkillRegistryService,\n private readonly welcomeScreen: WelcomeScreenService,\n private readonly planMode: PlanModeService,\n private readonly replCommands: ReplCommandsService,\n private readonly gitCommands: GitCommandsService,\n private readonly agentCommands: AgentCommandsService,\n private readonly mcpCommands: McpCommandsService,\n private readonly configCommands: ConfigCommandsService,\n private readonly projectCommands: ProjectCommandsService,\n private readonly toolsRegistry: ToolsRegistryService,\n ) {}\n\n async start(): Promise<void> {\n const initResult = await this.deepAgent.initialize();\n const agentCount = this.agentRegistry.resolveAllAgents().length;\n\n this.welcomeScreen.printWelcomeScreen({\n projectPath: initResult.projectPath || undefined,\n model: this.getModelDisplayName(),\n toolCount: initResult.toolCount,\n agentCount,\n });\n\n this.smartInput = new SmartInput({\n prompt: `${Colors.cyan}${Colors.bold}>${Colors.reset} `,\n promptVisibleLen: 2,\n getCommandSuggestions: (input) => this.getCommandSuggestions(input),\n getMentionSuggestions: (partial) => this.getMentionSuggestions(partial),\n onSubmit: (line) => this.handleLine(line),\n onCancel: () => this.handleCancel(),\n onExit: () => this.handleExit(),\n });\n\n this.smartInput.start();\n }\n\n private getCommandSuggestions(input: string): Array<{ text: string; display: string; description: string }> {\n const commands = [\n { text: '/help', display: '/help', description: 'Show help' },\n { text: '/clear', display: '/clear', description: 'Clear conversation' },\n { text: '/compact', display: '/compact', description: 'Compact history' },\n { text: '/exit', display: '/exit', description: 'Exit' },\n { text: '/status', display: '/status', description: 'Git status' },\n { text: '/diff', display: '/diff', description: 'Git diff' },\n { text: '/log', display: '/log', description: 'Git log' },\n { text: '/commit', display: '/commit', description: 'Commit changes' },\n { text: '/up', display: '/up', description: 'Smart commit & push' },\n { text: '/split-up', display: '/split-up', description: 'Split commits' },\n { text: '/pr', display: '/pr', description: 'Create Pull Request' },\n { text: '/review', display: '/review', description: 'Code review' },\n { text: '/fix', display: '/fix', description: 'Auto-fix code' },\n { text: '/ident', display: '/ident', description: 'Format code' },\n { text: '/release', display: '/release', description: 'Release notes' },\n { text: '/tools', display: '/tools', description: 'List tools' },\n { text: '/agents', display: '/agents', description: 'List agents' },\n { text: '/skills', display: '/skills', description: 'List skills' },\n { text: '/context', display: '/context', description: 'Session info' },\n { text: '/mentions', display: '/mentions', description: 'Mentions help' },\n { text: '/model', display: '/model', description: 'Show model' },\n { text: '/config', display: '/config', description: 'Configuration' },\n { text: '/project', display: '/project', description: 'Project context' },\n { text: '/project-deep', display: '/project-deep', description: 'Deep project analysis' },\n { text: '/init', display: '/init', description: 'Analyze project and generate context' },\n { text: '/mcp', display: '/mcp', description: 'MCP servers' },\n ];\n\n return commands.filter(c => c.text.startsWith(input));\n }\n\n private getMentionSuggestions(partial: string): Array<{ text: string; display: string; description: string }> {\n const fs = require('fs');\n const path = require('path');\n\n const gitOpts = [\n { text: '@git:status', display: '@git:status', description: 'Git status' },\n { text: '@git:diff', display: '@git:diff', description: 'Git diff' },\n { text: '@git:log', display: '@git:log', description: 'Git log' },\n { text: '@git:branch', display: '@git:branch', description: 'Branches' },\n ];\n\n if (partial === '') return [...gitOpts, ...this.getFileEntries('')];\n if (partial.startsWith('git:')) return gitOpts.filter(o => o.text.startsWith('@' + partial));\n\n return [...gitOpts.filter(o => o.text.startsWith('@' + partial)), ...this.getFileEntries(partial)].slice(0, 30);\n }\n\n private getFileEntries(partial: string): Array<{ text: string; display: string; description: string }> {\n const fs = require('fs');\n const path = require('path');\n\n try {\n let dir: string;\n let prefix: string;\n\n if (partial.endsWith('/')) {\n dir = partial.slice(0, -1) || '.';\n prefix = '';\n } else if (partial.includes('/')) {\n dir = path.dirname(partial);\n prefix = path.basename(partial);\n } else {\n dir = '.';\n prefix = partial;\n }\n\n const resolved = path.resolve(process.cwd(), dir);\n if (!fs.existsSync(resolved) || !fs.statSync(resolved).isDirectory()) return [];\n\n const entries = fs.readdirSync(resolved, { withFileTypes: true });\n const ignore = ['node_modules', '.git', 'dist', 'coverage', '.next', '__pycache__'];\n\n return entries\n .filter(e => !ignore.includes(e.name))\n .filter(e => !e.name.startsWith('.') || prefix.startsWith('.'))\n .filter(e => prefix === '' || e.name.toLowerCase().startsWith(prefix.toLowerCase()))\n .map(e => {\n const relDir = dir === '.' ? '' : dir + '/';\n const isDir = e.isDirectory();\n return {\n text: '@' + relDir + e.name + (isDir ? '/' : ''),\n display: '@' + relDir + e.name + (isDir ? '/' : ''),\n description: isDir ? 'dir' : '',\n };\n })\n .slice(0, 20);\n } catch {\n return [];\n }\n }\n\n private handleCancel(): void {\n if (this.isProcessing && this.abortController) {\n this.abortController.abort();\n this.stopSpinner();\n process.stdout.write(`\\r\\n${Colors.yellow} Cancelled${Colors.reset}\\r\\n\\r\\n`);\n this.isProcessing = false;\n } else {\n process.stdout.write(`${Colors.dim} (Use /exit to quit)${Colors.reset}\\r\\n`);\n this.smartInput?.showPrompt();\n }\n }\n\n private handleExit(): void {\n process.stdout.write(`${Colors.dim} Goodbye!${Colors.reset}\\r\\n`);\n this.stop();\n process.exit(0);\n }\n\n private async handleLine(input: string): Promise<void> {\n const trimmed = input.trim();\n\n if (!trimmed) {\n this.smartInput?.showPrompt();\n return;\n }\n\n if (trimmed.startsWith('/')) {\n await this.handleCommand(trimmed);\n } else {\n await this.handleMessage(trimmed);\n }\n\n this.smartInput?.showPrompt();\n }\n\n private async handleCommand(command: string): Promise<void> {\n const parts = command.slice(1).split(/\\s+/);\n const cmd = parts[0].toLowerCase();\n const args = parts.slice(1);\n\n switch (cmd) {\n case 'help': this.replCommands.printHelp(); break;\n case 'clear': this.replCommands.cmdClear(this.welcomeScreen); break;\n case 'exit':\n case 'quit': this.handleExit(); return;\n case 'compact': await this.handleCompact(); break;\n case 'context': this.replCommands.cmdContext(); break;\n case 'config': \n await this.configCommands.handleConfigCommand(args, this.smartInput!); \n break;\n case 'model': this.replCommands.cmdModel(args); break;\n case 'init':\n await this.projectCommands.cmdProject(['analyze'], this.smartInput!);\n break;\n case 'mentions': this.replCommands.cmdMentionsHelp(); break;\n case 'tools': this.cmdTools(); break;\n\n case 'status': this.gitCommands.runGit('git status'); break;\n case 'diff': this.gitCommands.runGit(args.length ? `git diff ${args.join(' ')}` : 'git diff'); break;\n case 'log': this.gitCommands.runGit('git log --oneline -15'); break;\n case 'commit': \n await this.gitCommands.cmdCommit(args, this.smartInput!); \n break;\n case 'up': \n await this.gitCommands.cmdUp(this.smartInput!); \n break;\n case 'split-up': \n await this.gitCommands.cmdSplitUp(this.smartInput!); \n break;\n case 'pr': \n await this.gitCommands.cmdPr(this.smartInput!); \n break;\n case 'review': await this.gitCommands.cmdReview(args); break;\n case 'fix': await this.gitCommands.cmdFix(args); break;\n case 'ident': await this.gitCommands.cmdIdent(); break;\n case 'release': await this.gitCommands.cmdRelease(args); break;\n\n case 'agents': \n await this.agentCommands.cmdAgents(args, this.smartInput!); \n break;\n case 'skills': \n await this.agentCommands.cmdSkills(args, this.smartInput!); \n break;\n\n case 'mcp': \n await this.mcpCommands.cmdMcp(args, this.smartInput!); \n break;\n\n case 'project':\n await this.projectCommands.cmdProject(args, this.smartInput!);\n break;\n case 'project-deep':\n await this.projectCommands.cmdProject(['deep'], this.smartInput!);\n break;\n\n default:\n process.stdout.write(`${Colors.red} Unknown: /${cmd}${Colors.reset} ${Colors.dim}Try /help${Colors.reset}\\r\\n`);\n }\n }\n\n private async handleCompact(): Promise<void> {\n const msgCount = this.deepAgent.getMessageCount();\n if (msgCount < 4) {\n process.stdout.write(`${Colors.dim} Nothing to compact (${msgCount} messages)${Colors.reset}\\r\\n`);\n return;\n }\n process.stdout.write(`${Colors.dim} Summarizing ${msgCount} messages...${Colors.reset}\\r\\n`);\n const result = await this.deepAgent.compactHistory();\n if (result.compacted) {\n process.stdout.write(`${Colors.green} Compacted: ${result.messagesBefore} → ${result.messagesAfter} messages${Colors.reset}\\r\\n`);\n } else {\n process.stdout.write(`${Colors.yellow} Could not compact (summarization failed)${Colors.reset}\\r\\n`);\n }\n }\n\n private async handleMessage(message: string): Promise<void> {\n this.isProcessing = true;\n this.abortController = new AbortController();\n this.smartInput?.enterPassiveMode();\n\n try {\n let messageToProcess = message;\n\n const planCheck = await this.planMode.shouldEnterPlanMode(message);\n if (planCheck.shouldPlan) {\n const usePlan = await this.smartInput!.askChoice(\n '📝 Complex task. Create a plan?',\n [\n { key: 'y', label: 'yes', description: 'Create structured plan' },\n { key: 'n', label: 'no', description: 'Proceed without plan' },\n ]\n );\n \n if (usePlan === 'y') {\n const plannedMessage = await this.runInteractivePlanMode(message);\n if (!plannedMessage) {\n this.isProcessing = false;\n this.smartInput?.exitPassiveMode();\n return;\n }\n messageToProcess = plannedMessage;\n }\n }\n\n const mentionResult = await this.mentionsService.processMessage(messageToProcess);\n if (mentionResult.mentions.length > 0) {\n const summary = this.mentionsService.getMentionsSummary(mentionResult.mentions);\n for (const line of summary) {\n process.stdout.write(`${Colors.dim}${line}${Colors.reset}\\r\\n`);\n }\n process.stdout.write('\\r\\n');\n }\n\n this.startSpinner('Thinking');\n\n let firstChunk = true;\n let fullResponse = '';\n\n for await (const chunk of this.deepAgent.chat(mentionResult.expandedMessage)) {\n if (this.abortController?.signal.aborted) break;\n\n const isToolOutput = chunk.includes('\\x1b[') && (\n chunk.includes('⏿') ||\n chunk.includes('tokens:') ||\n chunk.includes('conversation compacted')\n );\n\n if (firstChunk && !isToolOutput) {\n this.stopSpinner();\n process.stdout.write(`\\r\\n${Colors.magenta}${Colors.bold}${Icons.chestnut} Cast${Colors.reset}\\r\\n`);\n firstChunk = false;\n }\n\n if (!isToolOutput) {\n fullResponse += chunk;\n }\n process.stdout.write(chunk);\n }\n\n if (!firstChunk) {\n process.stdout.write('\\r\\n');\n } else {\n this.stopSpinner();\n }\n } catch (error) {\n this.stopSpinner();\n const msg = (error as Error).message;\n if (!msg.includes('abort')) {\n process.stdout.write(`\\r\\n${Colors.red} Error: ${msg}${Colors.reset}\\r\\n\\r\\n`);\n }\n } finally {\n this.isProcessing = false;\n this.abortController = null;\n this.smartInput?.exitPassiveMode();\n }\n }\n\n private async runInteractivePlanMode(userMessage: string): Promise<string | null> {\n process.stdout.write(`\\r\\n${Colors.cyan}${Colors.bold}📋 PLAN MODE${Colors.reset}\\r\\n`);\n process.stdout.write(`${Colors.dim}Build plan first, execute after approval${Colors.reset}\\r\\n\\r\\n`);\n\n const clarifyingQuestions = await this.planMode.generateClarifyingQuestions(userMessage);\n const answers: string[] = [];\n\n if (clarifyingQuestions.length > 0) {\n process.stdout.write(`${Colors.dim}I need a few quick clarifications:${Colors.reset}\\r\\n`);\n for (let i = 0; i < clarifyingQuestions.length; i++) {\n const q = clarifyingQuestions[i];\n const answer = await this.smartInput!.question(`${Colors.yellow}Q${i + 1}:${Colors.reset} ${q} `);\n if (answer.trim()) {\n answers.push(`- ${q} => ${answer.trim()}`);\n }\n }\n process.stdout.write('\\r\\n');\n }\n\n const context = answers.length > 0 ? `User clarifications:\\n${answers.join('\\n')}` : undefined;\n let plan = await this.planMode.generatePlan(userMessage, context);\n\n while (true) {\n process.stdout.write(this.planMode.formatPlanForDisplay(plan));\n\n const action = await this.smartInput!.askChoice('Plan options', [\n { key: 'a', label: 'accept', description: 'Use this plan and continue' },\n { key: 'r', label: 'refine', description: 'Refine plan with extra feedback' },\n { key: 'c', label: 'cancel', description: 'Cancel and return to prompt' },\n ]);\n\n if (action === 'c') {\n process.stdout.write(`${Colors.dim} Plan cancelled${Colors.reset}\\r\\n\\r\\n`);\n return null;\n }\n\n if (action === 'r') {\n const feedback = await this.smartInput!.question(`${Colors.cyan}Refinement feedback:${Colors.reset} `);\n if (!feedback.trim()) {\n process.stdout.write(`${Colors.dim} No feedback provided. Keeping current plan.${Colors.reset}\\r\\n\\r\\n`);\n continue;\n }\n plan = await this.planMode.refinePlan(plan, feedback.trim());\n continue;\n }\n\n return this.buildPlanExecutionPrompt(userMessage, plan, answers);\n }\n }\n\n private buildPlanExecutionPrompt(userMessage: string, plan: { title: string; overview: string; steps: Array<{ id: number; description: string; files: string[] }> }, clarifications: string[]): string {\n const lines: string[] = [];\n lines.push(userMessage);\n lines.push('');\n lines.push('Approved execution plan:');\n lines.push(`Title: ${plan.title}`);\n lines.push(`Overview: ${plan.overview}`);\n lines.push('Steps:');\n for (const step of plan.steps) {\n const files = step.files.length > 0 ? ` | files: ${step.files.join(', ')}` : '';\n lines.push(`${step.id}. ${step.description}${files}`);\n }\n if (clarifications.length > 0) {\n lines.push('');\n lines.push('User clarifications:');\n lines.push(...clarifications);\n }\n lines.push('');\n lines.push('Execute the task following this approved plan and report progress by step.');\n return lines.join('\\n');\n }\n\n private startSpinner(label: string): void {\n let i = 0;\n this.spinnerTimer = setInterval(() => {\n process.stdout.write(`\\r${Colors.cyan}${Icons.thinkingChestnut[i++ % Icons.thinkingChestnut.length]}${Colors.reset} ${Colors.dim}${label}...${Colors.reset}`);\n }, 80);\n }\n\n private stopSpinner(): void {\n if (this.spinnerTimer) {\n clearInterval(this.spinnerTimer);\n this.spinnerTimer = null;\n process.stdout.write('\\r\\x1b[K');\n }\n }\n\n private cmdTools(): void {\n const allTools = this.toolsRegistry.getAllTools();\n const tools: [string, string][] = allTools.map(t => [t.name, t.description.slice(0, 60)]);\n\n if (tools.length > 0) {\n const maxLen = Math.max(...tools.map(([n]) => n.length));\n\n process.stdout.write('\\r\\n');\n process.stdout.write(`${Colors.bold}Built-in Tools (${tools.length}):${Colors.reset}\\r\\n`);\n for (const [name, desc] of tools) {\n process.stdout.write(` ${Colors.cyan}${name.padEnd(maxLen)}${Colors.reset} ${Colors.dim}${desc}${Colors.reset}\\r\\n`);\n }\n }\n\n const mcpTools = this.mcpRegistry.getAllMcpTools();\n if (mcpTools.length > 0) {\n process.stdout.write(`\\r\\n${Colors.bold}MCP Tools (${mcpTools.length}):${Colors.reset}\\r\\n`);\n for (const t of mcpTools.slice(0, 10)) {\n process.stdout.write(` ${Colors.cyan}${t.name}${Colors.reset} ${Colors.dim}${t.description.slice(0, 50)}${Colors.reset}\\r\\n`);\n }\n }\n process.stdout.write('\\r\\n');\n }\n\n private getModelDisplayName(): string {\n try {\n const modelConfig = this.configManager.getModelConfig('default');\n if (modelConfig) {\n return `${modelConfig.provider}/${modelConfig.model}`;\n }\n } catch {\n }\n return `${this.configService.getProvider()}/${this.configService.getModel()}`;\n }\n\n stop(): void {\n this.stopSpinner();\n this.smartInput?.destroy();\n }\n}\n"],"names":["ReplService","start","initResult","deepAgent","initialize","agentCount","agentRegistry","resolveAllAgents","length","welcomeScreen","printWelcomeScreen","projectPath","undefined","model","getModelDisplayName","toolCount","smartInput","SmartInput","prompt","Colors","cyan","bold","reset","promptVisibleLen","getCommandSuggestions","input","getMentionSuggestions","partial","onSubmit","line","handleLine","onCancel","handleCancel","onExit","handleExit","commands","text","display","description","filter","c","startsWith","fs","require","path","gitOpts","getFileEntries","o","slice","dir","prefix","endsWith","includes","dirname","basename","resolved","resolve","process","cwd","existsSync","statSync","isDirectory","entries","readdirSync","withFileTypes","ignore","e","name","toLowerCase","map","relDir","isDir","isProcessing","abortController","abort","stopSpinner","stdout","write","yellow","dim","showPrompt","stop","exit","trimmed","trim","handleCommand","handleMessage","command","parts","split","cmd","args","replCommands","printHelp","cmdClear","handleCompact","cmdContext","configCommands","handleConfigCommand","cmdModel","projectCommands","cmdProject","cmdMentionsHelp","cmdTools","gitCommands","runGit","join","cmdCommit","cmdUp","cmdSplitUp","cmdPr","cmdReview","cmdFix","cmdIdent","cmdRelease","agentCommands","cmdAgents","cmdSkills","mcpCommands","cmdMcp","red","msgCount","getMessageCount","result","compactHistory","compacted","green","messagesBefore","messagesAfter","message","AbortController","enterPassiveMode","messageToProcess","planCheck","planMode","shouldEnterPlanMode","shouldPlan","usePlan","askChoice","key","label","plannedMessage","runInteractivePlanMode","exitPassiveMode","mentionResult","mentionsService","processMessage","mentions","summary","getMentionsSummary","startSpinner","firstChunk","fullResponse","chunk","chat","expandedMessage","signal","aborted","isToolOutput","magenta","Icons","chestnut","error","msg","userMessage","clarifyingQuestions","generateClarifyingQuestions","answers","i","q","answer","question","push","context","plan","generatePlan","formatPlanForDisplay","action","feedback","refinePlan","buildPlanExecutionPrompt","clarifications","lines","title","overview","step","steps","files","id","spinnerTimer","setInterval","thinkingChestnut","clearInterval","allTools","toolsRegistry","getAllTools","tools","t","maxLen","Math","max","n","desc","padEnd","mcpTools","mcpRegistry","getAllMcpTools","modelConfig","configManager","getModelConfig","provider","configService","getProvider","getModel","destroy","skillRegistry"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/repl/services/repl.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { DeepAgentService } from '../../core/services/deep-agent.service';\nimport { ConfigService } from '../../../common/services/config.service';\nimport { ConfigManagerService } from '../../config/services/config-manager.service';\nimport { MentionsService } from '../../mentions/services/mentions.service';\nimport { McpRegistryService } from '../../mcp/services/mcp-registry.service';\nimport { AgentRegistryService } from '../../agents/services/agent-registry.service';\nimport { SkillRegistryService } from '../../skills/services/skill-registry.service';\nimport { PlanModeService } from '../../core/services/plan-mode.service';\nimport { SmartInput } from './smart-input';\nimport { WelcomeScreenService } from './welcome-screen.service';\nimport { ReplCommandsService } from './commands/repl-commands.service';\nimport { GitCommandsService } from './commands/git-commands.service';\nimport { AgentCommandsService } from './commands/agent-commands.service';\nimport { McpCommandsService } from './commands/mcp-commands.service';\nimport { ConfigCommandsService } from '../../config/services/config-commands.service';\nimport { ProjectCommandsService } from './commands/project-commands.service';\nimport { ToolsRegistryService } from '../../tools/services/tools-registry.service';\nimport { Colors, Icons } from '../utils/theme';\n\n@Injectable()\nexport class ReplService {\n private smartInput: SmartInput | null = null;\n private abortController: AbortController | null = null;\n private isProcessing = false;\n private spinnerTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n private readonly deepAgent: DeepAgentService,\n private readonly configService: ConfigService,\n private readonly configManager: ConfigManagerService,\n private readonly mentionsService: MentionsService,\n private readonly mcpRegistry: McpRegistryService,\n private readonly agentRegistry: AgentRegistryService,\n private readonly skillRegistry: SkillRegistryService,\n private readonly welcomeScreen: WelcomeScreenService,\n private readonly planMode: PlanModeService,\n private readonly replCommands: ReplCommandsService,\n private readonly gitCommands: GitCommandsService,\n private readonly agentCommands: AgentCommandsService,\n private readonly mcpCommands: McpCommandsService,\n private readonly configCommands: ConfigCommandsService,\n private readonly projectCommands: ProjectCommandsService,\n private readonly toolsRegistry: ToolsRegistryService,\n ) {}\n\n async start(): Promise<void> {\n const initResult = await this.deepAgent.initialize();\n const agentCount = this.agentRegistry.resolveAllAgents().length;\n\n this.welcomeScreen.printWelcomeScreen({\n projectPath: initResult.projectPath || undefined,\n model: this.getModelDisplayName(),\n toolCount: initResult.toolCount,\n agentCount,\n });\n\n this.smartInput = new SmartInput({\n prompt: `${Colors.cyan}${Colors.bold}>${Colors.reset} `,\n promptVisibleLen: 2,\n getCommandSuggestions: (input) => this.getCommandSuggestions(input),\n getMentionSuggestions: (partial) => this.getMentionSuggestions(partial),\n onSubmit: (line) => this.handleLine(line),\n onCancel: () => this.handleCancel(),\n onExit: () => this.handleExit(),\n });\n\n this.smartInput.start();\n }\n\n private getCommandSuggestions(input: string): Array<{ text: string; display: string; description: string }> {\n const commands = [\n { text: '/help', display: '/help', description: 'Show help' },\n { text: '/clear', display: '/clear', description: 'Clear conversation' },\n { text: '/compact', display: '/compact', description: 'Compact history' },\n { text: '/exit', display: '/exit', description: 'Exit' },\n { text: '/status', display: '/status', description: 'Git status' },\n { text: '/diff', display: '/diff', description: 'Git diff' },\n { text: '/log', display: '/log', description: 'Git log' },\n { text: '/commit', display: '/commit', description: 'Commit changes' },\n { text: '/up', display: '/up', description: 'Smart commit & push' },\n { text: '/split-up', display: '/split-up', description: 'Split commits' },\n { text: '/pr', display: '/pr', description: 'Create Pull Request' },\n { text: '/review', display: '/review', description: 'Code review' },\n { text: '/fix', display: '/fix', description: 'Auto-fix code' },\n { text: '/ident', display: '/ident', description: 'Format code' },\n { text: '/release', display: '/release', description: 'Release notes' },\n { text: '/tools', display: '/tools', description: 'List tools' },\n { text: '/agents', display: '/agents', description: 'List agents' },\n { text: '/skills', display: '/skills', description: 'List skills' },\n { text: '/context', display: '/context', description: 'Session info' },\n { text: '/mentions', display: '/mentions', description: 'Mentions help' },\n { text: '/model', display: '/model', description: 'Show model' },\n { text: '/config', display: '/config', description: 'Configuration' },\n { text: '/project', display: '/project', description: 'Project context' },\n { text: '/project-deep', display: '/project-deep', description: 'Deep project analysis' },\n { text: '/init', display: '/init', description: 'Analyze project and generate context' },\n { text: '/mcp', display: '/mcp', description: 'MCP servers' },\n ];\n\n return commands.filter(c => c.text.startsWith(input));\n }\n\n private getMentionSuggestions(partial: string): Array<{ text: string; display: string; description: string }> {\n const fs = require('fs');\n const path = require('path');\n\n const gitOpts = [\n { text: '@git:status', display: '@git:status', description: 'Git status' },\n { text: '@git:diff', display: '@git:diff', description: 'Git diff' },\n { text: '@git:log', display: '@git:log', description: 'Git log' },\n { text: '@git:branch', display: '@git:branch', description: 'Branches' },\n ];\n\n if (partial === '') return [...gitOpts, ...this.getFileEntries('')];\n if (partial.startsWith('git:')) return gitOpts.filter(o => o.text.startsWith('@' + partial));\n\n return [...gitOpts.filter(o => o.text.startsWith('@' + partial)), ...this.getFileEntries(partial)].slice(0, 30);\n }\n\n private getFileEntries(partial: string): Array<{ text: string; display: string; description: string }> {\n const fs = require('fs');\n const path = require('path');\n\n try {\n let dir: string;\n let prefix: string;\n\n if (partial.endsWith('/')) {\n dir = partial.slice(0, -1) || '.';\n prefix = '';\n } else if (partial.includes('/')) {\n dir = path.dirname(partial);\n prefix = path.basename(partial);\n } else {\n dir = '.';\n prefix = partial;\n }\n\n const resolved = path.resolve(process.cwd(), dir);\n if (!fs.existsSync(resolved) || !fs.statSync(resolved).isDirectory()) return [];\n\n const entries = fs.readdirSync(resolved, { withFileTypes: true });\n const ignore = ['node_modules', '.git', 'dist', 'coverage', '.next', '__pycache__'];\n\n return entries\n .filter(e => !ignore.includes(e.name))\n .filter(e => !e.name.startsWith('.') || prefix.startsWith('.'))\n .filter(e => prefix === '' || e.name.toLowerCase().startsWith(prefix.toLowerCase()))\n .map(e => {\n const relDir = dir === '.' ? '' : dir + '/';\n const isDir = e.isDirectory();\n return {\n text: '@' + relDir + e.name + (isDir ? '/' : ''),\n display: '@' + relDir + e.name + (isDir ? '/' : ''),\n description: isDir ? 'dir' : '',\n };\n })\n .slice(0, 20);\n } catch {\n return [];\n }\n }\n\n private handleCancel(): void {\n if (this.isProcessing && this.abortController) {\n this.abortController.abort();\n this.stopSpinner();\n process.stdout.write(`\\r\\n${Colors.yellow} Cancelled${Colors.reset}\\r\\n\\r\\n`);\n this.isProcessing = false;\n } else {\n process.stdout.write(`${Colors.dim} (Use /exit to quit)${Colors.reset}\\r\\n`);\n this.smartInput?.showPrompt();\n }\n }\n\n private handleExit(): void {\n process.stdout.write(`${Colors.dim} Goodbye!${Colors.reset}\\r\\n`);\n this.stop();\n process.exit(0);\n }\n\n private async handleLine(input: string): Promise<void> {\n const trimmed = input.trim();\n\n if (!trimmed) {\n this.smartInput?.showPrompt();\n return;\n }\n\n if (trimmed.startsWith('/')) {\n await this.handleCommand(trimmed);\n } else {\n await this.handleMessage(trimmed);\n }\n\n this.smartInput?.showPrompt();\n }\n\n private async handleCommand(command: string): Promise<void> {\n const parts = command.slice(1).split(/\\s+/);\n const cmd = parts[0].toLowerCase();\n const args = parts.slice(1);\n\n switch (cmd) {\n case 'help': this.replCommands.printHelp(); break;\n case 'clear': this.replCommands.cmdClear(this.welcomeScreen); break;\n case 'exit':\n case 'quit': this.handleExit(); return;\n case 'compact': await this.handleCompact(); break;\n case 'context': this.replCommands.cmdContext(); break;\n case 'config':\n await this.configCommands.handleConfigCommand(args, this.smartInput!);\n await this.configManager.loadConfig();\n await this.deepAgent.reinitializeModel();\n break;\n case 'model': this.replCommands.cmdModel(args); break;\n case 'init':\n await this.projectCommands.cmdProject(['analyze'], this.smartInput!);\n break;\n case 'mentions': this.replCommands.cmdMentionsHelp(); break;\n case 'tools': this.cmdTools(); break;\n\n case 'status': this.gitCommands.runGit('git status'); break;\n case 'diff': this.gitCommands.runGit(args.length ? `git diff ${args.join(' ')}` : 'git diff'); break;\n case 'log': this.gitCommands.runGit('git log --oneline -15'); break;\n case 'commit': \n await this.gitCommands.cmdCommit(args, this.smartInput!); \n break;\n case 'up': \n await this.gitCommands.cmdUp(this.smartInput!); \n break;\n case 'split-up': \n await this.gitCommands.cmdSplitUp(this.smartInput!); \n break;\n case 'pr': \n await this.gitCommands.cmdPr(this.smartInput!); \n break;\n case 'review': await this.gitCommands.cmdReview(args); break;\n case 'fix': await this.gitCommands.cmdFix(args); break;\n case 'ident': await this.gitCommands.cmdIdent(); break;\n case 'release': await this.gitCommands.cmdRelease(args); break;\n\n case 'agents': \n await this.agentCommands.cmdAgents(args, this.smartInput!); \n break;\n case 'skills': \n await this.agentCommands.cmdSkills(args, this.smartInput!); \n break;\n\n case 'mcp': \n await this.mcpCommands.cmdMcp(args, this.smartInput!); \n break;\n\n case 'project':\n await this.projectCommands.cmdProject(args, this.smartInput!);\n break;\n case 'project-deep':\n await this.projectCommands.cmdProject(['deep'], this.smartInput!);\n break;\n\n default:\n process.stdout.write(`${Colors.red} Unknown: /${cmd}${Colors.reset} ${Colors.dim}Try /help${Colors.reset}\\r\\n`);\n }\n }\n\n private async handleCompact(): Promise<void> {\n const msgCount = this.deepAgent.getMessageCount();\n if (msgCount < 4) {\n process.stdout.write(`${Colors.dim} Nothing to compact (${msgCount} messages)${Colors.reset}\\r\\n`);\n return;\n }\n process.stdout.write(`${Colors.dim} Summarizing ${msgCount} messages...${Colors.reset}\\r\\n`);\n const result = await this.deepAgent.compactHistory();\n if (result.compacted) {\n process.stdout.write(`${Colors.green} Compacted: ${result.messagesBefore} → ${result.messagesAfter} messages${Colors.reset}\\r\\n`);\n } else {\n process.stdout.write(`${Colors.yellow} Could not compact (summarization failed)${Colors.reset}\\r\\n`);\n }\n }\n\n private async handleMessage(message: string): Promise<void> {\n this.isProcessing = true;\n this.abortController = new AbortController();\n this.smartInput?.enterPassiveMode();\n\n try {\n let messageToProcess = message;\n\n const planCheck = await this.planMode.shouldEnterPlanMode(message);\n if (planCheck.shouldPlan) {\n const usePlan = await this.smartInput!.askChoice(\n '📝 Complex task. Create a plan?',\n [\n { key: 'y', label: 'yes', description: 'Create structured plan' },\n { key: 'n', label: 'no', description: 'Proceed without plan' },\n ]\n );\n \n if (usePlan === 'y') {\n const plannedMessage = await this.runInteractivePlanMode(message);\n if (!plannedMessage) {\n this.isProcessing = false;\n this.smartInput?.exitPassiveMode();\n return;\n }\n messageToProcess = plannedMessage;\n }\n }\n\n const mentionResult = await this.mentionsService.processMessage(messageToProcess);\n if (mentionResult.mentions.length > 0) {\n const summary = this.mentionsService.getMentionsSummary(mentionResult.mentions);\n for (const line of summary) {\n process.stdout.write(`${Colors.dim}${line}${Colors.reset}\\r\\n`);\n }\n process.stdout.write('\\r\\n');\n }\n\n this.startSpinner('Thinking');\n\n let firstChunk = true;\n let fullResponse = '';\n\n for await (const chunk of this.deepAgent.chat(mentionResult.expandedMessage)) {\n if (this.abortController?.signal.aborted) break;\n\n const isToolOutput = chunk.includes('\\x1b[') && (\n chunk.includes('⏿') ||\n chunk.includes('tokens:') ||\n chunk.includes('conversation compacted')\n );\n\n if (firstChunk && !isToolOutput) {\n this.stopSpinner();\n process.stdout.write(`\\r\\n${Colors.magenta}${Colors.bold}${Icons.chestnut} Cast${Colors.reset}\\r\\n`);\n firstChunk = false;\n }\n\n if (!isToolOutput) {\n fullResponse += chunk;\n }\n process.stdout.write(chunk);\n }\n\n if (!firstChunk) {\n process.stdout.write('\\r\\n');\n } else {\n this.stopSpinner();\n }\n } catch (error) {\n this.stopSpinner();\n const msg = (error as Error).message;\n if (!msg.includes('abort')) {\n process.stdout.write(`\\r\\n${Colors.red} Error: ${msg}${Colors.reset}\\r\\n\\r\\n`);\n }\n } finally {\n this.isProcessing = false;\n this.abortController = null;\n this.smartInput?.exitPassiveMode();\n }\n }\n\n private async runInteractivePlanMode(userMessage: string): Promise<string | null> {\n process.stdout.write(`\\r\\n${Colors.cyan}${Colors.bold}📋 PLAN MODE${Colors.reset}\\r\\n`);\n process.stdout.write(`${Colors.dim}Build plan first, execute after approval${Colors.reset}\\r\\n\\r\\n`);\n\n const clarifyingQuestions = await this.planMode.generateClarifyingQuestions(userMessage);\n const answers: string[] = [];\n\n if (clarifyingQuestions.length > 0) {\n process.stdout.write(`${Colors.dim}I need a few quick clarifications:${Colors.reset}\\r\\n`);\n for (let i = 0; i < clarifyingQuestions.length; i++) {\n const q = clarifyingQuestions[i];\n const answer = await this.smartInput!.question(`${Colors.yellow}Q${i + 1}:${Colors.reset} ${q} `);\n if (answer.trim()) {\n answers.push(`- ${q} => ${answer.trim()}`);\n }\n }\n process.stdout.write('\\r\\n');\n }\n\n const context = answers.length > 0 ? `User clarifications:\\n${answers.join('\\n')}` : undefined;\n let plan = await this.planMode.generatePlan(userMessage, context);\n\n while (true) {\n process.stdout.write(this.planMode.formatPlanForDisplay(plan));\n\n const action = await this.smartInput!.askChoice('Plan options', [\n { key: 'a', label: 'accept', description: 'Use this plan and continue' },\n { key: 'r', label: 'refine', description: 'Refine plan with extra feedback' },\n { key: 'c', label: 'cancel', description: 'Cancel and return to prompt' },\n ]);\n\n if (action === 'c') {\n process.stdout.write(`${Colors.dim} Plan cancelled${Colors.reset}\\r\\n\\r\\n`);\n return null;\n }\n\n if (action === 'r') {\n const feedback = await this.smartInput!.question(`${Colors.cyan}Refinement feedback:${Colors.reset} `);\n if (!feedback.trim()) {\n process.stdout.write(`${Colors.dim} No feedback provided. Keeping current plan.${Colors.reset}\\r\\n\\r\\n`);\n continue;\n }\n plan = await this.planMode.refinePlan(plan, feedback.trim());\n continue;\n }\n\n return this.buildPlanExecutionPrompt(userMessage, plan, answers);\n }\n }\n\n private buildPlanExecutionPrompt(userMessage: string, plan: { title: string; overview: string; steps: Array<{ id: number; description: string; files: string[] }> }, clarifications: string[]): string {\n const lines: string[] = [];\n lines.push(userMessage);\n lines.push('');\n lines.push('Approved execution plan:');\n lines.push(`Title: ${plan.title}`);\n lines.push(`Overview: ${plan.overview}`);\n lines.push('Steps:');\n for (const step of plan.steps) {\n const files = step.files.length > 0 ? ` | files: ${step.files.join(', ')}` : '';\n lines.push(`${step.id}. ${step.description}${files}`);\n }\n if (clarifications.length > 0) {\n lines.push('');\n lines.push('User clarifications:');\n lines.push(...clarifications);\n }\n lines.push('');\n lines.push('Execute the task following this approved plan and report progress by step.');\n return lines.join('\\n');\n }\n\n private startSpinner(label: string): void {\n let i = 0;\n this.spinnerTimer = setInterval(() => {\n process.stdout.write(`\\r${Colors.cyan}${Icons.thinkingChestnut[i++ % Icons.thinkingChestnut.length]}${Colors.reset} ${Colors.dim}${label}...${Colors.reset}`);\n }, 80);\n }\n\n private stopSpinner(): void {\n if (this.spinnerTimer) {\n clearInterval(this.spinnerTimer);\n this.spinnerTimer = null;\n process.stdout.write('\\r\\x1b[K');\n }\n }\n\n private cmdTools(): void {\n const allTools = this.toolsRegistry.getAllTools();\n const tools: [string, string][] = allTools.map(t => [t.name, t.description.slice(0, 60)]);\n\n if (tools.length > 0) {\n const maxLen = Math.max(...tools.map(([n]) => n.length));\n\n process.stdout.write('\\r\\n');\n process.stdout.write(`${Colors.bold}Built-in Tools (${tools.length}):${Colors.reset}\\r\\n`);\n for (const [name, desc] of tools) {\n process.stdout.write(` ${Colors.cyan}${name.padEnd(maxLen)}${Colors.reset} ${Colors.dim}${desc}${Colors.reset}\\r\\n`);\n }\n }\n\n const mcpTools = this.mcpRegistry.getAllMcpTools();\n if (mcpTools.length > 0) {\n process.stdout.write(`\\r\\n${Colors.bold}MCP Tools (${mcpTools.length}):${Colors.reset}\\r\\n`);\n for (const t of mcpTools.slice(0, 10)) {\n process.stdout.write(` ${Colors.cyan}${t.name}${Colors.reset} ${Colors.dim}${t.description.slice(0, 50)}${Colors.reset}\\r\\n`);\n }\n }\n process.stdout.write('\\r\\n');\n }\n\n private getModelDisplayName(): string {\n try {\n const modelConfig = this.configManager.getModelConfig('default');\n if (modelConfig) {\n return `${modelConfig.provider}/${modelConfig.model}`;\n }\n } catch {\n }\n return `${this.configService.getProvider()}/${this.configService.getModel()}`;\n }\n\n stop(): void {\n this.stopSpinner();\n this.smartInput?.destroy();\n }\n}\n"],"names":["ReplService","start","initResult","deepAgent","initialize","agentCount","agentRegistry","resolveAllAgents","length","welcomeScreen","printWelcomeScreen","projectPath","undefined","model","getModelDisplayName","toolCount","smartInput","SmartInput","prompt","Colors","cyan","bold","reset","promptVisibleLen","getCommandSuggestions","input","getMentionSuggestions","partial","onSubmit","line","handleLine","onCancel","handleCancel","onExit","handleExit","commands","text","display","description","filter","c","startsWith","fs","require","path","gitOpts","getFileEntries","o","slice","dir","prefix","endsWith","includes","dirname","basename","resolved","resolve","process","cwd","existsSync","statSync","isDirectory","entries","readdirSync","withFileTypes","ignore","e","name","toLowerCase","map","relDir","isDir","isProcessing","abortController","abort","stopSpinner","stdout","write","yellow","dim","showPrompt","stop","exit","trimmed","trim","handleCommand","handleMessage","command","parts","split","cmd","args","replCommands","printHelp","cmdClear","handleCompact","cmdContext","configCommands","handleConfigCommand","configManager","loadConfig","reinitializeModel","cmdModel","projectCommands","cmdProject","cmdMentionsHelp","cmdTools","gitCommands","runGit","join","cmdCommit","cmdUp","cmdSplitUp","cmdPr","cmdReview","cmdFix","cmdIdent","cmdRelease","agentCommands","cmdAgents","cmdSkills","mcpCommands","cmdMcp","red","msgCount","getMessageCount","result","compactHistory","compacted","green","messagesBefore","messagesAfter","message","AbortController","enterPassiveMode","messageToProcess","planCheck","planMode","shouldEnterPlanMode","shouldPlan","usePlan","askChoice","key","label","plannedMessage","runInteractivePlanMode","exitPassiveMode","mentionResult","mentionsService","processMessage","mentions","summary","getMentionsSummary","startSpinner","firstChunk","fullResponse","chunk","chat","expandedMessage","signal","aborted","isToolOutput","magenta","Icons","chestnut","error","msg","userMessage","clarifyingQuestions","generateClarifyingQuestions","answers","i","q","answer","question","push","context","plan","generatePlan","formatPlanForDisplay","action","feedback","refinePlan","buildPlanExecutionPrompt","clarifications","lines","title","overview","step","steps","files","id","spinnerTimer","setInterval","thinkingChestnut","clearInterval","allTools","toolsRegistry","getAllTools","tools","t","maxLen","Math","max","n","desc","padEnd","mcpTools","mcpRegistry","getAllMcpTools","modelConfig","getModelConfig","provider","configService","getProvider","getModel","destroy","skillRegistry"],"mappings":"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"}
|
|
@@ -38,6 +38,7 @@ let SmartInput = class SmartInput {
|
|
|
38
38
|
this.cursor = 0;
|
|
39
39
|
this.suggestions = [];
|
|
40
40
|
this.selectedIndex = -1;
|
|
41
|
+
this.cursorRow = 0;
|
|
41
42
|
this.mode = 'input';
|
|
42
43
|
this.render();
|
|
43
44
|
}
|
|
@@ -442,30 +443,25 @@ let SmartInput = class SmartInput {
|
|
|
442
443
|
}
|
|
443
444
|
render() {
|
|
444
445
|
const write = (s)=>process.stdout.write(s);
|
|
445
|
-
// Calcular quantas linhas o buffer atual ocupa
|
|
446
446
|
const totalLength = this.promptLen + this.buffer.length;
|
|
447
|
-
const linesUsed = Math.ceil(totalLength / this.terminalWidth);
|
|
448
|
-
|
|
449
|
-
if (
|
|
450
|
-
write(`\x1b[${
|
|
447
|
+
const linesUsed = Math.max(1, Math.ceil(totalLength / this.terminalWidth));
|
|
448
|
+
const exactWrap = totalLength > 0 && totalLength % this.terminalWidth === 0;
|
|
449
|
+
if (this.cursorRow > 0) {
|
|
450
|
+
write(`\x1b[${this.cursorRow}A`);
|
|
451
451
|
}
|
|
452
|
-
write('\r');
|
|
453
|
-
|
|
454
|
-
for(let i = 0; i <
|
|
455
|
-
write('\x1b[K');
|
|
456
|
-
if (i <
|
|
452
|
+
write('\r');
|
|
453
|
+
const linesToClear = linesUsed + (exactWrap ? 1 : 0);
|
|
454
|
+
for(let i = 0; i < linesToClear; i++){
|
|
455
|
+
write('\x1b[K');
|
|
456
|
+
if (i < linesToClear - 1) write('\n');
|
|
457
457
|
}
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
write(`\x1b[${linesUsed - 1}A`);
|
|
458
|
+
if (linesToClear > 1) {
|
|
459
|
+
write(`\x1b[${linesToClear - 1}A`);
|
|
461
460
|
}
|
|
462
461
|
write('\r');
|
|
463
|
-
// Escrever prompt + buffer
|
|
464
462
|
write(this.prompt + this.buffer);
|
|
465
|
-
// Limpar resto da tela (para sugestões antigas)
|
|
466
463
|
write('\x1b[J');
|
|
467
464
|
this.renderedLines = 0;
|
|
468
|
-
// Renderizar sugestões
|
|
469
465
|
if (this.suggestions.length > 0) {
|
|
470
466
|
const maxVisible = 10;
|
|
471
467
|
const total = this.suggestions.length;
|
|
@@ -497,25 +493,28 @@ let SmartInput = class SmartInput {
|
|
|
497
493
|
this.renderedLines++;
|
|
498
494
|
}
|
|
499
495
|
}
|
|
500
|
-
// Voltar para linha do input se renderizou sugestões
|
|
501
496
|
if (this.renderedLines > 0) {
|
|
502
497
|
write(`\x1b[${this.renderedLines}A`);
|
|
503
498
|
}
|
|
504
|
-
|
|
505
|
-
const
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
}
|
|
509
|
-
write(`\x1b[${
|
|
499
|
+
const { row: targetRow, col: targetCol } = this.calculateCursorPosition();
|
|
500
|
+
const afterWriteRow = exactWrap ? linesUsed : linesUsed - 1;
|
|
501
|
+
const delta = targetRow - afterWriteRow;
|
|
502
|
+
if (delta > 0) write(`\x1b[${delta}B`);
|
|
503
|
+
else if (delta < 0) write(`\x1b[${-delta}A`);
|
|
504
|
+
write(`\x1b[${targetCol}G`);
|
|
505
|
+
this.cursorRow = targetRow;
|
|
510
506
|
}
|
|
511
507
|
clearSuggestions() {
|
|
512
508
|
if (this.renderedLines > 0) {
|
|
513
|
-
const
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
509
|
+
const totalLength = this.promptLen + this.buffer.length;
|
|
510
|
+
const linesUsed = Math.max(1, Math.ceil(totalLength / this.terminalWidth));
|
|
511
|
+
const exactWrap = totalLength > 0 && totalLength % this.terminalWidth === 0;
|
|
512
|
+
const afterWriteRow = exactWrap ? linesUsed : linesUsed - 1;
|
|
513
|
+
const afterWriteCol = exactWrap ? 1 : totalLength % this.terminalWidth + 1;
|
|
514
|
+
const delta = afterWriteRow - this.cursorRow;
|
|
515
|
+
if (delta > 0) process.stdout.write(`\x1b[${delta}B`);
|
|
516
|
+
else if (delta < 0) process.stdout.write(`\x1b[${-delta}A`);
|
|
517
|
+
process.stdout.write(`\x1b[${afterWriteCol}G\x1b[J`);
|
|
519
518
|
this.renderedLines = 0;
|
|
520
519
|
}
|
|
521
520
|
}
|
|
@@ -532,8 +531,9 @@ let SmartInput = class SmartInput {
|
|
|
532
531
|
this.questionResolve = null;
|
|
533
532
|
this.questionBuffer = '';
|
|
534
533
|
this.dataHandler = null;
|
|
535
|
-
this.terminalWidth = 80;
|
|
534
|
+
this.terminalWidth = 80;
|
|
536
535
|
this.isPaused = false;
|
|
536
|
+
this.cursorRow = 0;
|
|
537
537
|
this.lastCtrlCTime = 0;
|
|
538
538
|
this.opts = opts;
|
|
539
539
|
this.prompt = opts.prompt;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/repl/services/smart-input.ts"],"sourcesContent":["import { Colors } from '../utils/theme';\n\nexport interface Suggestion {\n text: string;\n display: string;\n description?: string;\n}\n\nexport interface SmartInputOptions {\n prompt: string;\n promptVisibleLen: number;\n getCommandSuggestions: (input: string) => Suggestion[];\n getMentionSuggestions: (partial: string) => Suggestion[];\n onSubmit: (line: string) => void;\n onCancel: () => void;\n onExit: () => void;\n onExpandToolOutput?: () => void;\n}\n\nexport class SmartInput {\n private buffer = '';\n private cursor = 0;\n\n private history: string[] = [];\n private historyIndex = -1;\n private savedBuffer = '';\n\n private suggestions: Suggestion[] = [];\n private selectedIndex = -1;\n private renderedLines = 0;\n\n private mode: 'input' | 'passive' | 'question' = 'input';\n private questionResolve: ((answer: string) => void) | null = null;\n private questionBuffer = '';\n\n private prompt: string;\n private promptLen: number;\n private opts: SmartInputOptions;\n\n private dataHandler: ((data: string) => void) | null = null;\n private terminalWidth = 80; // default\n private isPaused = false;\n\n constructor(opts: SmartInputOptions) {\n this.opts = opts;\n this.prompt = opts.prompt;\n this.promptLen = opts.promptVisibleLen;\n }\n\n start() {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n process.stdin.resume();\n process.stdin.setEncoding('utf8');\n\n this.terminalWidth = process.stdout.columns || 80;\n\n // Listener para redimensionamento\n process.stdout.on('resize', () => {\n this.terminalWidth = process.stdout.columns || 80;\n });\n\n this.dataHandler = (data: string) => this.handleData(data);\n process.stdin.on('data', this.dataHandler);\n\n this.mode = 'input';\n this.render();\n }\n\n enterPassiveMode() {\n this.mode = 'passive';\n this.clearSuggestions();\n }\n\n exitPassiveMode() {\n this.mode = 'input';\n }\n\n showPrompt() {\n this.buffer = '';\n this.cursor = 0;\n this.suggestions = [];\n this.selectedIndex = -1;\n this.mode = 'input';\n this.render();\n }\n\n async question(query: string): Promise<string> {\n this.mode = 'question';\n this.questionBuffer = '';\n process.stdout.write(query + ' ');\n\n return new Promise<string>((resolve) => {\n this.questionResolve = resolve;\n });\n }\n\n async askChoice(\n message: string,\n choices: { key: string; label: string; description?: string }[],\n ): Promise<string> {\n process.stdout.write(`\\r\\n${Colors.cyan}${message}${Colors.reset}\\r\\n\\r\\n`);\n choices.forEach((ch, i) => {\n const desc = ch.description ? `${Colors.dim} - ${ch.description}${Colors.reset}` : '';\n process.stdout.write(` ${Colors.white}${i + 1}.${Colors.reset} ${Colors.bold}${ch.label}${Colors.reset}${desc}\\r\\n`);\n });\n process.stdout.write('\\r\\n');\n\n while (true) {\n const answer = await this.question(`${Colors.yellow}Choose (1-${choices.length}):${Colors.reset}`);\n const idx = parseInt(answer) - 1;\n if (idx >= 0 && idx < choices.length) {\n return choices[idx].key;\n }\n process.stdout.write(`${Colors.red} Invalid choice, try again.${Colors.reset}\\r\\n`);\n }\n }\n\n pause() {\n this.isPaused = true;\n if (this.dataHandler) {\n process.stdin.removeListener('data', this.dataHandler);\n }\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n }\n this.clearSuggestions();\n process.stdout.write('\\r\\n');\n }\n\n resume() {\n this.isPaused = false;\n if (this.dataHandler) {\n process.stdin.on('data', this.dataHandler);\n }\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n process.stdin.resume();\n this.showPrompt();\n }\n\n destroy() {\n this.clearSuggestions();\n if (this.dataHandler) {\n process.stdin.removeListener('data', this.dataHandler);\n this.dataHandler = null;\n }\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n }\n }\n\n private handleData(data: string) {\n if (this.isPaused) {\n return;\n }\n\n if (this.mode === 'passive') {\n for (const ch of data) {\n if (ch.charCodeAt(0) === 0x03) {\n this.opts.onCancel();\n }\n }\n return;\n }\n\n if (this.mode === 'question') {\n this.handleQuestionData(data);\n return;\n }\n\n this.handleInputData(data);\n }\n\n private handleQuestionData(data: string) {\n const write = (s: string) => process.stdout.write(s);\n\n for (let i = 0; i < data.length; i++) {\n const code = data.charCodeAt(i);\n\n if (code === 0x0d || code === 0x0a) {\n write('\\r\\n');\n const resolve = this.questionResolve;\n const answer = this.questionBuffer;\n this.questionResolve = null;\n this.questionBuffer = '';\n this.mode = 'input';\n if (resolve) resolve(answer);\n return;\n }\n\n if (code === 0x7f || code === 0x08) {\n if (this.questionBuffer.length > 0) {\n this.questionBuffer = this.questionBuffer.slice(0, -1);\n write('\\b \\b');\n }\n continue;\n }\n\n if (code === 0x03) {\n write('\\r\\n');\n const resolve = this.questionResolve;\n this.questionResolve = null;\n this.questionBuffer = '';\n this.mode = 'input';\n if (resolve) resolve('');\n return;\n }\n\n if (code >= 0x20) {\n this.questionBuffer += data[i];\n write(data[i]);\n }\n }\n }\n\n private handleInputData(data: string) {\n let needsRender = false;\n let bufferChanged = false;\n let i = 0;\n\n while (i < data.length) {\n if (data[i] === '\\x1b' && data[i + 1] === '[') {\n const rest = data.slice(i);\n\n if (rest.startsWith('\\x1b[A')) { this.keyUp(); i += 3; needsRender = true; continue; }\n if (rest.startsWith('\\x1b[B')) { this.keyDown(); i += 3; needsRender = true; continue; }\n if (rest.startsWith('\\x1b[C')) { this.keyRight(); i += 3; needsRender = true; continue; }\n if (rest.startsWith('\\x1b[D')) { this.keyLeft(); i += 3; needsRender = true; continue; }\n if (rest.startsWith('\\x1b[H')) { this.cursor = 0; i += 3; needsRender = true; continue; }\n if (rest.startsWith('\\x1b[F')) { this.cursor = this.buffer.length; i += 3; needsRender = true; continue; }\n if (rest.startsWith('\\x1b[3~')) { this.keyDelete(); i += 4; needsRender = true; bufferChanged = true; continue; }\n\n i++;\n continue;\n }\n\n const code = data.charCodeAt(i);\n\n switch (code) {\n case 0x0d:\n case 0x0a:\n this.keyEnter();\n i++;\n continue;\n\n case 0x09:\n this.keyTab();\n needsRender = true;\n break;\n\n case 0x7f:\n case 0x08:\n this.keyBackspace();\n needsRender = true;\n bufferChanged = true;\n break;\n\n case 0x03:\n this.keyCtrlC();\n i++;\n continue;\n\n case 0x04:\n if (this.buffer.length === 0) {\n this.clearSuggestions();\n process.stdout.write('\\r\\n');\n this.opts.onExit();\n return;\n }\n break;\n\n case 0x0c:\n this.clearSuggestions();\n process.stdout.write('\\x1b[2J\\x1b[H');\n needsRender = true;\n break;\n\n case 0x15:\n this.buffer = this.buffer.slice(this.cursor);\n this.cursor = 0;\n needsRender = true;\n bufferChanged = true;\n break;\n\n case 0x0b:\n this.buffer = this.buffer.slice(0, this.cursor);\n needsRender = true;\n bufferChanged = true;\n break;\n\n case 0x01:\n this.cursor = 0;\n needsRender = true;\n break;\n\n case 0x05:\n this.cursor = this.buffer.length;\n needsRender = true;\n break;\n\n case 0x17:\n this.deleteWordBack();\n needsRender = true;\n bufferChanged = true;\n break;\n\n case 0x0f:\n if (this.opts.onExpandToolOutput) {\n this.clearSuggestions();\n process.stdout.write('\\r\\n');\n this.opts.onExpandToolOutput();\n needsRender = true;\n }\n break;\n\n default:\n if (code >= 0x20) {\n this.buffer =\n this.buffer.slice(0, this.cursor) +\n data[i] +\n this.buffer.slice(this.cursor);\n this.cursor++;\n needsRender = true;\n bufferChanged = true;\n }\n }\n\n i++;\n }\n\n if (needsRender) {\n if (bufferChanged) {\n this.computeSuggestions();\n }\n this.render();\n }\n }\n\n private keyUp() {\n if (this.suggestions.length > 0) {\n this.selectedIndex =\n this.selectedIndex <= 0\n ? this.suggestions.length - 1\n : this.selectedIndex - 1;\n } else {\n if (this.historyIndex === -1) this.savedBuffer = this.buffer;\n if (this.historyIndex < this.history.length - 1) {\n this.historyIndex++;\n this.buffer = this.history[this.historyIndex];\n this.cursor = this.buffer.length;\n }\n }\n }\n\n private keyDown() {\n if (this.suggestions.length > 0) {\n this.selectedIndex =\n this.selectedIndex >= this.suggestions.length - 1\n ? 0\n : this.selectedIndex + 1;\n } else {\n if (this.historyIndex > 0) {\n this.historyIndex--;\n this.buffer = this.history[this.historyIndex];\n this.cursor = this.buffer.length;\n } else if (this.historyIndex === 0) {\n this.historyIndex = -1;\n this.buffer = this.savedBuffer;\n this.cursor = this.buffer.length;\n }\n }\n }\n\n private keyLeft() { if (this.cursor > 0) this.cursor--; }\n private keyRight() { if (this.cursor < this.buffer.length) this.cursor++; }\n\n private keyBackspace() {\n if (this.cursor > 0) {\n this.buffer =\n this.buffer.slice(0, this.cursor - 1) +\n this.buffer.slice(this.cursor);\n this.cursor--;\n }\n }\n\n private keyDelete() {\n if (this.cursor < this.buffer.length) {\n this.buffer =\n this.buffer.slice(0, this.cursor) +\n this.buffer.slice(this.cursor + 1);\n }\n }\n\n private keyEnter() {\n if (this.selectedIndex >= 0 && this.suggestions.length > 0) {\n this.acceptSuggestion();\n this.computeSuggestions();\n this.render();\n } else {\n this.submitLine();\n }\n }\n\n private keyTab() {\n if (this.suggestions.length > 0) {\n if (this.selectedIndex < 0) {\n this.selectedIndex = 0;\n this.acceptSuggestion();\n this.computeSuggestions();\n } else {\n this.acceptSuggestion();\n this.computeSuggestions();\n }\n }\n }\n\n private lastCtrlCTime = 0;\n\n private keyCtrlC() {\n if (this.buffer.length > 0) {\n this.buffer = '';\n this.cursor = 0;\n this.suggestions = [];\n this.selectedIndex = -1;\n this.lastCtrlCTime = Date.now();\n this.clearSuggestions();\n process.stdout.write('\\r\\n');\n this.render();\n } else {\n const now = Date.now();\n if (now - this.lastCtrlCTime < 1500) {\n this.clearSuggestions();\n process.stdout.write('\\r\\n');\n this.opts.onExit();\n return;\n }\n this.lastCtrlCTime = now;\n this.clearSuggestions();\n process.stdout.write(`\\r\\n${Colors.dim} Press Ctrl+C again to exit${Colors.reset}\\r\\n`);\n this.render();\n }\n }\n\n private deleteWordBack() {\n const before = this.buffer.slice(0, this.cursor);\n const match = before.match(/\\S+\\s*$/);\n if (match) {\n const len = match[0].length;\n this.buffer =\n this.buffer.slice(0, this.cursor - len) +\n this.buffer.slice(this.cursor);\n this.cursor -= len;\n }\n }\n\n private submitLine() {\n const line = this.buffer;\n\n this.clearSuggestions();\n process.stdout.write('\\r\\n');\n\n if (line.trim()) {\n this.history.unshift(line);\n if (this.history.length > 200) this.history.pop();\n }\n\n this.buffer = '';\n this.cursor = 0;\n this.historyIndex = -1;\n this.suggestions = [];\n this.selectedIndex = -1;\n\n this.opts.onSubmit(line);\n }\n\n private acceptSuggestion() {\n const s = this.suggestions[this.selectedIndex];\n if (!s) return;\n\n if (this.buffer.startsWith('/')) {\n this.buffer = s.text;\n this.cursor = this.buffer.length;\n } else {\n const atMatch = this.buffer.match(/@[\\w./:~\\-]*$/);\n if (atMatch && atMatch.index !== undefined) {\n this.buffer = this.buffer.slice(0, atMatch.index) + s.text;\n this.cursor = this.buffer.length;\n }\n }\n\n this.selectedIndex = -1;\n\n if (s.text.endsWith('/')) {\n this.computeSuggestions();\n }\n }\n\n private computeSuggestions() {\n this.selectedIndex = -1;\n\n if (this.buffer.startsWith('/')) {\n this.suggestions = this.opts.getCommandSuggestions(this.buffer);\n return;\n }\n\n const atMatch = this.buffer.match(/@([\\w./:~\\-]*)$/);\n if (atMatch) {\n this.suggestions = this.opts.getMentionSuggestions(atMatch[1]);\n return;\n }\n\n this.suggestions = [];\n }\n\n private calculateCursorPosition(): { row: number; col: number } {\n const totalLength = this.promptLen + this.cursor;\n const row = Math.floor(totalLength / this.terminalWidth);\n const col = (totalLength % this.terminalWidth) + 1;\n return { row, col };\n }\n\n private render() {\n const write = (s: string) => process.stdout.write(s);\n\n // Calcular quantas linhas o buffer atual ocupa\n const totalLength = this.promptLen + this.buffer.length;\n const linesUsed = Math.ceil(totalLength / this.terminalWidth);\n\n // Ir para o início do input (primeira linha do input)\n if (linesUsed > 1) {\n write(`\\x1b[${linesUsed - 1}A`); // Sobe para primeira linha do input\n }\n write('\\r'); // Volta para início da linha\n\n // Limpar todas as linhas usadas pelo input\n for (let i = 0; i < linesUsed; i++) {\n write('\\x1b[K'); // Limpa linha atual\n if (i < linesUsed - 1) write('\\n'); // Desce se não for última linha\n }\n\n // Voltar para primeira linha\n if (linesUsed > 1) {\n write(`\\x1b[${linesUsed - 1}A`);\n }\n write('\\r');\n\n // Escrever prompt + buffer\n write(this.prompt + this.buffer);\n\n // Limpar resto da tela (para sugestões antigas)\n write('\\x1b[J');\n\n this.renderedLines = 0;\n\n // Renderizar sugestões\n if (this.suggestions.length > 0) {\n const maxVisible = 10;\n const total = this.suggestions.length;\n\n let scrollStart = 0;\n if (this.selectedIndex >= 0 && total > maxVisible) {\n scrollStart = Math.max(0, Math.min(\n this.selectedIndex - Math.floor(maxVisible / 2),\n total - maxVisible,\n ));\n }\n const scrollEnd = Math.min(scrollStart + maxVisible, total);\n\n if (scrollStart > 0) {\n write(`\\r\\n ${Colors.dim}\\u2191 ${scrollStart} above${Colors.reset}`);\n this.renderedLines++;\n }\n\n for (let i = scrollStart; i < scrollEnd; i++) {\n const s = this.suggestions[i];\n const selected = i === this.selectedIndex;\n\n if (selected) {\n write(`\\r\\n ${Colors.primary}\\u276f${Colors.reset} ${Colors.bold}${Colors.primary}${s.display}${Colors.reset}`);\n } else {\n write(`\\r\\n ${Colors.dim}${s.display}${Colors.reset}`);\n }\n\n if (s.description) {\n write(` ${Colors.muted}${s.description}${Colors.reset}`);\n }\n\n this.renderedLines++;\n }\n\n const remaining = total - scrollEnd;\n if (remaining > 0) {\n write(`\\r\\n ${Colors.dim}\\u2193 ${remaining} below${Colors.reset}`);\n this.renderedLines++;\n }\n }\n\n // Voltar para linha do input se renderizou sugestões\n if (this.renderedLines > 0) {\n write(`\\x1b[${this.renderedLines}A`);\n }\n\n // Posicionar cursor corretamente considerando wrapping\n const { row, col } = this.calculateCursorPosition();\n\n if (row > 0) {\n write(`\\x1b[${row}B`); // Desce 'row' linhas\n }\n write(`\\x1b[${col}G`); // Move para coluna\n }\n\n private clearSuggestions() {\n if (this.renderedLines > 0) {\n const { row, col } = this.calculateCursorPosition();\n\n // Posiciona no fim do buffer\n if (row > 0) {\n process.stdout.write(`\\x1b[${row}B`);\n }\n process.stdout.write(`\\x1b[${col}G\\x1b[J`);\n\n this.renderedLines = 0;\n }\n }\n}\n"],"names":["SmartInput","start","process","stdin","isTTY","setRawMode","resume","setEncoding","terminalWidth","stdout","columns","on","dataHandler","data","handleData","mode","render","enterPassiveMode","clearSuggestions","exitPassiveMode","showPrompt","buffer","cursor","suggestions","selectedIndex","question","query","questionBuffer","write","Promise","resolve","questionResolve","askChoice","message","choices","Colors","cyan","reset","forEach","ch","i","desc","description","dim","white","bold","label","answer","yellow","length","idx","parseInt","key","red","pause","isPaused","removeListener","destroy","charCodeAt","opts","onCancel","handleQuestionData","handleInputData","s","code","slice","needsRender","bufferChanged","rest","startsWith","keyUp","keyDown","keyRight","keyLeft","keyDelete","keyEnter","keyTab","keyBackspace","keyCtrlC","onExit","deleteWordBack","onExpandToolOutput","computeSuggestions","historyIndex","savedBuffer","history","acceptSuggestion","submitLine","lastCtrlCTime","Date","now","before","match","len","line","trim","unshift","pop","onSubmit","text","atMatch","index","undefined","endsWith","getCommandSuggestions","getMentionSuggestions","calculateCursorPosition","totalLength","promptLen","row","Math","floor","col","linesUsed","ceil","prompt","renderedLines","maxVisible","total","scrollStart","max","min","scrollEnd","selected","primary","display","muted","remaining","promptVisibleLen"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/repl/services/smart-input.ts"],"sourcesContent":["import { Colors } from '../utils/theme';\n\nexport interface Suggestion {\n text: string;\n display: string;\n description?: string;\n}\n\nexport interface SmartInputOptions {\n prompt: string;\n promptVisibleLen: number;\n getCommandSuggestions: (input: string) => Suggestion[];\n getMentionSuggestions: (partial: string) => Suggestion[];\n onSubmit: (line: string) => void;\n onCancel: () => void;\n onExit: () => void;\n onExpandToolOutput?: () => void;\n}\n\nexport class SmartInput {\n private buffer = '';\n private cursor = 0;\n\n private history: string[] = [];\n private historyIndex = -1;\n private savedBuffer = '';\n\n private suggestions: Suggestion[] = [];\n private selectedIndex = -1;\n private renderedLines = 0;\n\n private mode: 'input' | 'passive' | 'question' = 'input';\n private questionResolve: ((answer: string) => void) | null = null;\n private questionBuffer = '';\n\n private prompt: string;\n private promptLen: number;\n private opts: SmartInputOptions;\n\n private dataHandler: ((data: string) => void) | null = null;\n private terminalWidth = 80;\n private isPaused = false;\n private cursorRow = 0;\n\n constructor(opts: SmartInputOptions) {\n this.opts = opts;\n this.prompt = opts.prompt;\n this.promptLen = opts.promptVisibleLen;\n }\n\n start() {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n process.stdin.resume();\n process.stdin.setEncoding('utf8');\n\n this.terminalWidth = process.stdout.columns || 80;\n\n // Listener para redimensionamento\n process.stdout.on('resize', () => {\n this.terminalWidth = process.stdout.columns || 80;\n });\n\n this.dataHandler = (data: string) => this.handleData(data);\n process.stdin.on('data', this.dataHandler);\n\n this.mode = 'input';\n this.render();\n }\n\n enterPassiveMode() {\n this.mode = 'passive';\n this.clearSuggestions();\n }\n\n exitPassiveMode() {\n this.mode = 'input';\n }\n\n showPrompt() {\n this.buffer = '';\n this.cursor = 0;\n this.suggestions = [];\n this.selectedIndex = -1;\n this.cursorRow = 0;\n this.mode = 'input';\n this.render();\n }\n\n async question(query: string): Promise<string> {\n this.mode = 'question';\n this.questionBuffer = '';\n process.stdout.write(query + ' ');\n\n return new Promise<string>((resolve) => {\n this.questionResolve = resolve;\n });\n }\n\n async askChoice(\n message: string,\n choices: { key: string; label: string; description?: string }[],\n ): Promise<string> {\n process.stdout.write(`\\r\\n${Colors.cyan}${message}${Colors.reset}\\r\\n\\r\\n`);\n choices.forEach((ch, i) => {\n const desc = ch.description ? `${Colors.dim} - ${ch.description}${Colors.reset}` : '';\n process.stdout.write(` ${Colors.white}${i + 1}.${Colors.reset} ${Colors.bold}${ch.label}${Colors.reset}${desc}\\r\\n`);\n });\n process.stdout.write('\\r\\n');\n\n while (true) {\n const answer = await this.question(`${Colors.yellow}Choose (1-${choices.length}):${Colors.reset}`);\n const idx = parseInt(answer) - 1;\n if (idx >= 0 && idx < choices.length) {\n return choices[idx].key;\n }\n process.stdout.write(`${Colors.red} Invalid choice, try again.${Colors.reset}\\r\\n`);\n }\n }\n\n pause() {\n this.isPaused = true;\n if (this.dataHandler) {\n process.stdin.removeListener('data', this.dataHandler);\n }\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n }\n this.clearSuggestions();\n process.stdout.write('\\r\\n');\n }\n\n resume() {\n this.isPaused = false;\n if (this.dataHandler) {\n process.stdin.on('data', this.dataHandler);\n }\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n }\n process.stdin.resume();\n this.showPrompt();\n }\n\n destroy() {\n this.clearSuggestions();\n if (this.dataHandler) {\n process.stdin.removeListener('data', this.dataHandler);\n this.dataHandler = null;\n }\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n }\n }\n\n private handleData(data: string) {\n if (this.isPaused) {\n return;\n }\n\n if (this.mode === 'passive') {\n for (const ch of data) {\n if (ch.charCodeAt(0) === 0x03) {\n this.opts.onCancel();\n }\n }\n return;\n }\n\n if (this.mode === 'question') {\n this.handleQuestionData(data);\n return;\n }\n\n this.handleInputData(data);\n }\n\n private handleQuestionData(data: string) {\n const write = (s: string) => process.stdout.write(s);\n\n for (let i = 0; i < data.length; i++) {\n const code = data.charCodeAt(i);\n\n if (code === 0x0d || code === 0x0a) {\n write('\\r\\n');\n const resolve = this.questionResolve;\n const answer = this.questionBuffer;\n this.questionResolve = null;\n this.questionBuffer = '';\n this.mode = 'input';\n if (resolve) resolve(answer);\n return;\n }\n\n if (code === 0x7f || code === 0x08) {\n if (this.questionBuffer.length > 0) {\n this.questionBuffer = this.questionBuffer.slice(0, -1);\n write('\\b \\b');\n }\n continue;\n }\n\n if (code === 0x03) {\n write('\\r\\n');\n const resolve = this.questionResolve;\n this.questionResolve = null;\n this.questionBuffer = '';\n this.mode = 'input';\n if (resolve) resolve('');\n return;\n }\n\n if (code >= 0x20) {\n this.questionBuffer += data[i];\n write(data[i]);\n }\n }\n }\n\n private handleInputData(data: string) {\n let needsRender = false;\n let bufferChanged = false;\n let i = 0;\n\n while (i < data.length) {\n if (data[i] === '\\x1b' && data[i + 1] === '[') {\n const rest = data.slice(i);\n\n if (rest.startsWith('\\x1b[A')) { this.keyUp(); i += 3; needsRender = true; continue; }\n if (rest.startsWith('\\x1b[B')) { this.keyDown(); i += 3; needsRender = true; continue; }\n if (rest.startsWith('\\x1b[C')) { this.keyRight(); i += 3; needsRender = true; continue; }\n if (rest.startsWith('\\x1b[D')) { this.keyLeft(); i += 3; needsRender = true; continue; }\n if (rest.startsWith('\\x1b[H')) { this.cursor = 0; i += 3; needsRender = true; continue; }\n if (rest.startsWith('\\x1b[F')) { this.cursor = this.buffer.length; i += 3; needsRender = true; continue; }\n if (rest.startsWith('\\x1b[3~')) { this.keyDelete(); i += 4; needsRender = true; bufferChanged = true; continue; }\n\n i++;\n continue;\n }\n\n const code = data.charCodeAt(i);\n\n switch (code) {\n case 0x0d:\n case 0x0a:\n this.keyEnter();\n i++;\n continue;\n\n case 0x09:\n this.keyTab();\n needsRender = true;\n break;\n\n case 0x7f:\n case 0x08:\n this.keyBackspace();\n needsRender = true;\n bufferChanged = true;\n break;\n\n case 0x03:\n this.keyCtrlC();\n i++;\n continue;\n\n case 0x04:\n if (this.buffer.length === 0) {\n this.clearSuggestions();\n process.stdout.write('\\r\\n');\n this.opts.onExit();\n return;\n }\n break;\n\n case 0x0c:\n this.clearSuggestions();\n process.stdout.write('\\x1b[2J\\x1b[H');\n needsRender = true;\n break;\n\n case 0x15:\n this.buffer = this.buffer.slice(this.cursor);\n this.cursor = 0;\n needsRender = true;\n bufferChanged = true;\n break;\n\n case 0x0b:\n this.buffer = this.buffer.slice(0, this.cursor);\n needsRender = true;\n bufferChanged = true;\n break;\n\n case 0x01:\n this.cursor = 0;\n needsRender = true;\n break;\n\n case 0x05:\n this.cursor = this.buffer.length;\n needsRender = true;\n break;\n\n case 0x17:\n this.deleteWordBack();\n needsRender = true;\n bufferChanged = true;\n break;\n\n case 0x0f:\n if (this.opts.onExpandToolOutput) {\n this.clearSuggestions();\n process.stdout.write('\\r\\n');\n this.opts.onExpandToolOutput();\n needsRender = true;\n }\n break;\n\n default:\n if (code >= 0x20) {\n this.buffer =\n this.buffer.slice(0, this.cursor) +\n data[i] +\n this.buffer.slice(this.cursor);\n this.cursor++;\n needsRender = true;\n bufferChanged = true;\n }\n }\n\n i++;\n }\n\n if (needsRender) {\n if (bufferChanged) {\n this.computeSuggestions();\n }\n this.render();\n }\n }\n\n private keyUp() {\n if (this.suggestions.length > 0) {\n this.selectedIndex =\n this.selectedIndex <= 0\n ? this.suggestions.length - 1\n : this.selectedIndex - 1;\n } else {\n if (this.historyIndex === -1) this.savedBuffer = this.buffer;\n if (this.historyIndex < this.history.length - 1) {\n this.historyIndex++;\n this.buffer = this.history[this.historyIndex];\n this.cursor = this.buffer.length;\n }\n }\n }\n\n private keyDown() {\n if (this.suggestions.length > 0) {\n this.selectedIndex =\n this.selectedIndex >= this.suggestions.length - 1\n ? 0\n : this.selectedIndex + 1;\n } else {\n if (this.historyIndex > 0) {\n this.historyIndex--;\n this.buffer = this.history[this.historyIndex];\n this.cursor = this.buffer.length;\n } else if (this.historyIndex === 0) {\n this.historyIndex = -1;\n this.buffer = this.savedBuffer;\n this.cursor = this.buffer.length;\n }\n }\n }\n\n private keyLeft() { if (this.cursor > 0) this.cursor--; }\n private keyRight() { if (this.cursor < this.buffer.length) this.cursor++; }\n\n private keyBackspace() {\n if (this.cursor > 0) {\n this.buffer =\n this.buffer.slice(0, this.cursor - 1) +\n this.buffer.slice(this.cursor);\n this.cursor--;\n }\n }\n\n private keyDelete() {\n if (this.cursor < this.buffer.length) {\n this.buffer =\n this.buffer.slice(0, this.cursor) +\n this.buffer.slice(this.cursor + 1);\n }\n }\n\n private keyEnter() {\n if (this.selectedIndex >= 0 && this.suggestions.length > 0) {\n this.acceptSuggestion();\n this.computeSuggestions();\n this.render();\n } else {\n this.submitLine();\n }\n }\n\n private keyTab() {\n if (this.suggestions.length > 0) {\n if (this.selectedIndex < 0) {\n this.selectedIndex = 0;\n this.acceptSuggestion();\n this.computeSuggestions();\n } else {\n this.acceptSuggestion();\n this.computeSuggestions();\n }\n }\n }\n\n private lastCtrlCTime = 0;\n\n private keyCtrlC() {\n if (this.buffer.length > 0) {\n this.buffer = '';\n this.cursor = 0;\n this.suggestions = [];\n this.selectedIndex = -1;\n this.lastCtrlCTime = Date.now();\n this.clearSuggestions();\n process.stdout.write('\\r\\n');\n this.render();\n } else {\n const now = Date.now();\n if (now - this.lastCtrlCTime < 1500) {\n this.clearSuggestions();\n process.stdout.write('\\r\\n');\n this.opts.onExit();\n return;\n }\n this.lastCtrlCTime = now;\n this.clearSuggestions();\n process.stdout.write(`\\r\\n${Colors.dim} Press Ctrl+C again to exit${Colors.reset}\\r\\n`);\n this.render();\n }\n }\n\n private deleteWordBack() {\n const before = this.buffer.slice(0, this.cursor);\n const match = before.match(/\\S+\\s*$/);\n if (match) {\n const len = match[0].length;\n this.buffer =\n this.buffer.slice(0, this.cursor - len) +\n this.buffer.slice(this.cursor);\n this.cursor -= len;\n }\n }\n\n private submitLine() {\n const line = this.buffer;\n\n this.clearSuggestions();\n process.stdout.write('\\r\\n');\n\n if (line.trim()) {\n this.history.unshift(line);\n if (this.history.length > 200) this.history.pop();\n }\n\n this.buffer = '';\n this.cursor = 0;\n this.historyIndex = -1;\n this.suggestions = [];\n this.selectedIndex = -1;\n\n this.opts.onSubmit(line);\n }\n\n private acceptSuggestion() {\n const s = this.suggestions[this.selectedIndex];\n if (!s) return;\n\n if (this.buffer.startsWith('/')) {\n this.buffer = s.text;\n this.cursor = this.buffer.length;\n } else {\n const atMatch = this.buffer.match(/@[\\w./:~\\-]*$/);\n if (atMatch && atMatch.index !== undefined) {\n this.buffer = this.buffer.slice(0, atMatch.index) + s.text;\n this.cursor = this.buffer.length;\n }\n }\n\n this.selectedIndex = -1;\n\n if (s.text.endsWith('/')) {\n this.computeSuggestions();\n }\n }\n\n private computeSuggestions() {\n this.selectedIndex = -1;\n\n if (this.buffer.startsWith('/')) {\n this.suggestions = this.opts.getCommandSuggestions(this.buffer);\n return;\n }\n\n const atMatch = this.buffer.match(/@([\\w./:~\\-]*)$/);\n if (atMatch) {\n this.suggestions = this.opts.getMentionSuggestions(atMatch[1]);\n return;\n }\n\n this.suggestions = [];\n }\n\n private calculateCursorPosition(): { row: number; col: number } {\n const totalLength = this.promptLen + this.cursor;\n const row = Math.floor(totalLength / this.terminalWidth);\n const col = (totalLength % this.terminalWidth) + 1;\n return { row, col };\n }\n\n private render() {\n const write = (s: string) => process.stdout.write(s);\n\n const totalLength = this.promptLen + this.buffer.length;\n const linesUsed = Math.max(1, Math.ceil(totalLength / this.terminalWidth));\n const exactWrap = totalLength > 0 && totalLength % this.terminalWidth === 0;\n\n if (this.cursorRow > 0) {\n write(`\\x1b[${this.cursorRow}A`);\n }\n write('\\r');\n\n const linesToClear = linesUsed + (exactWrap ? 1 : 0);\n for (let i = 0; i < linesToClear; i++) {\n write('\\x1b[K');\n if (i < linesToClear - 1) write('\\n');\n }\n\n if (linesToClear > 1) {\n write(`\\x1b[${linesToClear - 1}A`);\n }\n write('\\r');\n\n write(this.prompt + this.buffer);\n\n write('\\x1b[J');\n\n this.renderedLines = 0;\n\n if (this.suggestions.length > 0) {\n const maxVisible = 10;\n const total = this.suggestions.length;\n\n let scrollStart = 0;\n if (this.selectedIndex >= 0 && total > maxVisible) {\n scrollStart = Math.max(0, Math.min(\n this.selectedIndex - Math.floor(maxVisible / 2),\n total - maxVisible,\n ));\n }\n const scrollEnd = Math.min(scrollStart + maxVisible, total);\n\n if (scrollStart > 0) {\n write(`\\r\\n ${Colors.dim}\\u2191 ${scrollStart} above${Colors.reset}`);\n this.renderedLines++;\n }\n\n for (let i = scrollStart; i < scrollEnd; i++) {\n const s = this.suggestions[i];\n const selected = i === this.selectedIndex;\n\n if (selected) {\n write(`\\r\\n ${Colors.primary}\\u276f${Colors.reset} ${Colors.bold}${Colors.primary}${s.display}${Colors.reset}`);\n } else {\n write(`\\r\\n ${Colors.dim}${s.display}${Colors.reset}`);\n }\n\n if (s.description) {\n write(` ${Colors.muted}${s.description}${Colors.reset}`);\n }\n\n this.renderedLines++;\n }\n\n const remaining = total - scrollEnd;\n if (remaining > 0) {\n write(`\\r\\n ${Colors.dim}\\u2193 ${remaining} below${Colors.reset}`);\n this.renderedLines++;\n }\n }\n\n if (this.renderedLines > 0) {\n write(`\\x1b[${this.renderedLines}A`);\n }\n\n const { row: targetRow, col: targetCol } = this.calculateCursorPosition();\n const afterWriteRow = exactWrap ? linesUsed : linesUsed - 1;\n const delta = targetRow - afterWriteRow;\n\n if (delta > 0) write(`\\x1b[${delta}B`);\n else if (delta < 0) write(`\\x1b[${-delta}A`);\n write(`\\x1b[${targetCol}G`);\n\n this.cursorRow = targetRow;\n }\n\n private clearSuggestions() {\n if (this.renderedLines > 0) {\n const totalLength = this.promptLen + this.buffer.length;\n const linesUsed = Math.max(1, Math.ceil(totalLength / this.terminalWidth));\n const exactWrap = totalLength > 0 && totalLength % this.terminalWidth === 0;\n const afterWriteRow = exactWrap ? linesUsed : linesUsed - 1;\n const afterWriteCol = exactWrap ? 1 : (totalLength % this.terminalWidth) + 1;\n\n const delta = afterWriteRow - this.cursorRow;\n if (delta > 0) process.stdout.write(`\\x1b[${delta}B`);\n else if (delta < 0) process.stdout.write(`\\x1b[${-delta}A`);\n process.stdout.write(`\\x1b[${afterWriteCol}G\\x1b[J`);\n\n this.renderedLines = 0;\n }\n }\n}\n"],"names":["SmartInput","start","process","stdin","isTTY","setRawMode","resume","setEncoding","terminalWidth","stdout","columns","on","dataHandler","data","handleData","mode","render","enterPassiveMode","clearSuggestions","exitPassiveMode","showPrompt","buffer","cursor","suggestions","selectedIndex","cursorRow","question","query","questionBuffer","write","Promise","resolve","questionResolve","askChoice","message","choices","Colors","cyan","reset","forEach","ch","i","desc","description","dim","white","bold","label","answer","yellow","length","idx","parseInt","key","red","pause","isPaused","removeListener","destroy","charCodeAt","opts","onCancel","handleQuestionData","handleInputData","s","code","slice","needsRender","bufferChanged","rest","startsWith","keyUp","keyDown","keyRight","keyLeft","keyDelete","keyEnter","keyTab","keyBackspace","keyCtrlC","onExit","deleteWordBack","onExpandToolOutput","computeSuggestions","historyIndex","savedBuffer","history","acceptSuggestion","submitLine","lastCtrlCTime","Date","now","before","match","len","line","trim","unshift","pop","onSubmit","text","atMatch","index","undefined","endsWith","getCommandSuggestions","getMentionSuggestions","calculateCursorPosition","totalLength","promptLen","row","Math","floor","col","linesUsed","max","ceil","exactWrap","linesToClear","prompt","renderedLines","maxVisible","total","scrollStart","min","scrollEnd","selected","primary","display","muted","remaining","targetRow","targetCol","afterWriteRow","delta","afterWriteCol","promptVisibleLen"],"mappings":"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"}
|