@gracker/smartperfetto 1.0.15 → 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 (189) hide show
  1. package/dist/agent/agents/base/baseAgent.d.ts.map +1 -1
  2. package/dist/agent/agents/base/baseAgent.js +5 -1
  3. package/dist/agent/agents/base/baseAgent.js.map +1 -1
  4. package/dist/agent/context/enhancedSessionContext.d.ts +5 -0
  5. package/dist/agent/context/enhancedSessionContext.d.ts.map +1 -1
  6. package/dist/agent/context/enhancedSessionContext.js +13 -0
  7. package/dist/agent/context/enhancedSessionContext.js.map +1 -1
  8. package/dist/agent/core/conclusionContract.d.ts +23 -1
  9. package/dist/agent/core/conclusionContract.d.ts.map +1 -1
  10. package/dist/agent/core/conclusionGenerator.d.ts.map +1 -1
  11. package/dist/agent/core/conclusionGenerator.js +223 -27
  12. package/dist/agent/core/conclusionGenerator.js.map +1 -1
  13. package/dist/agent/core/executors/directSkillExecutor.d.ts.map +1 -1
  14. package/dist/agent/core/executors/directSkillExecutor.js +6 -12
  15. package/dist/agent/core/executors/directSkillExecutor.js.map +1 -1
  16. package/dist/agent/core/orchestratorTypes.d.ts +6 -0
  17. package/dist/agent/core/orchestratorTypes.d.ts.map +1 -1
  18. package/dist/agent/core/orchestratorTypes.js.map +1 -1
  19. package/dist/agent/experts/crossDomain/moduleExpertInvoker.d.ts.map +1 -1
  20. package/dist/agent/experts/crossDomain/moduleExpertInvoker.js +4 -1
  21. package/dist/agent/experts/crossDomain/moduleExpertInvoker.js.map +1 -1
  22. package/dist/agent/scene/sceneStage1Runner.d.ts +1 -1
  23. package/dist/agent/scene/sceneStage1Runner.d.ts.map +1 -1
  24. package/dist/agent/scene/sceneStage1Runner.js +1 -1
  25. package/dist/agent/scene/sceneStage1Runner.js.map +1 -1
  26. package/dist/agent/scene/sceneStoryService.d.ts +1 -1
  27. package/dist/agent/scene/sceneStoryService.d.ts.map +1 -1
  28. package/dist/agent/scene/sceneStoryService.js +4 -1
  29. package/dist/agent/scene/sceneStoryService.js.map +1 -1
  30. package/dist/agent/types/agentProtocol.d.ts.map +1 -1
  31. package/dist/agent/types/agentProtocol.js +4 -1
  32. package/dist/agent/types/agentProtocol.js.map +1 -1
  33. package/dist/agent/types.d.ts +7 -0
  34. package/dist/agent/types.d.ts.map +1 -1
  35. package/dist/agent/types.js.map +1 -1
  36. package/dist/agentOpenAI/openAiConfig.d.ts +2 -0
  37. package/dist/agentOpenAI/openAiConfig.d.ts.map +1 -1
  38. package/dist/agentOpenAI/openAiConfig.js +3 -0
  39. package/dist/agentOpenAI/openAiConfig.js.map +1 -1
  40. package/dist/agentOpenAI/openAiRuntime.d.ts +8 -0
  41. package/dist/agentOpenAI/openAiRuntime.d.ts.map +1 -1
  42. package/dist/agentOpenAI/openAiRuntime.js +293 -58
  43. package/dist/agentOpenAI/openAiRuntime.js.map +1 -1
  44. package/dist/agentRuntime/runtimeHealth.d.ts +1 -0
  45. package/dist/agentRuntime/runtimeHealth.d.ts.map +1 -1
  46. package/dist/agentv3/artifactStore.d.ts +5 -0
  47. package/dist/agentv3/artifactStore.d.ts.map +1 -1
  48. package/dist/agentv3/artifactStore.js +3 -0
  49. package/dist/agentv3/artifactStore.js.map +1 -1
  50. package/dist/agentv3/claudeMcpServer.d.ts.map +1 -1
  51. package/dist/agentv3/claudeMcpServer.js +125 -86
  52. package/dist/agentv3/claudeMcpServer.js.map +1 -1
  53. package/dist/agentv3/claudeRuntime.d.ts.map +1 -1
  54. package/dist/agentv3/claudeRuntime.js +147 -65
  55. package/dist/agentv3/claudeRuntime.js.map +1 -1
  56. package/dist/agentv3/claudeSseBridge.d.ts +6 -0
  57. package/dist/agentv3/claudeSseBridge.d.ts.map +1 -1
  58. package/dist/agentv3/claudeSseBridge.js +1 -0
  59. package/dist/agentv3/claudeSseBridge.js.map +1 -1
  60. package/dist/agentv3/sessionStateSnapshot.d.ts +23 -0
  61. package/dist/agentv3/sessionStateSnapshot.d.ts.map +1 -1
  62. package/dist/assistant/application/agentAnalyzeSessionService.d.ts +6 -0
  63. package/dist/assistant/application/agentAnalyzeSessionService.d.ts.map +1 -1
  64. package/dist/assistant/application/agentAnalyzeSessionService.js +9 -3
  65. package/dist/assistant/application/agentAnalyzeSessionService.js.map +1 -1
  66. package/dist/assistant/application/assistantApplicationService.d.ts.map +1 -1
  67. package/dist/assistant/application/assistantApplicationService.js +3 -1
  68. package/dist/assistant/application/assistantApplicationService.js.map +1 -1
  69. package/dist/cli-user/commands/report.js +64 -0
  70. package/dist/cli-user/commands/report.js.map +1 -1
  71. package/dist/cli-user/io/paths.d.ts +3 -0
  72. package/dist/cli-user/io/paths.d.ts.map +1 -1
  73. package/dist/cli-user/io/paths.js +6 -0
  74. package/dist/cli-user/io/paths.js.map +1 -1
  75. package/dist/cli-user/io/sessionStore.d.ts +1 -0
  76. package/dist/cli-user/io/sessionStore.d.ts.map +1 -1
  77. package/dist/cli-user/io/sessionStore.js +5 -0
  78. package/dist/cli-user/io/sessionStore.js.map +1 -1
  79. package/dist/cli-user/repl/renderer.d.ts +8 -0
  80. package/dist/cli-user/repl/renderer.d.ts.map +1 -1
  81. package/dist/cli-user/repl/renderer.js.map +1 -1
  82. package/dist/cli-user/services/cliAnalyzeService.d.ts +3 -0
  83. package/dist/cli-user/services/cliAnalyzeService.d.ts.map +1 -1
  84. package/dist/cli-user/services/cliAnalyzeService.js +103 -1
  85. package/dist/cli-user/services/cliAnalyzeService.js.map +1 -1
  86. package/dist/cli-user/services/turnPersistence.d.ts +0 -10
  87. package/dist/cli-user/services/turnPersistence.d.ts.map +1 -1
  88. package/dist/cli-user/services/turnPersistence.js +62 -0
  89. package/dist/cli-user/services/turnPersistence.js.map +1 -1
  90. package/dist/routes/agentReportRoutes.d.ts +1 -0
  91. package/dist/routes/agentReportRoutes.d.ts.map +1 -1
  92. package/dist/routes/agentReportRoutes.js +13 -2
  93. package/dist/routes/agentReportRoutes.js.map +1 -1
  94. package/dist/routes/agentResumeRoutes.d.ts.map +1 -1
  95. package/dist/routes/agentResumeRoutes.js +51 -5
  96. package/dist/routes/agentResumeRoutes.js.map +1 -1
  97. package/dist/routes/agentRoutes.d.ts.map +1 -1
  98. package/dist/routes/agentRoutes.js +524 -130
  99. package/dist/routes/agentRoutes.js.map +1 -1
  100. package/dist/scripts/verifyAgentSseScrolling.js +142 -2
  101. package/dist/scripts/verifyAgentSseScrolling.js.map +1 -1
  102. package/dist/services/agentEventStore.d.ts.map +1 -1
  103. package/dist/services/agentEventStore.js +13 -3
  104. package/dist/services/agentEventStore.js.map +1 -1
  105. package/dist/services/agentReportData.d.ts +3 -0
  106. package/dist/services/agentReportData.d.ts.map +1 -1
  107. package/dist/services/agentReportData.js.map +1 -1
  108. package/dist/services/agentResultNormalizer.d.ts +15 -3
  109. package/dist/services/agentResultNormalizer.d.ts.map +1 -1
  110. package/dist/services/agentResultNormalizer.js +344 -6
  111. package/dist/services/agentResultNormalizer.js.map +1 -1
  112. package/dist/services/analysisResultSnapshotPipeline.d.ts +3 -0
  113. package/dist/services/analysisResultSnapshotPipeline.d.ts.map +1 -1
  114. package/dist/services/analysisResultSnapshotPipeline.js +3 -0
  115. package/dist/services/analysisResultSnapshotPipeline.js.map +1 -1
  116. package/dist/services/analysisResultSnapshotStore.d.ts.map +1 -1
  117. package/dist/services/analysisResultSnapshotStore.js +34 -2
  118. package/dist/services/analysisResultSnapshotStore.js.map +1 -1
  119. package/dist/services/enterpriseSchema.d.ts.map +1 -1
  120. package/dist/services/enterpriseSchema.js +11 -0
  121. package/dist/services/enterpriseSchema.js.map +1 -1
  122. package/dist/services/evidence/evidenceContractBuilder.d.ts +11 -0
  123. package/dist/services/evidence/evidenceContractBuilder.d.ts.map +1 -0
  124. package/dist/services/evidence/evidenceContractBuilder.js +546 -0
  125. package/dist/services/evidence/evidenceContractBuilder.js.map +1 -0
  126. package/dist/services/finalResultQualityGate.d.ts +18 -0
  127. package/dist/services/finalResultQualityGate.d.ts.map +1 -0
  128. package/dist/services/finalResultQualityGate.js +283 -0
  129. package/dist/services/finalResultQualityGate.js.map +1 -0
  130. package/dist/services/htmlReportGenerator.d.ts +8 -1
  131. package/dist/services/htmlReportGenerator.d.ts.map +1 -1
  132. package/dist/services/htmlReportGenerator.js +129 -42
  133. package/dist/services/htmlReportGenerator.js.map +1 -1
  134. package/dist/services/persistAgentSession.d.ts +2 -0
  135. package/dist/services/persistAgentSession.d.ts.map +1 -1
  136. package/dist/services/persistAgentSession.js +17 -1
  137. package/dist/services/persistAgentSession.js.map +1 -1
  138. package/dist/services/processIdentity/identityContractMapper.d.ts +14 -0
  139. package/dist/services/processIdentity/identityContractMapper.d.ts.map +1 -0
  140. package/dist/services/processIdentity/identityContractMapper.js +135 -0
  141. package/dist/services/processIdentity/identityContractMapper.js.map +1 -0
  142. package/dist/services/processIdentity/types.d.ts +5 -0
  143. package/dist/services/processIdentity/types.d.ts.map +1 -1
  144. package/dist/services/processIdentity/types.js.map +1 -1
  145. package/dist/services/skillEngine/skillExecutor.d.ts +14 -2
  146. package/dist/services/skillEngine/skillExecutor.d.ts.map +1 -1
  147. package/dist/services/skillEngine/skillExecutor.js +133 -13
  148. package/dist/services/skillEngine/skillExecutor.js.map +1 -1
  149. package/dist/services/skillEngine/types.d.ts +2 -0
  150. package/dist/services/skillEngine/types.d.ts.map +1 -1
  151. package/dist/services/verifier/claimVerificationRunner.d.ts +20 -0
  152. package/dist/services/verifier/claimVerificationRunner.d.ts.map +1 -0
  153. package/dist/services/verifier/claimVerificationRunner.js +88 -0
  154. package/dist/services/verifier/claimVerificationRunner.js.map +1 -0
  155. package/dist/services/verifier/deterministicClaimVerifier.d.ts +8 -0
  156. package/dist/services/verifier/deterministicClaimVerifier.d.ts.map +1 -0
  157. package/dist/services/verifier/deterministicClaimVerifier.js +178 -0
  158. package/dist/services/verifier/deterministicClaimVerifier.js.map +1 -0
  159. package/dist/types/claimVerification.d.ts +38 -0
  160. package/dist/types/claimVerification.d.ts.map +1 -0
  161. package/dist/types/claimVerification.js +6 -0
  162. package/dist/types/claimVerification.js.map +1 -0
  163. package/dist/types/dataContract.d.ts +32 -0
  164. package/dist/types/dataContract.d.ts.map +1 -1
  165. package/dist/types/dataContract.js +7 -0
  166. package/dist/types/dataContract.js.map +1 -1
  167. package/dist/types/evidenceContract.d.ts +100 -0
  168. package/dist/types/evidenceContract.d.ts.map +1 -0
  169. package/dist/types/evidenceContract.js +6 -0
  170. package/dist/types/evidenceContract.js.map +1 -0
  171. package/dist/types/identityContract.d.ts +57 -0
  172. package/dist/types/identityContract.d.ts.map +1 -0
  173. package/dist/types/identityContract.js +6 -0
  174. package/dist/types/identityContract.js.map +1 -0
  175. package/dist/types/multiTraceComparison.d.ts +3 -0
  176. package/dist/types/multiTraceComparison.d.ts.map +1 -1
  177. package/package.json +3 -2
  178. package/skills/atomic/process_identity_resolver.skill.yaml +130 -1
  179. package/skills/atomic/process_slice_cpu_hotspots.skill.yaml +321 -0
  180. package/skills/atomic/startup_slow_reasons.skill.yaml +102 -17
  181. package/skills/composite/startup_analysis.skill.yaml +16 -0
  182. package/strategies/anr.strategy.md +2 -2
  183. package/strategies/game.strategy.md +1 -1
  184. package/strategies/general.strategy.md +1 -1
  185. package/strategies/prompt-openai-final-report-continuation-en.template.md +12 -0
  186. package/strategies/prompt-openai-final-report-continuation-zh.template.md +12 -0
  187. package/strategies/prompt-output-format.template.md +1 -1
  188. package/strategies/scrolling.strategy.md +1 -0
  189. package/strategies/startup.strategy.md +4 -1
