hazo_collab_forms 3.1.6 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/CHANGE_LOG.md +207 -0
  2. package/README.md +3 -0
  3. package/dist/components/clarification/clarification_item_body.d.ts +19 -1
  4. package/dist/components/clarification/clarification_item_body.d.ts.map +1 -1
  5. package/dist/components/clarification/clarification_item_body.js +114 -6
  6. package/dist/components/clarification/clarification_item_body.js.map +1 -1
  7. package/dist/components/clarification/clarification_thread.js +1 -1
  8. package/dist/components/clarification/clarification_thread.js.map +1 -1
  9. package/dist/components/clarification/index.d.ts +2 -0
  10. package/dist/components/clarification/index.d.ts.map +1 -1
  11. package/dist/components/clarification/index.js +1 -0
  12. package/dist/components/clarification/index.js.map +1 -1
  13. package/dist/components/clarification/resolution_status_strip.d.ts +18 -0
  14. package/dist/components/clarification/resolution_status_strip.d.ts.map +1 -0
  15. package/dist/components/clarification/resolution_status_strip.js +20 -0
  16. package/dist/components/clarification/resolution_status_strip.js.map +1 -0
  17. package/dist/components/hazo_fb_form/context.d.ts +1 -1
  18. package/dist/components/hazo_fb_form/context.d.ts.map +1 -1
  19. package/dist/components/hazo_fb_form/hazo_fb_form.d.ts.map +1 -1
  20. package/dist/components/hazo_fb_form/hazo_fb_form.js +330 -113
  21. package/dist/components/hazo_fb_form/hazo_fb_form.js.map +1 -1
  22. package/dist/components/hazo_fb_form/hooks/use_fb_form_state.d.ts +3 -3
  23. package/dist/components/hazo_fb_form/hooks/use_fb_form_state.d.ts.map +1 -1
  24. package/dist/components/hazo_fb_form/hooks/use_fb_form_state.js +340 -61
  25. package/dist/components/hazo_fb_form/hooks/use_fb_form_state.js.map +1 -1
  26. package/dist/components/hazo_fb_form/hooks/use_llm_run.d.ts +3 -1
  27. package/dist/components/hazo_fb_form/hooks/use_llm_run.d.ts.map +1 -1
  28. package/dist/components/hazo_fb_form/hooks/use_llm_run.js +89 -11
  29. package/dist/components/hazo_fb_form/hooks/use_llm_run.js.map +1 -1
  30. package/dist/components/hazo_fb_form/shared/agent_stepper.js +1 -1
  31. package/dist/components/hazo_fb_form/shared/agent_stepper.js.map +1 -1
  32. package/dist/components/hazo_fb_form/shared/file_status_accordion.d.ts +9 -0
  33. package/dist/components/hazo_fb_form/shared/file_status_accordion.d.ts.map +1 -0
  34. package/dist/components/hazo_fb_form/shared/file_status_accordion.js +39 -0
  35. package/dist/components/hazo_fb_form/shared/file_status_accordion.js.map +1 -0
  36. package/dist/components/hazo_fb_form/shared/format.d.ts.map +1 -1
  37. package/dist/components/hazo_fb_form/shared/format.js +8 -3
  38. package/dist/components/hazo_fb_form/shared/format.js.map +1 -1
  39. package/dist/components/hazo_fb_form/shared/send_back_item_card.d.ts +7 -1
  40. package/dist/components/hazo_fb_form/shared/send_back_item_card.d.ts.map +1 -1
  41. package/dist/components/hazo_fb_form/shared/send_back_item_card.js +6 -3
  42. package/dist/components/hazo_fb_form/shared/send_back_item_card.js.map +1 -1
  43. package/dist/components/hazo_fb_form/types.d.ts +3 -1
  44. package/dist/components/hazo_fb_form/types.d.ts.map +1 -1
  45. package/dist/components/hazo_fb_form/views/back_office_view.js +1 -1
  46. package/dist/components/hazo_fb_form/views/back_office_view.js.map +1 -1
  47. package/dist/components/hazo_fb_form/views/clarifications_view.js +2 -2
  48. package/dist/components/hazo_fb_form/views/clarifications_view.js.map +1 -1
  49. package/dist/components/hazo_fb_form/views/front_office_view.d.ts.map +1 -1
  50. package/dist/components/hazo_fb_form/views/front_office_view.js +62 -41
  51. package/dist/components/hazo_fb_form/views/front_office_view.js.map +1 -1
  52. package/dist/components/hazo_fb_form/views/interim_view.js +3 -3
  53. package/dist/components/hazo_fb_form/views/interim_view.js.map +1 -1
  54. package/dist/components/hazo_fb_form/views/review_queue_view.d.ts.map +1 -1
  55. package/dist/components/hazo_fb_form/views/review_queue_view.js +22 -9
  56. package/dist/components/hazo_fb_form/views/review_queue_view.js.map +1 -1
  57. package/dist/components/hazo_validation_rule_editor/components/rule_editor.d.ts.map +1 -1
  58. package/dist/components/hazo_validation_rule_editor/components/rule_editor.js +32 -3
  59. package/dist/components/hazo_validation_rule_editor/components/rule_editor.js.map +1 -1
  60. package/dist/components/hazo_validation_rule_editor/components/variable_chain_input.d.ts +20 -0
  61. package/dist/components/hazo_validation_rule_editor/components/variable_chain_input.d.ts.map +1 -0
  62. package/dist/components/hazo_validation_rule_editor/components/variable_chain_input.js +34 -0
  63. package/dist/components/hazo_validation_rule_editor/components/variable_chain_input.js.map +1 -0
  64. package/dist/components/hazo_validation_rule_editor/context.d.ts +3 -2
  65. package/dist/components/hazo_validation_rule_editor/context.d.ts.map +1 -1
  66. package/dist/components/hazo_validation_rule_editor/context.js +15 -3
  67. package/dist/components/hazo_validation_rule_editor/context.js.map +1 -1
  68. package/dist/components/hazo_validation_rule_editor/types.d.ts +7 -1
  69. package/dist/components/hazo_validation_rule_editor/types.d.ts.map +1 -1
  70. package/dist/components/hazo_validation_rule_editor/validation_rule_editor.d.ts +1 -1
  71. package/dist/components/hazo_validation_rule_editor/validation_rule_editor.d.ts.map +1 -1
  72. package/dist/components/hazo_validation_rule_editor/validation_rule_editor.js +2 -2
  73. package/dist/components/hazo_validation_rule_editor/validation_rule_editor.js.map +1 -1
  74. package/dist/components/index.d.ts +2 -0
  75. package/dist/components/index.d.ts.map +1 -1
  76. package/dist/components/index.js +2 -0
  77. package/dist/components/index.js.map +1 -1
  78. package/dist/components/shared/document_type_editor.d.ts +31 -0
  79. package/dist/components/shared/document_type_editor.d.ts.map +1 -0
  80. package/dist/components/shared/document_type_editor.js +60 -0
  81. package/dist/components/shared/document_type_editor.js.map +1 -0
  82. package/dist/components/shared/file_bar/file_bar.d.ts +7 -1
  83. package/dist/components/shared/file_bar/file_bar.d.ts.map +1 -1
  84. package/dist/components/shared/file_bar/file_bar.js +5 -3
  85. package/dist/components/shared/file_bar/file_bar.js.map +1 -1
  86. package/dist/components/shared/file_bar/file_bar_validation_dialog.js +4 -4
  87. package/dist/components/shared/file_bar/file_bar_validation_dialog.js.map +1 -1
  88. package/dist/components/shared/file_status_icon.d.ts +23 -0
  89. package/dist/components/shared/file_status_icon.d.ts.map +1 -0
  90. package/dist/components/shared/file_status_icon.js +38 -0
  91. package/dist/components/shared/file_status_icon.js.map +1 -0
  92. package/dist/components/shared/json_data_panel/json_data_panel.d.ts +1 -1
  93. package/dist/components/shared/json_data_panel/json_data_panel.d.ts.map +1 -1
  94. package/dist/components/shared/json_data_panel/json_data_panel.js +27 -2
  95. package/dist/components/shared/json_data_panel/json_data_panel.js.map +1 -1
  96. package/dist/components/shared/rule_result_card.d.ts.map +1 -1
  97. package/dist/components/shared/rule_result_card.js +5 -4
  98. package/dist/components/shared/rule_result_card.js.map +1 -1
  99. package/dist/components/thread_form/components/add_question_dialog.d.ts +12 -0
  100. package/dist/components/thread_form/components/add_question_dialog.d.ts.map +1 -0
  101. package/dist/components/thread_form/components/add_question_dialog.js +36 -0
  102. package/dist/components/thread_form/components/add_question_dialog.js.map +1 -0
  103. package/dist/components/thread_form/components/agent_compose_dialog.d.ts +30 -0
  104. package/dist/components/thread_form/components/agent_compose_dialog.d.ts.map +1 -0
  105. package/dist/components/thread_form/components/agent_compose_dialog.js +45 -0
  106. package/dist/components/thread_form/components/agent_compose_dialog.js.map +1 -0
  107. package/dist/components/thread_form/components/clarification.d.ts +14 -0
  108. package/dist/components/thread_form/components/clarification.d.ts.map +1 -0
  109. package/dist/components/thread_form/components/clarification.js +12 -0
  110. package/dist/components/thread_form/components/clarification.js.map +1 -0
  111. package/dist/components/thread_form/components/collected_data_view.d.ts +15 -0
  112. package/dist/components/thread_form/components/collected_data_view.d.ts.map +1 -0
  113. package/dist/components/thread_form/components/collected_data_view.js +121 -0
  114. package/dist/components/thread_form/components/collected_data_view.js.map +1 -0
  115. package/dist/components/thread_form/components/coverage_card.d.ts +11 -0
  116. package/dist/components/thread_form/components/coverage_card.d.ts.map +1 -0
  117. package/dist/components/thread_form/components/coverage_card.js +60 -0
  118. package/dist/components/thread_form/components/coverage_card.js.map +1 -0
  119. package/dist/components/thread_form/components/file_bar.d.ts +93 -0
  120. package/dist/components/thread_form/components/file_bar.d.ts.map +1 -0
  121. package/dist/components/thread_form/components/file_bar.js +251 -0
  122. package/dist/components/thread_form/components/file_bar.js.map +1 -0
  123. package/dist/components/thread_form/components/file_info_dialog.d.ts +15 -0
  124. package/dist/components/thread_form/components/file_info_dialog.d.ts.map +1 -0
  125. package/dist/components/thread_form/components/file_info_dialog.js +64 -0
  126. package/dist/components/thread_form/components/file_info_dialog.js.map +1 -0
  127. package/dist/components/thread_form/components/issue_group_tree.d.ts +20 -0
  128. package/dist/components/thread_form/components/issue_group_tree.d.ts.map +1 -0
  129. package/dist/components/thread_form/components/issue_group_tree.js +164 -0
  130. package/dist/components/thread_form/components/issue_group_tree.js.map +1 -0
  131. package/dist/components/thread_form/components/pdf_side_panel.d.ts +20 -0
  132. package/dist/components/thread_form/components/pdf_side_panel.d.ts.map +1 -0
  133. package/dist/components/thread_form/components/pdf_side_panel.js +63 -0
  134. package/dist/components/thread_form/components/pdf_side_panel.js.map +1 -0
  135. package/dist/components/thread_form/components/rule_decision_row.d.ts +31 -0
  136. package/dist/components/thread_form/components/rule_decision_row.d.ts.map +1 -0
  137. package/dist/components/thread_form/components/rule_decision_row.js +20 -0
  138. package/dist/components/thread_form/components/rule_decision_row.js.map +1 -0
  139. package/dist/components/thread_form/components/send_back_message.d.ts +32 -0
  140. package/dist/components/thread_form/components/send_back_message.d.ts.map +1 -0
  141. package/dist/components/thread_form/components/send_back_message.js +82 -0
  142. package/dist/components/thread_form/components/send_back_message.js.map +1 -0
  143. package/dist/components/thread_form/components/shared.d.ts +54 -0
  144. package/dist/components/thread_form/components/shared.d.ts.map +1 -0
  145. package/dist/components/thread_form/components/shared.js +136 -0
  146. package/dist/components/thread_form/components/shared.js.map +1 -0
  147. package/dist/components/thread_form/components/task_card.d.ts +90 -0
  148. package/dist/components/thread_form/components/task_card.d.ts.map +1 -0
  149. package/dist/components/thread_form/components/task_card.js +63 -0
  150. package/dist/components/thread_form/components/task_card.js.map +1 -0
  151. package/dist/components/thread_form/components/text_doc_check.d.ts +15 -0
  152. package/dist/components/thread_form/components/text_doc_check.d.ts.map +1 -0
  153. package/dist/components/thread_form/components/text_doc_check.js +16 -0
  154. package/dist/components/thread_form/components/text_doc_check.js.map +1 -0
  155. package/dist/components/thread_form/components/text_extraction.d.ts +14 -0
  156. package/dist/components/thread_form/components/text_extraction.d.ts.map +1 -0
  157. package/dist/components/thread_form/components/text_extraction.js +16 -0
  158. package/dist/components/thread_form/components/text_extraction.js.map +1 -0
  159. package/dist/components/thread_form/components/thread_composer.d.ts +15 -0
  160. package/dist/components/thread_form/components/thread_composer.d.ts.map +1 -0
  161. package/dist/components/thread_form/components/thread_composer.js +93 -0
  162. package/dist/components/thread_form/components/thread_composer.js.map +1 -0
  163. package/dist/components/thread_form/components/thread_timeline.d.ts +65 -0
  164. package/dist/components/thread_form/components/thread_timeline.d.ts.map +1 -0
  165. package/dist/components/thread_form/components/thread_timeline.js +225 -0
  166. package/dist/components/thread_form/components/thread_timeline.js.map +1 -0
  167. package/dist/components/thread_form/hooks/use_file_pipeline.d.ts +126 -0
  168. package/dist/components/thread_form/hooks/use_file_pipeline.d.ts.map +1 -0
  169. package/dist/components/thread_form/hooks/use_file_pipeline.js +760 -0
  170. package/dist/components/thread_form/hooks/use_file_pipeline.js.map +1 -0
  171. package/dist/components/thread_form/hooks/use_thread_form.d.ts +36 -0
  172. package/dist/components/thread_form/hooks/use_thread_form.d.ts.map +1 -0
  173. package/dist/components/thread_form/hooks/use_thread_form.js +126 -0
  174. package/dist/components/thread_form/hooks/use_thread_form.js.map +1 -0
  175. package/dist/components/thread_form/index.d.ts +33 -0
  176. package/dist/components/thread_form/index.d.ts.map +1 -0
  177. package/dist/components/thread_form/index.js +30 -0
  178. package/dist/components/thread_form/index.js.map +1 -0
  179. package/dist/components/thread_form/sample_data.d.ts +8 -0
  180. package/dist/components/thread_form/sample_data.d.ts.map +1 -0
  181. package/dist/components/thread_form/sample_data.js +658 -0
  182. package/dist/components/thread_form/sample_data.js.map +1 -0
  183. package/dist/components/thread_form/thread_form.d.ts +7 -0
  184. package/dist/components/thread_form/thread_form.d.ts.map +1 -0
  185. package/dist/components/thread_form/thread_form.js +1385 -0
  186. package/dist/components/thread_form/thread_form.js.map +1 -0
  187. package/dist/components/thread_form/types.d.ts +402 -0
  188. package/dist/components/thread_form/types.d.ts.map +1 -0
  189. package/dist/components/thread_form/types.js +23 -0
  190. package/dist/components/thread_form/types.js.map +1 -0
  191. package/dist/components/thread_form/utils/file_decision_state.d.ts +22 -0
  192. package/dist/components/thread_form/utils/file_decision_state.d.ts.map +1 -0
  193. package/dist/components/thread_form/utils/file_decision_state.js +37 -0
  194. package/dist/components/thread_form/utils/file_decision_state.js.map +1 -0
  195. package/dist/components/thread_form/utils/merge_send_back.d.ts +13 -0
  196. package/dist/components/thread_form/utils/merge_send_back.d.ts.map +1 -0
  197. package/dist/components/thread_form/utils/merge_send_back.js +23 -0
  198. package/dist/components/thread_form/utils/merge_send_back.js.map +1 -0
  199. package/dist/lib/autofill_handler.d.ts.map +1 -1
  200. package/dist/lib/autofill_handler.js +5 -44
  201. package/dist/lib/autofill_handler.js.map +1 -1
  202. package/dist/lib/classification_handler.d.ts +105 -0
  203. package/dist/lib/classification_handler.d.ts.map +1 -0
  204. package/dist/lib/classification_handler.js +342 -0
  205. package/dist/lib/classification_handler.js.map +1 -0
  206. package/dist/lib/content_gate_handler.d.ts +37 -0
  207. package/dist/lib/content_gate_handler.d.ts.map +1 -0
  208. package/dist/lib/content_gate_handler.js +126 -0
  209. package/dist/lib/content_gate_handler.js.map +1 -0
  210. package/dist/lib/index.d.ts +10 -0
  211. package/dist/lib/index.d.ts.map +1 -1
  212. package/dist/lib/index.js +5 -0
  213. package/dist/lib/index.js.map +1 -1
  214. package/dist/lib/periodic_coverage_runner.d.ts +24 -0
  215. package/dist/lib/periodic_coverage_runner.d.ts.map +1 -0
  216. package/dist/lib/periodic_coverage_runner.js +121 -0
  217. package/dist/lib/periodic_coverage_runner.js.map +1 -0
  218. package/dist/lib/resolution_handler.d.ts +150 -0
  219. package/dist/lib/resolution_handler.d.ts.map +1 -0
  220. package/dist/lib/resolution_handler.js +597 -0
  221. package/dist/lib/resolution_handler.js.map +1 -0
  222. package/dist/lib/resolve_variable.d.ts +25 -0
  223. package/dist/lib/resolve_variable.d.ts.map +1 -0
  224. package/dist/lib/resolve_variable.js +77 -0
  225. package/dist/lib/resolve_variable.js.map +1 -0
  226. package/dist/lib/validation_handler.d.ts +27 -3
  227. package/dist/lib/validation_handler.d.ts.map +1 -1
  228. package/dist/lib/validation_handler.js +338 -288
  229. package/dist/lib/validation_handler.js.map +1 -1
  230. package/dist/types/clarification.d.ts +54 -0
  231. package/dist/types/clarification.d.ts.map +1 -1
  232. package/dist/types/fb_form_data.d.ts +273 -123
  233. package/dist/types/fb_form_data.d.ts.map +1 -1
  234. package/dist/types/fb_form_data.js +44 -58
  235. package/dist/types/fb_form_data.js.map +1 -1
  236. package/dist/types/fb_form_data_v1.d.ts +250 -0
  237. package/dist/types/fb_form_data_v1.d.ts.map +1 -0
  238. package/dist/types/fb_form_data_v1.js +117 -0
  239. package/dist/types/fb_form_data_v1.js.map +1 -0
  240. package/dist/types/fb_form_instance.d.ts +1 -1
  241. package/dist/types/fb_form_instance.d.ts.map +1 -1
  242. package/dist/types/index.d.ts +5 -3
  243. package/dist/types/index.d.ts.map +1 -1
  244. package/dist/types/index.js +2 -1
  245. package/dist/types/index.js.map +1 -1
  246. package/dist/types/validation.d.ts +134 -12
  247. package/dist/types/validation.d.ts.map +1 -1
  248. package/dist/utils/expectation_extractor.d.ts +31 -0
  249. package/dist/utils/expectation_extractor.d.ts.map +1 -0
  250. package/dist/utils/expectation_extractor.js +142 -0
  251. package/dist/utils/expectation_extractor.js.map +1 -0
  252. package/dist/utils/fb_data_adapter.d.ts +7 -2
  253. package/dist/utils/fb_data_adapter.d.ts.map +1 -1
  254. package/dist/utils/fb_data_adapter.js +58 -7
  255. package/dist/utils/fb_data_adapter.js.map +1 -1
  256. package/dist/utils/fb_data_adapter_v2.d.ts +17 -0
  257. package/dist/utils/fb_data_adapter_v2.d.ts.map +1 -0
  258. package/dist/utils/fb_data_adapter_v2.js +483 -0
  259. package/dist/utils/fb_data_adapter_v2.js.map +1 -0
  260. package/dist/utils/fb_data_helpers.d.ts +1 -1
  261. package/dist/utils/fb_data_helpers.d.ts.map +1 -1
  262. package/dist/utils/fb_data_mutations.d.ts +1 -1
  263. package/dist/utils/fb_data_mutations.d.ts.map +1 -1
  264. package/dist/utils/fb_data_mutations_v2.d.ts +46 -0
  265. package/dist/utils/fb_data_mutations_v2.d.ts.map +1 -0
  266. package/dist/utils/fb_data_mutations_v2.js +341 -0
  267. package/dist/utils/fb_data_mutations_v2.js.map +1 -0
  268. package/dist/utils/fb_data_queries.d.ts +81 -0
  269. package/dist/utils/fb_data_queries.d.ts.map +1 -0
  270. package/dist/utils/fb_data_queries.js +354 -0
  271. package/dist/utils/fb_data_queries.js.map +1 -0
  272. package/dist/utils/index.d.ts +4 -0
  273. package/dist/utils/index.d.ts.map +1 -1
  274. package/dist/utils/index.js +6 -0
  275. package/dist/utils/index.js.map +1 -1
  276. package/dist/utils/issue_bucketing.d.ts +36 -0
  277. package/dist/utils/issue_bucketing.d.ts.map +1 -0
  278. package/dist/utils/issue_bucketing.js +107 -0
  279. package/dist/utils/issue_bucketing.js.map +1 -0
  280. package/dist/utils/validation_result.d.ts +32 -0
  281. package/dist/utils/validation_result.d.ts.map +1 -0
  282. package/dist/utils/validation_result.js +55 -0
  283. package/dist/utils/validation_result.js.map +1 -0
  284. package/package.json +16 -4
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Group-level coverage findings card.
3
+ * Renders above a task's file list when periodic_coverage rules detect gaps
4
+ * or are skipped due to unresolved period bounds.
5
+ */
6
+ 'use client';
7
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
8
+ import { useState } from 'react';
9
+ import { LuCircleAlert, LuCircleHelp, LuChevronDown, LuChevronRight } from 'react-icons/lu';
10
+ import { bucket_dates_by_quarter, format_month } from '../../../utils/issue_bucketing.js';
11
+ export function CoverageCard({ results }) {
12
+ // Filter to items that need surfacing, then de-dupe across groups: when
13
+ // multiple groups produced the same rule + same gap set (typical when a
14
+ // task has only one logical group but classification produced duplicate
15
+ // tag groupings), collapse to a single card.
16
+ const surfaced = results.filter(r => r.skipped || r.gaps.length > 0);
17
+ const deduped = dedupe_results(surfaced);
18
+ if (deduped.length === 0)
19
+ return null;
20
+ return (_jsx("div", { className: "space-y-2 mb-3", children: deduped.map((cov, i) => (_jsx(CoverageCardRow, { cov: cov }, `${cov.rule_id}_${i}`))) }));
21
+ }
22
+ function CoverageCardRow({ cov }) {
23
+ const [expanded, set_expanded] = useState(false);
24
+ if (cov.skipped) {
25
+ return (_jsxs("div", { className: "flex items-start gap-2 border-l-4 border-amber-400 bg-amber-50/50 dark:bg-amber-950/20 px-3 py-2 rounded-md", children: [_jsx(LuCircleHelp, { className: "h-4 w-4 text-amber-600 mt-0.5 shrink-0" }), _jsxs("p", { className: "text-sm flex-1 min-w-0", children: [_jsx("span", { className: "font-medium text-foreground", children: cov.rule_name }), _jsx("span", { className: "text-muted-foreground", children: " \u2014 skipped (period bounds did not resolve)" })] })] }));
26
+ }
27
+ const range = format_overall_range(cov.gaps);
28
+ const gap_count = cov.gaps.length;
29
+ return (_jsxs("div", { className: "border-l-4 border-destructive bg-destructive/5 rounded-md", children: [_jsxs("button", { type: "button", onClick: () => set_expanded(e => !e), className: "w-full flex items-center gap-2 px-3 py-2 text-left hover:bg-destructive/10 transition-colors rounded-md", children: [_jsx(LuCircleAlert, { className: "h-4 w-4 text-destructive shrink-0" }), _jsxs("span", { className: "text-sm flex-1 min-w-0 truncate", children: [_jsx("span", { className: "font-medium text-foreground", children: cov.rule_name }), _jsx("span", { className: "text-muted-foreground", children: " \u2014 " }), _jsxs("span", { className: "text-destructive font-medium", children: [gap_count, " missing period", gap_count === 1 ? '' : 's'] }), range && _jsxs("span", { className: "text-muted-foreground", children: [" (", range, ")"] })] }), expanded
30
+ ? _jsx(LuChevronDown, { className: "h-3.5 w-3.5 text-muted-foreground shrink-0" })
31
+ : _jsx(LuChevronRight, { className: "h-3.5 w-3.5 text-muted-foreground shrink-0" })] }), expanded && (_jsx("ul", { className: "px-3 pb-2 pl-9 space-y-0.5 text-xs text-muted-foreground", children: bucket_dates_by_quarter(cov.gaps.map(g => ({ date: g.start, gap: g }))).map((bucket, bi) => (_jsx(QuarterRow, { bucket: bucket }, bi))) }))] }));
32
+ }
33
+ function QuarterRow({ bucket }) {
34
+ const [open, set_open] = useState(false);
35
+ return (_jsxs("li", { children: [_jsxs("button", { type: "button", onClick: () => set_open(o => !o), className: "w-full flex items-center gap-1 text-left hover:text-foreground transition-colors", children: [open
36
+ ? _jsx(LuChevronDown, { className: "h-3 w-3 text-muted-foreground/70 shrink-0" })
37
+ : _jsx(LuChevronRight, { className: "h-3 w-3 text-muted-foreground/70 shrink-0" }), _jsx("span", { className: "font-medium text-foreground/80", children: bucket.label }), _jsx("span", { className: "text-muted-foreground", children: " \u2014 " }), _jsx("span", { className: "font-mono", children: bucket.count }), _jsx("span", { children: " missing" })] }), open && (_jsx("ul", { className: "pl-4 mt-0.5 space-y-0.5 font-mono", children: bucket.issues.map(({ gap }, gi) => (_jsxs("li", { className: "text-muted-foreground", children: [gap.start, " \u2026 ", gap.end] }, gi))) }))] }));
38
+ }
39
+ /** Collapse the gap list to a "Mon YYYY – Mon YYYY" overall range. */
40
+ function format_overall_range(gaps) {
41
+ if (gaps.length === 0)
42
+ return null;
43
+ const first = gaps[0].start;
44
+ const last = gaps[gaps.length - 1].end;
45
+ return `${format_month(first)} – ${format_month(last)}`;
46
+ }
47
+ /** De-dupe results that share the same rule_id and identical gap sets. */
48
+ function dedupe_results(results) {
49
+ const seen = new Set();
50
+ const out = [];
51
+ for (const r of results) {
52
+ const sig = `${r.rule_id}|${r.skipped ? 'skip' : r.gaps.map(g => `${g.start}_${g.end}`).join(',')}`;
53
+ if (seen.has(sig))
54
+ continue;
55
+ seen.add(sig);
56
+ out.push(r);
57
+ }
58
+ return out;
59
+ }
60
+ //# sourceMappingURL=coverage_card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage_card.js","sourceRoot":"","sources":["../../../../src/components/thread_form/components/coverage_card.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * ThreadForm file bar — displays a file with inline doc check status,
3
+ * AI classification (agent), validation checks, PDF split sub-docs,
4
+ * client response mechanism for issues, and info dialog.
5
+ */
6
+ import type { ContentItem, AiContentResult, DocCheckData, ClassificationResult, SendBackIssue } from '../types.js';
7
+ import type { ValidationRuleResult } from '../../../types/validation.js';
8
+ import type { ClarificationResponse } from '../../../types/clarification.js';
9
+ import type { FileManagerCallbacks } from '../../../types/file_manager.js';
10
+ import { type DocumentTypeOption } from '../../shared/document_type_editor.js';
11
+ import type { RuleDecision } from '../types.js';
12
+ export interface FileBarProps {
13
+ item: ContentItem;
14
+ doc_check?: DocCheckData | null;
15
+ ai_result?: AiContentResult;
16
+ role: 'agent' | 'client';
17
+ /** Pipeline status for showing spinners */
18
+ pipeline_status?: 'queued' | 'classifying' | 'validating' | 'done' | 'error' | null;
19
+ /** Classification result for info dialog */
20
+ classification_result?: ClassificationResult | null;
21
+ /** Validation rule results for info dialog */
22
+ validation_rule_results?: ValidationRuleResult[];
23
+ on_view?: (item: ContentItem) => void;
24
+ on_remove?: (item: ContentItem) => void;
25
+ on_respond?: (item: ContentItem, response: {
26
+ comment?: string;
27
+ file?: File;
28
+ }) => void;
29
+ on_accept?: (content_ref: string) => void;
30
+ on_dismiss?: (content_ref: string) => void;
31
+ on_send_to_client?: (content_ref: string) => void;
32
+ /** Callback when client responds to an RFI clarification */
33
+ on_clarification_respond?: (id: string, response: ClarificationResponse) => void;
34
+ /** Callback when agent sends back selected issues as a new task. Keyed per-issue, not per-rule. */
35
+ on_send_back_issues?: (item: ContentItem, issues: SendBackIssue[], accepted_issue_keys: string[]) => void;
36
+ /** Callback when the agent submits a batch of per-rule decisions from the
37
+ * Pending Review panel. The parent applies the rule_actions and creates
38
+ * one task with one message per Send Back rule (cross-file Q1 batches
39
+ * merge via merge_send_back_message). */
40
+ on_submit_decisions?: (item: ContentItem, decisions: RuleDecision[]) => void;
41
+ /** Whether issues have already been sent back (pill shows "Sent Back") */
42
+ sent_back?: boolean;
43
+ /** Callback to persist updates to the ContentItem in form data */
44
+ on_update_content_item?: (content_id: string, updates: Partial<ContentItem>) => void;
45
+ /** File manager callbacks for upload in clarification response dropzone */
46
+ file_manager?: FileManagerCallbacks;
47
+ /** Callback when replacement files are submitted — adds them to the main thread for pipeline processing */
48
+ on_replacement_files?: (source_content_id: string, files: import('../../../types/file_attachment.js').FormFileAttachment[]) => void;
49
+ /** Name of the file that replaced this one (set when item.replaced_by_content_id is present) */
50
+ replaced_by_name?: string;
51
+ /** Name of the file this one replaces (set when item.replaces_content_id is present) */
52
+ replaces_name?: string;
53
+ /** Nesting depth for chained replacements (0 = original, 1 = first replacement, etc.) */
54
+ nesting_depth?: number;
55
+ /** Render the view action as an eye icon (default) or as "View" text. */
56
+ view_button_variant?: 'icon' | 'text';
57
+ /**
58
+ * Whether to show the info (classification + validation details) icon.
59
+ * When omitted, defaults to true for agents, false for clients.
60
+ */
61
+ show_info_icon?: boolean;
62
+ /**
63
+ * Whether the parent task has been resolved (status === 'completed' after the
64
+ * aggregate resolver passed). When true, suppress error/issue pills on the
65
+ * file bar — the SendBackMessage's RESOLVED header already conveys success
66
+ * for the whole set, so per-file warnings would just contradict it.
67
+ */
68
+ task_resolved?: boolean;
69
+ /**
70
+ * Whether the spawned send-back task for THIS file has been resolved.
71
+ * When true, the "Sent Back" pill is replaced with "Resolved" — the issue
72
+ * has been addressed in the child question, so the parent file shouldn't
73
+ * keep advertising the stale send-back state.
74
+ */
75
+ sent_back_resolved?: boolean;
76
+ /** Available document types for the editor dropdown. When omitted or empty,
77
+ * the document-type pill is read-only. Agent-side feature only. */
78
+ available_document_types?: DocumentTypeOption[];
79
+ /** Called when the agent picks a new document type from the dropdown.
80
+ * Parent should update item.classification_result and re-run validations. */
81
+ on_change_document_type?: (item: ContentItem, new_type_id: string) => Promise<void> | void;
82
+ /** Whether this file is currently marked as "kept" for collected data. When
83
+ * undefined the Keep checkbox is hidden — pass it explicitly to render the box. */
84
+ keep_selected?: boolean;
85
+ /** Called when the agent toggles the Keep checkbox. Same shape as the
86
+ * Collected Data tab's on_selection_change so consumers wire one handler. */
87
+ on_keep_change?: (selections: Record<string, boolean>) => void;
88
+ /** When false, suppresses the file-level Keep checkbox even if keep_selected
89
+ * is provided. Used by client view, which doesn't manage collected-data selections. */
90
+ show_keep_checkbox?: boolean;
91
+ }
92
+ export declare function FileBar({ item, doc_check, ai_result, role, pipeline_status, classification_result, validation_rule_results, on_view, on_remove, on_respond, on_accept, on_dismiss, on_send_to_client, on_clarification_respond, on_send_back_issues, on_submit_decisions, sent_back, on_update_content_item, file_manager, on_replacement_files, replaced_by_name, replaces_name, nesting_depth, view_button_variant, show_info_icon, task_resolved, sent_back_resolved, available_document_types, on_change_document_type, keep_selected, on_keep_change, show_keep_checkbox, }: FileBarProps): import("react/jsx-runtime").JSX.Element | null;
93
+ //# sourceMappingURL=file_bar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file_bar.d.ts","sourceRoot":"","sources":["../../../../src/components/thread_form/components/file_bar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,251 @@
1
+ /**
2
+ * ThreadForm file bar — displays a file with inline doc check status,
3
+ * AI classification (agent), validation checks, PDF split sub-docs,
4
+ * client response mechanism for issues, and info dialog.
5
+ */
6
+ 'use client';
7
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
8
+ import { useState, useMemo } from 'react';
9
+ import { AiOutlineEye } from 'react-icons/ai';
10
+ import { cn, PdfIcon } from './shared.js';
11
+ import { FileStatusIcon } from '../../shared/file_status_icon.js';
12
+ import { DocumentTypeEditor } from '../../shared/document_type_editor.js';
13
+ import { FileInfoDialog } from './file_info_dialog.js';
14
+ import { HazoCollabFormRFIbox } from '../../hazo_rfi_box/index.js';
15
+ import { IssueGroupTree } from './issue_group_tree.js';
16
+ import { RuleDecisionRow } from './rule_decision_row.js';
17
+ import { make_clarification_id, normalize_validation_rule_results } from '../../../utils/validation_result.js';
18
+ export function FileBar({ item, doc_check, ai_result, role, pipeline_status, classification_result, validation_rule_results, on_view, on_remove, on_respond, on_accept, on_dismiss, on_send_to_client, on_clarification_respond, on_send_back_issues, on_submit_decisions, sent_back, on_update_content_item, file_manager, on_replacement_files, replaced_by_name, replaces_name, nesting_depth = 0, view_button_variant = 'icon', show_info_icon, task_resolved, sent_back_resolved, available_document_types, on_change_document_type, keep_selected, on_keep_change, show_keep_checkbox, }) {
19
+ const info_icon_visible = show_info_icon ?? role === 'agent';
20
+ const [show_response, set_show_response] = useState(false);
21
+ const [info_dialog_open, set_info_dialog_open] = useState(false);
22
+ const [rfi_expanded, set_rfi_expanded] = useState(false);
23
+ // Initialize from persisted issue_responses on the ContentItem
24
+ const [rfi_responded, set_rfi_responded] = useState(() => {
25
+ if (!item.issue_responses)
26
+ return new Set();
27
+ return new Set(Object.keys(item.issue_responses));
28
+ });
29
+ const [rfi_responses, set_rfi_responses] = useState(() => {
30
+ if (!item.issue_responses)
31
+ return new Map();
32
+ const map = new Map();
33
+ for (const [id, resp] of Object.entries(item.issue_responses)) {
34
+ map.set(id, { response_choice: resp.response_choice, user_comment: resp.user_comment });
35
+ }
36
+ return map;
37
+ });
38
+ if (!item.file)
39
+ return null;
40
+ const has_issue = doc_check?.status === 'issues';
41
+ const is_passed = doc_check?.status === 'passed';
42
+ const is_processing = pipeline_status === 'classifying' || pipeline_status === 'validating';
43
+ const effective_sent_back = sent_back || item.sent_back || false;
44
+ const effective_accepted = item.accepted ?? false;
45
+ // Merge validation results: pipeline prop (live) takes priority, fall back to persisted on item.
46
+ // Clients never see backoffice-phase results — those are for the agent review only.
47
+ const all_validation_results = normalize_validation_rule_results((validation_rule_results && validation_rule_results.length > 0)
48
+ ? validation_rule_results
49
+ : item.validation_rule_results);
50
+ const effective_validation_results = role === 'agent'
51
+ ? all_validation_results
52
+ : all_validation_results.filter(r => r.check_type !== 'backoffice');
53
+ const has_info = !!classification_result || !!item.classification_result || effective_validation_results.length > 0;
54
+ // Derive classification from either direct prop or item's stored result
55
+ const effective_classification = classification_result || item.classification_result || null;
56
+ const is_replaced = !!item.replaced_by_content_id;
57
+ const is_replacement = !!item.replaces_content_id;
58
+ const issue_rows = useMemo(() => {
59
+ const rows = [];
60
+ for (const rule of effective_validation_results) {
61
+ for (const issue of rule.issues) {
62
+ rows.push({
63
+ rule,
64
+ issue,
65
+ clr_id: make_clarification_id(item.content_id, rule.rule_id, issue.issue_id),
66
+ });
67
+ }
68
+ }
69
+ return rows;
70
+ }, [effective_validation_results, item.content_id]);
71
+ const passed_results = useMemo(() => effective_validation_results.filter(r => r.issues.length === 0), [effective_validation_results]);
72
+ const has_validation_issues = issue_rows.length > 0 && !is_processing;
73
+ // Filter the file's validation rules by the agent's per-rule actions.
74
+ // A rule is "visible" (still up for decision) when it has issues AND
75
+ // the agent has not yet decided on it. Already-actioned rules disappear
76
+ // from the panel until rule_actions is cleared (e.g. after doc-type change).
77
+ const rule_actions = item.rule_actions ?? {};
78
+ const visible_rules = useMemo(() => effective_validation_results.filter(r => r.issues.length > 0 && !rule_actions[r.rule_id]), [effective_validation_results, rule_actions]);
79
+ const pending_issue_count = useMemo(() => visible_rules.reduce((n, r) => n + r.issues.length, 0), [visible_rules]);
80
+ const all_validation_passed = passed_results.length > 0 && issue_rows.length === 0 && !is_processing;
81
+ const all_issues_resolved = has_validation_issues && issue_rows.every(row => rfi_responded.has(row.clr_id));
82
+ // Convert validation issues to ClarificationItems for RFI boxes
83
+ const clarification_items = useMemo(() => {
84
+ return issue_rows.map(({ rule, issue, clr_id }) => {
85
+ const is_responded = rfi_responded.has(clr_id);
86
+ const saved_response = rfi_responses.get(clr_id);
87
+ return {
88
+ id: clr_id,
89
+ type: 'additional_info_required',
90
+ status: is_responded ? 'responded' : 'pending',
91
+ target_field_id: '__document',
92
+ target_label: item.file?.file_name || 'Document',
93
+ rule_name: rule.rule_name || rule.rule_id,
94
+ rule_id: rule.rule_id,
95
+ issue_description: issue.issue_description,
96
+ validation_details: issue.issue_description,
97
+ doc_references: [],
98
+ action_description: 'Please review the issue and provide a response.',
99
+ response_options: [
100
+ { value: 'acknowledge', label: 'Acknowledge', description: 'I understand the issue' },
101
+ { value: 'replace_document', label: 'Replace Document', description: 'I will upload a corrected document', shows_file_upload: true },
102
+ { value: 'provide_explanation', label: 'Provide Explanation', description: 'I have additional context', shows_additional_input: true },
103
+ ],
104
+ // Persist response data from previous submit
105
+ response_choice: saved_response?.response_choice,
106
+ user_comment: saved_response?.user_comment,
107
+ response_files: saved_response?.response_files || [],
108
+ created_at: new Date().toISOString(),
109
+ };
110
+ });
111
+ }, [issue_rows, item.file?.file_name, rfi_responded, rfi_responses]);
112
+ return (_jsxs("div", { "data-content-id": item.content_id, className: cn('rounded-md border overflow-hidden', is_replaced ? 'border-[#E2E8F0]/60' : 'border-[#E2E8F0]'), children: [_jsxs("div", { className: cn('flex items-center gap-2.5 px-3 py-2 text-[13px] group', is_replaced ? 'bg-[#F8FAFC]' : 'bg-white', has_issue && !is_replaced && !task_resolved && 'border-b border-amber-200'), style: nesting_depth > 0 ? { paddingLeft: `${12 + nesting_depth * 20}px` } : undefined, children: [is_replacement && (_jsx("span", { className: "text-[#94A3B8] flex-shrink-0 -ml-1", title: replaces_name ? `Replaces ${replaces_name}` : 'Replacement', children: _jsxs("svg", { className: "w-4 h-4", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("path", { d: "M4 2v8h8" }), _jsx("path", { d: "M9 7l3 3-3 3" })] }) })), _jsx(FileStatusIcon, { status: pipeline_status ?? null, is_replaced: is_replaced, className: "flex-shrink-0" }), _jsx("span", { className: cn('font-medium truncate flex-1', is_replaced ? 'text-[#94A3B8] line-through' : 'text-[#1a1a1a]'), children: item.file.file_name }), item.file.file_size && _jsx("span", { className: cn('text-[11px]', is_replaced ? 'text-[#CBD5E1]' : 'text-[#999]'), children: item.file.file_size }), is_replaced && (_jsxs("span", { className: "inline-flex items-center gap-0.5 px-1.5 py-px rounded text-[9px] font-medium text-[#94A3B8] bg-[#F1F5F9] flex-shrink-0", title: replaced_by_name ? `Replaced by ${replaced_by_name}` : 'Replaced', children: [_jsx("svg", { className: "w-2.5 h-2.5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", strokeWidth: 2, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 7l-7 7-7-7" }) }), "Replaced"] })), all_validation_passed && !task_resolved && (_jsxs("span", { className: "inline-flex items-center gap-0.5 px-1.5 py-px rounded text-[9px] font-medium text-green-600 bg-green-50 flex-shrink-0", title: "All validation checks passed", children: [_jsx("svg", { className: "w-2.5 h-2.5", fill: "currentColor", viewBox: "0 0 20 20", children: _jsx("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", clipRule: "evenodd" }) }), "Passed"] })), has_validation_issues && all_issues_resolved && role === 'agent' && !effective_sent_back && !effective_accepted && !task_resolved && (_jsxs("button", { type: "button", onClick: () => set_rfi_expanded(prev => !prev), className: "inline-flex items-center gap-0.5 px-1.5 py-px rounded text-[9px] font-medium cursor-pointer transition-colors flex-shrink-0 text-amber-600 bg-amber-50 hover:bg-amber-100", title: "Client responded \u2014 click to review", children: [_jsx("svg", { className: "w-2.5 h-2.5", fill: "currentColor", viewBox: "0 0 20 20", children: _jsx("path", { fillRule: "evenodd", d: "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z", clipRule: "evenodd" }) }), "Pending Review"] })), effective_accepted && !effective_sent_back && !task_resolved && (_jsxs("span", { className: "inline-flex items-center gap-0.5 px-1.5 py-px rounded text-[9px] font-medium text-green-600 bg-green-50 flex-shrink-0", title: "Agent accepted the client's response", children: [_jsx("svg", { className: "w-2.5 h-2.5", fill: "currentColor", viewBox: "0 0 20 20", children: _jsx("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", clipRule: "evenodd" }) }), "Accepted"] })), has_validation_issues && all_issues_resolved && role === 'client' && !task_resolved && (_jsxs("button", { type: "button", onClick: () => set_rfi_expanded(prev => !prev), className: "inline-flex items-center gap-0.5 px-1.5 py-px rounded text-[9px] font-medium cursor-pointer transition-colors flex-shrink-0 text-amber-600 bg-amber-50 hover:bg-amber-100", title: "All issues resolved \u2014 click to view", children: [_jsx("svg", { className: "w-2.5 h-2.5", fill: "currentColor", viewBox: "0 0 20 20", children: _jsx("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", clipRule: "evenodd" }) }), issue_rows.length, " Resolved"] })), has_validation_issues && !all_issues_resolved && !task_resolved && !effective_sent_back && !effective_accepted && (_jsxs("button", { type: "button", onClick: () => set_rfi_expanded(prev => !prev), className: "inline-flex items-center gap-0.5 px-1.5 py-px rounded text-[9px] font-medium cursor-pointer transition-colors flex-shrink-0 text-red-600 bg-red-50 hover:bg-red-100", title: "Click to view and respond to validation issues", children: [_jsx("svg", { className: "w-2.5 h-2.5", fill: "currentColor", viewBox: "0 0 20 20", children: _jsx("path", { fillRule: "evenodd", d: "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z", clipRule: "evenodd" }) }), pending_issue_count, " issue", pending_issue_count !== 1 ? 's' : ''] })), effective_sent_back && !task_resolved && !sent_back_resolved && (_jsxs("span", { className: "inline-flex items-center gap-0.5 px-1.5 py-px rounded text-[9px] font-medium text-blue-600 bg-blue-50 flex-shrink-0", title: "Issues sent back to client", children: [_jsx("svg", { className: "w-2.5 h-2.5", fill: "currentColor", viewBox: "0 0 20 20", children: _jsx("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", clipRule: "evenodd" }) }), "Sent Back"] })), effective_sent_back && sent_back_resolved && !task_resolved && (_jsxs("span", { className: "inline-flex items-center gap-0.5 px-1.5 py-px rounded text-[9px] font-medium text-[#059669] bg-[#ECFDF5] flex-shrink-0", title: "Issues addressed in the spawned question", children: [_jsx("svg", { className: "w-2.5 h-2.5", fill: "currentColor", viewBox: "0 0 20 20", children: _jsx("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", clipRule: "evenodd" }) }), "Resolved"] })), !is_processing && doc_check?.relevance && !task_resolved && ((() => {
113
+ const rel = doc_check.relevance;
114
+ const cfg = rel === 'matches'
115
+ ? { label: 'Matches', tone: 'text-[#059669] bg-[#ECFDF5]' }
116
+ : rel === 'mismatch'
117
+ ? { label: 'Wrong receipt', tone: 'text-[#B45309] bg-[#FFF7ED]' }
118
+ : rel === 'unclear'
119
+ ? { label: 'Unclear', tone: 'text-[#475569] bg-[#F1F5F9]' }
120
+ : { label: 'Off-topic', tone: 'text-[#DC2626] bg-[#FEE2E2]' };
121
+ return (_jsx("span", { className: cn('inline-flex items-center gap-0.5 px-1.5 py-px rounded text-[9px] font-medium flex-shrink-0', cfg.tone), title: doc_check.relevance_reason, children: cfg.label }));
122
+ })()), is_passed && !is_processing && !has_validation_issues && !all_validation_passed && !all_issues_resolved && !effective_sent_back && !task_resolved && !doc_check?.relevance && (_jsxs("span", { className: "text-[11px] text-[#059669] font-medium flex items-center gap-1", children: [_jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-[#059669]" }), "Verified"] })), has_issue && !is_processing && !has_validation_issues && !all_issues_resolved && !task_resolved && !doc_check?.relevance && (_jsxs("span", { className: "text-[11px] text-amber-600 font-medium flex items-center gap-1", children: [_jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-amber-500" }), "Issue found"] })), task_resolved && !is_processing && (_jsxs("span", { className: "text-[11px] text-[#059669] font-medium flex items-center gap-1", children: [_jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-[#059669]" }), "Resolved"] })), role === 'agent' && effective_classification && !is_processing && (_jsx(DocumentTypeEditor, { current: effective_classification.document_type, available: available_document_types ?? [], on_change: on_change_document_type
123
+ ? (new_type) => on_change_document_type(item, new_type)
124
+ : undefined, disabled: task_resolved })), !is_processing && info_icon_visible && (_jsx("button", { onClick: () => set_info_dialog_open(true), className: "p-0.5 rounded text-[#94A3B8] hover:text-blue-500 transition-colors flex-shrink-0 cursor-pointer", title: "File details", children: _jsx("svg", { className: "w-3.5 h-3.5", fill: "currentColor", viewBox: "0 0 20 20", children: _jsx("path", { fillRule: "evenodd", d: "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z", clipRule: "evenodd" }) }) })), view_button_variant === 'icon' ? (_jsx("button", { onClick: () => on_view?.(item), className: "p-0.5 rounded text-[#94A3B8] hover:text-[#2563EB] transition-colors flex-shrink-0 cursor-pointer", title: "View file", children: _jsx(AiOutlineEye, { className: "w-4 h-4" }) })) : (_jsx("button", { onClick: () => on_view?.(item), className: "text-[11px] text-[#2563EB] font-medium opacity-0 group-hover:opacity-100 transition-opacity cursor-pointer", children: "View" })), on_remove && !task_resolved && (_jsx("button", { onClick: () => on_remove(item), className: "p-0.5 rounded text-[#94A3B8] hover:text-[#EF4444] transition-colors flex-shrink-0 opacity-0 group-hover:opacity-100 cursor-pointer", title: "Remove file", children: _jsx("svg", { className: "w-3.5 h-3.5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) })), keep_selected !== undefined && show_keep_checkbox !== false && (_jsx("input", { type: "checkbox", checked: keep_selected, onChange: () => on_keep_change?.({ [item.content_id]: !keep_selected }), disabled: task_resolved, className: "ml-1 rounded border-[#CBD5E1] text-[#2563EB] focus:ring-[#2563EB] flex-shrink-0 disabled:cursor-not-allowed disabled:opacity-60 cursor-pointer", title: task_resolved
125
+ ? 'Locked — task is resolved'
126
+ : keep_selected
127
+ ? 'Kept — uncheck to drop from collected data'
128
+ : 'Mark as kept for collected data' }))] }), is_processing && (_jsxs("div", { className: "px-3 py-1.5 bg-[#FAFBFC] border-t border-[#F1F5F9] flex items-center gap-1.5", children: [_jsxs("svg", { className: "h-2.5 w-2.5 flex-shrink-0 text-blue-500 animate-spin", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", children: [_jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), _jsx("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" })] }), _jsx("span", { className: "text-[11px] italic text-[#94A3B8]", children: pipeline_status === 'classifying' ? 'Classifying document...' : 'Running validation rules...' })] })), pipeline_status === 'error' && (_jsx("div", { className: "px-3 py-1.5 bg-red-50/50 border-t border-red-100 flex items-center gap-1.5", children: _jsx("span", { className: "text-[11px] italic text-red-400", children: "Processing failed \u2014 classification or validation unavailable" }) })), has_issue && !has_validation_issues && !all_issues_resolved && !task_resolved && !doc_check?.relevance && (_jsxs("div", { className: "bg-amber-50/60 px-3 py-2 space-y-1", children: [doc_check?.summary && (_jsxs("div", { className: "flex items-start gap-2 text-[12px] text-amber-900", children: [_jsx("span", { className: "mt-0.5 text-amber-500 flex-shrink-0", children: "\u26A0" }), _jsx("p", { className: "flex-1 font-semibold", children: doc_check.summary })] })), doc_check?.issues?.map((issue, i) => (_jsxs("div", { className: cn('flex items-start gap-2 text-[12px] text-amber-800', doc_check?.summary && 'pl-5'), children: [!doc_check?.summary && _jsx("span", { className: "mt-0.5 text-amber-500 flex-shrink-0", children: "\u26A0" }), _jsxs("p", { className: "flex-1", children: [_jsxs("span", { className: "font-medium", children: [item.file.file_name, ":"] }), " ", issue.description] })] }, i)))] })), rfi_expanded && has_validation_issues && role === 'client' && clarification_items.length > 0 && (_jsx("div", { className: "border-t border-[#E2E8F0] bg-[#FAFBFC]", children: clarification_items.map(clr_item => (_jsx("div", { className: "px-3 py-2", children: _jsx(HazoCollabFormRFIbox, { item: clr_item, mode: "respond", display: "collapsed", file_manager: file_manager, on_respond: (id, response) => {
129
+ set_rfi_responded(prev => new Set([...prev, id]));
130
+ set_rfi_responses(prev => {
131
+ const next = new Map(prev);
132
+ next.set(id, response);
133
+ return next;
134
+ });
135
+ on_clarification_respond?.(id, response);
136
+ // Persist to ContentItem for localStorage survival
137
+ const updated_responses = { ...(item.issue_responses || {}) };
138
+ updated_responses[id] = {
139
+ response_choice: response.response_choice,
140
+ user_comment: response.user_comment,
141
+ responded_at: new Date().toISOString(),
142
+ };
143
+ on_update_content_item?.(item.content_id, { issue_responses: updated_responses });
144
+ // Add replacement files to the main thread for pipeline processing
145
+ if (response.response_choice === 'replace_document' && response.response_files && response.response_files.length > 0) {
146
+ on_replacement_files?.(item.content_id, response.response_files);
147
+ }
148
+ const new_responded = new Set([...rfi_responded, id]);
149
+ const all_done = issue_rows.every(row => new_responded.has(row.clr_id));
150
+ if (all_done)
151
+ set_rfi_expanded(false);
152
+ }, on_accept: (id) => {
153
+ set_rfi_responded(prev => new Set([...prev, id]));
154
+ } }) }, clr_item.id))) })), rfi_expanded && has_validation_issues && role === 'agent' && !task_resolved && visible_rules.length > 0 && (() => {
155
+ // File-level Accept all stamps every visible rule as accepted.
156
+ const accept_all_label = visible_rules.length === 1 ? 'Accept' : 'Accept all';
157
+ const handle_accept_all = () => {
158
+ on_submit_decisions?.(item, visible_rules.map(r => ({
159
+ rule_id: r.rule_id,
160
+ action: 'accepted',
161
+ rule_result: r,
162
+ })));
163
+ set_rfi_expanded(false);
164
+ };
165
+ // Single-rule fast path — keep today's UX entirely.
166
+ if (visible_rules.length === 1) {
167
+ const rule_result = visible_rules[0];
168
+ return (_jsxs("div", { className: "border-t border-[#E2E8F0] bg-[#FAFBFC] px-3 py-3 space-y-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: "text-[10px] font-semibold text-[#64748B] uppercase tracking-wider", children: "Client Responses \u2014 Pending Review" }), _jsx("button", { type: "button", onClick: handle_accept_all, className: "text-[11px] font-medium text-[#059669] border border-[#059669]/30 bg-green-50 px-3 py-1 rounded hover:bg-green-100 cursor-pointer", children: accept_all_label })] }), _jsx(IssueGroupTree, { mode: "agent", content_id: item.content_id, result: rule_result, on_accept: () => {
169
+ on_submit_decisions?.(item, [{
170
+ rule_id: rule_result.rule_id,
171
+ action: 'accepted',
172
+ rule_result,
173
+ }]);
174
+ set_rfi_expanded(false);
175
+ }, on_send_back: (send_back_payloads) => {
176
+ // The IssueGroupTree's on_send_back delivers the agent's
177
+ // edited comment in send_back_payloads[0].agent_feedback.
178
+ const payload = send_back_payloads[0];
179
+ on_submit_decisions?.(item, [{
180
+ rule_id: rule_result.rule_id,
181
+ action: 'sent_back',
182
+ comment: payload?.agent_feedback,
183
+ rule_result,
184
+ }]);
185
+ set_rfi_expanded(false);
186
+ } })] }));
187
+ }
188
+ // Multi-rule batch UI.
189
+ return (_jsx(BatchDecisionPanel, { item: item, visible_rules: visible_rules, on_submit: (decisions) => {
190
+ on_submit_decisions?.(item, decisions);
191
+ set_rfi_expanded(false);
192
+ }, on_accept_all: handle_accept_all, accept_all_label: accept_all_label }));
193
+ })(), role === 'agent' && ai_result?.split_items && ai_result.split_items.length > 0 && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "px-3 py-1.5 bg-[#F1F5F9] text-[10px] text-[#64748B] uppercase tracking-wider font-medium border-t border-[#E2E8F0]", children: [ai_result.split_items.length, " documents detected in this file"] }), ai_result.split_items.map(split => (_jsxs("div", { className: "flex items-center gap-2.5 px-3 py-2 text-[12px] border-t border-[#F1F5F9] bg-white group hover:bg-[#FAFBFC]", children: [_jsx(PdfIcon, { className: "w-3.5 h-3.5" }), _jsx("span", { className: "text-[#94A3B8] text-[11px] w-16 flex-shrink-0", children: split.split_info?.page_range }), _jsx("span", { className: "text-[#0F172A] font-medium flex-1", children: split.split_info?.label }), _jsx("button", { onClick: () => on_view?.(split), className: "text-[#2563EB] text-[11px] opacity-0 group-hover:opacity-100 cursor-pointer", children: "View" })] }, split.content_id))), ai_result.review_status === 'pending' && (_jsxs("div", { className: "px-3 py-2 bg-[#F8FAFC] flex gap-2 border-t border-[#E2E8F0]", children: [_jsx("button", { onClick: () => on_accept?.(ai_result.content_ref), className: "text-[11px] font-medium text-[#2563EB] hover:underline cursor-pointer", children: "Accept splits" }), _jsx("button", { className: "text-[11px] text-[#94A3B8] hover:underline cursor-pointer", children: "Adjust" })] }))] })), _jsx(FileInfoDialog, { open: info_dialog_open, on_open_change: set_info_dialog_open, file_name: item.file.file_name, classification: effective_classification, validation_results: effective_validation_results })] }));
194
+ }
195
+ function BatchDecisionPanel({ item, visible_rules, on_submit, on_accept_all, accept_all_label }) {
196
+ const [decisions, set_decisions] = useState({});
197
+ const [comments, set_comments] = useState({});
198
+ // Default comment per rule: the LLM's client_comment from the rule's first
199
+ // issue, falling back to the issue_description (commit 8295db2 pattern).
200
+ const default_comment_for = (rule) => {
201
+ const first = rule.issues[0];
202
+ if (!first)
203
+ return '';
204
+ const c = first.client_comment;
205
+ return (c && c.trim()) ? c : first.issue_description;
206
+ };
207
+ const decided_count = visible_rules.filter(r => {
208
+ const v = decisions[r.rule_id];
209
+ return v === 'accepted' || v === 'sent_back';
210
+ }).length;
211
+ const can_submit = decided_count > 0;
212
+ const handle_submit = () => {
213
+ const payload = visible_rules
214
+ .map(r => {
215
+ const v = decisions[r.rule_id];
216
+ if (v !== 'accepted' && v !== 'sent_back')
217
+ return null;
218
+ const comment = v === 'sent_back'
219
+ ? (comments[r.rule_id] || default_comment_for(r))
220
+ : undefined;
221
+ return { rule_id: r.rule_id, action: v, comment, rule_result: r };
222
+ })
223
+ .filter((d) => d !== null);
224
+ on_submit(payload);
225
+ };
226
+ return (_jsxs("div", { className: "border-t border-[#E2E8F0] bg-[#FAFBFC] px-3 py-3 space-y-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: "text-[10px] font-semibold text-[#64748B] uppercase tracking-wider", children: "Client Responses \u2014 Pending Review" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { type: "button", onClick: on_accept_all, className: "text-[11px] font-medium text-[#059669] border border-[#059669]/30 bg-green-50 px-3 py-1 rounded hover:bg-green-100 cursor-pointer", children: accept_all_label }), _jsxs("button", { type: "button", disabled: !can_submit, onClick: handle_submit, className: "text-[11px] font-medium text-white bg-[#2563EB] hover:bg-[#1D4ED8] px-3 py-1 rounded cursor-pointer disabled:bg-[#94A3B8] disabled:cursor-not-allowed", children: ["Submit Decisions", decided_count > 0 ? ` (${decided_count})` : ''] })] })] }), visible_rules.map(rule => {
227
+ const value = decisions[rule.rule_id] ?? 'pending';
228
+ const default_comment = default_comment_for(rule);
229
+ const comment = comments[rule.rule_id] ?? '';
230
+ return (_jsx(RuleDecisionRow, { content_id: item.content_id, rule_result: rule, value: value, comment: comment, default_comment: default_comment, on_value_change: (next) => {
231
+ set_decisions(prev => ({ ...prev, [rule.rule_id]: next }));
232
+ if (next === 'sent_back') {
233
+ // Pre-fill with the LLM-suggested comment so the agent sees
234
+ // editable text rather than a placeholder-only empty textarea.
235
+ set_comments(prev => prev[rule.rule_id] !== undefined
236
+ ? prev
237
+ : { ...prev, [rule.rule_id]: default_comment_for(rule) });
238
+ }
239
+ else {
240
+ // Discard the in-flight comment when toggling away from Send Back.
241
+ set_comments(prev => {
242
+ const { [rule.rule_id]: _, ...rest } = prev;
243
+ return rest;
244
+ });
245
+ }
246
+ }, on_comment_change: (next) => {
247
+ set_comments(prev => ({ ...prev, [rule.rule_id]: next }));
248
+ } }, rule.rule_id));
249
+ })] }));
250
+ }
251
+ //# sourceMappingURL=file_bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file_bar.js","sourceRoot":"","sources":["../../../../src/components/thread_form/components/file_bar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * FileInfoDialog — shows classification tags, document type, validation results,
3
+ * and debug JSON for a file in the thread form.
4
+ */
5
+ import type { ClassificationResult } from '../types.js';
6
+ import type { ValidationRuleResult } from '../../../types/validation.js';
7
+ export interface FileInfoDialogProps {
8
+ open: boolean;
9
+ on_open_change: (open: boolean) => void;
10
+ file_name: string;
11
+ classification?: ClassificationResult | null;
12
+ validation_results?: ValidationRuleResult[];
13
+ }
14
+ export declare function FileInfoDialog({ open, on_open_change, file_name, classification, validation_results, }: FileInfoDialogProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=file_info_dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file_info_dialog.d.ts","sourceRoot":"","sources":["../../../../src/components/thread_form/components/file_info_dialog.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAIzE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,cAAc,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC7C,kBAAkB,CAAC,EAAE,oBAAoB,EAAE,CAAC;CAC7C;AAWD,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,cAAc,EACd,SAAS,EACT,cAAc,EACd,kBAAuB,GACxB,EAAE,mBAAmB,2CA4PrB"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * FileInfoDialog — shows classification tags, document type, validation results,
3
+ * and debug JSON for a file in the thread form.
4
+ */
5
+ 'use client';
6
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
7
+ import { useState } from 'react';
8
+ import { cn } from './shared.js';
9
+ import { HazoUiDialog, Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from 'hazo_ui';
10
+ /** Get a human-readable name for a validation rule */
11
+ function get_rule_display_name(r, index) {
12
+ // Prefer rule_name if it's a real name (not a UUID)
13
+ if (r.rule_name && !/^[0-9a-f]{8}-/i.test(r.rule_name))
14
+ return r.rule_name;
15
+ // Try rule_id if it's human-friendly
16
+ if (r.rule_id && !/^[0-9a-f]{8}-/i.test(r.rule_id))
17
+ return r.rule_id;
18
+ return `Validation Rule ${index + 1}`;
19
+ }
20
+ export function FileInfoDialog({ open, on_open_change, file_name, classification, validation_results = [], }) {
21
+ const [debug_expanded, set_debug_expanded] = useState(false);
22
+ const [copied, set_copied] = useState(false);
23
+ const has_classification = !!classification;
24
+ const has_validations = validation_results.length > 0;
25
+ const debug_payload = JSON.stringify({
26
+ ...(has_classification ? { classification } : {}),
27
+ ...(has_validations ? { validation_results } : {}),
28
+ }, null, 2);
29
+ const handle_copy_debug = async (e) => {
30
+ e.stopPropagation();
31
+ try {
32
+ await navigator.clipboard.writeText(debug_payload);
33
+ set_copied(true);
34
+ setTimeout(() => set_copied(false), 1500);
35
+ }
36
+ catch {
37
+ // Clipboard API unavailable (e.g., insecure context) — silently ignore.
38
+ }
39
+ };
40
+ const issues_count = validation_results.filter(r => r.issues.length > 0).length;
41
+ const passed_count = validation_results.filter(r => r.issues.length === 0).length;
42
+ const document_type_label = classification
43
+ ? classification.document_type.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase())
44
+ : 'Not classified yet';
45
+ return (_jsx(HazoUiDialog, { open: open, onOpenChange: on_open_change, title: "File Details", description: file_name, footerContent: _jsx(_Fragment, {}), footerClassName: "!p-0 !border-0", children: _jsxs("div", { className: "space-y-5 py-2", children: [_jsxs("div", { className: "flex items-center gap-3 bg-[#EFF6FF] border border-[#BFDBFE] rounded-md px-4 py-3", children: [_jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("div", { className: "text-[10px] font-semibold text-[#1D4ED8] uppercase tracking-wider mb-0.5", children: "Document Type" }), _jsx("div", { className: cn('text-[16px] font-semibold truncate', classification ? 'text-[#0F172A]' : 'text-[#94A3B8] italic'), children: document_type_label })] }), has_classification && (_jsxs("span", { className: cn('text-[11px] font-medium px-2 py-1 rounded flex-shrink-0', classification.confidence >= 0.8 ? 'bg-green-100 text-green-700' :
46
+ classification.confidence >= 0.5 ? 'bg-amber-100 text-amber-700' :
47
+ 'bg-red-100 text-red-700'), children: [Math.round(classification.confidence * 100), "% confidence"] }))] }), has_classification && (classification.document_date || classification.document_nature) && (_jsxs("div", { children: [_jsx("h4", { className: "text-[12px] font-semibold text-[#64748B] uppercase tracking-wider mb-2", children: "Classification Details" }), _jsxs("div", { className: "bg-[#F8FAFC] border border-[#E2E8F0] rounded-md p-3 space-y-2", children: [classification.document_date && (_jsxs("div", { className: "text-[12px] text-[#64748B]", children: [_jsx("span", { className: "font-medium", children: "Date:" }), " ", classification.document_date] })), classification.document_nature && (_jsxs("div", { className: "text-[12px] text-[#64748B]", children: [_jsx("span", { className: "font-medium", children: "Nature:" }), " ", classification.document_nature] }))] })] })), has_classification && classification.tags.length > 0 && (() => {
48
+ const reason_by_tag = new Map((classification.tag_reasons ?? []).map(tr => [tr.name, tr.reason]));
49
+ return (_jsxs("div", { children: [_jsx("h4", { className: "text-[12px] font-semibold text-[#64748B] uppercase tracking-wider mb-2", children: "Tags" }), _jsx(TooltipProvider, { delayDuration: 150, children: _jsx("div", { className: "flex flex-wrap gap-1.5", children: classification.tags.map((tag, i) => {
50
+ const reason = reason_by_tag.get(tag);
51
+ const label = tag.replace(/_/g, ' ');
52
+ const pill = (_jsx("span", { className: cn('text-[11px] text-[#64748B] bg-[#F1F5F9] border border-[#E2E8F0] px-2 py-0.5 rounded-full', reason && 'cursor-help'), children: label }));
53
+ if (!reason)
54
+ return _jsx("span", { children: pill }, i);
55
+ return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: pill }), _jsx(TooltipContent, { side: "top", className: "max-w-xs text-[11px] leading-snug", children: reason })] }, i));
56
+ }) }) })] }));
57
+ })(), has_validations && (_jsxs("div", { children: [_jsxs("h4", { className: "text-[12px] font-semibold text-[#64748B] uppercase tracking-wider mb-2", children: ["Validation Results", issues_count > 0 && (_jsxs("span", { className: "ml-2 text-[10px] font-medium text-red-600 bg-red-50 px-1.5 py-0.5 rounded", children: [issues_count, " issue", issues_count !== 1 ? 's' : ''] })), passed_count > 0 && (_jsxs("span", { className: "ml-1 text-[10px] font-medium text-green-600 bg-green-50 px-1.5 py-0.5 rounded", children: [passed_count, " passed"] }))] }), _jsx("div", { className: "space-y-1.5", children: validation_results.map((r, i) => {
58
+ const rule_name = get_rule_display_name(r, i);
59
+ const has_issue = r.issues.length > 0;
60
+ const pass_detail = r.summary || 'Passed';
61
+ return (_jsxs("div", { className: cn('text-[12px] rounded border overflow-hidden', has_issue ? 'bg-red-50/50 border-red-200' : 'bg-green-50/50 border-green-200'), children: [_jsxs("div", { className: cn('flex items-center gap-2 px-3 py-1.5 border-b', has_issue ? 'border-red-200' : 'border-green-200'), children: [has_issue ? (_jsx("span", { className: "text-red-500 flex-shrink-0", children: "\u2715" })) : (_jsx("span", { className: "text-green-500 flex-shrink-0", children: "\u2713" })), _jsx("span", { className: "font-semibold text-[#0F172A]", children: rule_name }), r.issues.length > 1 && (_jsxs("span", { className: "text-[10px] text-[#94A3B8] bg-white border border-[#E2E8F0] px-1.5 py-px rounded", children: [r.issues.length, " issues"] })), r.confidence != null && (_jsxs("span", { className: "ml-auto text-[10px] text-[#94A3B8]", children: ["Confidence: ", Math.round(r.confidence * 100), "%"] }))] }), _jsx("div", { className: cn(r.issues.length > 1 && 'divide-y divide-red-200/40'), children: has_issue ? (r.issues.map(issue => (_jsx("div", { className: "px-3 py-2 text-[#64748B]", children: _jsx("p", { children: issue.issue_description }) }, issue.issue_id)))) : (_jsx("div", { className: "px-3 py-2", children: _jsx("p", { className: "text-[#94A3B8]", children: pass_detail }) })) })] }, i));
62
+ }) })] })), (has_classification || has_validations) && (_jsxs("div", { className: "border border-[#E2E8F0] rounded-md overflow-hidden", children: [_jsxs("div", { className: "w-full flex items-center gap-2 px-3 py-2 bg-[#F8FAFC] text-[11px] text-[#94A3B8] hover:bg-[#F1F5F9] transition-colors", children: [_jsxs("button", { type: "button", onClick: () => set_debug_expanded(p => !p), className: "flex items-center gap-2 flex-1 cursor-pointer text-left", children: [_jsx("svg", { className: cn('w-3 h-3 transition-transform', debug_expanded && 'rotate-90'), fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) }), _jsx("span", { className: "font-medium", children: "Debug JSON" })] }), _jsx("button", { type: "button", onClick: handle_copy_debug, className: cn('inline-flex items-center gap-1 px-2 py-0.5 rounded border border-[#E2E8F0] bg-white hover:bg-[#F1F5F9] transition-colors cursor-pointer', copied ? 'text-[#059669] border-[#059669]/30' : 'text-[#64748B]'), title: "Copy JSON to clipboard", children: copied ? (_jsxs(_Fragment, { children: [_jsx("svg", { className: "w-3 h-3", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2.4, strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("polyline", { points: "20 6 9 17 4 12" }) }), _jsx("span", { className: "font-medium", children: "Copied" })] })) : (_jsxs(_Fragment, { children: [_jsxs("svg", { className: "w-3 h-3", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("rect", { x: "9", y: "9", width: "13", height: "13", rx: "2", ry: "2" }), _jsx("path", { d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" })] }), _jsx("span", { className: "font-medium", children: "Copy" })] })) })] }), debug_expanded && (_jsxs("div", { className: "bg-[#1E293B] text-[#E2E8F0] overflow-auto max-h-[300px]", children: [has_classification && (_jsxs("div", { className: "px-3 py-2 border-b border-[#334155]", children: [_jsx("div", { className: "text-[10px] font-semibold text-[#94A3B8] uppercase tracking-wider mb-1", children: "Classification Result" }), _jsx("pre", { className: "text-[10px] font-mono whitespace-pre-wrap", children: JSON.stringify(classification, null, 2) })] })), has_validations && (_jsxs("div", { className: "px-3 py-2", children: [_jsx("div", { className: "text-[10px] font-semibold text-[#94A3B8] uppercase tracking-wider mb-1", children: "Validation Results" }), _jsx("pre", { className: "text-[10px] font-mono whitespace-pre-wrap", children: JSON.stringify(validation_results, null, 2) })] }))] }))] }))] }) }));
63
+ }
64
+ //# sourceMappingURL=file_info_dialog.js.map