@gracker/smartperfetto 1.0.16 → 1.0.18

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 (65) 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/services/renderingPipelineDetectionSkillGenerator.d.ts.map +1 -1
  54. package/dist/services/renderingPipelineDetectionSkillGenerator.js +149 -81
  55. package/dist/services/renderingPipelineDetectionSkillGenerator.js.map +1 -1
  56. package/dist/types/dataContract.d.ts +2 -0
  57. package/dist/types/dataContract.d.ts.map +1 -1
  58. package/dist/types/dataContract.js.map +1 -1
  59. package/package.json +3 -2
  60. package/skills/atomic/startup_slow_reasons.skill.yaml +102 -17
  61. package/skills/composite/startup_analysis.skill.yaml +16 -0
  62. package/strategies/prompt-openai-final-report-continuation-en.template.md +12 -0
  63. package/strategies/prompt-openai-final-report-continuation-zh.template.md +12 -0
  64. package/strategies/prompt-output-format.template.md +1 -1
  65. package/strategies/startup.strategy.md +4 -1
@@ -61,6 +61,13 @@ export interface ConclusionContractMetadata {
61
61
  rounds?: number;
62
62
  clusterPolicy?: ConclusionContractClusterPolicy;
63
63
  sceneId?: string;
64
+ /**
65
+ * Claims were derived by matching the final narrative against captured
66
+ * DataEnvelope cells, not emitted explicitly by the model.
67
+ */
68
+ derivedFromNarrativeEvidenceMatch?: boolean;
69
+ claimDerivation?: 'explicit_model_contract' | 'narrative_evidence_match';
70
+ claimVerificationScope?: 'explicit_claims' | 'sampled_narrative_evidence';
64
71
  }