@@ -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,21 +1803,97 @@ 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']));
1753
- if (!evidenceRefId && !sourceRef && !sourceToolCallId)
1754
- return null;
1755
- return {
1756
- evidenceRefId,
1757
- ...(rowIndex !== undefined ? { rowIndex } : {}),
1758
- ...(rowSelector ? { rowSelector } : {}),
1759
- ...(column ? { column } : {}),
1760
- ...(value !== undefined ? { value } : {}),
1808
+ const columnRaw = readValueFromAliases(record, ['column', 'col']);
1809
+ const columns = splitClaimList(columnRaw);
1810
+ const rawValue = readValueFromAliases(record, ['value']);
1811
+ const artifactId = String(readValueFromAliases(record, ['artifactId', 'artifact_id']) || '').trim();
1812
+ const sourceArtifactId = String(readValueFromAliases(record, ['sourceArtifactId', 'source_artifact_id']) || '').trim();
1813
+ if (!evidenceRefId && !sourceRef && !sourceToolCallId && !artifactId && !sourceArtifactId)
1814
+ return [];
1815
+ const base = {
1816
+ ...(evidenceRefId ? { evidenceRefId } : {}),
1761
1817
  ...(sourceRef ? { sourceRef } : {}),
1762
1818
  ...(sourceToolCallId ? { sourceToolCallId } : {}),
1819
+ ...(artifactId ? { artifactId } : {}),
1820
+ ...(sourceArtifactId ? { sourceArtifactId } : {}),
1763
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;
1840
+ }
1841
+ function parseClaimKind(value) {
1842
+ const normalized = String(value || '').trim();
1843
+ const allowed = [
1844
+ 'numeric',
1845
+ 'categorical',
1846
+ 'time_range',
1847
+ 'identity',
1848
+ 'causal',
1849
+ 'comparison',
1850
+ 'inference',
1851
+ 'recommendation',
1852
+ ];
1853
+ return allowed.includes(normalized)
1854
+ ? normalized
1855
+ : undefined;
1856
+ }
1857
+ function parseClaimSupportLevel(value) {
1858
+ const normalized = String(value || '').trim();
1859
+ const allowed = ['verified', 'partial', 'inference', 'unsupported'];
1860
+ return allowed.includes(normalized)
1861
+ ? normalized
1862
+ : undefined;
1863
+ }
1864
+ function parseStringArray(value) {
1865
+ if (!Array.isArray(value))
1866
+ return undefined;
1867
+ const out = value
1868
+ .map(item => String(item || '').trim())
1869
+ .filter(Boolean);
1870
+ return out.length > 0 ? Array.from(new Set(out)) : undefined;
1871
+ }
1872
+ function parseClaimArtifactRefs(value) {
1873
+ if (!Array.isArray(value))
1874
+ return undefined;
1875
+ const refs = value
1876
+ .map(item => toRecord(item))
1877
+ .filter((item) => Boolean(item))
1878
+ .map(item => {
1879
+ const artifactId = String(readValueFromAliases(item, [
1880
+ 'artifactId',
1881
+ 'artifact_id',
1882
+ 'sourceArtifactId',
1883
+ 'source_artifact_id',
1884
+ ]) || '').trim();
1885
+ if (!artifactId)
1886
+ return undefined;
1887
+ const rowIndex = parseNumberFromUnknown(readValueFromAliases(item, ['rowIndex', 'row_index']));
1888
+ const rowSelector = toRecord(readValueFromAliases(item, ['rowSelector', 'row_selector'])) || undefined;
1889
+ return {
1890
+ artifactId,
1891
+ ...(rowIndex !== undefined ? { rowIndex } : {}),
1892
+ ...(rowSelector ? { rowSelector } : {}),
1893
+ };
1894
+ })
1895
+ .filter((item) => Boolean(item));
1896
+ return refs.length > 0 ? refs : undefined;
1764
1897
  }
1765
1898
  function parseClaimItemsFromUnknown(value) {
1766
1899
  if (!Array.isArray(value))
@@ -1777,19 +1910,26 @@ function parseClaimItemsFromUnknown(value) {
1777
1910
  ? referencesSource
1778
1911
  .map(ref => toRecord(ref))
1779
1912
  .filter((ref) => Boolean(ref))
1780
- .map(ref => parseClaimReferenceFromRecord(ref))
1781
- .filter((ref) => Boolean(ref))
1913
+ .flatMap(ref => parseClaimReferencesFromRecord(ref))
1782
1914
  : [];
1783
- if (references.length === 0)
1915
+ const artifactRefs = parseClaimArtifactRefs(readValueFromAliases(record, ['artifactRefs', 'artifact_refs']));
1916
+ if (references.length === 0 && (!artifactRefs || artifactRefs.length === 0))
1784
1917
  return;
1785
1918
  const claimId = String(readValueFromAliases(record, ['id', 'claimId', 'claim_id']) || '').trim();
1786
1919
  const conclusionId = normalizeConclusionId(String(readValueFromAliases(record, ['conclusionId', 'conclusion_id', 'conclusion']) || '').trim(), idx + 1);
1787
1920
  const text = String(readValueFromAliases(record, ['text', 'statement', 'claim']) || '').trim() || `claim ${idx + 1}`;
1921
+ const kind = parseClaimKind(readValueFromAliases(record, ['kind', 'claimKind', 'claim_kind']));
1922
+ const supportLevel = parseClaimSupportLevel(readValueFromAliases(record, ['supportLevel', 'support_level']));
1923
+ const relationRefs = parseStringArray(readValueFromAliases(record, ['relationRefs', 'relation_refs']));
1788
1924
  claims.push({
1789
1925
  ...(claimId ? { id: claimId } : {}),
1790
1926
  conclusionId,
1791
1927
  text,
1928
+ ...(kind ? { kind } : {}),
1792
1929
  references,
1930
+ ...(artifactRefs ? { artifactRefs } : {}),
1931
+ ...(relationRefs ? { relationRefs } : {}),
1932
+ ...(supportLevel ? { supportLevel } : {}),
1793
1933
  });
1794
1934
  });
1795
1935
  return claims;
@@ -1802,6 +1942,10 @@ function formatClaimReferenceMarkdown(ref) {
1802
1942
  parts.push(`source_ref=${ref.sourceRef}`);
1803
1943
  if (ref.sourceToolCallId)
1804
1944
  parts.push(`source_tool_call_id=${ref.sourceToolCallId}`);
1945
+ if (ref.artifactId)
1946
+ parts.push(`artifact_id=${ref.artifactId}`);
1947
+ if (ref.sourceArtifactId)
1948
+ parts.push(`source_artifact_id=${ref.sourceArtifactId}`);
1805
1949
  if (typeof ref.rowIndex === 'number')
1806
1950
  parts.push(`row_index=${ref.rowIndex}`);
1807
1951
  if (ref.rowSelector)
@@ -1812,15 +1956,57 @@ function formatClaimReferenceMarkdown(ref) {
1812
1956
  parts.push(`value=${String(ref.value)}`);
1813
1957
  return parts.join('; ');
1814
1958
  }
1815
- function parseClaimReferenceFromMarkdownLine(line) {
1816
- 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
+ };
1817
1987
  for (const part of String(line || '').split(';')) {
1818
1988
  const match = part.trim().match(/^([a-zA-Z_]+)\s*=\s*(.*)$/);
1819
1989
  if (!match)
1820
1990
  continue;
1821
- 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;
1822
2005
  }
1823
- 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));
1824
2010
  }
