@gracker/smartperfetto 1.0.16 → 1.0.17

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 (62) hide show
  1. package/dist/agent/core/conclusionContract.d.ts +7 -0
  2. package/dist/agent/core/conclusionContract.d.ts.map +1 -1
  3. package/dist/agent/core/conclusionGenerator.d.ts.map +1 -1
  4. package/dist/agent/core/conclusionGenerator.js +133 -20
  5. package/dist/agent/core/conclusionGenerator.js.map +1 -1
  6. package/dist/agentOpenAI/openAiConfig.d.ts +2 -0
  7. package/dist/agentOpenAI/openAiConfig.d.ts.map +1 -1
  8. package/dist/agentOpenAI/openAiConfig.js +3 -0
  9. package/dist/agentOpenAI/openAiConfig.js.map +1 -1
  10. package/dist/agentOpenAI/openAiRuntime.d.ts +8 -0
  11. package/dist/agentOpenAI/openAiRuntime.d.ts.map +1 -1
  12. package/dist/agentOpenAI/openAiRuntime.js +293 -58
  13. package/dist/agentOpenAI/openAiRuntime.js.map +1 -1
  14. package/dist/agentRuntime/runtimeHealth.d.ts +1 -0
  15. package/dist/agentRuntime/runtimeHealth.d.ts.map +1 -1
  16. package/dist/agentv3/claudeRuntime.d.ts.map +1 -1
  17. package/dist/agentv3/claudeRuntime.js +147 -65
  18. package/dist/agentv3/claudeRuntime.js.map +1 -1
  19. package/dist/agentv3/claudeSseBridge.d.ts +6 -0
  20. package/dist/agentv3/claudeSseBridge.d.ts.map +1 -1
  21. package/dist/agentv3/claudeSseBridge.js +1 -0
  22. package/dist/agentv3/claudeSseBridge.js.map +1 -1
  23. package/dist/cli-user/services/cliAnalyzeService.d.ts.map +1 -1
  24. package/dist/cli-user/services/cliAnalyzeService.js +37 -2
  25. package/dist/cli-user/services/cliAnalyzeService.js.map +1 -1
  26. package/dist/routes/agentResumeRoutes.d.ts.map +1 -1
  27. package/dist/routes/agentResumeRoutes.js +22 -0
  28. package/dist/routes/agentResumeRoutes.js.map +1 -1
  29. package/dist/routes/agentRoutes.d.ts.map +1 -1
  30. package/dist/routes/agentRoutes.js +247 -55
  31. package/dist/routes/agentRoutes.js.map +1 -1
  32. package/dist/scripts/verifyAgentSseScrolling.js +142 -2
  33. package/dist/scripts/verifyAgentSseScrolling.js.map +1 -1
  34. package/dist/services/agentResultNormalizer.d.ts +15 -3
  35. package/dist/services/agentResultNormalizer.d.ts.map +1 -1
  36. package/dist/services/agentResultNormalizer.js +344 -6
  37. package/dist/services/agentResultNormalizer.js.map +1 -1
  38. package/dist/services/evidence/evidenceContractBuilder.d.ts.map +1 -1
  39. package/dist/services/evidence/evidenceContractBuilder.js +19 -3
  40. package/dist/services/evidence/evidenceContractBuilder.js.map +1 -1
  41. package/dist/services/finalResultQualityGate.d.ts +18 -0
  42. package/dist/services/finalResultQualityGate.d.ts.map +1 -0
  43. package/dist/services/finalResultQualityGate.js +283 -0
  44. package/dist/services/finalResultQualityGate.js.map +1 -0
  45. package/dist/services/htmlReportGenerator.d.ts +1 -1
  46. package/dist/services/htmlReportGenerator.d.ts.map +1 -1
  47. package/dist/services/htmlReportGenerator.js +63 -42
  48. package/dist/services/htmlReportGenerator.js.map +1 -1
  49. package/dist/services/persistAgentSession.d.ts +2 -0
  50. package/dist/services/persistAgentSession.d.ts.map +1 -1
  51. package/dist/services/persistAgentSession.js +12 -1
  52. package/dist/services/persistAgentSession.js.map +1 -1
  53. package/dist/types/dataContract.d.ts +2 -0
  54. package/dist/types/dataContract.d.ts.map +1 -1
  55. package/dist/types/dataContract.js.map +1 -1
  56. package/package.json +3 -2
  57. package/skills/atomic/startup_slow_reasons.skill.yaml +102 -17
  58. package/skills/composite/startup_analysis.skill.yaml +16 -0
  59. package/strategies/prompt-openai-final-report-continuation-en.template.md +12 -0
  60. package/strategies/prompt-openai-final-report-continuation-zh.template.md +12 -0
  61. package/strategies/prompt-output-format.template.md +1 -1
  62. package/strategies/startup.strategy.md +4 -1
