windows-exe-decompiler-mcp-server 0.1.0 → 0.1.3

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 (134) hide show
  1. package/CLAUDE_INSTALLATION.md +129 -0
  2. package/CODEX_INSTALLATION.md +25 -1
  3. package/COPILOT_INSTALLATION.md +29 -1
  4. package/LICENSE +21 -21
  5. package/README.md +232 -110
  6. package/dist/analysis-provenance.d.ts +50 -2
  7. package/dist/analysis-provenance.js +1 -0
  8. package/dist/analysis-task-runner.js +92 -0
  9. package/dist/config.d.ts +35 -16
  10. package/dist/config.js +37 -3
  11. package/dist/database.js +115 -115
  12. package/dist/decompiler-worker.d.ts +10 -5
  13. package/dist/decompiler-worker.js +240 -58
  14. package/dist/dynamic-trace.d.ts +6 -0
  15. package/dist/dynamic-trace.js +52 -1
  16. package/dist/ghidra-config.js +17 -1
  17. package/dist/index.js +38 -8
  18. package/dist/pe-runtime-functions.d.ts +90 -0
  19. package/dist/pe-runtime-functions.js +452 -0
  20. package/dist/prompts/module-reconstruction-review.d.ts +5 -0
  21. package/dist/prompts/module-reconstruction-review.js +65 -0
  22. package/dist/runtime-correlation.d.ts +5 -0
  23. package/dist/runtime-correlation.js +179 -2
  24. package/dist/sample-workspace.d.ts +28 -0
  25. package/dist/sample-workspace.js +186 -0
  26. package/dist/semantic-name-suggestion-artifacts.d.ts +56 -0
  27. package/dist/semantic-name-suggestion-artifacts.js +87 -0
  28. package/dist/server.js +1 -1
  29. package/dist/setup-guidance.d.ts +73 -0
  30. package/dist/setup-guidance.js +211 -0
  31. package/dist/tools/artifact-read.d.ts +10 -10
  32. package/dist/tools/artifacts-diff.d.ts +8 -8
  33. package/dist/tools/artifacts-list.d.ts +16 -16
  34. package/dist/tools/attack-map.d.ts +8 -8
  35. package/dist/tools/binary-role-profile.d.ts +1197 -0
  36. package/dist/tools/binary-role-profile.js +575 -0
  37. package/dist/tools/code-function-explain-apply.d.ts +12 -12
  38. package/dist/tools/code-function-explain-prepare.d.ts +12 -12
  39. package/dist/tools/code-function-explain-review.d.ts +58 -58
  40. package/dist/tools/code-function-rename-apply.d.ts +12 -12
  41. package/dist/tools/code-function-rename-prepare.d.ts +14 -14
  42. package/dist/tools/code-function-rename-review.d.ts +66 -66
  43. package/dist/tools/code-functions-define.d.ts +337 -0
  44. package/dist/tools/code-functions-define.js +337 -0
  45. package/dist/tools/code-functions-list.js +1 -1
  46. package/dist/tools/code-functions-rank.js +1 -1
  47. package/dist/tools/code-functions-reconstruct.d.ts +368 -58
  48. package/dist/tools/code-functions-reconstruct.js +130 -10
  49. package/dist/tools/code-functions-smart-recover.d.ts +352 -0
  50. package/dist/tools/code-functions-smart-recover.js +190 -0
  51. package/dist/tools/code-module-review-apply.d.ts +233 -0
  52. package/dist/tools/code-module-review-apply.js +209 -0
  53. package/dist/tools/code-module-review-prepare.d.ts +756 -0
  54. package/dist/tools/code-module-review-prepare.js +343 -0
  55. package/dist/tools/code-module-review.d.ts +474 -0
  56. package/dist/tools/code-module-review.js +566 -0
  57. package/dist/tools/code-reconstruct-export.d.ts +193 -21
  58. package/dist/tools/code-reconstruct-export.js +578 -21
  59. package/dist/tools/code-reconstruct-plan.d.ts +20 -20
  60. package/dist/tools/com-role-profile.d.ts +353 -0
  61. package/dist/tools/com-role-profile.js +186 -0
  62. package/dist/tools/dll-export-profile.d.ts +625 -0
  63. package/dist/tools/dll-export-profile.js +230 -0
  64. package/dist/tools/dotnet-metadata-extract.d.ts +122 -122
  65. package/dist/tools/dotnet-reconstruct-export.d.ts +49 -49
  66. package/dist/tools/dotnet-types-list.d.ts +66 -66
  67. package/dist/tools/dynamic-dependencies.d.ts +144 -8
  68. package/dist/tools/dynamic-dependencies.js +20 -1
  69. package/dist/tools/dynamic-memory-import.js +105 -2
  70. package/dist/tools/ghidra-analyze.d.ts +20 -0
  71. package/dist/tools/ghidra-analyze.js +10 -2
  72. package/dist/tools/ghidra-health.d.ts +177 -0
  73. package/dist/tools/ghidra-health.js +28 -0
  74. package/dist/tools/ioc-export.d.ts +8 -8
  75. package/dist/tools/packer-detect.d.ts +14 -14
  76. package/dist/tools/packer-detect.js +6 -9
  77. package/dist/tools/pe-exports-extract.d.ts +8 -8
  78. package/dist/tools/pe-exports-extract.js +6 -9
  79. package/dist/tools/pe-fingerprint.d.ts +36 -36
  80. package/dist/tools/pe-imports-extract.d.ts +8 -8
  81. package/dist/tools/pe-imports-extract.js +6 -9
  82. package/dist/tools/pe-pdata-extract.d.ts +448 -0
  83. package/dist/tools/pe-pdata-extract.js +219 -0
  84. package/dist/tools/pe-symbols-recover.d.ts +227 -0
  85. package/dist/tools/pe-symbols-recover.js +316 -0
  86. package/dist/tools/report-generate.d.ts +15 -1
  87. package/dist/tools/report-generate.js +139 -16
  88. package/dist/tools/report-summarize.d.ts +2242 -8
  89. package/dist/tools/report-summarize.js +246 -10
  90. package/dist/tools/runtime-detect.d.ts +8 -8
  91. package/dist/tools/runtime-detect.js +2 -12
  92. package/dist/tools/rust-binary-analyze.d.ts +2047 -0
  93. package/dist/tools/rust-binary-analyze.js +443 -0
  94. package/dist/tools/sample-profile-get.d.ts +135 -16
  95. package/dist/tools/sample-profile-get.js +35 -32
  96. package/dist/tools/sandbox-execute.d.ts +10 -10
  97. package/dist/tools/strings-extract.d.ts +8 -8
  98. package/dist/tools/strings-extract.js +2 -12
  99. package/dist/tools/strings-floss-decode.d.ts +8 -8
  100. package/dist/tools/system-health.d.ts +172 -36
  101. package/dist/tools/system-health.js +14 -0
  102. package/dist/tools/system-setup-guide.d.ts +179 -0
  103. package/dist/tools/system-setup-guide.js +62 -0
  104. package/dist/tools/tool-help.d.ts +16 -16
  105. package/dist/tools/tool-help.js +172 -0
  106. package/dist/tools/yara-scan.d.ts +8 -8
  107. package/dist/types.d.ts +2 -0
  108. package/dist/workflows/function-explanation-review.d.ts +3034 -76
  109. package/dist/workflows/function-explanation-review.js +172 -42
  110. package/dist/workflows/function-index-recover.d.ts +333 -0
  111. package/dist/workflows/function-index-recover.js +291 -0
  112. package/dist/workflows/module-reconstruction-review.d.ts +3537 -0
  113. package/dist/workflows/module-reconstruction-review.js +354 -0
  114. package/dist/workflows/reconstruct.d.ts +2182 -223
  115. package/dist/workflows/reconstruct.js +575 -32
  116. package/dist/workflows/semantic-name-review.d.ts +1436 -85
  117. package/dist/workflows/semantic-name-review.js +150 -58
  118. package/dist/workflows/triage.d.ts +8 -8
  119. package/ghidra_scripts/DecompileFunction.java +487 -487
  120. package/ghidra_scripts/ExtractCFG.java +256 -256
  121. package/ghidra_scripts/ExtractFunctions.java +442 -442
  122. package/ghidra_scripts/README.md +112 -112
  123. package/ghidra_scripts/SearchFunctionReferences.java +380 -380
  124. package/helpers/DotNetMetadataProbe/DotNetMetadataProbe.csproj +9 -9
  125. package/helpers/DotNetMetadataProbe/Program.cs +566 -566
  126. package/install-to-claude.ps1 +432 -0
  127. package/install-to-codex.ps1 +256 -178
  128. package/install-to-copilot.ps1 +389 -303
  129. package/package.json +4 -2
  130. package/requirements.txt +9 -9
  131. package/workers/requirements-dynamic.txt +11 -11
  132. package/workers/requirements.txt +8 -8
  133. package/workers/speakeasy_compat.py +175 -175
  134. package/workers/static_worker.py +3474 -3474
