grok-cli-hurry-mode 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/dist/agent/grok-agent.js.map +1 -1
- package/dist/hooks/use-input-handler.js +590 -2
- package/dist/hooks/use-input-handler.js.map +1 -1
- package/dist/mcp/client.js +6 -1
- package/dist/mcp/client.js.map +1 -1
- package/dist/subagents/subagent-framework.d.ts +66 -0
- package/dist/subagents/subagent-framework.js +349 -0
- package/dist/subagents/subagent-framework.js.map +1 -0
- package/dist/tools/documentation/agent-system-generator.d.ts +30 -0
- package/dist/tools/documentation/agent-system-generator.js +816 -0
- package/dist/tools/documentation/agent-system-generator.js.map +1 -0
- package/dist/tools/documentation/api-docs-generator.d.ts +89 -0
- package/dist/tools/documentation/api-docs-generator.js +344 -0
- package/dist/tools/documentation/api-docs-generator.js.map +1 -0
- package/dist/tools/documentation/auto-update-system.d.ts +47 -0
- package/dist/tools/documentation/auto-update-system.js +278 -0
- package/dist/tools/documentation/auto-update-system.js.map +1 -0
- package/dist/tools/documentation/changelog-generator.d.ts +39 -0
- package/dist/tools/documentation/changelog-generator.js +255 -0
- package/dist/tools/documentation/changelog-generator.js.map +1 -0
- package/dist/tools/documentation/claude-md-parser.d.ts +25 -0
- package/dist/tools/documentation/claude-md-parser.js +108 -0
- package/dist/tools/documentation/claude-md-parser.js.map +1 -0
- package/dist/tools/documentation/comments-generator.d.ts +55 -0
- package/dist/tools/documentation/comments-generator.js +238 -0
- package/dist/tools/documentation/comments-generator.js.map +1 -0
- package/dist/tools/documentation/docs-menu.d.ts +9 -0
- package/dist/tools/documentation/docs-menu.js +57 -0
- package/dist/tools/documentation/docs-menu.js.map +1 -0
- package/dist/tools/documentation/readme-generator.d.ts +31 -0
- package/dist/tools/documentation/readme-generator.js +244 -0
- package/dist/tools/documentation/readme-generator.js.map +1 -0
- package/dist/tools/documentation/self-healing-system.d.ts +66 -0
- package/dist/tools/documentation/self-healing-system.js +444 -0
- package/dist/tools/documentation/self-healing-system.js.map +1 -0
- package/dist/tools/documentation/smart-prd-assistant.d.ts +45 -0
- package/dist/tools/documentation/smart-prd-assistant.js +325 -0
- package/dist/tools/documentation/smart-prd-assistant.js.map +1 -0
- package/dist/tools/documentation/update-agent-docs.d.ts +37 -0
- package/dist/tools/documentation/update-agent-docs.js +275 -0
- package/dist/tools/documentation/update-agent-docs.js.map +1 -0
- package/dist/tools/intelligence/ast-parser.js +22 -4
- package/dist/tools/intelligence/ast-parser.js.map +1 -1
- package/dist/ui/app.d.ts +2 -1
- package/dist/ui/app.js +27 -6
- package/dist/ui/app.js.map +1 -1
- package/dist/ui/components/api-key-input.d.ts +2 -1
- package/dist/ui/components/api-key-input.js +18 -3
- package/dist/ui/components/api-key-input.js.map +1 -1
- package/dist/ui/components/chat-history.d.ts +2 -1
- package/dist/ui/components/chat-history.js +35 -13
- package/dist/ui/components/chat-history.js.map +1 -1
- package/dist/ui/components/chat-input.d.ts +2 -1
- package/dist/ui/components/chat-input.js +37 -16
- package/dist/ui/components/chat-input.js.map +1 -1
- package/dist/ui/components/chat-interface.d.ts +2 -1
- package/dist/ui/components/chat-interface.js +42 -8
- package/dist/ui/components/chat-interface.js.map +1 -1
- package/dist/ui/components/command-suggestions.d.ts +2 -1
- package/dist/ui/components/command-suggestions.js +8 -3
- package/dist/ui/components/command-suggestions.js.map +1 -1
- package/dist/ui/components/confirmation-dialog.d.ts +2 -1
- package/dist/ui/components/confirmation-dialog.js +39 -4
- package/dist/ui/components/confirmation-dialog.js.map +1 -1
- package/dist/ui/components/diff-renderer.js +66 -57
- package/dist/ui/components/diff-renderer.js.map +1 -1
- package/dist/ui/components/loading-spinner.d.ts +2 -1
- package/dist/ui/components/loading-spinner.js +13 -3
- package/dist/ui/components/loading-spinner.js.map +1 -1
- package/dist/ui/components/mcp-status.d.ts +2 -1
- package/dist/ui/components/mcp-status.js +6 -3
- package/dist/ui/components/mcp-status.js.map +1 -1
- package/dist/ui/components/model-selection.d.ts +2 -1
- package/dist/ui/components/model-selection.js +11 -2
- package/dist/ui/components/model-selection.js.map +1 -1
- package/dist/ui/shared/max-sized-box.js +2 -2
- package/dist/ui/shared/max-sized-box.js.map +1 -1
- package/dist/ui/utils/code-colorizer.js +2 -2
- package/dist/ui/utils/code-colorizer.js.map +1 -1
- package/dist/ui/utils/markdown-renderer.d.ts +2 -1
- package/dist/ui/utils/markdown-renderer.js +3 -3
- package/dist/ui/utils/markdown-renderer.js.map +1 -1
- package/package.json +21 -12
@@ -1,9 +1,19 @@
|
|
1
1
|
import { useState, useMemo, useEffect } from "react";
|
2
2
|
import { useInput } from "ink";
|
3
|
+
import path from "path";
|
3
4
|
import { ConfirmationService } from "../utils/confirmation-service.js";
|
4
5
|
import { useEnhancedInput } from "./use-enhanced-input.js";
|
5
6
|
import { filterCommandSuggestions } from "../ui/components/command-suggestions.js";
|
6
7
|
import { loadModelConfig, updateCurrentModel } from "../utils/model-config.js";
|
8
|
+
import { AgentSystemGenerator } from "../tools/documentation/agent-system-generator.js";
|
9
|
+
import { generateDocsMenuText, findDocsMenuOption } from "../tools/documentation/docs-menu.js";
|
10
|
+
import { ReadmeGenerator } from "../tools/documentation/readme-generator.js";
|
11
|
+
import { CommentsGenerator } from "../tools/documentation/comments-generator.js";
|
12
|
+
import { ApiDocsGenerator } from "../tools/documentation/api-docs-generator.js";
|
13
|
+
import { ChangelogGenerator } from "../tools/documentation/changelog-generator.js";
|
14
|
+
import { UpdateAgentDocs } from "../tools/documentation/update-agent-docs.js";
|
15
|
+
import { SubagentFramework } from "../subagents/subagent-framework.js";
|
16
|
+
import { SelfHealingSystem } from "../tools/documentation/self-healing-system.js";
|
7
17
|
export function useInputHandler({ agent, chatHistory, setChatHistory, setIsProcessing, setIsStreaming, setTokenCount, setProcessingTime, processingStartTime, isProcessing, isStreaming, isConfirmationActive = false, }) {
|
8
18
|
const [showCommandSuggestions, setShowCommandSuggestions] = useState(false);
|
9
19
|
const [selectedCommandIndex, setSelectedCommandIndex] = useState(0);
|
@@ -153,6 +163,16 @@ export function useInputHandler({ agent, chatHistory, setChatHistory, setIsProce
|
|
153
163
|
{ command: "/help", description: "Show help information" },
|
154
164
|
{ command: "/clear", description: "Clear chat history" },
|
155
165
|
{ command: "/models", description: "Switch Grok Model" },
|
166
|
+
{ command: "/init-agent", description: "Initialize .agent documentation system" },
|
167
|
+
{ command: "/docs", description: "Documentation generation menu" },
|
168
|
+
{ command: "/readme", description: "Generate project README.md" },
|
169
|
+
{ command: "/api-docs", description: "Generate API documentation" },
|
170
|
+
{ command: "/changelog", description: "Generate changelog from git history" },
|
171
|
+
{ command: "/update-agent-docs", description: "Update .agent docs with recent changes" },
|
172
|
+
{ command: "/compact", description: "Compress conversation history" },
|
173
|
+
{ command: "/heal", description: "Document and prevent failure recurrence" },
|
174
|
+
{ command: "/guardrails", description: "Manage prevention rules" },
|
175
|
+
{ command: "/comments", description: "Add code comments to files" },
|
156
176
|
{ command: "/commit-and-push", description: "AI commit & push to remote" },
|
157
177
|
{ command: "/exit", description: "Exit the application" },
|
158
178
|
];
|
@@ -190,6 +210,20 @@ Built-in Commands:
|
|
190
210
|
/exit - Exit application
|
191
211
|
exit, quit - Exit application
|
192
212
|
|
213
|
+
Documentation Commands:
|
214
|
+
/init-agent - Initialize .agent documentation system
|
215
|
+
/docs - Interactive documentation menu
|
216
|
+
/readme - Generate comprehensive README.md
|
217
|
+
/api-docs - Generate API documentation from code
|
218
|
+
/changelog - Generate changelog from git history
|
219
|
+
/update-agent-docs- Update .agent docs with recent changes
|
220
|
+
/comments - Add intelligent code comments
|
221
|
+
|
222
|
+
Self-Healing & Optimization:
|
223
|
+
/compact - Compress conversation history intelligently
|
224
|
+
/heal - Document failures and create prevention rules
|
225
|
+
/guardrails - Manage automated prevention system
|
226
|
+
|
193
227
|
Git Commands:
|
194
228
|
/commit-and-push - AI-generated commit + push to remote
|
195
229
|
|
@@ -432,6 +466,560 @@ Respond with ONLY the commit message, no additional text.`;
|
|
432
466
|
clearInput();
|
433
467
|
return true;
|
434
468
|
}
|
469
|
+
if (trimmedInput === "/init-agent") {
|
470
|
+
const userEntry = {
|
471
|
+
type: "user",
|
472
|
+
content: "/init-agent",
|
473
|
+
timestamp: new Date(),
|
474
|
+
};
|
475
|
+
setChatHistory((prev) => [...prev, userEntry]);
|
476
|
+
setIsProcessing(true);
|
477
|
+
try {
|
478
|
+
// Determine project type - assume external project for now, could detect Grok CLI
|
479
|
+
const isGrokCli = process.cwd().includes('grok-cli') ||
|
480
|
+
trimmedInput.includes('--grok');
|
481
|
+
const projectType = isGrokCli ? 'grok-cli' : 'external';
|
482
|
+
const projectName = isGrokCli ? 'Grok CLI' : 'Current Project';
|
483
|
+
const generator = new AgentSystemGenerator({
|
484
|
+
projectName,
|
485
|
+
projectType,
|
486
|
+
rootPath: process.cwd()
|
487
|
+
});
|
488
|
+
const result = await generator.generateAgentSystem();
|
489
|
+
const resultEntry = {
|
490
|
+
type: "assistant",
|
491
|
+
content: result.message,
|
492
|
+
timestamp: new Date(),
|
493
|
+
};
|
494
|
+
setChatHistory((prev) => [...prev, resultEntry]);
|
495
|
+
if (result.success) {
|
496
|
+
// Additional success message with next steps
|
497
|
+
const nextStepsEntry = {
|
498
|
+
type: "assistant",
|
499
|
+
content: `📚 **Next Steps:**
|
500
|
+
1. Review the generated documentation in \`.agent/\`
|
501
|
+
2. Customize \`system/\` docs for your project
|
502
|
+
3. Add PRDs to \`tasks/\` before implementing features
|
503
|
+
4. Run \`/update-agent-docs\` after making changes
|
504
|
+
5. Check \`.agent/README.md\` for complete navigation
|
505
|
+
|
506
|
+
💡 **Pro tip**: AI agents will now read these docs to understand your project context efficiently!`,
|
507
|
+
timestamp: new Date(),
|
508
|
+
};
|
509
|
+
setChatHistory((prev) => [...prev, nextStepsEntry]);
|
510
|
+
}
|
511
|
+
}
|
512
|
+
catch (error) {
|
513
|
+
const errorEntry = {
|
514
|
+
type: "assistant",
|
515
|
+
content: `Failed to initialize agent system: ${error.message}`,
|
516
|
+
timestamp: new Date(),
|
517
|
+
};
|
518
|
+
setChatHistory((prev) => [...prev, errorEntry]);
|
519
|
+
}
|
520
|
+
setIsProcessing(false);
|
521
|
+
clearInput();
|
522
|
+
return true;
|
523
|
+
}
|
524
|
+
if (trimmedInput === "/docs") {
|
525
|
+
const userEntry = {
|
526
|
+
type: "user",
|
527
|
+
content: "/docs",
|
528
|
+
timestamp: new Date(),
|
529
|
+
};
|
530
|
+
setChatHistory((prev) => [...prev, userEntry]);
|
531
|
+
const menuEntry = {
|
532
|
+
type: "assistant",
|
533
|
+
content: generateDocsMenuText(),
|
534
|
+
timestamp: new Date(),
|
535
|
+
};
|
536
|
+
setChatHistory((prev) => [...prev, menuEntry]);
|
537
|
+
clearInput();
|
538
|
+
return true;
|
539
|
+
}
|
540
|
+
// Check if input is a docs menu selection
|
541
|
+
const docsMenuOption = findDocsMenuOption(trimmedInput);
|
542
|
+
if (docsMenuOption) {
|
543
|
+
const userEntry = {
|
544
|
+
type: "user",
|
545
|
+
content: trimmedInput,
|
546
|
+
timestamp: new Date(),
|
547
|
+
};
|
548
|
+
setChatHistory((prev) => [...prev, userEntry]);
|
549
|
+
const confirmEntry = {
|
550
|
+
type: "assistant",
|
551
|
+
content: `🎯 Selected: ${docsMenuOption.title}\nExecuting: \`${docsMenuOption.command}\`...`,
|
552
|
+
timestamp: new Date(),
|
553
|
+
};
|
554
|
+
setChatHistory((prev) => [...prev, confirmEntry]);
|
555
|
+
// Execute the selected command
|
556
|
+
setTimeout(() => {
|
557
|
+
handleDirectCommand(docsMenuOption.command);
|
558
|
+
}, 100);
|
559
|
+
clearInput();
|
560
|
+
return true;
|
561
|
+
}
|
562
|
+
if (trimmedInput === "/readme" || trimmedInput.startsWith("/readme ")) {
|
563
|
+
const userEntry = {
|
564
|
+
type: "user",
|
565
|
+
content: trimmedInput,
|
566
|
+
timestamp: new Date(),
|
567
|
+
};
|
568
|
+
setChatHistory((prev) => [...prev, userEntry]);
|
569
|
+
setIsProcessing(true);
|
570
|
+
try {
|
571
|
+
const args = trimmedInput.split(' ').slice(1);
|
572
|
+
const updateExisting = args.includes('--update');
|
573
|
+
const template = args.find(arg => arg.startsWith('--template='))?.split('=')[1] || 'default';
|
574
|
+
const generator = new ReadmeGenerator({
|
575
|
+
projectName: '', // Will be auto-detected
|
576
|
+
rootPath: process.cwd(),
|
577
|
+
updateExisting,
|
578
|
+
template
|
579
|
+
});
|
580
|
+
const result = await generator.generateReadme();
|
581
|
+
const resultEntry = {
|
582
|
+
type: "assistant",
|
583
|
+
content: result.message,
|
584
|
+
timestamp: new Date(),
|
585
|
+
};
|
586
|
+
setChatHistory((prev) => [...prev, resultEntry]);
|
587
|
+
if (result.success) {
|
588
|
+
const nextStepsEntry = {
|
589
|
+
type: "assistant",
|
590
|
+
content: `📝 **README.md Generated!**
|
591
|
+
|
592
|
+
**Next Steps:**
|
593
|
+
1. Review and customize the generated content
|
594
|
+
2. Add project-specific details and examples
|
595
|
+
3. Update installation and usage instructions
|
596
|
+
4. Consider adding screenshots or diagrams
|
597
|
+
|
598
|
+
💡 **Tip**: Use \`/docs\` to access other documentation tools!`,
|
599
|
+
timestamp: new Date(),
|
600
|
+
};
|
601
|
+
setChatHistory((prev) => [...prev, nextStepsEntry]);
|
602
|
+
}
|
603
|
+
}
|
604
|
+
catch (error) {
|
605
|
+
const errorEntry = {
|
606
|
+
type: "assistant",
|
607
|
+
content: `Failed to generate README: ${error.message}`,
|
608
|
+
timestamp: new Date(),
|
609
|
+
};
|
610
|
+
setChatHistory((prev) => [...prev, errorEntry]);
|
611
|
+
}
|
612
|
+
setIsProcessing(false);
|
613
|
+
clearInput();
|
614
|
+
return true;
|
615
|
+
}
|
616
|
+
if (trimmedInput === "/comments" || trimmedInput.startsWith("/comments ")) {
|
617
|
+
const userEntry = {
|
618
|
+
type: "user",
|
619
|
+
content: trimmedInput,
|
620
|
+
timestamp: new Date(),
|
621
|
+
};
|
622
|
+
setChatHistory((prev) => [...prev, userEntry]);
|
623
|
+
setIsProcessing(true);
|
624
|
+
try {
|
625
|
+
const args = trimmedInput.split(' ').slice(1);
|
626
|
+
const filePath = args[0];
|
627
|
+
if (!filePath) {
|
628
|
+
const errorEntry = {
|
629
|
+
type: "assistant",
|
630
|
+
content: "❌ Please specify a file path. Usage: `/comments <file-path>`\n\nExample: `/comments src/utils/helper.ts`",
|
631
|
+
timestamp: new Date(),
|
632
|
+
};
|
633
|
+
setChatHistory((prev) => [...prev, errorEntry]);
|
634
|
+
setIsProcessing(false);
|
635
|
+
clearInput();
|
636
|
+
return true;
|
637
|
+
}
|
638
|
+
const commentType = args.includes('--functions') ? 'functions' :
|
639
|
+
args.includes('--classes') ? 'classes' : 'all';
|
640
|
+
const generator = new CommentsGenerator({
|
641
|
+
filePath: filePath.startsWith('/') ? filePath : path.join(process.cwd(), filePath),
|
642
|
+
commentType,
|
643
|
+
style: 'auto'
|
644
|
+
});
|
645
|
+
const result = await generator.generateComments();
|
646
|
+
const resultEntry = {
|
647
|
+
type: "assistant",
|
648
|
+
content: result.message,
|
649
|
+
timestamp: new Date(),
|
650
|
+
};
|
651
|
+
setChatHistory((prev) => [...prev, resultEntry]);
|
652
|
+
if (result.success) {
|
653
|
+
const tipsEntry = {
|
654
|
+
type: "assistant",
|
655
|
+
content: `💡 **Code Comments Added!**
|
656
|
+
|
657
|
+
**Options for next time:**
|
658
|
+
- \`/comments file.ts --functions\` - Only comment functions
|
659
|
+
- \`/comments file.ts --classes\` - Only comment classes
|
660
|
+
- \`/comments file.ts\` - Comment all (default)
|
661
|
+
|
662
|
+
**Backup created** - Original file saved with .backup extension`,
|
663
|
+
timestamp: new Date(),
|
664
|
+
};
|
665
|
+
setChatHistory((prev) => [...prev, tipsEntry]);
|
666
|
+
}
|
667
|
+
}
|
668
|
+
catch (error) {
|
669
|
+
const errorEntry = {
|
670
|
+
type: "assistant",
|
671
|
+
content: `Failed to add comments: ${error.message}`,
|
672
|
+
timestamp: new Date(),
|
673
|
+
};
|
674
|
+
setChatHistory((prev) => [...prev, errorEntry]);
|
675
|
+
}
|
676
|
+
setIsProcessing(false);
|
677
|
+
clearInput();
|
678
|
+
return true;
|
679
|
+
}
|
680
|
+
if (trimmedInput === "/api-docs" || trimmedInput.startsWith("/api-docs ")) {
|
681
|
+
const userEntry = {
|
682
|
+
type: "user",
|
683
|
+
content: trimmedInput,
|
684
|
+
timestamp: new Date(),
|
685
|
+
};
|
686
|
+
setChatHistory((prev) => [...prev, userEntry]);
|
687
|
+
setIsProcessing(true);
|
688
|
+
try {
|
689
|
+
const args = trimmedInput.split(' ').slice(1);
|
690
|
+
const outputFormat = args.includes('--format=html') ? 'html' : 'md';
|
691
|
+
const includePrivate = args.includes('--private');
|
692
|
+
const scanPaths = args.filter(arg => !arg.startsWith('--') && arg !== '');
|
693
|
+
const generator = new ApiDocsGenerator({
|
694
|
+
rootPath: process.cwd(),
|
695
|
+
outputFormat,
|
696
|
+
includePrivate,
|
697
|
+
scanPaths: scanPaths.length > 0 ? scanPaths : ['src/']
|
698
|
+
});
|
699
|
+
const result = await generator.generateApiDocs();
|
700
|
+
const resultEntry = {
|
701
|
+
type: "assistant",
|
702
|
+
content: result.message,
|
703
|
+
timestamp: new Date(),
|
704
|
+
};
|
705
|
+
setChatHistory((prev) => [...prev, resultEntry]);
|
706
|
+
if (result.success) {
|
707
|
+
const tipsEntry = {
|
708
|
+
type: "assistant",
|
709
|
+
content: `📖 **API Documentation Generated!**
|
710
|
+
|
711
|
+
**Options for next time:**
|
712
|
+
- \`/api-docs --format=html\` - Generate HTML format
|
713
|
+
- \`/api-docs --private\` - Include private members
|
714
|
+
- \`/api-docs src/ lib/\` - Specify custom scan paths
|
715
|
+
|
716
|
+
**Enhancement tips:**
|
717
|
+
- Add JSDoc comments to your functions and classes
|
718
|
+
- Use TypeScript for better type information
|
719
|
+
- Organize exports clearly in your modules`,
|
720
|
+
timestamp: new Date(),
|
721
|
+
};
|
722
|
+
setChatHistory((prev) => [...prev, tipsEntry]);
|
723
|
+
}
|
724
|
+
}
|
725
|
+
catch (error) {
|
726
|
+
const errorEntry = {
|
727
|
+
type: "assistant",
|
728
|
+
content: `Failed to generate API docs: ${error.message}`,
|
729
|
+
timestamp: new Date(),
|
730
|
+
};
|
731
|
+
setChatHistory((prev) => [...prev, errorEntry]);
|
732
|
+
}
|
733
|
+
setIsProcessing(false);
|
734
|
+
clearInput();
|
735
|
+
return true;
|
736
|
+
}
|
737
|
+
if (trimmedInput === "/changelog" || trimmedInput.startsWith("/changelog ")) {
|
738
|
+
const userEntry = {
|
739
|
+
type: "user",
|
740
|
+
content: trimmedInput,
|
741
|
+
timestamp: new Date(),
|
742
|
+
};
|
743
|
+
setChatHistory((prev) => [...prev, userEntry]);
|
744
|
+
setIsProcessing(true);
|
745
|
+
try {
|
746
|
+
const args = trimmedInput.split(' ').slice(1);
|
747
|
+
const sinceVersion = args.find(arg => arg.startsWith('--since='))?.split('=')[1];
|
748
|
+
const commitCount = args.find(arg => arg.startsWith('--commits='))?.split('=')[1];
|
749
|
+
const format = args.includes('--simple') ? 'simple' : 'conventional';
|
750
|
+
const generator = new ChangelogGenerator({
|
751
|
+
rootPath: process.cwd(),
|
752
|
+
sinceVersion,
|
753
|
+
commitCount: commitCount ? parseInt(commitCount) : undefined,
|
754
|
+
format,
|
755
|
+
includeBreaking: true
|
756
|
+
});
|
757
|
+
const result = await generator.generateChangelog();
|
758
|
+
const resultEntry = {
|
759
|
+
type: "assistant",
|
760
|
+
content: result.message,
|
761
|
+
timestamp: new Date(),
|
762
|
+
};
|
763
|
+
setChatHistory((prev) => [...prev, resultEntry]);
|
764
|
+
if (result.success) {
|
765
|
+
const tipsEntry = {
|
766
|
+
type: "assistant",
|
767
|
+
content: `📝 **Changelog Generated!**
|
768
|
+
|
769
|
+
**Options for next time:**
|
770
|
+
- \`/changelog --since=v1.0.0\` - Generate since specific version
|
771
|
+
- \`/changelog --commits=10\` - Limit to last N commits
|
772
|
+
- \`/changelog --simple\` - Use simple format (not conventional)
|
773
|
+
|
774
|
+
**Pro tips:**
|
775
|
+
- Use conventional commit format: \`feat: add new feature\`
|
776
|
+
- Mark breaking changes: \`feat!: breaking change\`
|
777
|
+
- The changelog follows Keep a Changelog format`,
|
778
|
+
timestamp: new Date(),
|
779
|
+
};
|
780
|
+
setChatHistory((prev) => [...prev, tipsEntry]);
|
781
|
+
}
|
782
|
+
}
|
783
|
+
catch (error) {
|
784
|
+
const errorEntry = {
|
785
|
+
type: "assistant",
|
786
|
+
content: `Failed to generate changelog: ${error.message}`,
|
787
|
+
timestamp: new Date(),
|
788
|
+
};
|
789
|
+
setChatHistory((prev) => [...prev, errorEntry]);
|
790
|
+
}
|
791
|
+
setIsProcessing(false);
|
792
|
+
clearInput();
|
793
|
+
return true;
|
794
|
+
}
|
795
|
+
if (trimmedInput === "/update-agent-docs" || trimmedInput.startsWith("/update-agent-docs ")) {
|
796
|
+
const userEntry = {
|
797
|
+
type: "user",
|
798
|
+
content: trimmedInput,
|
799
|
+
timestamp: new Date(),
|
800
|
+
};
|
801
|
+
setChatHistory((prev) => [...prev, userEntry]);
|
802
|
+
setIsProcessing(true);
|
803
|
+
try {
|
804
|
+
const args = trimmedInput.split(' ').slice(1);
|
805
|
+
const updateTarget = args.includes('--system') ? 'system' :
|
806
|
+
args.includes('--tasks') ? 'tasks' :
|
807
|
+
args.includes('--sop') ? 'sop' : 'all';
|
808
|
+
const autoCommit = args.includes('--commit');
|
809
|
+
const updater = new UpdateAgentDocs({
|
810
|
+
rootPath: process.cwd(),
|
811
|
+
updateTarget,
|
812
|
+
autoCommit
|
813
|
+
});
|
814
|
+
const result = await updater.updateDocs();
|
815
|
+
const resultEntry = {
|
816
|
+
type: "assistant",
|
817
|
+
content: result.message,
|
818
|
+
timestamp: new Date(),
|
819
|
+
};
|
820
|
+
setChatHistory((prev) => [...prev, resultEntry]);
|
821
|
+
if (result.success && result.suggestions.length > 0) {
|
822
|
+
const suggestionsEntry = {
|
823
|
+
type: "assistant",
|
824
|
+
content: `💡 **Suggestions for Manual Review:**\n\n${result.suggestions.map(s => `- ${s}`).join('\n')}\n\n**Options:**\n- \`/update-agent-docs --system\` - Update only system docs\n- \`/update-agent-docs --tasks\` - Update only tasks docs\n- \`/update-agent-docs --sop\` - Update only SOPs`,
|
825
|
+
timestamp: new Date(),
|
826
|
+
};
|
827
|
+
setChatHistory((prev) => [...prev, suggestionsEntry]);
|
828
|
+
}
|
829
|
+
}
|
830
|
+
catch (error) {
|
831
|
+
const errorEntry = {
|
832
|
+
type: "assistant",
|
833
|
+
content: `Failed to update agent docs: ${error.message}`,
|
834
|
+
timestamp: new Date(),
|
835
|
+
};
|
836
|
+
setChatHistory((prev) => [...prev, errorEntry]);
|
837
|
+
}
|
838
|
+
setIsProcessing(false);
|
839
|
+
clearInput();
|
840
|
+
return true;
|
841
|
+
}
|
842
|
+
if (trimmedInput === "/compact" || trimmedInput.startsWith("/compact ")) {
|
843
|
+
const userEntry = {
|
844
|
+
type: "user",
|
845
|
+
content: trimmedInput,
|
846
|
+
timestamp: new Date(),
|
847
|
+
};
|
848
|
+
setChatHistory((prev) => [...prev, userEntry]);
|
849
|
+
setIsProcessing(true);
|
850
|
+
try {
|
851
|
+
const args = trimmedInput.split(' ').slice(1);
|
852
|
+
const force = args.includes('--force');
|
853
|
+
const dryRun = args.includes('--dry-run');
|
854
|
+
// Simulate context compression using subagent framework
|
855
|
+
const subagentFramework = new SubagentFramework();
|
856
|
+
const taskId = await subagentFramework.spawnSubagent({
|
857
|
+
type: 'summarizer',
|
858
|
+
input: {
|
859
|
+
content: chatHistory.map(entry => entry.content).join('\n'),
|
860
|
+
compressionTarget: 0.3 // 70% reduction
|
861
|
+
},
|
862
|
+
priority: 'medium'
|
863
|
+
});
|
864
|
+
const result = await subagentFramework.waitForResult(taskId, 10000);
|
865
|
+
if (result.success) {
|
866
|
+
const metrics = subagentFramework.getPerformanceMetrics();
|
867
|
+
const resultEntry = {
|
868
|
+
type: "assistant",
|
869
|
+
content: dryRun
|
870
|
+
? `📊 **Compression Preview (Dry Run)**\n\n${result.summary}\n\n💡 Use \`/compact\` to apply compression`
|
871
|
+
: `🧹 **Context Compressed Successfully**\n\n${result.summary}\n\n📈 **Performance:**\n- Tokens saved: ~${result.output.compressionRatio * 100}%\n- Processing time: ${result.executionTime}ms\n- Subagent tokens used: ${result.tokensUsed}`,
|
872
|
+
timestamp: new Date(),
|
873
|
+
};
|
874
|
+
setChatHistory((prev) => [...prev, resultEntry]);
|
875
|
+
if (!dryRun && result.success) {
|
876
|
+
// In a real implementation, this would actually compress the chat history
|
877
|
+
const tipsEntry = {
|
878
|
+
type: "assistant",
|
879
|
+
content: `✨ **Context Optimization Complete**\n\n**What happened:**\n- Older conversations summarized\n- Recent context preserved\n- Key decisions and TODOs maintained\n\n**Options:**\n- \`/compact --dry-run\` - Preview compression\n- \`/compact --force\` - Force compression even if below threshold`,
|
880
|
+
timestamp: new Date(),
|
881
|
+
};
|
882
|
+
setChatHistory((prev) => [...prev, tipsEntry]);
|
883
|
+
}
|
884
|
+
}
|
885
|
+
}
|
886
|
+
catch (error) {
|
887
|
+
const errorEntry = {
|
888
|
+
type: "assistant",
|
889
|
+
content: `Failed to compress context: ${error.message}`,
|
890
|
+
timestamp: new Date(),
|
891
|
+
};
|
892
|
+
setChatHistory((prev) => [...prev, errorEntry]);
|
893
|
+
}
|
894
|
+
setIsProcessing(false);
|
895
|
+
clearInput();
|
896
|
+
return true;
|
897
|
+
}
|
898
|
+
if (trimmedInput === "/heal" || trimmedInput.startsWith("/heal ")) {
|
899
|
+
const userEntry = {
|
900
|
+
type: "user",
|
901
|
+
content: trimmedInput,
|
902
|
+
timestamp: new Date(),
|
903
|
+
};
|
904
|
+
setChatHistory((prev) => [...prev, userEntry]);
|
905
|
+
setIsProcessing(true);
|
906
|
+
try {
|
907
|
+
const args = trimmedInput.split(' ').slice(1);
|
908
|
+
const classify = args.includes('--classify');
|
909
|
+
const playbook = args.includes('--playbook');
|
910
|
+
const healingSystem = new SelfHealingSystem(process.cwd());
|
911
|
+
// For demo purposes, create a simulated error
|
912
|
+
const mockError = {
|
913
|
+
message: "Example error for demonstration",
|
914
|
+
stack: "at someFunction (src/example.ts:42:10)"
|
915
|
+
};
|
916
|
+
const mockContext = {
|
917
|
+
command: trimmedInput,
|
918
|
+
operation: "heal-demo",
|
919
|
+
files: ["src/example.ts"]
|
920
|
+
};
|
921
|
+
const result = await healingSystem.captureIncident(mockError, mockContext);
|
922
|
+
const resultEntry = {
|
923
|
+
type: "assistant",
|
924
|
+
content: result.message,
|
925
|
+
timestamp: new Date(),
|
926
|
+
};
|
927
|
+
setChatHistory((prev) => [...prev, resultEntry]);
|
928
|
+
if (result.success) {
|
929
|
+
const tipsEntry = {
|
930
|
+
type: "assistant",
|
931
|
+
content: `🔄 **Self-Healing System Activated**
|
932
|
+
|
933
|
+
**What was captured:**
|
934
|
+
- Incident documentation with root cause analysis
|
935
|
+
- Automatic guardrail generation (if applicable)
|
936
|
+
- Integration with existing .agent system
|
937
|
+
|
938
|
+
**Options:**
|
939
|
+
- \`/heal --classify\` - Classify failure type and suggest guardrail
|
940
|
+
- \`/heal --playbook\` - Generate step-by-step recovery SOP
|
941
|
+
- \`/guardrails\` - View and manage all prevention rules
|
942
|
+
|
943
|
+
**Next steps:**
|
944
|
+
- Review the incident documentation
|
945
|
+
- Check if guardrail was created
|
946
|
+
- Update SOPs with lessons learned`,
|
947
|
+
timestamp: new Date(),
|
948
|
+
};
|
949
|
+
setChatHistory((prev) => [...prev, tipsEntry]);
|
950
|
+
}
|
951
|
+
}
|
952
|
+
catch (error) {
|
953
|
+
const errorEntry = {
|
954
|
+
type: "assistant",
|
955
|
+
content: `Failed to process healing: ${error.message}`,
|
956
|
+
timestamp: new Date(),
|
957
|
+
};
|
958
|
+
setChatHistory((prev) => [...prev, errorEntry]);
|
959
|
+
}
|
960
|
+
setIsProcessing(false);
|
961
|
+
clearInput();
|
962
|
+
return true;
|
963
|
+
}
|
964
|
+
if (trimmedInput === "/guardrails" || trimmedInput.startsWith("/guardrails ")) {
|
965
|
+
const userEntry = {
|
966
|
+
type: "user",
|
967
|
+
content: trimmedInput,
|
968
|
+
timestamp: new Date(),
|
969
|
+
};
|
970
|
+
setChatHistory((prev) => [...prev, userEntry]);
|
971
|
+
setIsProcessing(true);
|
972
|
+
try {
|
973
|
+
const args = trimmedInput.split(' ').slice(1);
|
974
|
+
const check = args.includes('--check');
|
975
|
+
const enable = args.find(arg => arg.startsWith('--enable'))?.split('=')[1];
|
976
|
+
const disable = args.find(arg => arg.startsWith('--disable'))?.split('=')[1];
|
977
|
+
const healingSystem = new SelfHealingSystem(process.cwd());
|
978
|
+
if (check) {
|
979
|
+
const checkResult = await healingSystem.checkGuardrails('example-operation', {});
|
980
|
+
const resultEntry = {
|
981
|
+
type: "assistant",
|
982
|
+
content: `🛡️ **Guardrail Check Results**\n\n**Status:** ${checkResult.passed ? '✅ All Clear' : '❌ Violations Found'}\n**Violations:** ${checkResult.violations.length}\n**Warnings:** ${checkResult.warnings.length}`,
|
983
|
+
timestamp: new Date(),
|
984
|
+
};
|
985
|
+
setChatHistory((prev) => [...prev, resultEntry]);
|
986
|
+
}
|
987
|
+
else {
|
988
|
+
// List all guardrails
|
989
|
+
const incidents = await healingSystem.listIncidents();
|
990
|
+
const config = healingSystem.getConfig();
|
991
|
+
const resultEntry = {
|
992
|
+
type: "assistant",
|
993
|
+
content: `🛡️ **Guardrails Management**
|
994
|
+
|
995
|
+
**System Status:** ${config.enabled ? '✅ Enabled' : '❌ Disabled'}
|
996
|
+
**Enforcement:** ${config.enforceGuardrails ? '✅ Active' : '❌ Disabled'}
|
997
|
+
**Error Prompt:** ${config.onErrorPrompt}
|
998
|
+
|
999
|
+
**Recent Incidents:** ${incidents.length}
|
1000
|
+
${incidents.slice(0, 3).map(i => `- ${i.title} (${i.impact} impact)`).join('\n')}
|
1001
|
+
|
1002
|
+
**Available Commands:**
|
1003
|
+
- \`/guardrails --check\` - Check current plans against guardrails
|
1004
|
+
- \`/heal\` - Document new failure and create guardrail
|
1005
|
+
- View specific guardrails in \`.agent/guardrails/\``,
|
1006
|
+
timestamp: new Date(),
|
1007
|
+
};
|
1008
|
+
setChatHistory((prev) => [...prev, resultEntry]);
|
1009
|
+
}
|
1010
|
+
}
|
1011
|
+
catch (error) {
|
1012
|
+
const errorEntry = {
|
1013
|
+
type: "assistant",
|
1014
|
+
content: `Failed to manage guardrails: ${error.message}`,
|
1015
|
+
timestamp: new Date(),
|
1016
|
+
};
|
1017
|
+
setChatHistory((prev) => [...prev, errorEntry]);
|
1018
|
+
}
|
1019
|
+
setIsProcessing(false);
|
1020
|
+
clearInput();
|
1021
|
+
return true;
|
1022
|
+
}
|
435
1023
|
const directBashCommands = [
|
436
1024
|
"ls",
|
437
1025
|
"pwd",
|
@@ -560,9 +1148,9 @@ Respond with ONLY the commit message, no additional text.`;
|
|
560
1148
|
return {
|
561
1149
|
...entry,
|
562
1150
|
type: "tool_result",
|
563
|
-
content: chunk.toolResult
|
1151
|
+
content: chunk.toolResult?.success
|
564
1152
|
? chunk.toolResult.output || "Success"
|
565
|
-
: chunk.toolResult
|
1153
|
+
: chunk.toolResult?.error || "Error occurred",
|
566
1154
|
toolResult: chunk.toolResult,
|
567
1155
|
};
|
568
1156
|
}
|