yuangs 6.3.0 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/dist/agent/AgentRuntime.d.ts +7 -27
  2. package/dist/agent/AgentRuntime.js +31 -583
  3. package/dist/agent/AgentRuntime.js.map +1 -1
  4. package/dist/agent/DualAgentRuntime.js +16 -16
  5. package/dist/agent/DualAgentRuntime.js.map +1 -1
  6. package/dist/agent/ExecutionCompleter.d.ts +31 -0
  7. package/dist/agent/ExecutionCompleter.js +83 -0
  8. package/dist/agent/ExecutionCompleter.js.map +1 -0
  9. package/dist/agent/ExecutionHandler.d.ts +34 -0
  10. package/dist/agent/ExecutionHandler.js +227 -0
  11. package/dist/agent/ExecutionHandler.js.map +1 -0
  12. package/dist/agent/ExecutionLearning.d.ts +8 -0
  13. package/dist/agent/ExecutionLearning.js +31 -0
  14. package/dist/agent/ExecutionLearning.js.map +1 -0
  15. package/dist/agent/ExecutionRecovery.d.ts +26 -0
  16. package/dist/agent/ExecutionRecovery.js +99 -0
  17. package/dist/agent/ExecutionRecovery.js.map +1 -0
  18. package/dist/agent/ExecutionStabilizer.d.ts +20 -0
  19. package/dist/agent/ExecutionStabilizer.js +101 -0
  20. package/dist/agent/ExecutionStabilizer.js.map +1 -0
  21. package/dist/agent/ExecutionTypes.d.ts +13 -0
  22. package/dist/agent/ExecutionTypes.js +9 -0
  23. package/dist/agent/ExecutionTypes.js.map +1 -0
  24. package/dist/agent/LLMCaller.d.ts +19 -0
  25. package/dist/agent/LLMCaller.js +103 -0
  26. package/dist/agent/LLMCaller.js.map +1 -0
  27. package/dist/agent/PreFlightChecker.d.ts +51 -0
  28. package/dist/agent/PreFlightChecker.js +148 -0
  29. package/dist/agent/PreFlightChecker.js.map +1 -0
  30. package/dist/agent/commandSemantics.js +12 -0
  31. package/dist/agent/commandSemantics.js.map +1 -1
  32. package/dist/agent/errorTracker.d.ts +10 -0
  33. package/dist/agent/errorTracker.js +36 -0
  34. package/dist/agent/errorTracker.js.map +1 -1
  35. package/dist/agent/executor.d.ts +12 -90
  36. package/dist/agent/executor.js +59 -881
  37. package/dist/agent/executor.js.map +1 -1
  38. package/dist/agent/governance/core.js.map +1 -1
  39. package/dist/agent/governance/riskScoring.js +6 -3
  40. package/dist/agent/governance/riskScoring.js.map +1 -1
  41. package/dist/agent/governance.js +4 -36
  42. package/dist/agent/governance.js.map +1 -1
  43. package/dist/agent/llm.js +11 -17
  44. package/dist/agent/llm.js.map +1 -1
  45. package/dist/agent/policy/engine.d.ts +2 -5
  46. package/dist/agent/policy/engine.js.map +1 -1
  47. package/dist/agent/policy/index.d.ts +1 -0
  48. package/dist/agent/policy/index.js +1 -0
  49. package/dist/agent/policy/index.js.map +1 -1
  50. package/dist/agent/policy/policies/WorkdirWrite.d.ts +11 -0
  51. package/dist/agent/policy/policies/WorkdirWrite.js +65 -0
  52. package/dist/agent/policy/policies/WorkdirWrite.js.map +1 -0
  53. package/dist/agent/policy/policies/noDangerousShell.js +1 -1
  54. package/dist/agent/policy/policies/noDangerousShell.js.map +1 -1
  55. package/dist/agent/policy/types.d.ts +6 -4
  56. package/dist/agent/skills.d.ts +12 -17
  57. package/dist/agent/skills.js +45 -52
  58. package/dist/agent/skills.js.map +1 -1
  59. package/dist/agent/state.d.ts +33 -3
  60. package/dist/agent/state.js +14 -0
  61. package/dist/agent/state.js.map +1 -1
  62. package/dist/agent/tools/AnalyzeDependencies.d.ts +9 -0
  63. package/dist/agent/tools/AnalyzeDependencies.js +91 -0
  64. package/dist/agent/tools/AnalyzeDependencies.js.map +1 -0
  65. package/dist/agent/tools/AppendFile.d.ts +8 -0
  66. package/dist/agent/tools/AppendFile.js +36 -0
  67. package/dist/agent/tools/AppendFile.js.map +1 -0
  68. package/dist/agent/tools/CodeDiff.d.ts +8 -0
  69. package/dist/agent/tools/CodeDiff.js +36 -0
  70. package/dist/agent/tools/CodeDiff.js.map +1 -0
  71. package/dist/agent/tools/ContinueReading.d.ts +8 -0
  72. package/dist/agent/tools/ContinueReading.js +59 -0
  73. package/dist/agent/tools/ContinueReading.js.map +1 -0
  74. package/dist/agent/tools/FileInfo.d.ts +8 -0
  75. package/dist/agent/tools/FileInfo.js +43 -0
  76. package/dist/agent/tools/FileInfo.js.map +1 -0
  77. package/dist/agent/tools/GitDiff.d.ts +8 -0
  78. package/dist/agent/tools/GitDiff.js +40 -0
  79. package/dist/agent/tools/GitDiff.js.map +1 -0
  80. package/dist/agent/tools/GitLog.d.ts +8 -0
  81. package/dist/agent/tools/GitLog.js +36 -0
  82. package/dist/agent/tools/GitLog.js.map +1 -0
  83. package/dist/agent/tools/GitStatus.d.ts +8 -0
  84. package/dist/agent/tools/GitStatus.js +38 -0
  85. package/dist/agent/tools/GitStatus.js.map +1 -0
  86. package/dist/agent/tools/ListDirectoryTree.d.ts +9 -0
  87. package/dist/agent/tools/ListDirectoryTree.js +63 -0
  88. package/dist/agent/tools/ListDirectoryTree.js.map +1 -0
  89. package/dist/agent/tools/ListFiles.d.ts +9 -0
  90. package/dist/agent/tools/ListFiles.js +53 -0
  91. package/dist/agent/tools/ListFiles.js.map +1 -0
  92. package/dist/agent/tools/ReadFile.d.ts +8 -0
  93. package/dist/agent/tools/ReadFile.js +33 -0
  94. package/dist/agent/tools/ReadFile.js.map +1 -0
  95. package/dist/agent/tools/ReadFileLines.d.ts +8 -0
  96. package/dist/agent/tools/ReadFileLines.js +45 -0
  97. package/dist/agent/tools/ReadFileLines.js.map +1 -0
  98. package/dist/agent/tools/ReadFileLinesFromEnd.d.ts +8 -0
  99. package/dist/agent/tools/ReadFileLinesFromEnd.js +48 -0
  100. package/dist/agent/tools/ReadFileLinesFromEnd.js.map +1 -0
  101. package/dist/agent/tools/SearchInFiles.d.ts +8 -0
  102. package/dist/agent/tools/SearchInFiles.js +70 -0
  103. package/dist/agent/tools/SearchInFiles.js.map +1 -0
  104. package/dist/agent/tools/SearchSymbol.d.ts +8 -0
  105. package/dist/agent/tools/SearchSymbol.js +62 -0
  106. package/dist/agent/tools/SearchSymbol.js.map +1 -0
  107. package/dist/agent/tools/ShellCmd.d.ts +8 -0
  108. package/dist/agent/tools/ShellCmd.js +40 -0
  109. package/dist/agent/tools/ShellCmd.js.map +1 -0
  110. package/dist/agent/tools/WriteFile.d.ts +8 -0
  111. package/dist/agent/tools/WriteFile.js +35 -0
  112. package/dist/agent/tools/WriteFile.js.map +1 -0
  113. package/dist/agent/tools/index.d.ts +20 -0
  114. package/dist/agent/tools/index.js +50 -0
  115. package/dist/agent/tools/index.js.map +1 -0
  116. package/dist/agent/tools/pathSafety.d.ts +9 -0
  117. package/dist/agent/tools/pathSafety.js +85 -0
  118. package/dist/agent/tools/pathSafety.js.map +1 -0
  119. package/dist/agent/tools/registry.d.ts +40 -0
  120. package/dist/agent/tools/registry.js +77 -0
  121. package/dist/agent/tools/registry.js.map +1 -0
  122. package/dist/agent/tools/types.d.ts +21 -0
  123. package/dist/agent/tools/types.js +3 -0
  124. package/dist/agent/tools/types.js.map +1 -0
  125. package/dist/agent/tools/utils.d.ts +43 -0
  126. package/dist/agent/tools/utils.js +158 -0
  127. package/dist/agent/tools/utils.js.map +1 -0
  128. package/dist/agent/types.d.ts +5 -3
  129. package/dist/ai/client.d.ts +2 -2
  130. package/dist/ai/client.js +16 -23
  131. package/dist/ai/client.js.map +1 -1
  132. package/dist/audit/timeline.js +7 -5
  133. package/dist/audit/timeline.js.map +1 -1
  134. package/dist/cli.js +12 -6
  135. package/dist/cli.js.map +1 -1
  136. package/dist/commands/handleAIChat.js +1 -1
  137. package/dist/commands/handleAIChat.js.map +1 -1
  138. package/dist/commands/handleAICommand.js +3 -3
  139. package/dist/commands/handleAICommand.js.map +1 -1
  140. package/dist/commands/skillsCommands.js +4 -42
  141. package/dist/commands/skillsCommands.js.map +1 -1
  142. package/dist/core/ConfigService.d.ts +87 -0
  143. package/dist/core/ConfigService.js +259 -0
  144. package/dist/core/ConfigService.js.map +1 -0
  145. package/dist/core/executionRecord.d.ts +1 -1
  146. package/dist/core/explain.js +2 -2
  147. package/dist/core/explain.js.map +1 -1
  148. package/dist/core/git/BackupManager.d.ts +30 -0
  149. package/dist/core/git/BackupManager.js +153 -0
  150. package/dist/core/git/BackupManager.js.map +1 -0
  151. package/dist/core/git/ConflictResolver.js.map +1 -1
  152. package/dist/core/replayDiff.js +5 -5
  153. package/dist/core/replayDiff.js.map +1 -1
  154. package/dist/core/skillTypes.d.ts +22 -0
  155. package/dist/core/skillTypes.js +17 -0
  156. package/dist/core/skillTypes.js.map +1 -0
  157. package/dist/utils/Logger.d.ts +24 -5
  158. package/dist/utils/Logger.js +89 -63
  159. package/dist/utils/Logger.js.map +1 -1
  160. package/dist/utils/storage.d.ts +22 -0
  161. package/dist/utils/storage.js +62 -0
  162. package/dist/utils/storage.js.map +1 -0
  163. package/package.json +3 -1
  164. package/dist/core/ConfigManager.d.ts +0 -39
  165. package/dist/core/ConfigManager.js +0 -127
  166. package/dist/core/ConfigManager.js.map +0 -1
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExecutionLearning = void 0;
4
+ const executionRecord_1 = require("../core/executionRecord");
5
+ const executionStore_1 = require("../core/executionStore");
6
+ const skills_1 = require("./skills");
7
+ const Logger_1 = require("../utils/Logger");
8
+ const log = Logger_1.logger.child('ExecutionLearning');
9
+ /**
10
+ * Records execution history for skill learning.
11
+ * Standalone — no dependencies on other classes.
12
+ */
13
+ class ExecutionLearning {
14
+ learn(userInput, mode, thought) {
15
+ try {
16
+ const record = (0, executionRecord_1.createExecutionRecord)(`agent-${mode}`, { required: [], preferred: [] }, { aiProxyUrl: { value: '', source: 'built-in' }, defaultModel: { value: '', source: 'built-in' }, accountType: { value: 'free', source: 'built-in' } }, { selected: null, candidates: [], fallbackOccurred: false }, { success: true }, undefined, userInput, mode);
17
+ record.llmResult = { plan: thought.parsedPlan };
18
+ record.input = { rawInput: userInput };
19
+ const savedRecordId = (0, executionStore_1.saveExecutionRecord)(record);
20
+ const savedRecord = (0, executionStore_1.loadExecutionRecord)(savedRecordId);
21
+ if (savedRecord) {
22
+ (0, skills_1.learnSkillFromRecord)(savedRecord, true);
23
+ }
24
+ }
25
+ catch (error) {
26
+ log.warn('Skill learning failed', { error: String(error) });
27
+ }
28
+ }
29
+ }
30
+ exports.ExecutionLearning = ExecutionLearning;
31
+ //# sourceMappingURL=ExecutionLearning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutionLearning.js","sourceRoot":"","sources":["../../src/agent/ExecutionLearning.ts"],"names":[],"mappings":";;;AACA,6DAAgE;AAChE,2DAAkF;AAClF,qCAAgD;AAChD,4CAAyC;AAEzC,MAAM,GAAG,GAAG,eAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;AAE9C;;;GAGG;AACH,MAAa,iBAAiB;IAC5B,KAAK,CAAC,SAAiB,EAAE,IAAY,EAAE,OAAqB;QAC1D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,uCAAqB,EAClC,SAAS,IAAI,EAAE,EACf,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAS,EACtC,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,EAAS,EAC7J,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,EAC3D,EAAE,OAAO,EAAE,IAAI,EAAE,EACjB,SAAS,EACT,SAAS,EACT,IAAI,CACL,CAAC;YAED,MAAc,CAAC,SAAS,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;YACxD,MAAc,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;YAEhD,MAAM,aAAa,GAAG,IAAA,oCAAmB,EAAC,MAAM,CAAC,CAAC;YAClD,MAAM,WAAW,GAAG,IAAA,oCAAmB,EAAC,aAAa,CAAC,CAAC;YAEvD,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAA,6BAAoB,EAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;CACF;AA3BD,8CA2BC"}
@@ -0,0 +1,26 @@
1
+ import { ProposedAction } from './state';
2
+ /**
3
+ * Handles execution failure: backup rollback, error tracking, and auto-fix.
4
+ */
5
+ export declare class ExecutionRecovery {
6
+ /** Clear backup reference after successful write */
7
+ clearBackup(): void;
8
+ /**
9
+ * Handle a failed execution.
10
+ * Attempts rollback, records error, and tries auto-fix for shell commands.
11
+ * Returns the error message (empty string if auto-fix succeeded).
12
+ */
13
+ handle(result: {
14
+ success: boolean;
15
+ output: string;
16
+ error?: string;
17
+ }, action: ProposedAction, mode: string, thought: {
18
+ modelName?: string;
19
+ }, userInput: string, context: {
20
+ addToolResult: (tool: string, output: string) => void;
21
+ addMessage: (role: string, content: string) => void;
22
+ }): Promise<string>;
23
+ private tryAutoFix;
24
+ /** Current backup reference (set by caller before execute) */
25
+ private currentBackup;
26
+ }
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExecutionRecovery = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const executor_1 = require("./executor");
6
+ const errorTracker_1 = require("./errorTracker");
7
+ const BackupManager_1 = require("../core/git/BackupManager");
8
+ const autofix_1 = require("../core/autofix");
9
+ const os_1 = require("../core/os");
10
+ const Logger_1 = require("../utils/Logger");
11
+ const log = Logger_1.logger.child('ExecutionRecovery');
12
+ /**
13
+ * Handles execution failure: backup rollback, error tracking, and auto-fix.
14
+ */
15
+ class ExecutionRecovery {
16
+ /** Clear backup reference after successful write */
17
+ clearBackup() {
18
+ this.currentBackup = null;
19
+ }
20
+ /**
21
+ * Handle a failed execution.
22
+ * Attempts rollback, records error, and tries auto-fix for shell commands.
23
+ * Returns the error message (empty string if auto-fix succeeded).
24
+ */
25
+ async handle(result, action, mode, thought, userInput, context) {
26
+ // Rollback on write failure
27
+ if (this.currentBackup) {
28
+ log.warn('Rollback: write failed, attempting restore');
29
+ const rolledBack = await BackupManager_1.BackupManager.rollback(this.currentBackup);
30
+ if (rolledBack) {
31
+ log.info('Rollback succeeded');
32
+ this.currentBackup = null;
33
+ }
34
+ else {
35
+ log.error('Rollback failed, file may need manual recovery');
36
+ }
37
+ }
38
+ const actualToolName = action.payload?.tool_name || action.type;
39
+ context.addToolResult(actualToolName, `Error: ${result.error}`);
40
+ log.error('Execution failed', { tool: actualToolName, error: result.error });
41
+ if (action.type === 'tool_call') {
42
+ const toolParams = action.payload;
43
+ errorTracker_1.ErrorTracker.recordError(toolParams.tool_name, toolParams.parameters, result.error || 'Unknown error', { mode, model: thought.modelName, userInput });
44
+ }
45
+ else if (action.type === 'shell_cmd') {
46
+ const shellParams = action.payload;
47
+ errorTracker_1.ErrorTracker.recordError('shell_cmd', { command: shellParams.command }, result.error || 'Unknown error', { mode, model: thought.modelName, userInput });
48
+ }
49
+ // Auto-fix for shell_cmd failures
50
+ if (action.type === 'shell_cmd' && result.error) {
51
+ const fixed = await this.tryAutoFix(action, result, thought, context);
52
+ if (fixed)
53
+ return '';
54
+ }
55
+ return result.error || '';
56
+ }
57
+ async tryAutoFix(action, result, thought, context) {
58
+ log.debug('AutoFix: attempting command repair');
59
+ try {
60
+ const os = (0, os_1.getOSProfile)();
61
+ const shellParams = action.payload;
62
+ const fixPlan = await (0, autofix_1.autoFixCommand)(shellParams.command, result.error || result.output || '', os, thought.modelName);
63
+ if (fixPlan && fixPlan.command) {
64
+ log.debug('AutoFix: fix plan generated', { command: fixPlan.command, plan: fixPlan.plan || 'none' });
65
+ context.addMessage('system', `自动修复建议:${fixPlan.command}\n原因:${fixPlan.plan || '无'}`);
66
+ if (fixPlan.risk === 'low') {
67
+ log.debug('AutoFix: executing low-risk fix');
68
+ const fixedAction = {
69
+ id: (0, crypto_1.randomUUID)(),
70
+ type: 'shell_cmd',
71
+ payload: { command: fixPlan.command },
72
+ riskLevel: 'low',
73
+ reasoning: `AutoFix from failed command: ${shellParams.command}`
74
+ };
75
+ const fixedResult = await executor_1.ToolExecutor.execute(fixedAction);
76
+ if (fixedResult.success) {
77
+ log.info('AutoFix: fix succeeded');
78
+ context.addToolResult('shell_cmd', fixedResult.output);
79
+ return true;
80
+ }
81
+ else {
82
+ log.warn('AutoFix: fix failed, continuing with original error');
83
+ }
84
+ }
85
+ }
86
+ else {
87
+ log.debug('AutoFix: unable to generate fix plan');
88
+ }
89
+ }
90
+ catch (fixError) {
91
+ log.warn('AutoFix: error during fix attempt', { error: fixError.message });
92
+ }
93
+ return false;
94
+ }
95
+ /** Current backup reference (set by caller before execute) */
96
+ currentBackup = null;
97
+ }
98
+ exports.ExecutionRecovery = ExecutionRecovery;
99
+ //# sourceMappingURL=ExecutionRecovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutionRecovery.js","sourceRoot":"","sources":["../../src/agent/ExecutionRecovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { ToolCallRecord } from './ExecutionTypes';
2
+ import { StreamMarkdownRenderer } from '../utils/renderer';
3
+ /**
4
+ * Detects output stabilization and semantic completion.
5
+ * Pure functions with zero dependencies on class state.
6
+ */
7
+ export declare class StabilizationDetector {
8
+ /** Detect if output has stabilized (same prefix as previous) */
9
+ isOutputStable(lastToolCall: ToolCallRecord | null, normalizedOutput: string): boolean;
10
+ /** Detect if output is semantically complete (short direct answer) */
11
+ isSemanticComplete(output: string, userInput: string): boolean;
12
+ /** Format tool result for display */
13
+ tryFormatToolResult(output: string, userInput: string): string | null;
14
+ /** Render output and finish the renderer */
15
+ renderAndFinish(context: {
16
+ addMessage: (role: string, content: string) => void;
17
+ }, output: string, agentRenderer: StreamMarkdownRenderer | undefined): void;
18
+ /** Quietly finish the renderer without adding message */
19
+ finishQuiet(agentRenderer: StreamMarkdownRenderer | undefined): void;
20
+ }
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StabilizationDetector = void 0;
4
+ /**
5
+ * Detects output stabilization and semantic completion.
6
+ * Pure functions with zero dependencies on class state.
7
+ */
8
+ class StabilizationDetector {
9
+ /** Detect if output has stabilized (same prefix as previous) */
10
+ isOutputStable(lastToolCall, normalizedOutput) {
11
+ const prevOutput = lastToolCall?.lastOutput || '';
12
+ if (!prevOutput || !normalizedOutput)
13
+ return false;
14
+ const compareLen = 500;
15
+ const currPrefix = normalizedOutput.substring(0, compareLen);
16
+ const prevPrefix = prevOutput.substring(0, compareLen);
17
+ const isStable = currPrefix === prevPrefix;
18
+ const isNearlyStable = Math.abs(prevOutput.length - normalizedOutput.length) < 20 &&
19
+ currPrefix.slice(0, 100) === prevPrefix.slice(0, 100);
20
+ return isStable || isNearlyStable;
21
+ }
22
+ /** Detect if output is semantically complete (short direct answer) */
23
+ isSemanticComplete(output, userInput) {
24
+ const trimmed = output.trim();
25
+ if (trimmed.length > 300 || trimmed.length === 0)
26
+ return false;
27
+ const lineCount = trimmed.split('\n').length;
28
+ if (lineCount > 15)
29
+ return false;
30
+ const q = userInput.toLowerCase();
31
+ if (/(大小|多少字节|多大|size|bytes?)/.test(q)) {
32
+ if (/^\d+(\.\d+)?$/.test(trimmed))
33
+ return true;
34
+ if (/^[\d.]+\s*[KMGT]?B?$/i.test(trimmed))
35
+ return true;
36
+ if (/^[\d.]+\s*[KMGT]?B?\s+\S+/i.test(trimmed))
37
+ return true;
38
+ }
39
+ if (/(几个|多少个|数量|count|how many)/.test(q) && /^\d+$/.test(trimmed))
40
+ return true;
41
+ if (/(最大|最小|largest|smallest).*文件/.test(q)) {
42
+ if (/^\d+\s+\.\//m.test(trimmed))
43
+ return true;
44
+ }
45
+ if (/(最新|最旧|最近|最早|newest|latest|oldest)/.test(q) && trimmed.split(/\s+/).length <= 5 && trimmed.length < 80)
46
+ return true;
47
+ if (/(行数|多少行|line.?count|多少 line)/.test(q) && /^\d+$/.test(trimmed))
48
+ return true;
49
+ if (trimmed.length < 50 && !trimmed.startsWith('-') && trimmed.split(/\s+/).length <= 4) {
50
+ if (/\d+|\.\//.test(trimmed))
51
+ return true;
52
+ }
53
+ return false;
54
+ }
55
+ /** Format tool result for display */
56
+ tryFormatToolResult(output, userInput) {
57
+ if (output.length > 5000)
58
+ return null;
59
+ if (/(最大|最小|哪个.*最大|哪个.*最小|largest|smallest|biggest)/.test(userInput))
60
+ return null;
61
+ try {
62
+ const parsed = JSON.parse(output);
63
+ if (Array.isArray(parsed) && parsed.length > 0 && parsed[0].path) {
64
+ const files = parsed.filter((f) => f.type === 'file');
65
+ const dirs = parsed.filter((f) => f.type === 'directory');
66
+ const fileNames = files.map((f) => f.path.split('/').pop()).join('、');
67
+ const dirNames = dirs.map((f) => f.path.split('/').pop()).join('、');
68
+ let result = `**${files.length}** 个文件`;
69
+ if (files.length > 0 && files.length <= 30)
70
+ result += `:${fileNames}`;
71
+ result += `\n**${dirs.length}** 个目录`;
72
+ if (dirs.length > 0 && dirs.length <= 30)
73
+ result += `:${dirNames}`;
74
+ return result;
75
+ }
76
+ }
77
+ catch { /* not JSON */ }
78
+ if (output.length < 200 && !output.includes('\n'))
79
+ return output;
80
+ return null;
81
+ }
82
+ /** Render output and finish the renderer */
83
+ renderAndFinish(context, output, agentRenderer) {
84
+ context.addMessage('assistant', output);
85
+ if (agentRenderer) {
86
+ agentRenderer.buffer = '';
87
+ agentRenderer.quietMode = true;
88
+ agentRenderer.finish();
89
+ }
90
+ }
91
+ /** Quietly finish the renderer without adding message */
92
+ finishQuiet(agentRenderer) {
93
+ if (agentRenderer) {
94
+ agentRenderer.buffer = '';
95
+ agentRenderer.quietMode = true;
96
+ agentRenderer.finish();
97
+ }
98
+ }
99
+ }
100
+ exports.StabilizationDetector = StabilizationDetector;
101
+ //# sourceMappingURL=ExecutionStabilizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutionStabilizer.js","sourceRoot":"","sources":["../../src/agent/ExecutionStabilizer.ts"],"names":[],"mappings":";;;AAGA;;;GAGG;AACH,MAAa,qBAAqB;IAChC,gEAAgE;IAChE,cAAc,CAAC,YAAmC,EAAE,gBAAwB;QAC1E,MAAM,UAAU,GAAG,YAAY,EAAE,UAAU,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,UAAU,IAAI,CAAC,gBAAgB;YAAE,OAAO,KAAK,CAAC;QAEnD,MAAM,UAAU,GAAG,GAAG,CAAC;QACvB,MAAM,UAAU,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,UAAU,KAAK,UAAU,CAAC;QAE3C,MAAM,cAAc,GAClB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,GAAG,EAAE;YAC1D,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAExD,OAAO,QAAQ,IAAI,cAAc,CAAC;IACpC,CAAC;IAED,sEAAsE;IACtE,kBAAkB,CAAC,MAAc,EAAE,SAAiB;QAClD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAE/D,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QAC7C,IAAI,SAAS,GAAG,EAAE;YAAE,OAAO,KAAK,CAAC;QAEjC,MAAM,CAAC,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QAElC,IAAI,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC/C,IAAI,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC;YACvD,IAAI,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC9D,CAAC;QAED,IAAI,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QAE/E,IAAI,8BAA8B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC;QAChD,CAAC;QAED,IAAI,oCAAoC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,IAAI,CAAC;QAEzH,IAAI,8BAA8B,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QAEjF,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACxF,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC5C,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,qCAAqC;IACrC,mBAAmB,CAAC,MAAc,EAAE,SAAiB;QACnD,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI;YAAE,OAAO,IAAI,CAAC;QACtC,IAAI,gDAAgD,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QAElF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAClC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACjE,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;gBAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;gBAC/D,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACzE,IAAI,MAAM,GAAG,KAAK,KAAK,CAAC,MAAM,QAAQ,CAAC;gBACvC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE;oBAAE,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBACtE,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,QAAQ,CAAC;gBACrC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE;oBAAE,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBACnE,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;QAE1B,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,MAAM,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4CAA4C;IAC5C,eAAe,CACb,OAAgE,EAChE,MAAc,EACd,aAAiD;QAEjD,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,aAAa,EAAE,CAAC;YACjB,aAAqB,CAAC,MAAM,GAAG,EAAE,CAAC;YAClC,aAAqB,CAAC,SAAS,GAAG,IAAI,CAAC;YACxC,aAAa,CAAC,MAAM,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,WAAW,CAAC,aAAiD;QAC3D,IAAI,aAAa,EAAE,CAAC;YACjB,aAAqB,CAAC,MAAM,GAAG,EAAE,CAAC;YAClC,aAAqB,CAAC,SAAS,GAAG,IAAI,CAAC;YACxC,aAAa,CAAC,MAAM,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;CACF;AAjGD,sDAiGC"}
@@ -0,0 +1,13 @@
1
+ export interface ToolCallRecord {
2
+ tool: string;
3
+ params: Record<string, unknown>;
4
+ count: number;
5
+ lastOutput?: string;
6
+ outputHistory: string[];
7
+ blockCount: number;
8
+ }
9
+ export declare const READ_ONLY_TOOLS: string[];
10
+ export interface WriteModeState {
11
+ filePath: string;
12
+ content: string;
13
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.READ_ONLY_TOOLS = void 0;
4
+ exports.READ_ONLY_TOOLS = [
5
+ 'read_file', 'list_files', 'read_file_lines', 'read_file_lines_from_end',
6
+ 'file_info', 'git_status', 'git_log', 'git_diff', 'list_directory_tree',
7
+ 'search_in_files', 'search_symbol', 'continue_reading', 'analyze_dependencies'
8
+ ];
9
+ //# sourceMappingURL=ExecutionTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutionTypes.js","sourceRoot":"","sources":["../../src/agent/ExecutionTypes.ts"],"names":[],"mappings":";;;AASa,QAAA,eAAe,GAAG;IAC7B,WAAW,EAAE,YAAY,EAAE,iBAAiB,EAAE,0BAA0B;IACxE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,qBAAqB;IACvE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,sBAAsB;CAC/E,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { SmartContextManager } from "./smartContextManager";
2
+ import { AgentThought } from "./state";
3
+ import { StreamMarkdownRenderer } from '../utils/renderer';
4
+ /**
5
+ * Handles all LLM interaction: prompt building, calling, and error recovery.
6
+ */
7
+ export declare class LLMCaller {
8
+ private context;
9
+ constructor(context: SmartContextManager);
10
+ /**
11
+ * Build the final prompt with dynamic context and skill injection.
12
+ */
13
+ buildPrompt(userInput: string, lastError: string | undefined): Promise<string>;
14
+ /**
15
+ * Call LLM with enhanced context.
16
+ */
17
+ call(enhancedPrompt: string, userInput: string, mode: string, onChunk: ((chunk: string) => void) | undefined, model: string | undefined, renderer: StreamMarkdownRenderer | undefined): Promise<AgentThought | null>;
18
+ private handleError;
19
+ }
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LLMCaller = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const llmAdapter_1 = require("./llmAdapter");
9
+ const llm_1 = require("./llm");
10
+ const governance_1 = require("./governance");
11
+ const dynamicPrompt_1 = require("./dynamicPrompt");
12
+ const promptSkills_1 = require("./promptSkills");
13
+ /**
14
+ * Handles all LLM interaction: prompt building, calling, and error recovery.
15
+ */
16
+ class LLMCaller {
17
+ context;
18
+ constructor(context) {
19
+ this.context = context;
20
+ }
21
+ /**
22
+ * Build the final prompt with dynamic context and skill injection.
23
+ */
24
+ async buildPrompt(userInput, lastError) {
25
+ const dynamicContext = await (0, dynamicPrompt_1.buildDynamicContext)(lastError);
26
+ const basePrompt = governance_1.GovernanceService.getPolicyManual();
27
+ let prompt = (0, dynamicPrompt_1.injectDynamicContext)(basePrompt, dynamicContext);
28
+ const skill = (0, promptSkills_1.matchSkill)(userInput);
29
+ if (skill) {
30
+ prompt += `\n\n[SKILL ACTIVE: ${skill.name}]\n${(0, promptSkills_1.generateSkillPrompt)(skill, userInput)}`;
31
+ }
32
+ return prompt;
33
+ }
34
+ /**
35
+ * Call LLM with enhanced context.
36
+ */
37
+ async call(enhancedPrompt, userInput, mode, onChunk, model, renderer) {
38
+ const messages = [];
39
+ const enhancedContext = await this.context.getEnhancedContext({
40
+ query: userInput || enhancedPrompt,
41
+ minRelevance: 0.3,
42
+ maxTokens: 8000,
43
+ enableSmartSummary: true
44
+ });
45
+ if (enhancedContext.summary) {
46
+ messages.push({ role: 'system', content: enhancedContext.summary });
47
+ }
48
+ for (const item of enhancedContext.rankedItems) {
49
+ messages.push({
50
+ role: 'user',
51
+ content: `@${item.path} (相关度: ${(item.relevance * 100).toFixed(0)}%)\n${item.summary || item.content || ''}`
52
+ });
53
+ }
54
+ if (userInput) {
55
+ messages.push({ role: 'user', content: userInput });
56
+ }
57
+ else {
58
+ messages.push({ role: 'user', content: enhancedPrompt });
59
+ }
60
+ try {
61
+ const thought = await llmAdapter_1.LLMAdapter.think(messages, mode, onChunk, model, enhancedPrompt, this.context);
62
+ if (!thought.raw || thought.raw.trim() === '') {
63
+ console.log(chalk_1.default.red('\n⚠️ AI 返回了空响应,请检查网络连接或模型配置。'));
64
+ return null;
65
+ }
66
+ return thought;
67
+ }
68
+ catch (error) {
69
+ this.handleError(error);
70
+ return null;
71
+ }
72
+ }
73
+ handleError(error) {
74
+ let errorMessage = '未知内部错误';
75
+ let statusCode = 0;
76
+ if (error instanceof llm_1.AIError) {
77
+ errorMessage = error.message;
78
+ statusCode = error.statusCode;
79
+ }
80
+ else if (error instanceof Error) {
81
+ errorMessage = error.message;
82
+ statusCode = error.statusCode || 0;
83
+ }
84
+ else if (typeof error === 'string') {
85
+ errorMessage = error;
86
+ }
87
+ const statusInfo = statusCode ? ` (状态码: ${statusCode})` : '';
88
+ console.log(chalk_1.default.red(`\n❌ AI 思考过程发生错误: ${errorMessage}${statusInfo}`));
89
+ const isTransient = statusCode === 429 || statusCode >= 500
90
+ || errorMessage.includes('timeout') || errorMessage.includes('network') || errorMessage.includes('ETIMEDOUT');
91
+ if (isTransient) {
92
+ console.log(chalk_1.default.yellow('⚠️ 检测到瞬时错误,自动跳过此轮'));
93
+ this.context.addMessage("system", `AI 调用失败${statusInfo},请稍后重试`);
94
+ return;
95
+ }
96
+ this.context.addMessage("system", `思考过程中发生错误${statusInfo}: ${errorMessage}`);
97
+ if (statusCode === 401 || statusCode === 403 || errorMessage.includes('401') || errorMessage.includes('403')) {
98
+ console.log(chalk_1.default.yellow('💡 检测到权限或授权错误,请检查 API 配置。'));
99
+ }
100
+ }
101
+ }
102
+ exports.LLMCaller = LLMCaller;
103
+ //# sourceMappingURL=LLMCaller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LLMCaller.js","sourceRoot":"","sources":["../../src/agent/LLMCaller.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,6CAA0C;AAC1C,+BAAgC;AAChC,6CAAiD;AAIjD,mDAA4E;AAC5E,iDAAiE;AAEjE;;GAEG;AACH,MAAa,SAAS;IACA;IAApB,YAAoB,OAA4B;QAA5B,YAAO,GAAP,OAAO,CAAqB;IAAG,CAAC;IAEpD;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,SAA6B;QAChE,MAAM,cAAc,GAAG,MAAM,IAAA,mCAAmB,EAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,8BAAiB,CAAC,eAAe,EAAE,CAAC;QACvD,IAAI,MAAM,GAAG,IAAA,oCAAoB,EAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAE9D,MAAM,KAAK,GAAG,IAAA,yBAAU,EAAC,SAAS,CAAC,CAAC;QACpC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,sBAAsB,KAAK,CAAC,IAAI,MAAM,IAAA,kCAAmB,EAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;QAC1F,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CACR,cAAsB,EACtB,SAAiB,EACjB,IAAY,EACZ,OAA8C,EAC9C,KAAyB,EACzB,QAA4C;QAE5C,MAAM,QAAQ,GAAU,EAAE,CAAC;QAC3B,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;YAC5D,KAAK,EAAE,SAAS,IAAI,cAAc;YAClC,YAAY,EAAE,GAAG;YACjB,SAAS,EAAE,IAAI;YACf,kBAAkB,EAAE,IAAI;SACzB,CAAC,CAAC;QAEH,IAAI,eAAe,CAAC,OAAO,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,eAAe,CAAC,WAAW,EAAE,CAAC;YAC/C,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE;aAC7G,CAAC,CAAC;QACL,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,uBAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAW,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5G,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBACvD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,KAAc;QAChC,IAAI,YAAY,GAAG,QAAQ,CAAC;QAC5B,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,IAAI,KAAK,YAAY,aAAO,EAAE,CAAC;YAC7B,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC;YAC7B,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QAChC,CAAC;aAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAClC,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC;YAC7B,UAAU,GAAI,KAAa,CAAC,UAAU,IAAI,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrC,YAAY,GAAG,KAAK,CAAC;QACvB,CAAC;QAED,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,oBAAoB,YAAY,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;QAExE,MAAM,WAAW,GAAG,UAAU,KAAK,GAAG,IAAI,UAAU,IAAI,GAAG;eACtD,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAEhH,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAC/C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,UAAU,QAAQ,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,YAAY,UAAU,KAAK,YAAY,EAAE,CAAC,CAAC;QAE7E,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7G,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;CACF;AAlGD,8BAkGC"}
@@ -0,0 +1,51 @@
1
+ import { ProposedAction } from "./state";
2
+ import { SmartContextManager } from "./smartContextManager";
3
+ interface WriteModeState {
4
+ filePath: string;
5
+ content: string;
6
+ }
7
+ interface ToolCallRecord {
8
+ tool: string;
9
+ params: any;
10
+ count: number;
11
+ lastOutput?: string;
12
+ outputHistory: string[];
13
+ blockCount: number;
14
+ }
15
+ /**
16
+ * Pre-flight checks before executing an action.
17
+ * Handles duplicate detection, write-mode caching, governance, and causal ACK verification.
18
+ */
19
+ export declare class PreFlightChecker {
20
+ private context;
21
+ constructor(context: SmartContextManager);
22
+ /**
23
+ * Verify causal ACK matches the last observation.
24
+ * Returns false if ACK mismatches and the loop should skip.
25
+ */
26
+ verifyAckCausality(thought: any): boolean;
27
+ /**
28
+ * Run governance checks. Returns false if the action is denied.
29
+ */
30
+ passGovernance(action: ProposedAction): Promise<boolean>;
31
+ /**
32
+ * Record knowledge graph edge between observation and action.
33
+ */
34
+ recordKnowledgeGraphEdge(thought: any, action: ProposedAction): Promise<void>;
35
+ /**
36
+ * Check if execution should be blocked.
37
+ * Returns:
38
+ * - 'blocked': skip this turn
39
+ * - 'force_break': break the loop entirely
40
+ * - cached result object: use cached output instead of executing
41
+ * - null: proceed with execution
42
+ */
43
+ check(action: ProposedAction, writeModeState: WriteModeState | null, lastToolCall: ToolCallRecord | null): 'blocked' | 'force_break' | {
44
+ success: true;
45
+ output: string;
46
+ artifacts: string[];
47
+ } | null;
48
+ /** Synchronous policy evaluation (for sync check method) */
49
+ private evaluatePolicySync;
50
+ }
51
+ export {};