@@ -3,6 +3,7 @@ import { type OpenAIProtocol, type ProviderScope } from '../services/providerMan
3
3
  export interface OpenAIAgentConfig {
4
4
  model: string;
5
5
  lightModel: string;
6
+ maxOutputTokens: number;
6
7
  maxTurns: number;
7
8
  quickMaxTurns: number;
8
9
  baseURL?: string;
@@ -27,6 +28,7 @@ export declare function getOpenAIRuntimeDiagnostics(providerId?: string | null,
27
28
  baseUrlConfigured: boolean;
28
29
  configured: boolean;
29
30
  credentialSources: string[];
31
+ maxOutputTokens: number;
30
32
  outputLanguage: {
31
33
  value: OutputLanguage;
32
34
  displayName: string;
@@ -1 +1 @@
1
- {"version":3,"file":"openAiConfig.d.ts","sourceRoot":"","sources":["../../src/agentOpenAI/openAiConfig.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2E,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACzI,OAAO,EAAsB,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAI1G,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,cAAc,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,cAAc,CAAC;CAChC;AAmBD,wBAAgB,eAAe,CAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAC1B,aAAa,CAAC,EAAE,aAAa,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAqBpC;AAED,wBAAgB,gBAAgB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,iBAAiB,CAqB7G;AAED,wBAAgB,oBAAoB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,OAAO,CASvG;AAED,wBAAgB,2BAA2B,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,aAAa,CAAC,EAAE,aAAa;;;;;;;;;;;;;;;;;EA6BpG"}
1
+ {"version":3,"file":"openAiConfig.d.ts","sourceRoot":"","sources":["../../src/agentOpenAI/openAiConfig.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2E,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACzI,OAAO,EAAsB,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAI1G,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,cAAc,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,cAAc,CAAC;CAChC;AAoBD,wBAAgB,eAAe,CAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAC1B,aAAa,CAAC,EAAE,aAAa,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAqBpC;AAED,wBAAgB,gBAAgB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,iBAAiB,CAsB7G;AAED,wBAAgB,oBAAoB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,OAAO,CASvG;AAED,wBAAgB,2BAA2B,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,aAAa,CAAC,EAAE,aAAa;;;;;;;;;;;;;;;;;;EA8BpG"}
@@ -14,6 +14,7 @@ const envCredentialSources_1 = require("../agentRuntime/envCredentialSources");
14
14
  const DEFAULT_MODEL = 'gpt-5.5';
15
15
  const DEFAULT_LIGHT_MODEL = 'gpt-5.4-mini';
16
16
  const DEFAULT_BASE_URL = 'https://api.openai.com/v1';
17
+ const DEFAULT_MAX_OUTPUT_TOKENS = 2048;
17
18
  const DEFAULT_MAX_TURNS = 60;
18
19
  const DEFAULT_QUICK_MAX_TURNS = 10;
19
20
  function parsePositiveIntEnv(env, name, fallback) {
@@ -50,6 +51,7 @@ function loadOpenAIConfig(providerId, providerScope) {
50
51
  return {
51
52
  model: env.OPENAI_MODEL || DEFAULT_MODEL,
52
53
  lightModel: env.OPENAI_LIGHT_MODEL || DEFAULT_LIGHT_MODEL,
54
+ maxOutputTokens: parsePositiveIntEnv(env, 'OPENAI_MAX_OUTPUT_TOKENS', DEFAULT_MAX_OUTPUT_TOKENS),
53
55
  maxTurns: parsePositiveIntEnv(env, 'OPENAI_MAX_TURNS', parsePositiveIntEnv(env, 'CLAUDE_MAX_TURNS', DEFAULT_MAX_TURNS)),
54
56
  quickMaxTurns: parsePositiveIntEnv(env, 'OPENAI_QUICK_MAX_TURNS', parsePositiveIntEnv(env, 'CLAUDE_QUICK_MAX_TURNS', DEFAULT_QUICK_MAX_TURNS)),
55
57
  baseURL: env.OPENAI_BASE_URL || DEFAULT_BASE_URL,
@@ -90,6 +92,7 @@ function getOpenAIRuntimeDiagnostics(providerId, providerScope) {
90
92
  baseUrlConfigured: (0, envCredentialSources_1.hasConcreteEnvValue)(env.OPENAI_BASE_URL),
91
93
  configured: hasOpenAICredentials(providerId, providerScope),
92
94
  credentialSources,
95
+ maxOutputTokens: config.maxOutputTokens,
93
96
  outputLanguage: {
94
97
  value: config.outputLanguage,
95
98
  displayName: (0, outputLanguage_1.outputLanguageDisplayName)(config.outputLanguage),
@@ -1 +1 @@
1
- {"version":3,"file":"openAiConfig.js","sourceRoot":"","sources":["../../src/agentOpenAI/openAiConfig.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openAiConfig.js","sourceRoot":"","sources":["../../src/agentOpenAI/openAiConfig.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,10 @@ declare function readCompletedStreamFinalOutput(stream: {
14
14
  completedByPlanIdle: boolean;
15
15
  timedOut: boolean;
16
16
  }): unknown | undefined;
17
+ declare function selectOpenAiRecoveryAnswer(input: {
18
+ runAnswer: string;
19
+ accumulatedAnswer: string;
20
+ }): string;
17
21
  declare function sanitizeOpenAiConclusionText(conclusion: string, options?: {
18
22
  completedByPlanIdle?: boolean;
19
23
  planComplete?: boolean;
@@ -31,6 +35,7 @@ export declare const __testing: {
31
35
  readCompletedStreamFinalOutput: typeof readCompletedStreamFinalOutput;
32
36
  sanitizeOpenAiConclusionText: typeof sanitizeOpenAiConclusionText;
33
37
  chooseOpenAiConclusionText: typeof chooseOpenAiConclusionText;
38
+ selectOpenAiRecoveryAnswer: typeof selectOpenAiRecoveryAnswer;
34
39
  isRecoverableOpenAIStreamTermination: typeof isRecoverableOpenAIStreamTermination;
35
40
  compactProviderErrorMessage: typeof compactProviderErrorMessage;
36
41
  };
@@ -77,6 +82,9 @@ export declare class OpenAIRuntime extends EventEmitter implements IOrchestrator
77
82
  private classifyModeForRequest;
78
83
  private getPlanCompletionStatus;
79
84
  private shouldFinalizeAfterPlanComplete;
85
+ private shouldRequestFinalReportAfterPlanComplete;
86
+ private buildFinalReportAfterPlanCompletePrompt;
87
+ private formatPlanCompleteReportContinuationMessage;
80
88
  private buildCompletedPlanFallbackConclusion;
81
89
  private buildPlanPhaseSummaryFallbackConclusion;
82
90
  private recoverPartialResultAfterStreamTermination;
@@ -1 +1 @@
1
- {"version":3,"file":"openAiRuntime.d.ts","sourceRoot":"","sources":["../../src/agentOpenAI/openAiRuntime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openAiRuntime.d.ts","sourceRoot":"","sources":["../../src/agentOpenAI/openAiRuntime.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,7 @@ const architectureDetector_1 = require("../agent/detectors/architectureDetector"
18
18
  const enhancedSessionContext_1 = require("../agent/context/enhancedSessionContext");
19
19
  const claudeMcpServer_1 = require("../agentv3/claudeMcpServer");
20
20
  const claudeSystemPrompt_1 = require("../agentv3/claudeSystemPrompt");
21
+ const strategyLoader_1 = require("../agentv3/strategyLoader");
21
22
  const claudeFindingExtractor_1 = require("../agentv3/claudeFindingExtractor");
22
23
  const focusAppDetector_1 = require("../agentv3/focusAppDetector");
23
24
  const sceneClassifier_1 = require("../agentv3/sceneClassifier");
@@ -35,8 +36,10 @@ const toolNarration_1 = require("../agentv3/toolNarration");
35
36
  const openAiConfig_1 = require("./openAiConfig");
36
37
  const mimoReasoningCompat_1 = require("./mimoReasoningCompat");
37
38
  const openAiToolAdapter_1 = require("./openAiToolAdapter");
39
+ const finalResultQualityGate_1 = require("../services/finalResultQualityGate");
38
40
  const OPENAI_SESSION_FRESHNESS_MS = 4 * 60 * 60 * 1000;
39
41
  const OPENAI_MAX_PLAN_CONTINUATIONS = 3;
42
+ const OPENAI_MAX_FINAL_REPORT_CONTINUATIONS = 1;
40
43
  const OPENAI_PLAN_COMPLETE_IDLE_ABORT_MS = 8000;
41
44
  function hasAdequateClosedPhaseSummary(phase) {
42
45
  if (phase.status !== 'completed' && phase.status !== 'skipped')
@@ -173,13 +176,49 @@ function looksLikeProcessNarrationParagraph(paragraph) {
173
176
  if (!compact)
174
177
  return false;
175
178
  return /^(?:我来|我需要|我将|我会|现在|接下来|下一步|首先[,,]?.*提交|调用\s*`?[\w-]+`?|记录关键发现|数据量充足|非常丰富的数据|让我|为了完成|I need\b|I will\b|Now I\b|Next\b|Let me\b)/i.test(compact)
176
- || /阶段状态更新|执行剩余阶段|继续执行剩余阶段|update_plan_phase|submit_plan|resolve_hypothesis|provider 未主动结束 stream|plan 未完成|plan 已完成/i.test(compact);
179
+ || /现在进入\s*Phase|Phase\s*\d+(?:\.\d+)?.*返回|关键概览|阶段状态更新|执行剩余阶段|继续执行剩余阶段|update_plan_phase|submit_plan|resolve_hypothesis|provider 未主动结束 stream|plan 未完成|plan 已完成/i.test(compact);
177
180
  }
178
181
  function hasReportMarkers(text) {
179
182
  return /(^|\n)\s{0,3}#{1,3}\s+\S/.test(text)
180
183
  || /(^|\n)\s{0,3}\*\*[^*\n]{2,80}\*\*/.test(text)
181
184
  || /(^|\n)\s{0,3}\|/.test(text);
182
185
  }
186
+ function normalizeConclusionForComparison(text) {
187
+ return text.trim().replace(/\s+/g, ' ');
188
+ }
189
+ function isSameConclusionText(a, b) {
190
+ const normalizedA = normalizeConclusionForComparison(a || '');
191
+ const normalizedB = normalizeConclusionForComparison(b || '');
192
+ return normalizedA.length > 0 && normalizedA === normalizedB;
193
+ }
194
+ function cleanPlanSummaryForFinalReport(summary) {
195
+ return summary
196
+ .trim()
197
+ .replace(/^(?:完成综合结论输出|完整结构化报告已(?:输出|生成))[。::\s]*/i, '')
198
+ .replace(/^核心发现[::\s]*/i, '')
199
+ .replace(/^所有关键artifact已在Phase\s*\d+(?:\.\d+)?中获取完毕[::。\s]*/i, '')
200
+ .trim();
201
+ }
202
+ function isSubstantialReportText(text) {
203
+ const trimmed = text.trim();
204
+ if (trimmed.length < 200 || !(0, finalResultQualityGate_1.hasDeliverableFinalReportHeading)(trimmed))
205
+ return false;
206
+ if (looksLikeProcessNarrationParagraph(trimmed))
207
+ return false;
208
+ return !looksLikeProcessNarrationParagraph(trimmed.split(/\n{2,}/)[0] || '');
209
+ }
210
+ function isRicherReportCandidate(candidate, baseline) {
211
+ const candidateTrimmed = candidate.trim();
212
+ const baselineTrimmed = baseline.trim();
213
+ if (!isSubstantialReportText(candidateTrimmed))
214
+ return false;
215
+ if (!baselineTrimmed || !isSubstantialReportText(baselineTrimmed))
216
+ return true;
217
+ return candidateTrimmed.length > Math.max(200, baselineTrimmed.length * 1.25);
218
+ }
219
+ function selectOpenAiRecoveryAnswer(input) {
220
+ return input.runAnswer.trim() ? input.runAnswer : input.accumulatedAnswer;
221
+ }
183
222
  function findEmbeddedFinalReportStart(text) {
184
223
  const match = /#{1,3}\s*(?:[\w\u4e00-\u9fff` .::_-]{0,40})?(?:分析报告|综合结论|最终结论|最终报告|Final Report|Analysis Report)(?=\s|$|[::。.!!?\n])/i.exec(text);
185
224
  return match?.index ?? -1;
@@ -216,12 +255,13 @@ function sanitizeOpenAiConclusionText(conclusion, options = {}) {
216
255
  ? paragraphs.slice(firstReportParagraph).join('\n\n').trim()
217
256
  : trimmed;
218
257
  const strippedStillProcess = looksLikeProcessNarrationParagraph(stripped.split(/\n{2,}/)[0] || '');
219
- if (firstReportParagraph > 0 && stripped.length >= 80 && !strippedStillProcess) {
258
+ const strippedHasProcessNarration = looksLikeProcessNarrationParagraph(stripped);
259
+ if (firstReportParagraph > 0 && stripped.length >= 80 && !strippedStillProcess && !strippedHasProcessNarration) {
220
260
  return stripped;
221
261
  }
222
262
  if (fallback &&
223
263
  (options.completedByPlanIdle || options.planComplete) &&
224
- (firstReportParagraph > 0 || strippedStillProcess || !hasReportMarkers(trimmed))) {
264
+ (firstReportParagraph > 0 || strippedStillProcess || strippedHasProcessNarration || !hasReportMarkers(trimmed))) {
225
265
  return fallback;
226
266
  }
227
267
  return trimmed;
@@ -234,14 +274,28 @@ function chooseOpenAiConclusionText(input) {
234
274
  });
235
275
  const fallback = input.fallbackConclusion?.trim();
236
276
  const accumulated = input.accumulatedAnswer.trim();
237
- if (!input.completedByPlanIdle || !accumulated || accumulated === input.candidate.trim()) {
277
+ const selectedIsFallback = fallback ? isSameConclusionText(selected, fallback) : false;
278
+ const selectedNeedsRecovery = selectedIsFallback ||
279
+ (0, finalResultQualityGate_1.looksLikePhaseSummaryFallback)(selected) ||
280
+ !isSubstantialReportText(selected) ||
281
+ looksLikeProcessNarrationParagraph(selected.split(/\n{2,}/)[0] || '');
282
+ const mayRecoverAccumulated = accumulated.length > 0 &&
283
+ !isSameConclusionText(accumulated, input.candidate) &&
284
+ (input.completedByPlanIdle || (input.planComplete && selectedNeedsRecovery));
285
+ if (!mayRecoverAccumulated)
238
286
  return selected;
287
+ const recovered = sanitizeOpenAiConclusionText(accumulated, {
288
+ completedByPlanIdle: input.completedByPlanIdle,
289
+ planComplete: input.planComplete,
290
+ fallbackConclusion: input.fallbackConclusion,
291
+ });
292
+ if (isRicherReportCandidate(recovered, selected)) {
293
+ return recovered;
239
294
  }
240
- const recovered = sanitizeOpenAiConclusionText(accumulated);
241
- if (hasReportMarkers(recovered) && recovered.length > Math.max(200, selected.length * 1.25)) {
295
+ if ((0, finalResultQualityGate_1.hasDeliverableFinalReportHeading)(recovered) && recovered.length > Math.max(200, selected.length * 1.25)) {
242
296
  return recovered;
243
297
  }
244
- if (fallback && selected === fallback && hasReportMarkers(recovered) && recovered.length > selected.length) {
298
+ if (fallback && selectedIsFallback && (0, finalResultQualityGate_1.hasDeliverableFinalReportHeading)(recovered) && recovered.length > selected.length) {
245
299
  return recovered;
246
300
  }
247
301
  return selected;
@@ -251,6 +305,7 @@ exports.__testing = {
251
305
  readCompletedStreamFinalOutput,
252
306
  sanitizeOpenAiConclusionText,
253
307
  chooseOpenAiConclusionText,
308
+ selectOpenAiRecoveryAnswer,
254
309
  isRecoverableOpenAIStreamTermination,
255
310
  compactProviderErrorMessage,
256
311
  };
@@ -392,16 +447,18 @@ class OpenAIRuntime extends events_1.EventEmitter {
392
447
  tools: context.tools,
393
448
  toolUseBehavior: 'run_llm_again',
394
449
  modelSettings: {
450
+ maxTokens: config.maxOutputTokens,
395
451
  parallelToolCalls: false,
396
452
  },
397
453
  });
398
- const controller = new AbortController();
454
+ let activeController;
399
455
  const timeoutMs = (quickMode ? config.quickPathPerTurnMs : config.fullPathPerTurnMs)
400
456
  * (quickMode ? config.quickMaxTurns : config.maxTurns);
457
+ const deadlineAt = Date.now() + timeoutMs;
401
458
  let timedOut = false;
402
459
  const timeout = setTimeout(() => {
403
460
  timedOut = true;
404
- controller.abort();
461
+ activeController?.abort();
405
462
  }, timeoutMs);
406
463
  this.emitUpdate({
407
464
  type: 'progress',
@@ -423,7 +480,32 @@ class OpenAIRuntime extends events_1.EventEmitter {
423
480
  let partial = false;
424
481
  let terminationReason;
425
482
  let terminationMessage;
483
+ let finalReportContinuations = 0;
484
+ const markTimeoutPartial = (planStatus) => {
485
+ partial = true;
486
+ terminationReason = 'timeout';
487
+ terminationMessage = (0, outputLanguage_1.localize)(config.outputLanguage, `OpenAI 分析超过 ${Math.round(timeoutMs / 1000)} 秒超时,结果可能不完整。`, `OpenAI analysis timed out after ${Math.round(timeoutMs / 1000)} seconds; the result may be incomplete.`);
488
+ conclusion = this.withIncompletePlanWarning(conclusion, planStatus, config.outputLanguage);
489
+ this.emitUpdate({
490
+ type: 'degraded',
491
+ content: {
492
+ module: 'openAiRuntime',
493
+ fallback: 'partial_result_after_timeout',
494
+ partial: true,
495
+ terminationReason,
496
+ message: terminationMessage,
497
+ },
498
+ timestamp: Date.now(),
499
+ });
500
+ };
426
501
  for (let continuation = 0;; continuation++) {
502
+ if (timedOut || Date.now() >= deadlineAt) {
503
+ timedOut = true;
504
+ markTimeoutPartial(this.getPlanCompletionStatus(sessionId, quickMode));
505
+ break;
506
+ }
507
+ const controller = new AbortController();
508
+ activeController = controller;
427
509
  let runAnswer = '';
428
510
  let runTurns = 0;
429
511
  let completedByPlanIdle = false;
@@ -485,6 +567,9 @@ class OpenAIRuntime extends events_1.EventEmitter {
485
567
  }
486
568
  finally {
487
569
  clearPlanCompleteIdleTimer();
570
+ if (activeController === controller) {
571
+ activeController = undefined;
572
+ }
488
573
  }
489
574
  rounds += runTurns || stream.currentTurn || 0;
490
575
  const streamFinalOutput = readCompletedStreamFinalOutput(stream, {
@@ -497,13 +582,14 @@ class OpenAIRuntime extends events_1.EventEmitter {
497
582
  : (streamFinalOutput ? JSON.stringify(streamFinalOutput) : runAnswer);
498
583
  const planStatus = this.getPlanCompletionStatus(sessionId, quickMode);
499
584
  const fallbackConclusion = this.buildCompletedPlanFallbackConclusion(sessionId, quickMode, config.outputLanguage);
585
+ const recoveryAnswer = selectOpenAiRecoveryAnswer({ runAnswer, accumulatedAnswer });
500
586
  conclusion = chooseOpenAiConclusionText({
501
587
  candidate: finalOutput ||
502
588
  runAnswer ||
503
589
  accumulatedAnswer ||
504
590
  fallbackConclusion ||
505
591
  '',
506
- accumulatedAnswer,
592
+ accumulatedAnswer: recoveryAnswer,
507
593
  completedByPlanIdle,
508
594
  planComplete: planStatus.complete,
509
595
  fallbackConclusion,
@@ -514,25 +600,43 @@ class OpenAIRuntime extends events_1.EventEmitter {
514
600
  finalRunState = this.safeSerializeRunState(stream.state);
515
601
  }
516
602
  if (timedOut && !completedByPlanIdle) {
517
- partial = true;
518
- terminationReason = 'timeout';
519
- terminationMessage = (0, outputLanguage_1.localize)(config.outputLanguage, `OpenAI 分析超过 ${Math.round(timeoutMs / 1000)} 秒超时,结果可能不完整。`, `OpenAI analysis timed out after ${Math.round(timeoutMs / 1000)} seconds; the result may be incomplete.`);
520
- conclusion = this.withIncompletePlanWarning(conclusion, planStatus, config.outputLanguage);
521
- this.emitUpdate({
522
- type: 'degraded',
523
- content: {
524
- module: 'openAiRuntime',
525
- fallback: 'partial_result_after_timeout',
526
- partial: true,
527
- terminationReason,
528
- message: terminationMessage,
529
- },
530
- timestamp: Date.now(),
531
- });
603
+ markTimeoutPartial(planStatus);
532
604
  break;
533
605
  }
534
- if (planStatus.complete)
606
+ if (planStatus.complete) {
607
+ const streamHistory = Array.isArray(stream.history)
608
+ ? stream.history
609
+ : [];
610
+ if (this.shouldRequestFinalReportAfterPlanComplete({
611
+ quickMode,
612
+ planStatus,
613
+ conclusion,
614
+ fallbackConclusion,
615
+ completedByPlanIdle,
616
+ timedOut,
617
+ finalReportContinuations,
618
+ }) && streamHistory.length > 0) {
619
+ finalReportContinuations++;
620
+ this.emitUpdate({
621
+ type: 'progress',
622
+ content: {
623
+ phase: 'concluding',
624
+ message: this.formatPlanCompleteReportContinuationMessage(config.outputLanguage),
625
+ },
626
+ timestamp: Date.now(),
627
+ });
628
+ currentInput = [
629
+ ...streamHistory,
630
+ {
631
+ role: 'user',
632
+ content: this.buildFinalReportAfterPlanCompletePrompt(config.outputLanguage),
633
+ },
634
+ ];
635
+ currentPreviousResponseId = undefined;
636
+ continue;
637
+ }
535
638
  break;
639
+ }
536
640
  if (continuation >= OPENAI_MAX_PLAN_CONTINUATIONS) {
537
641
  partial = true;
538
642
  terminationReason = 'plan_incomplete';
@@ -572,10 +676,54 @@ class OpenAIRuntime extends events_1.EventEmitter {
572
676
  if (options.codeAwareMode && options.codeAwareMode !== 'off') {
573
677
  conclusion = (0, codeAwareOutputRegistry_1.sanitizeCodeAwareText)(sessionId, conclusion);
574
678
  }
679
+ const finalFallbackConclusion = this.buildCompletedPlanFallbackConclusion(sessionId, quickMode, config.outputLanguage);
680
+ if (finalFallbackConclusion &&
681
+ (isSameConclusionText(conclusion, finalFallbackConclusion) ||
682
+ (0, finalResultQualityGate_1.looksLikePhaseSummaryFallback)(conclusion)) &&
683
+ !partial) {
684
+ partial = true;
685
+ terminationMessage = (0, outputLanguage_1.localize)(config.outputLanguage, 'OpenAI plan 已完成,但 provider 没有输出独立最终报告;已退回到阶段摘要,结果信息密度可能不足。', 'The OpenAI plan completed, but the provider did not produce an independent final report; falling back to phase summaries, which may be less informative.');
686
+ this.emitUpdate({
687
+ type: 'degraded',
688
+ content: {
689
+ module: 'openAiRuntime',
690
+ fallback: 'completed_plan_summary_fallback',
691
+ partial: true,
692
+ message: terminationMessage,
693
+ },
694
+ timestamp: Date.now(),
695
+ });
696
+ }
575
697
  const findings = (0, claudeFindingExtractor_1.extractFindingsFromText)(conclusion);
576
698
  const confidence = partial
577
699
  ? Math.min(0.55, this.estimateConfidence(findings, conclusion))
578
700
  : this.estimateConfidence(findings, conclusion);
701
+ const result = {
702
+ sessionId,
703
+ success: true,
704
+ findings,
705
+ hypotheses: context.hypotheses.map(h => this.toProtocolHypothesis(h)),
706
+ conclusion,
707
+ confidence,
708
+ rounds,
709
+ totalDurationMs: Date.now() - startTime,
710
+ partial: partial || undefined,
711
+ terminationReason,
712
+ terminationMessage,
713
+ };
714
+ const gateIssue = (0, finalResultQualityGate_1.applyFinalResultQualityGate)({ result, query });
715
+ if (gateIssue) {
716
+ this.emitUpdate({
717
+ type: 'degraded',
718
+ content: {
719
+ module: 'openAiRuntime',
720
+ fallback: gateIssue.code,
721
+ partial: true,
722
+ message: gateIssue.message,
723
+ },
724
+ timestamp: Date.now(),
725
+ });
726
+ }
579
727
  this.sessionMap.set(context.sessionMapKey, {
580
728
  history: finalHistory,
581
729
  lastResponseId: finalLastResponseId,
@@ -585,37 +733,23 @@ class OpenAIRuntime extends events_1.EventEmitter {
585
733
  this.recordTurn({
586
734
  query,
587
735
  sessionId,
588
- conclusion,
589
- findings,
590
- confidence,
736
+ result,
591
737
  sessionContext: context.sessionContext,
592
738
  previousTurnCount: context.previousTurns.length,
593
739
  quickMode,
594
740
  });
595
741
  this.emitUpdate({
596
742
  type: 'conclusion',
597
- content: { conclusion, durationMs: Date.now() - startTime, turns: rounds },
743
+ content: { conclusion: result.conclusion, durationMs: Date.now() - startTime, turns: rounds },
598
744
  timestamp: Date.now(),
599
745
  });
600
746
  this.emitUpdate({
601
747
  type: 'answer_token',
602
- content: { done: true, totalChars: conclusion.length },
748
+ content: { done: true, totalChars: result.conclusion.length },
603
749
  timestamp: Date.now(),
604
750
  });
605
751
  await provider.close().catch(() => undefined);
606
- return {
607
- sessionId,
608
- success: true,
609
- findings,
610
- hypotheses: context.hypotheses.map(h => this.toProtocolHypothesis(h)),
611
- conclusion,
612
- confidence,
613
- rounds,
614
- totalDurationMs: Date.now() - startTime,
615
- partial: partial || undefined,
616
- terminationReason,
617
- terminationMessage,
618
- };
752
+ return result;
619
753
  }
620
754
  catch (error) {
621
755
  clearTimeout(timeout);
@@ -1113,6 +1247,42 @@ class OpenAIRuntime extends events_1.EventEmitter {
1113
1247
  fallbackAnswer.trim().length > 0 ||
1114
1248
  this.buildCompletedPlanFallbackConclusion(sessionId, quickMode, outputLanguage_1.DEFAULT_OUTPUT_LANGUAGE) !== undefined;
1115
1249
  }
1250
+ shouldRequestFinalReportAfterPlanComplete(input) {
1251
+ if (input.quickMode ||
1252
+ !input.planStatus.complete ||
1253
+ input.timedOut ||
1254
+ input.finalReportContinuations >= OPENAI_MAX_FINAL_REPORT_CONTINUATIONS) {
1255
+ return false;
1256
+ }
1257
+ const conclusion = input.conclusion.trim();
1258
+ const fallback = input.fallbackConclusion?.trim();
1259
+ if (!fallback)
1260
+ return false;
1261
+ if (!conclusion)
1262
+ return true;
1263
+ if (isSameConclusionText(conclusion, fallback))
1264
+ return true;
1265
+ if ((0, finalResultQualityGate_1.looksLikePhaseSummaryFallback)(conclusion))
1266
+ return true;
1267
+ if (!(0, finalResultQualityGate_1.hasDeliverableFinalReportHeading)(conclusion))
1268
+ return true;
1269
+ if (looksLikeProcessNarrationParagraph(conclusion))
1270
+ return true;
1271
+ return looksLikeProcessNarrationParagraph(conclusion.split(/\n{2,}/)[0] || '');
1272
+ }
1273
+ buildFinalReportAfterPlanCompletePrompt(outputLanguage) {
1274
+ const templateName = outputLanguage === 'en'
1275
+ ? 'prompt-openai-final-report-continuation-en'
1276
+ : 'prompt-openai-final-report-continuation-zh';
1277
+ const template = (0, strategyLoader_1.loadPromptTemplate)(templateName);
1278
+ if (!template) {
1279
+ throw new Error(`Missing OpenAI final-report continuation prompt template: ${templateName}`);
1280
+ }
1281
+ return template;
1282
+ }
1283
+ formatPlanCompleteReportContinuationMessage(outputLanguage) {
1284
+ return (0, outputLanguage_1.localize)(outputLanguage, 'OpenAI plan 已完成,但最终正文仍是阶段摘要,继续请求完整最终报告。', 'The OpenAI plan is complete, but the final body is still a phase summary; requesting the complete final report.');
1285
+ }
1116
1286
  buildCompletedPlanFallbackConclusion(sessionId, quickMode, outputLanguage) {
1117
1287
  if (quickMode)
1118
1288
  return undefined;
@@ -1121,20 +1291,70 @@ class OpenAIRuntime extends events_1.EventEmitter {
1121
1291
  return undefined;
1122
1292
  if (!this.getPlanCompletionStatus(sessionId, quickMode).complete)
1123
1293
  return undefined;
1294
+ const isFinalReportPhase = (phase) => /(综合结论|最终结论|结论|报告|conclusion|final report)/i.test(`${phase.name} ${phase.goal}`);
1124
1295
  const summaries = plan.phases
1125
1296
  .filter(hasAdequateClosedPhaseSummary)
1126
1297
  .map(phase => {
1127
1298
  const name = phase.name || phase.id;
1128
- return `- ${name}: ${phase.summary?.trim()}`;
1299
+ return `- ${name}: ${cleanPlanSummaryForFinalReport(phase.summary || '')}`;
1129
1300
  });
1130
1301
  if (summaries.length === 0)
1131
1302
  return undefined;
1132
1303
  const finalPhase = [...plan.phases]
1133
1304
  .reverse()
1134
1305
  .find(phase => hasAdequateClosedPhaseSummary(phase) &&
1135
- /(综合结论|最终结论|结论|报告|conclusion|final report)/i.test(`${phase.name} ${phase.goal}`));
1136
- const finalSummary = finalPhase?.summary?.trim() || summaries[summaries.length - 1]?.replace(/^-\s*[^:]+:\s*/, '') || '';
1137
- return (0, outputLanguage_1.localize)(outputLanguage, `## 综合结论\n\n${finalSummary}\n\n## 分阶段证据摘要\n\n${summaries.join('\n')}`, `## Final Conclusion\n\n${finalSummary}\n\n## Evidence Summary By Phase\n\n${summaries.join('\n')}`);
1306
+ isFinalReportPhase(phase));
1307
+ const finalSummary = cleanPlanSummaryForFinalReport(finalPhase?.summary?.trim() || summaries[summaries.length - 1]?.replace(/^-\s*[^:]+:\s*/, '') || '');
1308
+ const evidenceBullets = plan.phases
1309
+ .filter(phase => hasAdequateClosedPhaseSummary(phase) && !isFinalReportPhase(phase))
1310
+ .map(phase => {
1311
+ const name = phase.name || phase.id;
1312
+ return `- ${name}: ${cleanPlanSummaryForFinalReport(phase.summary || '')}`;
1313
+ })
1314
+ .filter(line => line.trim().length > 4)
1315
+ .slice(0, 8)
1316
+ .join('\n');
1317
+ return (0, outputLanguage_1.localize)(outputLanguage, [
1318
+ '## 综合结论',
1319
+ '',
1320
+ finalSummary || '分析计划已完成,以下结论基于已采集的结构化证据收敛。',
1321
+ '',
1322
+ '## 关键证据链',
1323
+ '',
1324
+ evidenceBullets || '- 已完成的计划阶段均有结构化证据支撑。',
1325
+ '',
1326
+ '## 根因拆解',
1327
+ '',
1328
+ '- 以上证据按阶段产出、关键指标、已确认假设和已排除因素归并;优化优先级以已验证且可执行的瓶颈为准。',
1329
+ '',
1330
+ '## 优化建议',
1331
+ '',
1332
+ '- 优先处理证据支持的可操作瓶颈;对已排除但风险较高的因素保留必要监控。',
1333
+ '',
1334
+ '## 置信度/限制',
1335
+ '',
1336
+ '- 结论基于已完成计划阶段的结构化证据收敛;若需要代码级 owner 定位,应结合源码符号继续分析。',
1337
+ ].join('\n'), [
1338
+ '## Final Conclusion',
1339
+ '',
1340
+ finalSummary || 'The analysis plan completed; this conclusion is synthesized from the collected structured evidence.',
1341
+ '',
1342
+ '## Key Evidence',
1343
+ '',
1344
+ evidenceBullets || '- Completed plan phases contain structured evidence.',
1345
+ '',
1346
+ '## Root Cause Breakdown',
1347
+ '',
1348
+ '- The evidence is grouped by phase outputs, key metrics, confirmed hypotheses, and excluded factors; optimization priority should follow verified and actionable bottlenecks.',
1349
+ '',
1350
+ '## Recommendations',
1351
+ '',
1352
+ '- Prioritize actionable bottlenecks supported by evidence; keep monitoring excluded factors that still carry residual risk.',
1353
+ '',
1354
+ '## Confidence / Limits',
1355
+ '',
1356
+ '- This conclusion is synthesized from structured evidence collected by the completed plan phases. Use source-code symbol lookup for owner-level fixes.',
1357
+ ].join('\n'));
1138
1358
  }
1139
1359
  buildPlanPhaseSummaryFallbackConclusion(sessionId, quickMode, outputLanguage) {
1140
1360
  if (quickMode)
@@ -1195,9 +1415,19 @@ class OpenAIRuntime extends events_1.EventEmitter {
1195
1415
  this.recordTurn({
1196
1416
  query: params.query,
1197
1417
  sessionId: params.sessionId,
1198
- conclusion,
1199
- findings,
1200
- confidence,
1418
+ result: {
1419
+ sessionId: params.sessionId,
1420
+ success: true,
1421
+ findings,
1422
+ hypotheses: params.context.hypotheses.map(h => this.toProtocolHypothesis(h)),
1423
+ conclusion,
1424
+ confidence,
1425
+ rounds: params.rounds,
1426
+ totalDurationMs: Date.now() - params.startTime,
1427
+ partial: true,
1428
+ terminationReason,
1429
+ terminationMessage,
1430
+ },
1201
1431
  sessionContext: params.context.sessionContext,
1202
1432
  previousTurnCount: params.context.previousTurns.length,
1203
1433
  quickMode: params.quickMode,
@@ -1337,16 +1567,21 @@ class OpenAIRuntime extends events_1.EventEmitter {
1337
1567
  followUpType: input.previousTurnCount > 0 ? 'extend' : 'initial',
1338
1568
  }, {
1339
1569
  agentId: 'openai-agent',
1340
- success: true,
1341
- findings: input.findings,
1342
- confidence: input.confidence,
1343
- message: input.conclusion,
1344
- }, input.findings);
1570
+ success: input.result.success,
1571
+ findings: input.result.findings,
1572
+ confidence: input.result.confidence,
1573
+ message: input.result.conclusion,
1574
+ partial: input.result.partial,
1575
+ terminationReason: input.result.terminationReason,
1576
+ terminationMessage: input.result.terminationMessage,
1577
+ }, input.result.findings);
1578
+ if (input.result.partial === true)
1579
+ return;
1345
1580
  input.sessionContext.updateWorkingMemoryFromConclusion({
1346
1581
  turnIndex: input.previousTurnCount,
1347
1582
  query: input.query,
1348
- conclusion: input.conclusion,
1349
- confidence: input.confidence,
1583
+ conclusion: input.result.conclusion,
1584
+ confidence: input.result.confidence,
1350
1585
  });
1351
1586
  }
1352
1587
  captureEntitiesFromSkillDisplayResults(displayResults, entityStore) {