@@ -7,6 +7,8 @@ import { createCodeFunctionRenameReviewHandler } from '../tools/code-function-re
7
7
  import { createReconstructWorkflowHandler } from './reconstruct.js';
8
8
  import { AnalysisProvenanceSchema } from '../analysis-provenance.js';
9
9
  import { AnalysisSelectionDiffSchema } from '../selection-diff.js';
10
+ import { BinaryRoleProfileDataSchema } from '../tools/binary-role-profile.js';
11
+ import { RequiredUserInputSchema, SetupActionSchema, collectSetupGuidanceFromWorkerResult, mergeRequiredUserInputs, mergeSetupActions, } from '../setup-guidance.js';
10
12
  const TOOL_NAME = 'workflow.semantic_name_review';
11
13
  export const semanticNameReviewWorkflowInputSchema = z
12
14
  .object({
@@ -157,6 +159,14 @@ export const semanticNameReviewWorkflowInputSchema = z
157
159
  .max(64)
158
160
  .optional()
159
161
  .describe('Optional export folder name used for the refresh run'),
162
+ include_preflight: z
163
+ .boolean()
164
+ .default(true)
165
+ .describe('Run binary role and language-specific preflight profiling before refresh export'),
166
+ auto_recover_function_index: z
167
+ .boolean()
168
+ .default(true)
169
+ .describe('When native function-index coverage is missing, automatically recover it before refresh export'),
160
170
  include_plan: z
161
171
  .boolean()
162
172
  .default(false)
@@ -225,70 +235,88 @@ export const semanticNameReviewWorkflowInputSchema = z
225
235
  export const semanticNameReviewWorkflowOutputSchema = z.object({
226
236
  ok: z.boolean(),
227
237
  data: z
228
- .object({
229
- sample_id: z.string(),
230
- review: z.object({
231
- review_status: z.string(),
232
- prompt_name: z.string(),
233
- client: z.object({
234
- name: z.string().nullable(),
235
- version: z.string().nullable(),
236
- sampling_available: z.boolean(),
237
- }),
238
- prepare: z.object({
239
- prepared_count: z.number().int().nonnegative(),
240
- unresolved_count: z.number().int().nonnegative(),
241
- include_resolved: z.boolean(),
242
- artifact_id: z.string().nullable(),
243
- }),
244
- sampling: z.object({
245
- attempted: z.boolean(),
246
- model: z.string().nullable(),
247
- stop_reason: z.string().nullable(),
248
- parsed_suggestion_count: z.number().int().nonnegative(),
249
- }),
250
- apply: z.object({
251
- attempted: z.boolean(),
252
- accepted_count: z.number().int().nonnegative(),
253
- rejected_count: z.number().int().nonnegative(),
254
- artifact_id: z.string().nullable(),
255
- }),
256
- confidence_policy: z.object({
257
- calibrated: z.boolean(),
258
- rule_priority_over_llm: z.boolean(),
259
- llm_acceptance_threshold: z.number().min(0).max(1),
260
- meaning: z.string(),
238
+ .union([
239
+ z.object({
240
+ job_id: z.string(),
241
+ status: z.literal('queued'),
242
+ tool: z.literal(TOOL_NAME),
243
+ sample_id: z.string(),
244
+ progress: z.number().int().min(0).max(100),
245
+ }),
246
+ z.object({
247
+ sample_id: z.string(),
248
+ review: z.object({
249
+ review_status: z.string(),
250
+ prompt_name: z.string(),
251
+ client: z.object({
252
+ name: z.string().nullable(),
253
+ version: z.string().nullable(),
254
+ sampling_available: z.boolean(),
255
+ }),
256
+ prepare: z.object({
257
+ prepared_count: z.number().int().nonnegative(),
258
+ unresolved_count: z.number().int().nonnegative(),
259
+ include_resolved: z.boolean(),
260
+ artifact_id: z.string().nullable(),
261
+ }),
262
+ sampling: z.object({
263
+ attempted: z.boolean(),
264
+ model: z.string().nullable(),
265
+ stop_reason: z.string().nullable(),
266
+ parsed_suggestion_count: z.number().int().nonnegative(),
267
+ }),
268
+ apply: z.object({
269
+ attempted: z.boolean(),
270
+ accepted_count: z.number().int().nonnegative(),
271
+ rejected_count: z.number().int().nonnegative(),
272
+ artifact_id: z.string().nullable(),
273
+ }),
274
+ confidence_policy: z.object({
275
+ calibrated: z.boolean(),
276
+ rule_priority_over_llm: z.boolean(),
277
+ llm_acceptance_threshold: z.number().min(0).max(1),
278
+ meaning: z.string(),
279
+ }),
280
+ reconstruct: z.object({
281
+ attempted: z.boolean(),
282
+ reconstructed_count: z.number().int().nonnegative(),
283
+ llm_or_hybrid_count: z.number().int().nonnegative(),
284
+ functions: z.array(z.object({
285
+ function: z.string(),
286
+ address: z.string(),
287
+ validated_name: z.string().nullable(),
288
+ resolution_source: z.string().nullable(),
289
+ })),
290
+ }),
261
291
  }),
262
- reconstruct: z.object({
292
+ export: z.object({
263
293
  attempted: z.boolean(),
264
- reconstructed_count: z.number().int().nonnegative(),
265
- llm_or_hybrid_count: z.number().int().nonnegative(),
266
- functions: z.array(z.object({
267
- function: z.string(),
268
- address: z.string(),
269
- validated_name: z.string().nullable(),
270
- resolution_source: z.string().nullable(),
271
- })),
294
+ status: z.enum(['completed', 'failed', 'skipped']),
295
+ selected_path: z.enum(['native', 'dotnet']).nullable(),
296
+ export_tool: z.string().nullable(),
297
+ export_root: z.string().nullable(),
298
+ manifest_path: z.string().nullable(),
299
+ build_validation_status: z.string().nullable(),
300
+ harness_validation_status: z.string().nullable(),
301
+ preflight: z
302
+ .object({
303
+ binary_profile: BinaryRoleProfileDataSchema.nullable(),
304
+ rust_profile: z.any().nullable(),
305
+ function_index_recovery: z.any().nullable(),
306
+ })
307
+ .nullable(),
308
+ provenance: AnalysisProvenanceSchema.nullable(),
309
+ selection_diffs: AnalysisSelectionDiffSchema.nullable(),
310
+ notes: z.array(z.string()),
272
311
  }),
312
+ next_steps: z.array(z.string()),
273
313
  }),
274
- export: z.object({
275
- attempted: z.boolean(),
276
- status: z.enum(['completed', 'failed', 'skipped']),
277
- selected_path: z.enum(['native', 'dotnet']).nullable(),
278
- export_tool: z.string().nullable(),
279
- export_root: z.string().nullable(),
280
- manifest_path: z.string().nullable(),
281
- build_validation_status: z.string().nullable(),
282
- harness_validation_status: z.string().nullable(),
283
- provenance: AnalysisProvenanceSchema.nullable(),
284
- selection_diffs: AnalysisSelectionDiffSchema.nullable(),
285
- notes: z.array(z.string()),
286
- }),
287
- next_steps: z.array(z.string()),
288
- })
314
+ ])
289
315
  .optional(),
290
316
  warnings: z.array(z.string()).optional(),
291
317
  errors: z.array(z.string()).optional(),
318
+ setup_actions: z.array(SetupActionSchema).optional(),
319
+ required_user_inputs: z.array(RequiredUserInputSchema).optional(),
292
320
  artifacts: z.array(z.any()).optional(),
293
321
  metrics: z
294
322
  .object({
@@ -303,7 +331,7 @@ export const semanticNameReviewWorkflowToolDefinition = {
303
331
  inputSchema: semanticNameReviewWorkflowInputSchema,
304
332
  outputSchema: semanticNameReviewWorkflowOutputSchema,
305
333
  };
306
- export function createSemanticNameReviewWorkflowHandler(workspaceManager, database, cacheManager, mcpServer, dependencies) {
334
+ export function createSemanticNameReviewWorkflowHandler(workspaceManager, database, cacheManager, mcpServer, dependencies, jobQueue) {
307
335
  const renameReviewHandler = dependencies?.renameReviewHandler ||
308
336
  createCodeFunctionRenameReviewHandler(workspaceManager, database, cacheManager, mcpServer);
309
337
  const reconstructWorkflowHandler = dependencies?.reconstructWorkflowHandler ||
@@ -313,8 +341,51 @@ export function createSemanticNameReviewWorkflowHandler(workspaceManager, databa
313
341
  const warnings = [];
314
342
  const errors = [];
315
343
  const artifacts = [];
344
+ let setupActions = [];
345
+ let requiredUserInputs = [];
316
346
  try {
317
347
  const input = semanticNameReviewWorkflowInputSchema.parse(args);
348
+ const sample = database.findSample(input.sample_id);
349
+ if (!sample) {
350
+ return {
351
+ ok: false,
352
+ errors: [`Sample not found: ${input.sample_id}`],
353
+ metrics: {
354
+ elapsed_ms: Date.now() - startTime,
355
+ tool: TOOL_NAME,
356
+ },
357
+ };
358
+ }
359
+ if (jobQueue) {
360
+ const jobTimeoutMs = Math.max(input.build_timeout_ms + input.run_timeout_ms + 45 * 60 * 1000, 60 * 60 * 1000);
361
+ const jobId = jobQueue.enqueue({
362
+ type: 'static',
363
+ tool: TOOL_NAME,
364
+ sampleId: input.sample_id,
365
+ args: input,
366
+ priority: 5,
367
+ timeout: jobTimeoutMs,
368
+ retryPolicy: {
369
+ maxRetries: 1,
370
+ backoffMs: 5000,
371
+ retryableErrors: ['E_TIMEOUT', 'E_RESOURCE_EXHAUSTED'],
372
+ },
373
+ });
374
+ return {
375
+ ok: true,
376
+ data: {
377
+ job_id: jobId,
378
+ status: 'queued',
379
+ tool: TOOL_NAME,
380
+ sample_id: input.sample_id,
381
+ progress: 0,
382
+ },
383
+ metrics: {
384
+ elapsed_ms: Date.now() - startTime,
385
+ tool: TOOL_NAME,
386
+ },
387
+ };
388
+ }
318
389
  const reviewResult = await renameReviewHandler({
319
390
  sample_id: input.sample_id,
320
391
  address: input.address,
@@ -343,11 +414,18 @@ export function createSemanticNameReviewWorkflowHandler(workspaceManager, databa
343
414
  });
344
415
  warnings.push(...(reviewResult.warnings || []));
345
416
  artifacts.push(...(reviewResult.artifacts || []));
417
+ {
418
+ const setupGuidance = collectSetupGuidanceFromWorkerResult(reviewResult);
419
+ setupActions = mergeSetupActions(setupActions, setupGuidance.setupActions);
420
+ requiredUserInputs = mergeRequiredUserInputs(requiredUserInputs, setupGuidance.requiredUserInputs);
421
+ }
346
422
  if (!reviewResult.ok) {
347
423
  return {
348
424
  ok: false,
349
425
  errors: reviewResult.errors || ['code.function.rename.review failed'],
350
426
  warnings: warnings.length > 0 ? warnings : undefined,
427
+ setup_actions: setupActions.length > 0 ? setupActions : undefined,
428
+ required_user_inputs: requiredUserInputs.length > 0 ? requiredUserInputs : undefined,
351
429
  artifacts: artifacts.length > 0 ? artifacts : undefined,
352
430
  metrics: {
353
431
  elapsed_ms: Date.now() - startTime,
@@ -370,6 +448,7 @@ export function createSemanticNameReviewWorkflowHandler(workspaceManager, databa
370
448
  manifest_path: null,
371
449
  build_validation_status: null,
372
450
  harness_validation_status: null,
451
+ preflight: null,
373
452
  provenance: null,
374
453
  selection_diffs: null,
375
454
  notes: [],
@@ -393,6 +472,8 @@ export function createSemanticNameReviewWorkflowHandler(workspaceManager, databa
393
472
  semantic_session_tag: input.semantic_session_tag || input.session_tag,
394
473
  compare_semantic_scope: input.compare_semantic_scope,
395
474
  compare_semantic_session_tag: input.compare_semantic_session_tag,
475
+ include_preflight: input.include_preflight,
476
+ auto_recover_function_index: input.auto_recover_function_index,
396
477
  include_plan: input.include_plan,
397
478
  include_obfuscation_fallback: input.include_obfuscation_fallback,
398
479
  fallback_on_error: input.fallback_on_error,
@@ -401,6 +482,11 @@ export function createSemanticNameReviewWorkflowHandler(workspaceManager, databa
401
482
  });
402
483
  warnings.push(...(exportResult.warnings || []));
403
484
  artifacts.push(...(exportResult.artifacts || []));
485
+ {
486
+ const setupGuidance = collectSetupGuidanceFromWorkerResult(exportResult);
487
+ setupActions = mergeSetupActions(setupActions, setupGuidance.setupActions);
488
+ requiredUserInputs = mergeRequiredUserInputs(requiredUserInputs, setupGuidance.requiredUserInputs);
489
+ }
404
490
  if (!exportResult.ok) {
405
491
  errors.push(...(exportResult.errors || ['workflow.reconstruct failed during export refresh']));
406
492
  exportSummary = {
@@ -412,6 +498,7 @@ export function createSemanticNameReviewWorkflowHandler(workspaceManager, databa
412
498
  manifest_path: null,
413
499
  build_validation_status: null,
414
500
  harness_validation_status: null,
501
+ preflight: null,
415
502
  provenance: null,
416
503
  selection_diffs: null,
417
504
  notes: ['Refresh export failed after semantic name apply.'],
@@ -428,6 +515,7 @@ export function createSemanticNameReviewWorkflowHandler(workspaceManager, databa
428
515
  manifest_path: exportData.export?.manifest_path || null,
429
516
  build_validation_status: exportData.export?.build_validation_status || null,
430
517
  harness_validation_status: exportData.export?.harness_validation_status || null,
518
+ preflight: exportData.preflight || null,
431
519
  provenance: exportData.provenance || null,
432
520
  selection_diffs: exportData.selection_diffs || null,
433
521
  notes: Array.isArray(exportData.notes) ? exportData.notes : [],
@@ -499,6 +587,8 @@ export function createSemanticNameReviewWorkflowHandler(workspaceManager, databa
499
587
  },
500
588
  warnings: warnings.length > 0 ? warnings : undefined,
501
589
  errors: errors.length > 0 ? errors : undefined,
590
+ setup_actions: setupActions.length > 0 ? setupActions : undefined,
591
+ required_user_inputs: requiredUserInputs.length > 0 ? requiredUserInputs : undefined,
502
592
  artifacts: artifacts.length > 0 ? artifacts : undefined,
503
593
  metrics: {
504
594
  elapsed_ms: Date.now() - startTime,
@@ -510,6 +600,8 @@ export function createSemanticNameReviewWorkflowHandler(workspaceManager, databa
510
600
  return {
511
601
  ok: false,
512
602
  errors: [error instanceof Error ? error.message : String(error)],
603
+ setup_actions: setupActions.length > 0 ? setupActions : undefined,
604
+ required_user_inputs: requiredUserInputs.length > 0 ? requiredUserInputs : undefined,
513
605
  metrics: {
514
606
  elapsed_ms: Date.now() - startTime,
515
607
  tool: TOOL_NAME,
@@ -446,10 +446,6 @@ export declare const TriageWorkflowOutputSchema: z.ZodObject<{
446
446
  }>>;
447
447
  }, "strip", z.ZodTypeAny, {
448
448
  ok: boolean;
449
- metrics?: {
450
- elapsed_ms: number;
451
- tool: string;
452
- } | undefined;
453
449
  data?: {
454
450
  summary: string;
455
451
  confidence: number;
@@ -519,14 +515,14 @@ export declare const TriageWorkflowOutputSchema: z.ZodObject<{
519
515
  } | undefined;
520
516
  } | undefined;
521
517
  } | undefined;
522
- warnings?: string[] | undefined;
523
- errors?: string[] | undefined;
524
- }, {
525
- ok: boolean;
526
518
  metrics?: {
527
519
  elapsed_ms: number;
528
520
  tool: string;
529
521
  } | undefined;
522
+ warnings?: string[] | undefined;
523
+ errors?: string[] | undefined;
524
+ }, {
525
+ ok: boolean;
530
526
  data?: {
531
527
  summary: string;
532
528
  confidence: number;
@@ -596,6 +592,10 @@ export declare const TriageWorkflowOutputSchema: z.ZodObject<{
596
592
  } | undefined;
597
593
  } | undefined;
598
594
  } | undefined;
595
+ metrics?: {
596
+ elapsed_ms: number;
597
+ tool: string;
598
+ } | undefined;
599
599
  warnings?: string[] | undefined;
600
600
  errors?: string[] | undefined;
601
601
  }>;