1825
2011
  function parseClaimItemsFromMarkdownSection(sectionBody) {
1826
2012
  const claims = [];
@@ -1848,8 +2034,8 @@ function parseClaimItemsFromMarkdownSection(sectionBody) {
1848
2034
  continue;
1849
2035
  }
1850
2036
  const refLine = line.replace(/^[-*]\s+/, '').trim();
1851
- const ref = parseClaimReferenceFromMarkdownLine(refLine);
1852
- if (ref) {
2037
+ const refs = parseClaimReferencesFromMarkdownLine(refLine);
2038
+ if (refs.length > 0) {
1853
2039
  if (!current) {
1854
2040
  current = {
1855
2041
  id: `Q${claims.length + 1}`,
@@ -1857,7 +2043,7 @@ function parseClaimItemsFromMarkdownSection(sectionBody) {
1857
2043
  references: [],
1858
2044
  };
1859
2045
  }
1860
- current.references.push(ref);
2046
+ current.references.push(...refs);
1861
2047
  }
1862
2048
  }
1863
2049
  flush();
@@ -2148,24 +2334,34 @@ function sanitizeConclusionContract(contract, options) {
2148
2334
  .map((item, idx) => {
2149
2335
  const references = (item.references || [])
2150
2336
  .map(ref => ({
2151
- evidenceRefId: sanitizeText(ref.evidenceRefId),
2337
+ ...(ref.evidenceRefId ? { evidenceRefId: sanitizeText(ref.evidenceRefId) } : {}),
2152
2338
  ...(typeof ref.rowIndex === 'number' && Number.isFinite(ref.rowIndex) ? { rowIndex: ref.rowIndex } : {}),
2153
2339
  ...(ref.rowSelector ? { rowSelector: parseClaimRowSelector(ref.rowSelector) } : {}),
2154
2340
  ...(ref.column ? { column: sanitizeText(ref.column) } : {}),
2155
2341
  ...(ref.value !== undefined ? { value: parseClaimScalar(ref.value) } : {}),
2156
2342
  ...(ref.sourceRef ? { sourceRef: sanitizeText(ref.sourceRef) } : {}),
2157
2343
  ...(ref.sourceToolCallId ? { sourceToolCallId: sanitizeText(ref.sourceToolCallId) } : {}),
2344
+ ...(ref.artifactId ? { artifactId: sanitizeText(ref.artifactId) } : {}),
2345
+ ...(ref.sourceArtifactId ? { sourceArtifactId: sanitizeText(ref.sourceArtifactId) } : {}),
2158
2346
  }))
2159
- .filter(ref => ((ref.evidenceRefId || ref.sourceRef || ref.sourceToolCallId) &&
2347
+ .filter(ref => ((ref.evidenceRefId || ref.sourceRef || ref.sourceToolCallId || ref.artifactId || ref.sourceArtifactId) &&
2160
2348
  (ref.value === undefined || typeof ref.value === 'string' || typeof ref.value === 'number' || typeof ref.value === 'boolean')));
2349
+ const kind = parseClaimKind(item.kind);
2350
+ const artifactRefs = parseClaimArtifactRefs(item.artifactRefs);
2351
+ const relationRefs = parseStringArray(item.relationRefs);
2352
+ const supportLevel = parseClaimSupportLevel(item.supportLevel);
2161
2353
  return {
2162
2354
  ...(item.id ? { id: sanitizeText(item.id) } : {}),
2163
2355
  ...(item.conclusionId ? { conclusionId: normalizeConclusionId(item.conclusionId, idx + 1) } : {}),
2164
2356
  text: sanitizeText(item.text) || `claim ${idx + 1}`,
2357
+ ...(kind ? { kind } : {}),
2165
2358
  references,
2359
+ ...(artifactRefs ? { artifactRefs } : {}),
2360
+ ...(relationRefs ? { relationRefs } : {}),
2361
+ ...(supportLevel ? { supportLevel } : {}),
2166
2362
  };
2167
2363
  })
2168
- .filter(item => item.text && item.references.length > 0)
2364
+ .filter(item => item.text && (item.references.length > 0 || Boolean(item.artifactRefs?.length)))
2169
2365
  .slice(0, 50);
2170
2366
  const uncertainties = dedupe(contract.uncertainties).slice(0, 6);
2171
2367
  const nextSteps = dedupe(contract.nextSteps).slice(0, 6);
@@ -3045,7 +3241,7 @@ function buildInsightFirstPrompt(params) {
3045
3241
  }
3046
3242
  parts.push('- evidence_chain 必须按 C1/C2/C3 对齐(C1=结论1):每项包含 conclusion_id 和 evidence 文本,且包含至少 1 个 evidence id(ev_xxxxxxxxxxxx)。');
3047
3243
  parts.push('- claims 必须列出结论中出现的关键数值/实体判断,用于前端逐句核验;没有可核验数据时传空数组。');
3048
- parts.push('- claims 每项包含:id(Q1...), conclusion_id(C1...), text, references');
3244
+ parts.push('- claims 每项包含:id(Q1...), conclusion_id(C1...), text, kind, references;kind 从 numeric/categorical/time_range/identity/causal/comparison/inference/recommendation 中选择。');
3049
3245
  parts.push('- claims[].references 每项包含:evidence_ref_id(优先使用 data:* 证据 ID), source_ref(如 表 1/摘要 1), source_tool_call_id(如可见), row_index(0-based,不是第几行的 1-based 编号), row_selector(行号不稳定时使用), column, value。');
3050
3246
  parts.push('- metadata 可包含 confidence(0-100 或 0-1)与 rounds(正整数)。');
3051
3247
  parts.push('- metadata 可包含 cluster_policy 对象:{ output_mode: required|optional|none, frame_list_mode: none|top|full, max_frames_per_cluster?: number }。');