65
72
  export interface ConclusionContract {
66
73
  schemaVersion: 'conclusion_contract_v1';
@@ -1 +1 @@
1
- {"version":3,"file":"conclusionContract.d.ts","sourceRoot":"","sources":["../../../src/agent/core/conclusionContract.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,YAAY,CAAC;AACtF,MAAM,MAAM,2BAA2B,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;AAC3E,MAAM,MAAM,8BAA8B,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AACrE,MAAM,MAAM,mBAAmB,GAC3B,SAAS,GACT,aAAa,GACb,YAAY,GACZ,UAAU,GACV,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,gBAAgB,CAAC;AACrB,MAAM,MAAM,2BAA2B,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,aAAa,CAAC;AAE/F,MAAM,WAAW,gCAAgC;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,+BAA+B;IAC9C,UAAU,EAAE,2BAA2B,CAAC;IACxC,aAAa,EAAE,8BAA8B,CAAC;IAC9C,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,8BAA8B;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gCAAgC;IAC/C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B,UAAU,EAAE,gCAAgC,EAAE,CAAC;IAC/C,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IACvG,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,2BAA2B,CAAC;CAC5C;AAED,MAAM,WAAW,0BAA0B;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,+BAA+B,CAAC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,wBAAwB,CAAC;IACxC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,WAAW,EAAE,gCAAgC,EAAE,CAAC;IAChD,QAAQ,EAAE,6BAA6B,EAAE,CAAC;IAC1C,aAAa,EAAE,8BAA8B,EAAE,CAAC;IAChD,MAAM,CAAC,EAAE,2BAA2B,EAAE,CAAC;IACvC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,0BAA0B,CAAC;CACvC"}
1
+ {"version":3,"file":"conclusionContract.d.ts","sourceRoot":"","sources":["../../../src/agent/core/conclusionContract.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"conclusionGenerator.d.ts","sourceRoot":"","sources":["../../../src/agent/core/conclusionGenerator.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,KAAK,EAKV,kBAAkB,EAQlB,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAsB9B,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAo6FD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,IAAI,CAAC,EAAE,oBAAoB,CAAC;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CACb,GACL,kBAAkB,GAAG,IAAI,CAwC3B;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,GAAE;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/C,MAAM,CAIR;AA2ED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,kBAAkB,EACjC,WAAW,EAAE,OAAO,EAAE,EACtB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,eAAe,EACxB,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,MAAM,CAAC,CAqSjB;AAqED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CA+BzF;AAkkBD,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAmBrE;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAsBjE"}
1
+ {"version":3,"file":"conclusionGenerator.d.ts","sourceRoot":"","sources":["../../../src/agent/core/conclusionGenerator.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,KAAK,EAKV,kBAAkB,EAQlB,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAsB9B,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA+hGD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,IAAI,CAAC,EAAE,oBAAoB,CAAC;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CACb,GACL,kBAAkB,GAAG,IAAI,CAwC3B;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,GAAE;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/C,MAAM,CAIR;AA2ED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,kBAAkB,EACjC,WAAW,EAAE,OAAO,EAAE,EACtB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,eAAe,EACxB,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,MAAM,CAAC,CAqSjB;AAqED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CA+BzF;AAkkBD,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAmBrE;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAsBjE"}
@@ -1710,7 +1710,7 @@ function parseClaimRowSelector(value) {
1710
1710
  }
1711
1711
  else {
1712
1712
  const parsed = {};
1713
- for (const part of text.split(/[,,]/)) {
1713
+ for (const part of text.split(/\s+(?:AND|and)\s+|[,,]/)) {
1714
1714
  const match = part.trim().match(/^([^=::]+)\s*(?:=|:|:)\s*(.+)$/);
1715
1715
  if (!match)
1716
1716
  continue;
@@ -1735,7 +1735,64 @@ function parseClaimRowSelector(value) {
1735
1735
  }
1736
1736
  return Object.keys(selector).length > 0 ? selector : undefined;
1737
1737
  }
1738
- function parseClaimReferenceFromRecord(record) {
1738
+ function splitClaimList(value) {
1739
+ if (value === undefined || value === null)
1740
+ return [];
1741
+ return String(value)
1742
+ .split(/[,,]/)
1743
+ .map(item => item.trim())
1744
+ .filter(Boolean);
1745
+ }
1746
+ function parseClaimRowIndices(value) {
1747
+ if (value === undefined || value === null || value === '')
1748
+ return [];
1749
+ if (typeof value === 'number' && Number.isInteger(value) && value >= 0)
1750
+ return [value];
1751
+ const text = String(value).trim();
1752
+ const range = text.match(/^(\d+)\s*(?:-|\.\.|~|至|到)\s*(\d+)$/);
1753
+ if (range) {
1754
+ const start = Number(range[1]);
1755
+ const end = Number(range[2]);
1756
+ if (Number.isInteger(start) && Number.isInteger(end) && start >= 0 && end >= start && end - start <= 50) {
1757
+ return Array.from({ length: end - start + 1 }, (_, index) => start + index);
1758
+ }
1759
+ }
1760
+ const parsed = parseNumberFromUnknown(value);
1761
+ return parsed !== undefined && Number.isInteger(parsed) && parsed >= 0 ? [parsed] : [];
1762
+ }
1763
+ function parseClaimTupleValues(rawValue, rowCount, columnCount) {
1764
+ if (rawValue === undefined)
1765
+ return [];
1766
+ if (rowCount > 1) {
1767
+ const rowGroups = splitClaimList(rawValue);
1768
+ if (rowGroups.length === rowCount) {
1769
+ return rowGroups.map(group => {
1770
+ const slashParts = String(group)
1771
+ .split('/')
1772
+ .map(item => item.trim())
1773
+ .filter(Boolean);
1774
+ if (columnCount > 1 && slashParts.length === columnCount) {
1775
+ return slashParts.map(parseClaimScalar);
1776
+ }
1777
+ return [parseClaimScalar(group)];
1778
+ });
1779
+ }
1780
+ }
1781
+ if (columnCount > 1) {
1782
+ const values = splitClaimList(rawValue);
1783
+ if (values.length >= columnCount) {
1784
+ const normalizedValues = values.length === columnCount
1785
+ ? values
1786
+ : [
1787
+ ...values.slice(0, columnCount - 1),
1788
+ values.slice(columnCount - 1).join(', '),
1789
+ ];
1790
+ return [normalizedValues.map(parseClaimScalar)];
1791
+ }
1792
+ }
1793
+ return [[parseClaimScalar(rawValue)]];
1794
+ }
1795
+ function parseClaimReferencesFromRecord(record) {
1739
1796
  const evidenceRefId = String(readValueFromAliases(record, [
1740
1797
  'evidenceRefId', 'evidence_ref_id', 'evidenceId', 'evidence_id',
1741
1798
  ]) || '').trim();
@@ -1746,25 +1803,40 @@ function parseClaimReferenceFromRecord(record) {
1746
1803
  'sourceToolCallId', 'source_tool_call_id', 'toolCallId', 'tool_call_id',
1747
1804
  ]) || '').trim();
1748
1805
  const rowIndexRaw = readValueFromAliases(record, ['rowIndex', 'row_index']);
1749
- const rowIndex = parseNumberFromUnknown(rowIndexRaw);
1806
+ const rowIndices = parseClaimRowIndices(rowIndexRaw);
1750
1807
  const rowSelector = parseClaimRowSelector(readValueFromAliases(record, ['rowSelector', 'row_selector']));
1751
- const column = String(readValueFromAliases(record, ['column', 'col']) || '').trim();
1752
- const value = parseClaimScalar(readValueFromAliases(record, ['value']));
1808
+ const columnRaw = readValueFromAliases(record, ['column', 'col']);
1809
+ const columns = splitClaimList(columnRaw);
1810
+ const rawValue = readValueFromAliases(record, ['value']);
1753
1811
  const artifactId = String(readValueFromAliases(record, ['artifactId', 'artifact_id']) || '').trim();
1754
1812
  const sourceArtifactId = String(readValueFromAliases(record, ['sourceArtifactId', 'source_artifact_id']) || '').trim();
1755
1813
  if (!evidenceRefId && !sourceRef && !sourceToolCallId && !artifactId && !sourceArtifactId)
1756
- return null;
1757
- return {
1814
+ return [];
1815
+ const base = {
1758
1816
  ...(evidenceRefId ? { evidenceRefId } : {}),
1759
- ...(rowIndex !== undefined ? { rowIndex } : {}),
1760
- ...(rowSelector ? { rowSelector } : {}),
1761
- ...(column ? { column } : {}),
1762
- ...(value !== undefined ? { value } : {}),
1763
1817
  ...(sourceRef ? { sourceRef } : {}),
1764
1818
  ...(sourceToolCallId ? { sourceToolCallId } : {}),
1765
1819
  ...(artifactId ? { artifactId } : {}),
1766
1820
  ...(sourceArtifactId ? { sourceArtifactId } : {}),
1767
1821
  };
1822
+ const rowTargets = rowIndices.length > 0 ? rowIndices : [undefined];
1823
+ const columnTargets = columns.length > 0 ? columns : [undefined];
1824
+ const tupleValues = parseClaimTupleValues(rawValue, rowTargets.length, columnTargets.length);
1825
+ const refs = [];
1826
+ rowTargets.forEach((rowIndex, rowOffset) => {
1827
+ columnTargets.forEach((column, columnOffset) => {
1828
+ const value = tupleValues[rowOffset]?.[columnOffset]
1829
+ ?? (rowTargets.length === 1 ? tupleValues[0]?.[columnOffset] : undefined);
1830
+ refs.push({
1831
+ ...base,
1832
+ ...(rowIndex !== undefined ? { rowIndex } : {}),
1833
+ ...(rowSelector ? { rowSelector } : {}),
1834
+ ...(column ? { column } : {}),
1835
+ ...(value !== undefined ? { value: value } : {}),
1836
+ });
1837
+ });
1838
+ });
1839
+ return refs;
1768
1840
  }
1769
1841
  function parseClaimKind(value) {
1770
1842
  const normalized = String(value || '').trim();
@@ -1838,8 +1910,7 @@ function parseClaimItemsFromUnknown(value) {
1838
1910
  ? referencesSource
1839
1911
  .map(ref => toRecord(ref))
1840
1912
  .filter((ref) => Boolean(ref))
1841
- .map(ref => parseClaimReferenceFromRecord(ref))
1842
- .filter((ref) => Boolean(ref))
1913
+ .flatMap(ref => parseClaimReferencesFromRecord(ref))
1843
1914
  : [];
1844
1915
  const artifactRefs = parseClaimArtifactRefs(readValueFromAliases(record, ['artifactRefs', 'artifact_refs']));
1845
1916
  if (references.length === 0 && (!artifactRefs || artifactRefs.length === 0))
@@ -1885,15 +1956,57 @@ function formatClaimReferenceMarkdown(ref) {
1885
1956
  parts.push(`value=${String(ref.value)}`);
1886
1957
  return parts.join('; ');
1887
1958
  }
1888
- function parseClaimReferenceFromMarkdownLine(line) {
1889
- const record = {};
1959
+ function parseClaimReferencesFromMarkdownLine(line) {
1960
+ const identifierKeys = new Set([
1961
+ 'evidence_ref_id',
1962
+ 'evidenceRefId',
1963
+ 'evidence_id',
1964
+ 'evidenceId',
1965
+ 'source_ref',
1966
+ 'sourceRef',
1967
+ 'ref',
1968
+ 'source_tool_call_id',
1969
+ 'sourceToolCallId',
1970
+ 'tool_call_id',
1971
+ 'toolCallId',
1972
+ 'artifact_id',
1973
+ 'artifactId',
1974
+ 'source_artifact_id',
1975
+ 'sourceArtifactId',
1976
+ ]);
1977
+ const localKeys = new Set(['row_index', 'rowIndex', 'row_selector', 'rowSelector', 'column', 'col', 'value']);
1978
+ const base = {};
1979
+ const groups = [];
1980
+ let current = {};
1981
+ const flush = () => {
1982
+ if (Object.keys(current).length === 0)
1983
+ return;
1984
+ groups.push({ ...base, ...current });
1985
+ current = {};
1986
+ };
1890
1987
  for (const part of String(line || '').split(';')) {
1891
1988
  const match = part.trim().match(/^([a-zA-Z_]+)\s*=\s*(.*)$/);
1892
1989
  if (!match)
1893
1990
  continue;
1894
- record[match[1]] = match[2].trim();
1991
+ const key = match[1];
1992
+ const value = match[2].trim();
1993
+ if (identifierKeys.has(key)) {
1994
+ base[key] = value;
1995
+ continue;
1996
+ }
1997
+ if (localKeys.has(key) &&
1998
+ (Object.prototype.hasOwnProperty.call(current, key)
1999
+ || ((key === 'row_index' || key === 'rowIndex' || key === 'row_selector' || key === 'rowSelector')
2000
+ && (current.column !== undefined || current.col !== undefined || current.value !== undefined))
2001
+ || ((key === 'column' || key === 'col') && current.value !== undefined))) {
2002
+ flush();
2003
+ }
2004
+ current[key] = value;
1895
2005
  }
1896
- return parseClaimReferenceFromRecord(record);
2006
+ flush();
2007
+ if (groups.length === 0 && Object.keys(base).length > 0)
2008
+ groups.push({ ...base });
2009
+ return groups.flatMap(group => parseClaimReferencesFromRecord(group));
1897
2010
  }
1898
2011
  function parseClaimItemsFromMarkdownSection(sectionBody) {
1899
2012
  const claims = [];
@@ -1921,8 +2034,8 @@ function parseClaimItemsFromMarkdownSection(sectionBody) {
1921
2034
  continue;
1922
2035
  }
1923
2036
  const refLine = line.replace(/^[-*]\s+/, '').trim();
1924
- const ref = parseClaimReferenceFromMarkdownLine(refLine);
1925
- if (ref) {
2037
+ const refs = parseClaimReferencesFromMarkdownLine(refLine);
2038
+ if (refs.length > 0) {
1926
2039
  if (!current) {
1927
2040
  current = {
1928
2041
  id: `Q${claims.length + 1}`,
@@ -1930,7 +2043,7 @@ function parseClaimItemsFromMarkdownSection(sectionBody) {
1930
2043
  references: [],
1931
2044
  };
1932
2045
  }
1933
- current.references.push(ref);
2046
+ current.references.push(...refs);
1934
2047
  }
1935
2048
  }
1936
2049
  flush();