briefloop 0.22.1__tar.gz → 0.22.3__tar.gz

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 (661) hide show
  1. {briefloop-0.22.1 → briefloop-0.22.3}/CHANGELOG.md +12 -0
  2. {briefloop-0.22.1 → briefloop-0.22.3}/PKG-INFO +1 -1
  3. briefloop-0.22.3/VERSION +1 -0
  4. {briefloop-0.22.1 → briefloop-0.22.3}/desktop/electron/package-lock.json +2 -2
  5. {briefloop-0.22.1 → briefloop-0.22.3}/desktop/electron/package.json +1 -1
  6. {briefloop-0.22.1 → briefloop-0.22.3}/frontend/app.js +96 -31
  7. briefloop-0.22.3/frontend/report-panels.js +14 -0
  8. {briefloop-0.22.1 → briefloop-0.22.3}/frontend/task-progress.js +1 -1
  9. {briefloop-0.22.1 → briefloop-0.22.3}/pyproject.toml +1 -1
  10. briefloop-0.22.3/src/briefloop/__init__.py +1 -0
  11. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/document_export.py +49 -4
  12. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/export_jobs.py +1 -1
  13. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/models.py +4 -2
  14. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/research_plan.py +2 -0
  15. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/runtime.py +73 -38
  16. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/server.py +7 -3
  17. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/app.js +87 -85
  18. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/index.html +2 -2
  19. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/style.css +9 -0
  20. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/store.py +2 -0
  21. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/task_progress.py +3 -1
  22. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop.egg-info/PKG-INFO +1 -1
  23. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop.egg-info/SOURCES.txt +5 -0
  24. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_open_brief_status.mjs +1 -1
  25. briefloop-0.22.3/tests/frontend_pending_report.mjs +18 -0
  26. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_report_outline.mjs +1 -1
  27. briefloop-0.22.3/tests/frontend_report_panels.mjs +35 -0
  28. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_save_barrier.mjs +1 -1
  29. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_export_admission.py +27 -0
  30. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_fact_check_orchestration.py +1 -1
  31. briefloop-0.22.3/tests/test_reader_source_export.py +44 -0
  32. briefloop-0.22.3/tests/test_report_concurrency.py +48 -0
  33. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_research_plan.py +11 -1
  34. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_runtime_concurrency.py +1 -1
  35. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_runtime_settlement.py +2 -2
  36. briefloop-0.22.1/VERSION +0 -1
  37. briefloop-0.22.1/src/briefloop/__init__.py +0 -1
  38. {briefloop-0.22.1 → briefloop-0.22.3}/.gitattributes +0 -0
  39. {briefloop-0.22.1 → briefloop-0.22.3}/CONTRIBUTING.md +0 -0
  40. {briefloop-0.22.1 → briefloop-0.22.3}/KNOWN_ISSUES.md +0 -0
  41. {briefloop-0.22.1 → briefloop-0.22.3}/LICENSE +0 -0
  42. {briefloop-0.22.1 → briefloop-0.22.3}/MANIFEST.in +0 -0
  43. {briefloop-0.22.1 → briefloop-0.22.3}/README.md +0 -0
  44. {briefloop-0.22.1 → briefloop-0.22.3}/SECURITY.md +0 -0
  45. {briefloop-0.22.1 → briefloop-0.22.3}/THIRD_PARTY_NOTICES.md +0 -0
  46. {briefloop-0.22.1 → briefloop-0.22.3}/bootstrap.py +0 -0
  47. {briefloop-0.22.1 → briefloop-0.22.3}/docs/WorkBuddy/345/244/226/351/203/250/345/205/245/345/217/243.md" +0 -0
  48. {briefloop-0.22.1 → briefloop-0.22.3}/docs/architecture.md +0 -0
  49. {briefloop-0.22.1 → briefloop-0.22.3}/docs/report-time-window.md +0 -0
  50. {briefloop-0.22.1 → briefloop-0.22.3}/docs/technical-report-0.21.0/evidence-index.md +0 -0
  51. {briefloop-0.22.1 → briefloop-0.22.3}/docs/technical-report-0.21.0/technical-report.md +0 -0
  52. {briefloop-0.22.1 → briefloop-0.22.3}/docs/windows.md +0 -0
  53. {briefloop-0.22.1 → briefloop-0.22.3}/docs//344/272/247/345/223/201/345/256/232/344/275/215/344/270/216/351/252/214/350/257/201.md" +0 -0
  54. {briefloop-0.22.1 → briefloop-0.22.3}/docs//344/274/232/350/256/256/347/272/252/350/246/201.md" +0 -0
  55. {briefloop-0.22.1 → briefloop-0.22.3}/docs//344/275/277/347/224/250/346/214/207/345/215/227.md" +0 -0
  56. {briefloop-0.22.1 → briefloop-0.22.3}/docs//345/215/207/347/272/247/350/257/264/346/230/216.md" +0 -0
  57. {briefloop-0.22.1 → briefloop-0.22.3}/docs//345/233/276/350/241/250/344/270/216Excel.md" +0 -0
  58. {briefloop-0.22.1 → briefloop-0.22.3}/docs//345/244/232Runtime/344/270/216/346/250/241/345/236/213.md" +0 -0
  59. {briefloop-0.22.1 → briefloop-0.22.3}/docs//345/244/232/346/250/241/346/200/201/346/235/245/346/272/220.md" +0 -0
  60. {briefloop-0.22.1 → briefloop-0.22.3}/docs//345/256/232/346/227/266/346/212/245/345/221/212.md" +0 -0
  61. {briefloop-0.22.1 → briefloop-0.22.3}/docs//345/257/271/350/257/235/345/256/277/344/270/273/345/210/207/346/215/242.md" +0 -0
  62. {briefloop-0.22.1 → briefloop-0.22.3}/docs//346/212/245/345/221/212/347/274/226/350/276/221/344/270/216/346/250/241/346/235/277.md" +0 -0
  63. {briefloop-0.22.1 → briefloop-0.22.3}/docs//346/241/214/351/235/242/345/256/211/350/243/205/344/270/216/346/233/264/346/226/260.md" +0 -0
  64. {briefloop-0.22.1 → briefloop-0.22.3}/docs//346/267/261/345/272/246/347/240/224/347/251/266/344/270/216/344/272/213/345/256/236/346/240/270/346/237/245.md" +0 -0
  65. {briefloop-0.22.1 → briefloop-0.22.3}/docs//347/211/210/346/234/254/344/270/200/350/207/264/346/200/247/346/243/200/346/237/245.md" +0 -0
  66. {briefloop-0.22.1 → briefloop-0.22.3}/docs//350/241/214/344/270/232/346/212/245/345/221/212.md" +0 -0
  67. {briefloop-0.22.1 → briefloop-0.22.3}/docs//350/257/201/345/210/270/347/240/224/347/251/266.md" +0 -0
  68. {briefloop-0.22.1 → briefloop-0.22.3}/docs//350/257/201/346/215/256/344/270/216/347/273/223/350/256/272/350/277/275/346/272/257.md" +0 -0
  69. {briefloop-0.22.1 → briefloop-0.22.3}/docs//350/277/220/350/241/214/346/227/266/351/200/211/346/213/251/344/270/216/346/243/200/346/265/213.md" +0 -0
  70. {briefloop-0.22.1 → briefloop-0.22.3}/examples/internal-weekly-report/README.md +0 -0
  71. {briefloop-0.22.1 → briefloop-0.22.3}/examples/internal-weekly-report/report.md +0 -0
  72. {briefloop-0.22.1 → briefloop-0.22.3}/examples/internal-weekly-report/source.txt +0 -0
  73. {briefloop-0.22.1 → briefloop-0.22.3}/examples/meeting-minutes/transcript.txt +0 -0
  74. {briefloop-0.22.1 → briefloop-0.22.3}/examples/stock-research/earnings-event.txt +0 -0
  75. {briefloop-0.22.1 → briefloop-0.22.3}/frontend/clipboard.js +0 -0
  76. {briefloop-0.22.1 → briefloop-0.22.3}/frontend/connectors.js +0 -0
  77. {briefloop-0.22.1 → briefloop-0.22.3}/frontend/mcp-selection.js +0 -0
  78. {briefloop-0.22.1 → briefloop-0.22.3}/frontend/notifications.js +0 -0
  79. {briefloop-0.22.1 → briefloop-0.22.3}/frontend/polling.js +0 -0
  80. {briefloop-0.22.1 → briefloop-0.22.3}/frontend/review-status.js +0 -0
  81. {briefloop-0.22.1 → briefloop-0.22.3}/frontend/rich-document.js +0 -0
  82. {briefloop-0.22.1 → briefloop-0.22.3}/frontend/runtime-cards.js +0 -0
  83. {briefloop-0.22.1 → briefloop-0.22.3}/frontend/schedules.js +0 -0
  84. {briefloop-0.22.1 → briefloop-0.22.3}/frontend/uploads.js +0 -0
  85. {briefloop-0.22.1 → briefloop-0.22.3}/package-lock.json +0 -0
  86. {briefloop-0.22.1 → briefloop-0.22.3}/package.json +0 -0
  87. {briefloop-0.22.1 → briefloop-0.22.3}/probes/mcp_m0/README.md +0 -0
  88. {briefloop-0.22.1 → briefloop-0.22.3}/probes/mcp_m0/probe.py +0 -0
  89. {briefloop-0.22.1 → briefloop-0.22.3}/probes/mcp_m0/requirements.txt +0 -0
  90. {briefloop-0.22.1 → briefloop-0.22.3}/probes/mcp_m0/server.py +0 -0
  91. {briefloop-0.22.1 → briefloop-0.22.3}/runtime-bridge/README.md +0 -0
  92. {briefloop-0.22.1 → briefloop-0.22.3}/runtime-bridge/bridge.test.mjs +0 -0
  93. {briefloop-0.22.1 → briefloop-0.22.3}/runtime-bridge/build.mjs +0 -0
  94. {briefloop-0.22.1 → briefloop-0.22.3}/runtime-bridge/catalog.json +0 -0
  95. {briefloop-0.22.1 → briefloop-0.22.3}/runtime-bridge/main.ts +0 -0
  96. {briefloop-0.22.1 → briefloop-0.22.3}/runtime-bridge/pi.ts +0 -0
  97. {briefloop-0.22.1 → briefloop-0.22.3}/scripts/build_frontend.mjs +0 -0
  98. {briefloop-0.22.1 → briefloop-0.22.3}/scripts/build_frontend_licenses.mjs +0 -0
  99. {briefloop-0.22.1 → briefloop-0.22.3}/scripts/check_versions.py +0 -0
  100. {briefloop-0.22.1 → briefloop-0.22.3}/scripts/test_frontend.mjs +0 -0
  101. {briefloop-0.22.1 → briefloop-0.22.3}/setup.cfg +0 -0
  102. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/__main__.py +0 -0
  103. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/_entrypoint.py +0 -0
  104. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/agent_commands.py +0 -0
  105. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/app_server.py +0 -0
  106. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/audit_bundle.py +0 -0
  107. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/backends/__init__.py +0 -0
  108. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/backends/opencode_server.py +0 -0
  109. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/bocha.py +0 -0
  110. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/bridge_harness.py +0 -0
  111. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/chat_dispatch.py +0 -0
  112. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/chat_execution.py +0 -0
  113. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/chat_store.py +0 -0
  114. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/chat_tools.py +0 -0
  115. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/cli.py +0 -0
  116. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/company_context.py +0 -0
  117. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/conflicts.py +0 -0
  118. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/connectors/MATERIALS.md +0 -0
  119. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/connectors/README.md +0 -0
  120. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/connectors/__init__.py +0 -0
  121. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/connectors/config.py +0 -0
  122. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/connectors/grants.py +0 -0
  123. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/connectors/materials.py +0 -0
  124. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/connectors/receipts.py +0 -0
  125. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/connectors/runtime.py +0 -0
  126. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/connectors/runtime_tools.py +0 -0
  127. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/connectors/service.py +0 -0
  128. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/connectors/stdio_supervisor.py +0 -0
  129. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/connectors/task_client.py +0 -0
  130. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/connectors/tasks.py +0 -0
  131. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/connectors/transport.py +0 -0
  132. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/connectors/windows_acl.py +0 -0
  133. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/default_fonts.py +0 -0
  134. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/deliverable_spec.py +0 -0
  135. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/delivery_checks.py +0 -0
  136. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/demo.py +0 -0
  137. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/document_model.py +0 -0
  138. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/document_workflows.py +0 -0
  139. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/duckduckgo.py +0 -0
  140. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/evidence.py +0 -0
  141. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/execution_records.py +0 -0
  142. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/exports.py +0 -0
  143. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/external_client.py +0 -0
  144. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/external_requests.py +0 -0
  145. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/fact_check.py +0 -0
  146. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/fast_mode.py +0 -0
  147. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/figure_support.py +0 -0
  148. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/figures.py +0 -0
  149. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/harness.py +0 -0
  150. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/host_bins.py +0 -0
  151. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/industry_data.py +0 -0
  152. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/industry_export.py +0 -0
  153. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/interactive_runtime.py +0 -0
  154. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/learning.py +0 -0
  155. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/length.py +0 -0
  156. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/media.py +0 -0
  157. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/notifications.py +0 -0
  158. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/opencode_harness.py +0 -0
  159. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/parent_watch.py +0 -0
  160. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/platform_support.py +0 -0
  161. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/process_host.py +0 -0
  162. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/progress.py +0 -0
  163. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/projections.py +0 -0
  164. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/reconciliation.py +0 -0
  165. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/release.py +0 -0
  166. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/report_profiles.py +0 -0
  167. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/report_time.py +0 -0
  168. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/report_tools.py +0 -0
  169. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/research_budget.py +0 -0
  170. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/review.py +0 -0
  171. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/review_learning.py +0 -0
  172. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/revision_policy.py +0 -0
  173. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/rpc_writer.py +0 -0
  174. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/runtime_bridge.py +0 -0
  175. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/runtime_permissions.py +0 -0
  176. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/schedules.py +0 -0
  177. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/scout_tools.py +0 -0
  178. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/search_policy.py +0 -0
  179. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/skill_assets/briefloop-external/SKILL.md +0 -0
  180. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/skill_assets/duckduckgo/SKILL.md +0 -0
  181. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/skill_assets/multi-search/SKILL.md +0 -0
  182. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/skill_assets/tavily/SKILL.md +0 -0
  183. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/skills.py +0 -0
  184. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/software_version.py +0 -0
  185. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/source_updates.py +0 -0
  186. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/sources.py +0 -0
  187. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/frontend-licenses.txt +0 -0
  188. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-aider.png +0 -0
  189. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-amr.svg +0 -0
  190. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-antigravity.svg +0 -0
  191. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-bridge.LICENSE.txt +0 -0
  192. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-bridge.NOTICE.txt +0 -0
  193. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-bridge.mjs +0 -0
  194. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-claude.svg +0 -0
  195. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-codebuddy.svg +0 -0
  196. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-codex.svg +0 -0
  197. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-copilot.svg +0 -0
  198. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-cursor-agent.svg +0 -0
  199. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-deepseek.svg +0 -0
  200. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-devin.png +0 -0
  201. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-grok-build.svg +0 -0
  202. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-hermes.svg +0 -0
  203. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-kilo.svg +0 -0
  204. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-kimi.svg +0 -0
  205. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-kiro.svg +0 -0
  206. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-mimo.svg +0 -0
  207. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-opencode.svg +0 -0
  208. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-pi.svg +0 -0
  209. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-qoder.svg +0 -0
  210. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-qwen.svg +0 -0
  211. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-reasonix.svg +0 -0
  212. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-trae-cli.png +0 -0
  213. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/static/runtime-vibe.svg +0 -0
  214. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/task_notify.py +0 -0
  215. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/tavily.py +0 -0
  216. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/academic-paper-zh-t1.docx +0 -0
  217. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/academic-paper-zh-t1.spec.json +0 -0
  218. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/academic-paper-zh-t2.docx +0 -0
  219. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/academic-paper-zh-t2.spec.json +0 -0
  220. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/academic-paper-zh-t3.docx +0 -0
  221. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/academic-paper-zh-t3.spec.json +0 -0
  222. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/academic-paper-zh-t4.docx +0 -0
  223. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/academic-paper-zh-t4.spec.json +0 -0
  224. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/academic-paper-zh-t5.docx +0 -0
  225. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/academic-paper-zh-t5.spec.json +0 -0
  226. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/annual-report-zh-t1.docx +0 -0
  227. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/annual-report-zh-t1.spec.json +0 -0
  228. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/annual-report-zh-t2.docx +0 -0
  229. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/annual-report-zh-t2.spec.json +0 -0
  230. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/annual-report-zh-t3.docx +0 -0
  231. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/annual-report-zh-t3.spec.json +0 -0
  232. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/annual-report-zh-t4.docx +0 -0
  233. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/annual-report-zh-t4.spec.json +0 -0
  234. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/annual-report-zh-t5.docx +0 -0
  235. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/annual-report-zh-t5.spec.json +0 -0
  236. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/business-report-zh-t1.docx +0 -0
  237. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/business-report-zh-t1.spec.json +0 -0
  238. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/business-report-zh-t2.docx +0 -0
  239. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/business-report-zh-t2.spec.json +0 -0
  240. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/business-report-zh-t3.docx +0 -0
  241. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/business-report-zh-t3.spec.json +0 -0
  242. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/business-report-zh-t4.docx +0 -0
  243. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/business-report-zh-t4.spec.json +0 -0
  244. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/business-report-zh-t5.docx +0 -0
  245. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/business-report-zh-t5.spec.json +0 -0
  246. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/general-report-zh-t1.docx +0 -0
  247. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/general-report-zh-t1.spec.json +0 -0
  248. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/general-report-zh-t2.docx +0 -0
  249. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/general-report-zh-t2.spec.json +0 -0
  250. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/general-report-zh-t3.docx +0 -0
  251. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/general-report-zh-t3.spec.json +0 -0
  252. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/general-report-zh-t4.docx +0 -0
  253. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/general-report-zh-t4.spec.json +0 -0
  254. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/general-report-zh-t5.docx +0 -0
  255. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/general-report-zh-t5.spec.json +0 -0
  256. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/government-doc-zh-t4.docx +0 -0
  257. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/government-doc-zh-t4.spec.json +0 -0
  258. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/legal-contract-zh-t1.docx +0 -0
  259. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/legal-contract-zh-t1.spec.json +0 -0
  260. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/legal-contract-zh-t2.docx +0 -0
  261. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/legal-contract-zh-t2.spec.json +0 -0
  262. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/legal-contract-zh-t3.docx +0 -0
  263. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/legal-contract-zh-t3.spec.json +0 -0
  264. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/legal-contract-zh-t4.docx +0 -0
  265. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/legal-contract-zh-t4.spec.json +0 -0
  266. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/legal-contract-zh-t5.docx +0 -0
  267. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/legal-contract-zh-t5.spec.json +0 -0
  268. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/meeting-minutes-zh-t1.docx +0 -0
  269. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/meeting-minutes-zh-t1.spec.json +0 -0
  270. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/meeting-minutes-zh-t2.docx +0 -0
  271. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/meeting-minutes-zh-t2.spec.json +0 -0
  272. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/meeting-minutes-zh-t3.docx +0 -0
  273. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/meeting-minutes-zh-t3.spec.json +0 -0
  274. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/meeting-minutes-zh-t4.docx +0 -0
  275. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/meeting-minutes-zh-t4.spec.json +0 -0
  276. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/meeting-minutes-zh-t5.docx +0 -0
  277. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/meeting-minutes-zh-t5.spec.json +0 -0
  278. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/stock-research-zh-t1.docx +0 -0
  279. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/stock-research-zh-t1.spec.json +0 -0
  280. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/stock-research-zh-t2.docx +0 -0
  281. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/stock-research-zh-t2.spec.json +0 -0
  282. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/stock-research-zh-t3.docx +0 -0
  283. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/stock-research-zh-t3.spec.json +0 -0
  284. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/stock-research-zh-t4.docx +0 -0
  285. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/stock-research-zh-t4.spec.json +0 -0
  286. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/stock-research-zh-t5.docx +0 -0
  287. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/template_assets/stock-research-zh-t5.spec.json +0 -0
  288. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/templates.py +0 -0
  289. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/websearch.py +0 -0
  290. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/windows_process.py +0 -0
  291. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/word_import.py +0 -0
  292. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workbook_figures.py +0 -0
  293. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/business_report/evaluation.md +0 -0
  294. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/business_report/manifest.json +0 -0
  295. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/business_report/methods/decision_memo.md +0 -0
  296. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/business_report/methods/industry_periodic.md +0 -0
  297. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/business_report/methods/work_progress.md +0 -0
  298. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/business_report/planning.md +0 -0
  299. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/business_report/writing.md +0 -0
  300. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/general_report/evaluation.md +0 -0
  301. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/general_report/manifest.json +0 -0
  302. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/general_report/planning.md +0 -0
  303. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/general_report/writing.md +0 -0
  304. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/meeting_minutes/evaluation.md +0 -0
  305. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/meeting_minutes/manifest.json +0 -0
  306. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/meeting_minutes/planning.md +0 -0
  307. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/meeting_minutes/writing.md +0 -0
  308. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/stock_research/evaluation.md +0 -0
  309. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/stock_research/manifest.json +0 -0
  310. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/stock_research/methods/company_research.md +0 -0
  311. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/stock_research/methods/event_commentary.md +0 -0
  312. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/stock_research/methods/industry_tracking.md +0 -0
  313. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/stock_research/planning.md +0 -0
  314. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workflow_assets/stock_research/writing.md +0 -0
  315. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workspace_profile.py +0 -0
  316. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/workspaces.py +0 -0
  317. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop/zhipu.py +0 -0
  318. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop.egg-info/dependency_links.txt +0 -0
  319. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop.egg-info/entry_points.txt +0 -0
  320. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop.egg-info/requires.txt +0 -0
  321. {briefloop-0.22.1 → briefloop-0.22.3}/src/briefloop.egg-info/top_level.txt +0 -0
  322. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/__init__.py +0 -0
  323. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/__main__.py +0 -0
  324. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/_licenses/LICENSE +0 -0
  325. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/_licenses/NOTICE.md +0 -0
  326. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/_licenses/third_party/acorn/LICENSE +0 -0
  327. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/_licenses/third_party/acorn/NOTICE.md +0 -0
  328. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/_licenses/third_party/officeqa/LICENSE-APACHE +0 -0
  329. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/_licenses/third_party/officeqa/NOTICE +0 -0
  330. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/alfworld/__init__.py +0 -0
  331. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/alfworld/act.sh +0 -0
  332. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/alfworld/rollout.py +0 -0
  333. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/alfworld/step.py +0 -0
  334. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/benchmarks/__init__.py +0 -0
  335. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/benchmarks/alfworld.py +0 -0
  336. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/benchmarks/livemath.py +0 -0
  337. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/benchmarks/sealqa.py +0 -0
  338. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/benchmarks/spreadsheet.py +0 -0
  339. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/cli.py +0 -0
  340. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/codex_identity.py +0 -0
  341. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/engine.py +0 -0
  342. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/feedback_loop.py +0 -0
  343. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/isolated/__init__.py +0 -0
  344. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/isolated/audit.py +0 -0
  345. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/isolated/runtime.py +0 -0
  346. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/isolated/tools_server.py +0 -0
  347. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/jsonl.py +0 -0
  348. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/k4_lock.py +0 -0
  349. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/livemath/__init__.py +0 -0
  350. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/livemath/loop.py +0 -0
  351. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/livemath/rollout.py +0 -0
  352. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/native_agents.py +0 -0
  353. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/officeqa/__init__.py +0 -0
  354. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/officeqa/dataset.py +0 -0
  355. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/officeqa/fetch.py +0 -0
  356. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/officeqa/loop.py +0 -0
  357. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/officeqa/retrieval.py +0 -0
  358. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/officeqa/reward.py +0 -0
  359. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/officeqa/rollout.py +0 -0
  360. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/officeqa/scoring.py +0 -0
  361. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/officeqa/wiki_agents.py +0 -0
  362. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/paper_alignment/__init__.py +0 -0
  363. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/paper_alignment/contracts.py +0 -0
  364. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/paper_alignment/evidence.py +0 -0
  365. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/product.py +0 -0
  366. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/product_cli.py +0 -0
  367. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/product_install.py +0 -0
  368. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/product_views.py +0 -0
  369. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/alfworld/id_split/split_manifest.json +0 -0
  370. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/alfworld/id_split/test.json +0 -0
  371. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/alfworld/id_split/train.json +0 -0
  372. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/alfworld/id_split/val.json +0 -0
  373. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/alfworld/wiki/SKILL-s0.md +0 -0
  374. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/alfworld/wiki/index.md +0 -0
  375. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/alfworld/wiki/logs.md +0 -0
  376. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/alfworld/wiki/prompts/maintainer.md +0 -0
  377. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/alfworld/wiki/prompts/proposer.md +0 -0
  378. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/alfworld/wiki/skill-impact.md +0 -0
  379. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/isolated/model-catalog-direct.json +0 -0
  380. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/livemath/id_split/split_manifest.json +0 -0
  381. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/livemath/id_split/test.json +0 -0
  382. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/livemath/id_split/train.json +0 -0
  383. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/livemath/id_split/val.json +0 -0
  384. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/livemath/id_split-v2/split_manifest.json +0 -0
  385. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/livemath/id_split-v2/test.json +0 -0
  386. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/livemath/id_split-v2/train.json +0 -0
  387. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/livemath/id_split-v2/val.json +0 -0
  388. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/livemath/protocol.json +0 -0
  389. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/livemath/wiki/SKILL-s0.md +0 -0
  390. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/livemath/wiki/index.md +0 -0
  391. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/livemath/wiki/logs.md +0 -0
  392. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/livemath/wiki/prompts/maintainer.md +0 -0
  393. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/livemath/wiki/prompts/proposer.md +0 -0
  394. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/livemath/wiki/skill-impact.md +0 -0
  395. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/officeqa/id_split/split_manifest.json +0 -0
  396. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/officeqa/id_split/test.json +0 -0
  397. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/officeqa/id_split/train.json +0 -0
  398. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/officeqa/id_split/val.json +0 -0
  399. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/officeqa/protocol.json +0 -0
  400. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/officeqa/wiki/SKILL-s0.md +0 -0
  401. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/officeqa/wiki/index.md +0 -0
  402. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/officeqa/wiki/logs.md +0 -0
  403. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/officeqa/wiki/prompts/maintainer.md +0 -0
  404. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/officeqa/wiki/prompts/proposer.md +0 -0
  405. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/officeqa/wiki/skill-impact.md +0 -0
  406. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/paper_alignment/README.md +0 -0
  407. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/paper_alignment/prompts/maintainer.paper.md +0 -0
  408. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/paper_alignment/prompts/officeqa.paper.md +0 -0
  409. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/paper_alignment/prompts/proposer.paper.md +0 -0
  410. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/paper_alignment/prompts/spreadsheet.paper.md +0 -0
  411. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/product/agents/claude-code/wikiskill-executor.md +0 -0
  412. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/product/agents/claude-code/wikiskill-maintainer.md +0 -0
  413. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/product/agents/claude-code/wikiskill-proposer.md +0 -0
  414. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/product/agents/codex/wikiskill-executor.toml +0 -0
  415. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/product/agents/codex/wikiskill-maintainer.toml +0 -0
  416. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/product/agents/codex/wikiskill-proposer.toml +0 -0
  417. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/product/entry-skill/SKILL.md +0 -0
  418. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/product/entry-skill/agents/openai.yaml +0 -0
  419. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/product/entry-skill/references/native-subagents.md +0 -0
  420. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/product/entry-skill/references/workflow.md +0 -0
  421. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/product/roles/executor.md +0 -0
  422. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/product/roles/maintainer.md +0 -0
  423. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/product/roles/proposer.md +0 -0
  424. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/final-20260907/manifest.json +0 -0
  425. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/final-20260907/math-episodes.json +0 -0
  426. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/final-20260907/sealqa-pairs.json +0 -0
  427. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/final-20260907/spreadsheet-SKILL.md +0 -0
  428. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/final-20260907/spreadsheet-pairs.json +0 -0
  429. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/final-20260907/summary.json +0 -0
  430. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/repeatability-20260908/example-provenance.json +0 -0
  431. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/repeatability-20260908/installed-smoke.json +0 -0
  432. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/repeatability-20260908/manifest.json +0 -0
  433. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/repeatability-20260908/repeat1-pairs.json +0 -0
  434. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/repeatability-20260908/repeat2-pairs.json +0 -0
  435. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/repeatability-20260908/repeat3-pairs.json +0 -0
  436. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/repeatability-20260908/summary.json +0 -0
  437. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/repeatability-20260908/wiki-deliver-the-recalculated-workbook.md +0 -0
  438. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/skills/livemath/55.md +0 -0
  439. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/skills/livemath/luna.md +0 -0
  440. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/skills/officeqa/55.md +0 -0
  441. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/skills/officeqa/terra.md +0 -0
  442. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/skills/officeqa-retrieval/55.md +0 -0
  443. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/skills/officeqa-retrieval/sol.md +0 -0
  444. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/skills/sealqa/sol.md +0 -0
  445. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/skills/spreadsheet/55.md +0 -0
  446. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/skills/spreadsheet/sol.md +0 -0
  447. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/snapshot.json +0 -0
  448. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/snapshot.sha256 +0 -0
  449. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/update-20260906/livemath-luna-pairs.json +0 -0
  450. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/update-20260906/livemath-luna-skill.md +0 -0
  451. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/update-20260906/manifest.json +0 -0
  452. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/update-20260906/officeqa-luna-skill.md +0 -0
  453. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/update-20260906/officeqa-sol-skill.md +0 -0
  454. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/update-20260906/officeqa-sol-v2-pairs.json +0 -0
  455. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/update-20260906/studies.json +0 -0
  456. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/update-20260907/effort-analysis.json +0 -0
  457. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/update-20260907/effort-pairs.json +0 -0
  458. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/update-20260907/manifest.json +0 -0
  459. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/update-20260907/officeqa-luna-paper-tools-pairs.json +0 -0
  460. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/update-20260907/officeqa-luna-paper-tools-skill.md +0 -0
  461. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/update-20260907/spreadsheet-luna-scoped-python-pairs.json +0 -0
  462. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/update-20260907/spreadsheet-luna-scoped-python-skill.md +0 -0
  463. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/research/update-20260907/studies.json +0 -0
  464. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/runtime/acorn.mjs +0 -0
  465. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/runtime/audit_js.mjs +0 -0
  466. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/sealqa/id_split/split_manifest.json +0 -0
  467. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/sealqa/id_split/test.json +0 -0
  468. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/sealqa/id_split/train.json +0 -0
  469. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/sealqa/id_split/val.json +0 -0
  470. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/sealqa/protocol.json +0 -0
  471. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/sealqa/wiki/SKILL-s0.md +0 -0
  472. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/sealqa/wiki/index.md +0 -0
  473. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/sealqa/wiki/logs.md +0 -0
  474. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/sealqa/wiki/prompts/maintainer.md +0 -0
  475. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/sealqa/wiki/prompts/proposer.md +0 -0
  476. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/sealqa/wiki/skill-impact.md +0 -0
  477. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/spreadsheet/id_split/split_manifest.json +0 -0
  478. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/spreadsheet/id_split/test.json +0 -0
  479. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/spreadsheet/id_split/train.json +0 -0
  480. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/spreadsheet/id_split/val.json +0 -0
  481. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/spreadsheet/protocol.json +0 -0
  482. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/spreadsheet/wiki/SKILL-s0.md +0 -0
  483. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/spreadsheet/wiki/index.md +0 -0
  484. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/spreadsheet/wiki/logs.md +0 -0
  485. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/spreadsheet/wiki/prompts/maintainer.md +0 -0
  486. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/spreadsheet/wiki/prompts/proposer.md +0 -0
  487. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/resources/spreadsheet/wiki/skill-impact.md +0 -0
  488. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/results.py +0 -0
  489. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/score_rules.py +0 -0
  490. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/scorer_trust.py +0 -0
  491. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/sealqa/__init__.py +0 -0
  492. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/sealqa/loop.py +0 -0
  493. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/sealqa/rollout.py +0 -0
  494. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/settings.py +0 -0
  495. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/skill_proposer.py +0 -0
  496. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/spreadsheet/__init__.py +0 -0
  497. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/spreadsheet/loop.py +0 -0
  498. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/spreadsheet/rollout.py +0 -0
  499. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/spreadsheet/study.py +0 -0
  500. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/tool_audit.py +0 -0
  501. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/wiki.py +0 -0
  502. {briefloop-0.22.1 → briefloop-0.22.3}/src/wikiskill/wiki_maintainer.py +0 -0
  503. {briefloop-0.22.1 → briefloop-0.22.3}/start.ps1 +0 -0
  504. {briefloop-0.22.1 → briefloop-0.22.3}/start.sh +0 -0
  505. {briefloop-0.22.1 → briefloop-0.22.3}/tests/check_distribution.py +0 -0
  506. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_app_updates.mjs +0 -0
  507. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_chat_attachments.mjs +0 -0
  508. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_chat_commands.mjs +0 -0
  509. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_checkout_eol.mjs +0 -0
  510. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_citation_clipboard.mjs +0 -0
  511. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_citation_edit.mjs +0 -0
  512. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_clipboard_fallback.mjs +0 -0
  513. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_fast_mode.mjs +0 -0
  514. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_licenses.mjs +0 -0
  515. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_live_status.mjs +0 -0
  516. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_markdown_import.mjs +0 -0
  517. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_mcp_selection.mjs +0 -0
  518. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_model_label.mjs +0 -0
  519. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_model_selection.mjs +0 -0
  520. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_polling.mjs +0 -0
  521. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_progress_race.mjs +0 -0
  522. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_report_chat_drawer.mjs +0 -0
  523. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_report_load.mjs +0 -0
  524. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_review_status.mjs +0 -0
  525. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_runtime_discovery.mjs +0 -0
  526. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_runtime_feedback.mjs +0 -0
  527. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_settings_workspaces.mjs +0 -0
  528. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_setup_state.mjs +0 -0
  529. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_source_library.mjs +0 -0
  530. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_task_progress.mjs +0 -0
  531. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_template_groups.mjs +0 -0
  532. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_upload_limits.mjs +0 -0
  533. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_welcome_gate.mjs +0 -0
  534. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_workspace_proposal.mjs +0 -0
  535. {briefloop-0.22.1 → briefloop-0.22.3}/tests/frontend_writing_preferences.mjs +0 -0
  536. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_agent_backend.py +0 -0
  537. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_agent_commands.py +0 -0
  538. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_assessment_admission_recovery.py +0 -0
  539. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_bridge_harness.py +0 -0
  540. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_builtin_templates.py +0 -0
  541. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_chat_dispatch.py +0 -0
  542. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_chat_execution.py +0 -0
  543. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_chat_model_selection.py +0 -0
  544. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_codex_idle.py +0 -0
  545. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_connection_test_history.py +0 -0
  546. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_connector_authorization.py +0 -0
  547. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_connector_empty_catalog.py +0 -0
  548. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_connector_materials.py +0 -0
  549. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_connector_tasks.py +0 -0
  550. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_connectors.py +0 -0
  551. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_core.py +0 -0
  552. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_cross_module_regressions.py +0 -0
  553. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_delivery_checks.py +0 -0
  554. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_demo.py +0 -0
  555. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_desktop_lifecycle.py +0 -0
  556. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_document_workflows.py +0 -0
  557. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_draft_contract.py +0 -0
  558. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_entrypoint.py +0 -0
  559. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_evidence.py +0 -0
  560. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_evidence_parse_failures.py +0 -0
  561. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_execution_records.py +0 -0
  562. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_export_layout_swap.py +0 -0
  563. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_external_requests.py +0 -0
  564. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_fact_check_contract.py +0 -0
  565. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_fact_check_phase.py +0 -0
  566. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_fact_check_review.py +0 -0
  567. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_fact_check_switch.py +0 -0
  568. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_fact_status_tool.py +0 -0
  569. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_fast_mode.py +0 -0
  570. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_figure_exports.py +0 -0
  571. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_figure_flow.py +0 -0
  572. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_figures.py +0 -0
  573. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_harness.py +0 -0
  574. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_host_bins.py +0 -0
  575. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_human_learning.py +0 -0
  576. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_industry_export.py +0 -0
  577. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_industry_flow.py +0 -0
  578. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_industry_research.py +0 -0
  579. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_interactive_runtime.py +0 -0
  580. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_learning_integrity.py +0 -0
  581. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_length.py +0 -0
  582. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_media_sources.py +0 -0
  583. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_multimodal_harness.py +0 -0
  584. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_multimodal_http.py +0 -0
  585. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_notifications.py +0 -0
  586. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_npm_native_shim.py +0 -0
  587. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_opencode_harness.py +0 -0
  588. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_opencode_idle.py +0 -0
  589. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_opencode_provider.py +0 -0
  590. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_opencode_search_prompt.py +0 -0
  591. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_opencode_server_stdin.py +0 -0
  592. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_posix_process_tree.py +0 -0
  593. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_pr593_roundtrip.py +0 -0
  594. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_progress.py +0 -0
  595. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_progress_pipeline.py +0 -0
  596. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_public_research.py +0 -0
  597. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_reader_contract.py +0 -0
  598. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_reader_workflow.py +0 -0
  599. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_reconciliation.py +0 -0
  600. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_release.py +0 -0
  601. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_report_path_regressions.py +0 -0
  602. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_report_time.py +0 -0
  603. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_research_budget.py +0 -0
  604. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_research_handoff.py +0 -0
  605. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_resume_in_place.py +0 -0
  606. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_review.py +0 -0
  607. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_review_learning.py +0 -0
  608. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_review_packet_paths.py +0 -0
  609. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_review_schema_drift.py +0 -0
  610. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_review_snapshot.py +0 -0
  611. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_review_visual_input.py +0 -0
  612. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_revision_policy.py +0 -0
  613. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_rich_document.py +0 -0
  614. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_role_models.py +0 -0
  615. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_runtime_bridge.py +0 -0
  616. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_runtime_bridge_idle.py +0 -0
  617. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_runtime_json_bom.py +0 -0
  618. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_runtime_liveness.py +0 -0
  619. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_runtime_permissions.py +0 -0
  620. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_runtime_retry.py +0 -0
  621. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_schedules.py +0 -0
  622. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_search_policy.py +0 -0
  623. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_server_boundary.py +0 -0
  624. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_software_version.py +0 -0
  625. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_source_recovery_regressions.py +0 -0
  626. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_source_updates.py +0 -0
  627. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_sources_provenance.py +0 -0
  628. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_task_notify.py +0 -0
  629. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_task_progress.py +0 -0
  630. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_tavily.py +0 -0
  631. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_templates.py +0 -0
  632. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_version_consistency.py +0 -0
  633. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_websearch.py +0 -0
  634. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_windows_connector_acl.py +0 -0
  635. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_windows_distribution.py +0 -0
  636. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_windows_mcp_supervisor.py +0 -0
  637. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_windows_platform.py +0 -0
  638. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_windows_runtime_bundle.py +0 -0
  639. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_word_import.py +0 -0
  640. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_word_toc.py +0 -0
  641. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_worker_idle.py +0 -0
  642. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_workspace_action_errors.py +0 -0
  643. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_workspace_profile.py +0 -0
  644. {briefloop-0.22.1 → briefloop-0.22.3}/tests/test_workspaces.py +0 -0
  645. {briefloop-0.22.1 → briefloop-0.22.3}/third_party/open-design/LICENSE +0 -0
  646. {briefloop-0.22.1 → briefloop-0.22.3}/third_party/open-design/NOTICE.md +0 -0
  647. {briefloop-0.22.1 → briefloop-0.22.3}/third_party/open-design/acp/constants.ts +0 -0
  648. {briefloop-0.22.1 → briefloop-0.22.3}/third_party/open-design/acp/json.ts +0 -0
  649. {briefloop-0.22.1 → briefloop-0.22.3}/third_party/open-design/acp/models.ts +0 -0
  650. {briefloop-0.22.1 → briefloop-0.22.3}/third_party/open-design/acp/rpc.ts +0 -0
  651. {briefloop-0.22.1 → briefloop-0.22.3}/third_party/open-design/acp/session-params.ts +0 -0
  652. {briefloop-0.22.1 → briefloop-0.22.3}/third_party/open-design/acp/types.ts +0 -0
  653. {briefloop-0.22.1 → briefloop-0.22.3}/third_party/open-design/byok-reference/byok-opencode.ts +0 -0
  654. {briefloop-0.22.1 → briefloop-0.22.3}/third_party/open-design/byok-reference/provider-models.ts +0 -0
  655. {briefloop-0.22.1 → briefloop-0.22.3}/third_party/open-design/core/index.ts +0 -0
  656. {briefloop-0.22.1 → briefloop-0.22.3}/third_party/open-design/core/json-line-stream.ts +0 -0
  657. {briefloop-0.22.1 → briefloop-0.22.3}/third_party/open-design/runtime-models/codex-models.ts +0 -0
  658. {briefloop-0.22.1 → briefloop-0.22.3}/third_party/open-design/runtime-models/fallbacks.json +0 -0
  659. {briefloop-0.22.1 → briefloop-0.22.3}/third_party/open-design/runtime-models/mmd-routes.ts +0 -0
  660. {briefloop-0.22.1 → briefloop-0.22.3}/third_party/open-design/runtime-models/models.ts +0 -0
  661. {briefloop-0.22.1 → briefloop-0.22.3}/third_party/open-design/runtime-models/opencode-models.ts +0 -0
@@ -1,5 +1,17 @@
1
1
  # 变更记录
2
2
 
3
+ ## 0.22.3
4
+
5
+ - Word 导出合并可识别的内部来源索引,只保留面向读者的来源列表;来源标题使用可点击的原文超链接。不能可靠识别的业务表格保持原样。
6
+ - 更新通用及定制模板的 Word 缓存身份,已有报告再次导出时使用新的来源呈现;保留历史文件。
7
+
8
+ ## 0.22.2
9
+
10
+ - 首页和新建报告提供紧凑研究深度、事实核查与 WikiSkill 控件;默认执行上限 60 分钟,深度研究默认目标 10,000 字、上限 12,000 字,保留用户明确篇幅。
11
+ - 同时生成报告数默认 4,可在设置中调整;Scout 并发独立调整,冻结计划不再受较低预设限制。排队等待与执行时间分别展示。
12
+ - 新报告生成期间显示独立等待页,版本选择器列出排队和生成中报告;已有稿件仍可切换查看。
13
+ - 核查与评分面板轮询保留已有内容,相同结果不重建,旧版本响应不覆盖新版本。
14
+
3
15
  ## 0.22.1
4
16
 
5
17
  - 修复桌面后台启动 OpenCode 时继承桌面生命周期输入管道、导致服务启动超时的问题;OpenCode HTTP 服务使用独立的空输入,桌面退出检测和所属进程回收继续保留。
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: briefloop
3
- Version: 0.22.1
3
+ Version: 0.22.3
4
4
  Summary: Local multi-runtime agent workbench for sourced briefings, independent review and skill learning
5
5
  Author: Stahl-G
6
6
  License-Expression: MIT
@@ -0,0 +1 @@
1
+ 0.22.3
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "briefloop-desktop",
3
- "version": "0.22.1",
3
+ "version": "0.22.3",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "briefloop-desktop",
9
- "version": "0.22.1",
9
+ "version": "0.22.3",
10
10
  "hasInstallScript": true,
11
11
  "license": "MIT",
12
12
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "briefloop-desktop",
3
- "version": "0.22.1",
3
+ "version": "0.22.3",
4
4
  "private": true,
5
5
  "description": "BriefLoop local desktop workspace",
6
6
  "author": "Stahl-G",
@@ -1,3 +1,4 @@
1
+ import {beginPanel,updatePanel} from './report-panels.js';
1
2
  import {taskProgressCard} from './task-progress.js';
2
3
  import {copyText} from './clipboard.js';
3
4
  import {scheduleUI} from './schedules.js';
@@ -157,7 +158,7 @@ function openTask(job){
157
158
  const payload=parse(job.payload);
158
159
  const brief=state.briefs.find(b=>b.id===payload.version_id)||state.briefs.find(b=>b.run_id===payload.run_id);
159
160
  if(brief){if(!openBrief(brief,{follow:true}))return;pendingRun=null}
160
- else if(payload.run_id)pendingRun=payload.run_id;
161
+ else if(payload.run_id){if(!showPendingReport(payload.run_id))return;}
161
162
  page('report');refreshProgress();
162
163
  }
163
164
  const taskSnapshots=new Map(),taskExpanded=new Set(),taskMaterials=new Set(),taskActions=new Map();
@@ -293,32 +294,49 @@ function render(first){
293
294
  if(original&&original.id!==latest?.id)visible.push({brief:original,label:original.author==='example'?'合成示例':'生成原稿'});
294
295
  }
295
296
  if(current&&!visible.some(v=>v.brief.id===current.id))visible.push({brief:current,label:'正在查看历史快照'});
296
- $('version-select').innerHTML=visible.map(({brief:b,label})=>`<option value="${b.id}">${esc(parse(b.detail).title||'简报')} · ${label}</option>`).join('');
297
+ const pendingOptions=state.jobs.filter(j=>j.kind==='generate'&&['queued','running'].includes(j.status)&&!state.briefs.some(b=>b.run_id===parse(j.payload).run_id)).map(j=>{const rid=parse(j.payload).run_id,r=state.runs.find(r=>r.id===rid);return `<option value="run:${esc(rid)}">${esc(parse(r?.requirements).title||'新报告')} · ${j.status==='queued'?'排队中':'正在生成'}</option>`}).join('');
298
+ $('version-select').innerHTML=pendingOptions+visible.map(({brief:b,label})=>`<option value="${b.id}">${esc(parse(b.detail).title||'简报')} · ${label}</option>`).join('');
297
299
  if($('version-history'))$('version-history').textContent='编辑历史'+(current?'('+state.briefs.filter(b=>b.run_id===current.run_id&&b.author==='user').length+')':'');
298
300
 
299
- tryOpenPending();if(!current&&state.briefs.length)openBrief(state.briefs[0],{follow:true});if(current&&followUpdates&&!dirty&&!saving){const latest=state.briefs.find(b=>b.run_id===current.run_id);if(latest?.parent_id===current.id&&latest.author==='agent')openBrief(latest,{follow:true})}if(current){$('version-select').value=current.id;assessment();citations();renderBriefLength()}
300
- $('empty').hidden=!!current||state.jobs.length>0;$('document-area').hidden=!current;
301
+ tryOpenPending();if(!current&&!pendingRun&&state.briefs.length)openBrief(state.briefs[0],{follow:true});if(current&&followUpdates&&!dirty&&!saving){const latest=state.briefs.find(b=>b.run_id===current.run_id);if(latest?.parent_id===current.id&&latest.author==='agent')openBrief(latest,{follow:true})}if(current){$('version-select').value=current.id;assessment();citations();renderBriefLength()}
302
+ $('empty').hidden=!!current||state.jobs.length>0;$('document-area').hidden=!current;syncPendingReport();
301
303
  $('jobs').innerHTML=state.jobs.filter(j=>j.status!=='dismissed').map(j=>`<div class="job"><span class="tag ${j.status==='failed'?'error':''}">${statuses[j.status]}</span><div class="job-main">${esc(TASK_LABELS[j.kind]||j.kind)}<small>${['export_docx','release','audit_bundle'].includes(j.kind)?'本地脚本':j.kind==='source_refresh'?'来源工具':parse(j.payload).runtime?esc(jobModelLabel(j)):'旧任务:沿用当时本机配置'} · ${j.progress?`第 ${j.progress.round}/${j.progress.k} 轮 · ${{maintainer:'整理经验',proposer:'提出候选',validation:'验证候选'}[j.progress.phase]||j.progress.phase} · `:''}${esc(j.error||(j.kind==='source_refresh'?sourceRefreshOutcome(parse(j.result).outcome):'')||new Date(j.created).toLocaleString())}</small></div>${j.kind==='learn'?`<button data-details="${j.id}">查看比较</button>`:''}${['queued','running'].includes(j.status)?`<button data-stop="${j.id}">停止</button>`:''}${['failed','interrupted','cancelled'].includes(j.status)?`<button data-resume="${j.id}">沿用原模型恢复</button>${['review','learn'].includes(j.kind)?`<button data-retry-current="${j.id}">按当前模型重试</button>`:''}`:''}</div>`).join('');
302
304
  document.querySelectorAll('[data-stop]').forEach(b=>b.onclick=()=>action(()=>api('stop',{job_id:b.dataset.stop})));document.querySelectorAll('[data-resume]').forEach(b=>b.onclick=()=>action(()=>api('resume',{job_id:b.dataset.resume})));document.querySelectorAll('[data-retry-current]').forEach(b=>b.onclick=()=>action(()=>api('resume',{job_id:b.dataset.retryCurrent,use_current_model:true})));renderTasks();renderTaskGraph();renderTaskBanner();renderAssistantSummary();renderReportStatus();renderReports();renderSourcesPage();renderTemplatesPage();if($('welcome')&&!$('welcome').hidden)renderWelcome();
303
305
  document.querySelectorAll('[data-details]').forEach(b=>b.onclick=()=>action(async()=>{const d=await api('learning-details?job='+b.dataset.details);$('source-title').textContent='技能比较与依据';$('source-original').hidden=true;$('source-provenance').hidden=true;$('source-link').textContent='';$('source-body').textContent=d.rounds.length?d.rounds.map((r,i)=>`第 ${i+1} 轮\n${r.result?.reason||'比较尚未完成'}\n${(r.result?.pairs||[]).map(p=>({better:'候选更好',tie:'差不多,保留原技能',worse:'原稿更好'}[p.verdict])+': '+p.reason).join('\n')}\n\n`+r.cases.map(c=>`任务:${c.requirements.title}\n\n旧版\n${gradeSummary(c.baseline.assessment)}\n${c.baseline.reader_markdown||c.baseline.markdown}\n\n候选\n${gradeSummary(c.candidate.assessment)}\n${c.candidate.reader_markdown||c.candidate.markdown}`).join('\n\n')).join('\n\n'):d.job.error||'比较尚未开始;先整理 Wiki 和提出候选。';$('source-dialog').showModal()}));
304
306
  $('skills').innerHTML=`<div class="skill">${state.active_skill?'当前启用 '+esc(state.active_skill):'当前使用基础任务提示词'}${state.active_skill?'<button data-rollback="">回到基础版本</button>':''}</div>`+state.skills.map(s=>`<div class="skill"><strong>${esc(s.id)}</strong><p>${esc(s.reason)}</p>${s.id===state.active_skill?'<span class="tag">正在使用</span>':`<button data-rollback="${s.id}" class="outline">使用这个版本</button>`}</div>`).join('');document.querySelectorAll('[data-rollback]').forEach(b=>b.onclick=()=>action(()=>api('rollback',{skill_id:b.dataset.rollback||null}),'下一轮将使用所选技能'));
305
307
  if(state.wiki!==render.wiki){render.wiki=state.wiki;if(state.wiki)api('render',{markdown:state.wiki}).then(r=>$('wiki').innerHTML=r.html);else $('wiki').innerHTML='<h2>还没有学习经验</h2><p class="muted">生成简报后直接改稿,或留下评论。Maintainer 会在这里整理观察、方法与适用条件。</p>'}bindSources();
306
308
  }
309
+ function showPendingReport(runId){
310
+ if(dirty||saving){notice('请先保存当前修改,再切换报告',true);return false}
311
+ pendingRun=runId;current=null;followUpdates=true;
312
+ if(editor){editor.destroy();editor=null}
313
+ syncPendingReport();return true;
314
+ }
315
+ function syncPendingReport(){
316
+ const waiting=!!pendingRun&&!current;
317
+ let box=$('pending-report');if(!box){box=document.createElement('div');box.id='pending-report';box.className='empty';$('document-area').before(box)}
318
+ box.hidden=!waiting;$('document-area').hidden=!current;
319
+ for(const id of ['export-menu-toggle','more-menu-toggle','version-history'])if($(id))$(id).hidden=waiting;
320
+ if(!waiting)return;
321
+ const run=state.runs.find(r=>r.id===pendingRun),job=state.jobs.find(j=>j.kind==='generate'&&parse(j.payload).run_id===pendingRun);
322
+ $('report-title').textContent=parse(run?.requirements).title||'新报告';$('save-state').textContent='';$('version-select').value='run:'+pendingRun;
323
+ for(const id of ['brief-length','report-status'])if($(id))$(id).textContent='';
324
+ box.textContent=job?.status==='queued'?'报告已排队,等待生成':job&&['failed','cancelled','interrupted'].includes(job.status)?'报告生成已停止,尚未保存正文':'报告正在生成中';
325
+ }
307
326
  function tryOpenPending(){
308
327
  if(!pendingRun||dirty||saving)return false;
309
328
  const incoming=state?.briefs.find(b=>b.run_id===pendingRun);
310
329
  if(incoming&&openBrief(incoming,{follow:true})){pendingRun=null;return true}
311
330
  return false;
312
331
  }
313
- function openBrief(b,{follow=false}={}){if(dirty||saving){notice('请先保存当前修改,再切换版本',true);return false}followUpdates=follow;current=b;renderWordExports();$('report-title').textContent=parse(b.detail).title||'简报';updateDownloads(b);if(editor)editor.destroy();highlightQuotes=[];editor=new Editor({element:$('editor'),editable:state.briefs.find(x=>x.run_id===b.run_id)?.id===b.id,extensions:[StarterKit.configure({link:{openOnClick:false},trailingNode:false}),ReportTrailingParagraph,TableKit,ReportImage.configure({HTMLAttributes:{class:'briefloop-figure'},allowBase64:false}),TextStyle,Layout,Citation,Markdown,MustFixHighlight],content:b.editor_document?editorDocument(parse(b.editor_document),b.id):toEditor(b.markdown),...(b.editor_document?{}:{contentType:'markdown'}),onUpdate:changed,onSelectionUpdate:updateFormattingTools});$('markdown-source').value=b.markdown;const historical=state.briefs.find(x=>x.run_id===b.run_id)?.id!==b.id;$('markdown-source').readOnly=historical;$('toolbar').querySelectorAll('button,input,select').forEach(x=>x.disabled=historical);$('save-state').textContent=historical?'历史记录(只读)':b.author==='example'?'合成示例已保存':b.author==='user'?'当前编辑稿已自动保存':'原稿已保存';$('version-select').value=b.id;assessment();citations();renderBriefLength();setReportView('edit');renderReportStatus();renderAssistantSummary();return true}
332
+ function openBrief(b,{follow=false}={}){if(!b)return false;if(dirty||saving){notice('请先保存当前修改,再切换版本',true);return false}pendingRun=null;followUpdates=follow;current=b;syncPendingReport();renderWordExports();$('report-title').textContent=parse(b.detail).title||'简报';updateDownloads(b);if(editor)editor.destroy();highlightQuotes=[];editor=new Editor({element:$('editor'),editable:state.briefs.find(x=>x.run_id===b.run_id)?.id===b.id,extensions:[StarterKit.configure({link:{openOnClick:false},trailingNode:false}),ReportTrailingParagraph,TableKit,ReportImage.configure({HTMLAttributes:{class:'briefloop-figure'},allowBase64:false}),TextStyle,Layout,Citation,Markdown,MustFixHighlight],content:b.editor_document?editorDocument(parse(b.editor_document),b.id):toEditor(b.markdown),...(b.editor_document?{}:{contentType:'markdown'}),onUpdate:changed,onSelectionUpdate:updateFormattingTools});$('markdown-source').value=b.markdown;const historical=state.briefs.find(x=>x.run_id===b.run_id)?.id!==b.id;$('markdown-source').readOnly=historical;$('toolbar').querySelectorAll('button,input,select').forEach(x=>x.disabled=historical);$('save-state').textContent=historical?'历史记录(只读)':b.author==='example'?'合成示例已保存':b.author==='user'?'当前编辑稿已自动保存':'原稿已保存';$('version-select').value=b.id;assessment();citations();renderBriefLength();setReportView('edit');renderReportStatus();renderAssistantSummary();return true}
314
333
  async function renderDeliveryChecks(){
315
334
  const ticket=(renderDeliveryChecks.ticket||0)+1;renderDeliveryChecks.ticket=ticket;
316
335
  if(!current||!$('assessment'))return;const vid=current.id;
317
- const old=$('assessment').querySelector('.delivery-checks');if(old)old.remove();
318
- const box=document.createElement('div');box.className='delivery-checks';
319
- box.textContent=dirty?'有未保存修改;下列检查仅针对已保存版本。':'正在检查已保存版本…';
320
- $('assessment').prepend(box);
321
- let c;try{c=await api('version-checks?version='+encodeURIComponent(vid))}catch(e){if(box.isConnected)box.textContent='检查暂不可用,请稍后重试;未判定通过。';return}
336
+ let box=$('assessment').querySelector('.delivery-checks');
337
+ if(!box){box=document.createElement('div');box.className='delivery-checks';$('assessment').prepend(box)}
338
+ beginPanel(box,vid,dirty?'有未保存修改;下列检查仅针对已保存版本。':'正在检查已保存版本…');
339
+ let c;try{c=await api('version-checks?version='+encodeURIComponent(vid))}catch(e){if(box.isConnected&&current?.id===vid&&ticket===renderDeliveryChecks.ticket)updatePanel(box,'检查暂不可用,请稍后重试;未判定通过。');return}
322
340
  if(!current||current.id!==vid||ticket!==renderDeliveryChecks.ticket||!box.isConnected)return;
323
341
  const parts=[];
324
342
  if(dirty)parts.push('<span class="tag">有未保存修改;仅检查已保存版本</span>');
@@ -340,11 +358,11 @@ async function renderDeliveryChecks(){
340
358
  parts.push(findings.length?`<span class="tag error">版式:${esc(findings.join(';'))}</span>`:'<span class="tag">版式:标题层级、表头与空标题检查通过</span>');
341
359
  }
342
360
  if(c.assessment_overall)parts.push(`<span class="tag">模型评分:${esc(c.assessment_overall)}</span>`);
343
- box.innerHTML='<strong>已保存版本检查</strong> '+parts.join(' ')+'<p class="help">数值检查仅覆盖已提交并成功定位的绑定,不代表正文数字已全部核验;事实含义、研究覆盖与交付质量仍需评价。</p>';
361
+ updatePanel(box,'<strong>已保存版本检查</strong> '+parts.join(' ')+'<p class="help">数值检查仅覆盖已提交并成功定位的绑定,不代表正文数字已全部核验;事实含义、研究覆盖与交付质量仍需评价。</p>');
344
362
  }
345
363
 
346
- function changed(){followUpdates=false;dirty=true;renderDeliveryChecks.ticket=(renderDeliveryChecks.ticket||0)+1;const check=$('assessment').querySelector('.delivery-checks');if(check)check.textContent='有未保存修改;保存后重新检查。';renderBriefLength();$('save-state').textContent='有未保存修改';clearTimeout(saveTimer);saveTimer=setTimeout(save,1400)}
347
- $('version-select').onchange=e=>openBrief(state.briefs.find(b=>b.id===e.target.value));
364
+ function changed(){followUpdates=false;dirty=true;renderDeliveryChecks.ticket=(renderDeliveryChecks.ticket||0)+1;const check=$('assessment').querySelector('.delivery-checks');if(check)updatePanel(check,'有未保存修改;保存后重新检查。');renderBriefLength();$('save-state').textContent='有未保存修改';clearTimeout(saveTimer);saveTimer=setTimeout(save,1400)}
365
+ $('version-select').onchange=e=>{const value=e.target.value;if(value.startsWith('run:'))showPendingReport(value.slice(4));else openBrief(state.briefs.find(b=>b.id===value));refreshProgress()};
348
366
  let savePromise=null,lastSaveError=null;
349
367
  function save(){
350
368
  if(savePromise)return savePromise;
@@ -391,8 +409,8 @@ function scheduleLearning(){ /* Worker consumes the durable feedback after inact
391
409
  async function renderReportIssues(){
392
410
  const ticket=(renderReportIssues.ticket||0)+1;renderReportIssues.ticket=ticket;
393
411
  const box=$('report-issues');if(!box||!current)return;
394
- const vid=current.id;box.innerHTML='<p class="help">正在读取问题…</p>';
395
- let data;try{data=await api('review-status?version='+encodeURIComponent(vid))}catch(e){if(box.isConnected&&current?.id===vid&&ticket===renderReportIssues.ticket)box.innerHTML='<p class="help">问题清单暂不可用,请稍后重试。</p>';return}
412
+ const vid=current.id;beginPanel(box,vid,'<p class="help">正在读取问题…</p>');
413
+ let data;try{data=await api('review-status?version='+encodeURIComponent(vid))}catch(e){if(box.isConnected&&current?.id===vid&&ticket===renderReportIssues.ticket)updatePanel(box,'<p class="help">问题清单暂不可用,请稍后重试。</p>');return}
396
414
  if(!current||current.id!==vid||ticket!==renderReportIssues.ticket)return;
397
415
  const kinds={contradiction:'实质矛盾',insufficient_evidence:'证据不足',missing_requirement:'要求缺口',missing_binding:'未绑定正文',execution_gap:'执行缺口',expression:'表达问题'};
398
416
  const cards=[];
@@ -422,9 +440,9 @@ async function renderReportIssues(){
422
440
  }
423
441
  if(reconciliation&&reconciliation.stale)notes.push('来源或时间注释已变化,对照记录需更新');
424
442
  if(reconciliation&&reconciliation.error)notes.push('对照记录不可用:'+reconciliation.error);
425
- box.innerHTML=(cards.length||notes.length)
443
+ updatePanel(box,(cards.length||notes.length)
426
444
  ? `${cards.length?`<div class="issue-head"><strong>需要处理 ${cards.length} 项</strong></div>`:''}${cards.map(card=>`<details class="issue-card ${card.tone}"><summary><span class="issue-label">${esc(card.label)}</span><strong>${esc(card.title)}</strong></summary>${card.basis?`<p class="issue-basis">${esc(card.basis)}</p>`:''}${card.scope?`<p class="help">关联:${esc(card.scope)}</p>`:''}${card.action?`<p>${esc(card.action)}</p>`:''}<p class="help">状态:${esc(card.state)}</p></details>`).join('')}${notes.length?`<p class="help">${notes.map(esc).join(' · ')}</p>`:''}`
427
- : '<p class="help">暂未发现需要处理的问题;独立审阅完成后会更新。</p>';
445
+ : '<p class="help">暂未发现需要处理的问题;独立审阅完成后会更新。</p>');
428
446
  }
429
447
  const RELATION_LABELS={compatible:'可合并',different_scope:'口径不同',temporal_sequence:'时间演进',correction:'明确更正',supersession:'替代',republication:'转载',attributed_difference:'归属分歧',contradiction:'实质矛盾',unknown:'无法判断'};
430
448
  async function renderFactChecks(){
@@ -432,17 +450,17 @@ async function renderFactChecks(){
432
450
  // links, execution status on its own line; never part of the report body.
433
451
  const box=$('fact-checks');if(!box||!current)return;
434
452
  const ticket=(renderFactChecks.ticket||0)+1;renderFactChecks.ticket=ticket;
435
- const vid=current.id;box.innerHTML='';
453
+ const vid=current.id;beginPanel(box,vid);
436
454
  let data;try{data=await api('fact-checks?version='+encodeURIComponent(vid))}catch(e){return}
437
455
  if(!current||current.id!==vid||ticket!==renderFactChecks.ticket||!box.isConnected)return;
438
- box.innerHTML=factCheckHTML(data);if(box.innerHTML)bindSources();
456
+ updatePanel(box,factCheckHTML(data));if(box.innerHTML)bindSources();
439
457
  box.querySelectorAll('[data-fact-grant]').forEach(b=>b.onclick=()=>action(async()=>{
440
458
  await api('fact-check-grant',{version_id:b.dataset.factGrant,limits:{search_requests:6,candidate_urls:30,source_pages:12}});
441
459
  notice('已追加核查预算,将在核查阶段计量中生效');
442
460
  await renderFactChecks();
443
461
  }));
444
462
  }
445
- function assessment(){if(!current)return;queueMicrotask(()=>{renderDeliveryChecks();renderReportIssues();renderFactChecks()});const r=state.assessments.find(a=>a.version_id===current.id);if(!r){highlightQuotes=[];applyHighlights();const pending=reviewPending(current,state.jobs);$('assessment').innerHTML=pending?'<p class="muted">评分将自动进行</p><p class="help">本轮生成完成后,系统会用独立 Evaluator 自动评分,不需要手动点「重新评分」。</p>':'<p class="muted">尚未评分</p><p class="help">你可以先阅读和修改。评分针对这个版本独立运行。</p>';return}const d=parse(r.data),findings=d.findings||[];highlightQuotes=readerHighlights(findings,{expression:d.expression,showSuggestions:showSuggestionMarks}).map(item=>({quote:item.quote,kind:item.kind,title:findingTitle(item.finding),findingIndex:findings.indexOf(item.finding)}));highlightFindings=new Map(findings.map((f,i)=>[String(i),f]));highlightKinds=new Map(highlightQuotes.map(q=>[String(q.findingIndex),q.kind]));applyHighlights();const toggle=`<label class="finding-toggle help"><input type="checkbox" id="show-suggestions" ${showSuggestionMarks?'checked':''}> 显示建议标记(黄);必须修正句始终标红</label>`;$('assessment').innerHTML=`<div class="judgment">${esc(d.overall)}</div><p>${esc(d.summary)}</p><div class="grades">${[['evidence','证据与准确性'],['coverage','覆盖与取舍'],['analysis','分析有效性'],['expression','表达与可用性']].map(([k,l])=>`<div class="grade"><span>${l}</span><strong>${d[k]??'—'}</strong><small>${d[k]?' / 5':''}</small></div>`).join('')}</div><p class="help">等级是本轮要求完成程度,评分可有不同意见。</p>${(typeof d.expression==='number'&&d.expression<=2&&d.overall==='达到要求')?'<p class="help">表达分偏低但总体仍判为「达到要求」,两者不一致;系统会按此安排一次修订,实际以正文和独立审阅为准。</p>':''}${findings.length?toggle:''}${findings.map((f,i)=>`<details class="finding" data-finding="${i}"><summary>${f.severity==='major'?'●':'○'} ${esc(f.description)}</summary>${f.report_quote?`<blockquote>${esc(f.report_quote)}</blockquote>`:''}<p>${esc(f.requirement)}</p><p>${esc(f.evidence)}</p>${f.source_id?`<button data-source="${esc(f.source_id)}">查看来源 · ${esc(f.locator)}</button>`:''}<p>${esc(f.suggestion)}</p></details>`).join('')}`;bindSources();const toggleEl=$('show-suggestions');if(toggleEl)toggleEl.onchange=()=>{showSuggestionMarks=toggleEl.checked;assessment()}}
463
+ function assessment(){if(!current)return;queueMicrotask(()=>{renderDeliveryChecks();renderReportIssues();renderFactChecks()});const r=state.assessments.find(a=>a.version_id===current.id);const signature=JSON.stringify([current.id,r?.data,reviewPending(current,state.jobs),showSuggestionMarks]);if(assessment.signature===signature&&assessment.editor===editor)return;assessment.signature=signature;assessment.editor=editor;if(!r){highlightQuotes=[];applyHighlights();const pending=reviewPending(current,state.jobs);$('assessment').innerHTML=pending?'<p class="muted">评分将自动进行</p><p class="help">本轮生成完成后,系统会用独立 Evaluator 自动评分,不需要手动点「重新评分」。</p>':'<p class="muted">尚未评分</p><p class="help">你可以先阅读和修改。评分针对这个版本独立运行。</p>';return}const d=parse(r.data),findings=d.findings||[];highlightQuotes=readerHighlights(findings,{expression:d.expression,showSuggestions:showSuggestionMarks}).map(item=>({quote:item.quote,kind:item.kind,title:findingTitle(item.finding),findingIndex:findings.indexOf(item.finding)}));highlightFindings=new Map(findings.map((f,i)=>[String(i),f]));highlightKinds=new Map(highlightQuotes.map(q=>[String(q.findingIndex),q.kind]));applyHighlights();const toggle=`<label class="finding-toggle help"><input type="checkbox" id="show-suggestions" ${showSuggestionMarks?'checked':''}> 显示建议标记(黄);必须修正句始终标红</label>`;$('assessment').innerHTML=`<div class="judgment">${esc(d.overall)}</div><p>${esc(d.summary)}</p><div class="grades">${[['evidence','证据与准确性'],['coverage','覆盖与取舍'],['analysis','分析有效性'],['expression','表达与可用性']].map(([k,l])=>`<div class="grade"><span>${l}</span><strong>${d[k]??'—'}</strong><small>${d[k]?' / 5':''}</small></div>`).join('')}</div><p class="help">等级是本轮要求完成程度,评分可有不同意见。</p>${(typeof d.expression==='number'&&d.expression<=2&&d.overall==='达到要求')?'<p class="help">表达分偏低但总体仍判为「达到要求」,两者不一致;系统会按此安排一次修订,实际以正文和独立审阅为准。</p>':''}${findings.length?toggle:''}${findings.map((f,i)=>`<details class="finding" data-finding="${i}"><summary>${f.severity==='major'?'●':'○'} ${esc(f.description)}</summary>${f.report_quote?`<blockquote>${esc(f.report_quote)}</blockquote>`:''}<p>${esc(f.requirement)}</p><p>${esc(f.evidence)}</p>${f.source_id?`<button data-source="${esc(f.source_id)}">查看来源 · ${esc(f.locator)}</button>`:''}<p>${esc(f.suggestion)}</p></details>`).join('')}`;bindSources();const toggleEl=$('show-suggestions');if(toggleEl)toggleEl.onchange=()=>{showSuggestionMarks=toggleEl.checked;assessment()}}
446
464
  function citations(){const detail=parse(current.detail),derived=new Set((detail.content_citations||[]).map(r=>r.source_id));const refs=(detail.citations||[]).filter(r=>derived.has(r.source_id)||toEditor(current.markdown).includes('#source-'+r.source_id));$('citations').innerHTML=refs.length?'引用来源 '+refs.map(r=>`<button data-source="${esc(r.source_id)}">${esc(state.sources.find(s=>s.id===r.source_id)?.name||r.source_id)} · ${esc(r.locator)}</button>`).join(''):'尚无引用记录';bindSources()}
447
465
  function bindSources(){document.querySelectorAll('[data-source]').forEach(b=>b.onclick=()=>action(async()=>{const r=await api('source?id='+b.dataset.source);showSource(r)}))}
448
466
  $('close-source').onclick=()=>$('source-dialog').close();
@@ -456,11 +474,11 @@ async function previewReportTime(){
456
474
  try{const requirements={title:form.elements.title.value||'预览',objective:form.elements.objective.value||'预览'};for(const key of ['period','period_start','period_end','report_timezone'])requirements[key]=form.elements[key].value;const t=await api('report-time-preview',{requirements});if(ticket!==reportTimePreviewTicket)return;box.textContent=`系统日期:${t.today} · ${t.timezone};报告范围:${t.start} 至 ${t.end_exclusive}(不含结束时刻)。提交时冻结。`;}catch(e){if(ticket===reportTimePreviewTicket)box.textContent=e.message}
457
475
  }
458
476
  for(const key of ['period','period_start','period_end','report_timezone'])$('requirements').elements[key].addEventListener('change',previewReportTime);
459
- $('requirements').onsubmit=e=>{e.preventDefault();action(async()=>{const f=new FormData(e.target),req=Object.fromEntries(f.entries());if(req.writing_mode==='internal_report'&&state.settings.company_context_enabled==null){$('company-choice-dialog').showModal();return}req.allow_web=f.has('allow_web');req.fact_check=f.has('fact_check');req.target_words=Number(req.target_words);req.max_words=Number(req.max_words);req.research_budget=readResearchBudget();req.search_policy=readSearchPolicy();Object.assign(req,readWorkflowChoice());req.reference_source_ids=[...referenceSelected];req.template_id=req.template_id||null;req.sections=readTemplateSections();req.key_questions=(req.key_questions_text||'').split('\n').map(x=>x.trim()).filter(Boolean);delete req.key_questions_text;req.manual_sections=(req.manual_sections_text||'').split('\n').map(x=>x.trim()).filter(Boolean);for(const title of req.manual_sections){const found=req.sections.find(s=>s.title===title);if(found){found.mode='manual';found.placeholder='待填充'}}delete req.manual_sections_text;preserveWritingPreferences(req,state.requirements,writingPreferencesOverride);req.raw_input=req.objective;delete req.runtime_model;delete req.runtime_effort;await saveModel();if(current)await savedVersion();const connector_selection=reportMcpSelection.selection();const job=await api('generate',{...(connector_selection?{connector_selection}:{}),requirements:req,session_id:chat.id||undefined,source_ids:[...selected].filter(id=>!req.reference_source_ids.includes(id))});pendingRun=parse(job.payload).run_id;page('report');notice('任务已排队,后台会生成简报')})};
477
+ $('requirements').onsubmit=e=>{e.preventDefault();action(async()=>{const f=new FormData(e.target),req=Object.fromEntries(f.entries());if(req.writing_mode==='internal_report'&&state.settings.company_context_enabled==null){$('company-choice-dialog').showModal();return}req.allow_web=f.has('allow_web');req.fact_check=f.has('fact_check');req.target_words=Number(req.target_words);req.max_words=Number(req.max_words);req.research_budget=readResearchBudget();req.search_policy=readSearchPolicy();Object.assign(req,readWorkflowChoice());req.reference_source_ids=[...referenceSelected];req.template_id=req.template_id||null;req.sections=readTemplateSections();req.key_questions=(req.key_questions_text||'').split('\n').map(x=>x.trim()).filter(Boolean);delete req.key_questions_text;req.manual_sections=(req.manual_sections_text||'').split('\n').map(x=>x.trim()).filter(Boolean);for(const title of req.manual_sections){const found=req.sections.find(s=>s.title===title);if(found){found.mode='manual';found.placeholder='待填充'}}delete req.manual_sections_text;preserveWritingPreferences(req,state.requirements,writingPreferencesOverride);req.raw_input=req.objective;delete req.runtime_model;delete req.runtime_effort;await saveModel();if(current)await savedVersion();const connector_selection=reportMcpSelection.selection();const job=await api('generate',{...(connector_selection?{connector_selection}:{}),requirements:req,session_id:chat.id||undefined,source_ids:[...selected].filter(id=>!req.reference_source_ids.includes(id))});showPendingReport(parse(job.payload).run_id);page('report');notice('任务已排队,后台会生成简报')})};
460
478
  $('upload').onchange=e=>action(async()=>{preflightUploads(e.target.files,uploadLimits);for(const f of e.target.files){const s=await api('upload',await uploadPayload(f,uploadLimits));selected.add(s.id)}e.target.value=''},'来源已保存');
461
479
  $('add-url').onclick=()=>action(async()=>{const s=await api('source-url',{url:$('source-url').value});selected.add(s.id);$('source-url').value='';notice(s.status==='ready'?'网页已读取':'来源已保存,但读取失败:'+s.error,s.status!=='ready')});
462
480
  $('rescore').onclick=()=>action(async()=>{await savedVersion();await api('assess',{version_id:current.id,session_id:chat.id||undefined})},'已提交评分');
463
- $('comment-submit').onclick=()=>action(async()=>{const text=$('comment').value,required=$('comment-required').checked;const version=await savedVersion();await api('comment',{version_id:version,text,learning_intent:required?'explicit_requirement':'feedback'});if($('comment').value===text&&$('comment-required').checked===required){$('comment').value='';$('comment-required').checked=false;}scheduleLearning()},'反馈已保存');
481
+ $('comment-submit').onclick=()=>action(async()=>{const text=$('comment').value,required=$('comment-required').checked;const version=await savedVersion();await api('comment',{version_id:version,text,learning_intent:required?'explicit_requirement':'feedback'});if($('comment').value===text&&$('comment-required').checked===required){$('comment').value='';$('comment-required').checked=true;}scheduleLearning()},'反馈已保存');
464
482
  $('learn-now').onclick=()=>action(async()=>{await savedVersion();clearTimeout(learnTimer);const result=await api('learn',{});notice(result.message||'已提交反馈学习')});
465
483
  async function setK(v){const k=Math.max(1,Math.min(20,Number(v)||1));$('rounds').value=k;await action(()=>api('settings',{k}),'轮数已保存,下一批生效')}
466
484
  $('rounds').onchange=e=>setK(e.target.value);$('k-minus').onclick=()=>setK(Number($('rounds').value)-1);$('k-plus').onclick=()=>setK(Number($('rounds').value)+1);$('auto-learn').onchange=e=>action(()=>api('settings',{auto_learn:e.target.checked}),'学习偏好已保存');
@@ -536,10 +554,10 @@ async function refreshProgress(){
536
554
  $('run-progress').hidden=false;$('run-progress').innerHTML=`<div class="section-title"><h2>${job.status==='queued'?'来源复查已排队':'正在复查来源'}</h2><button class="outline" id="progress-stop">停止任务</button></div><p>${esc(source?.name||'当前来源')}</p><p class="help">按本轮联网范围和预算获取新快照;已有来源与报告保留。复查完成后,来源变化仍需判断和复核。</p>`;
537
555
  $('progress-stop').onclick=()=>action(()=>api('stop',{job_id:job.id}));return;
538
556
  }
539
- const [events,live]=await Promise.all([api('events?job='+job.id),api('runtime')]);
557
+ const [events,live]=await Promise.all([api('events?job='+job.id),api('runtime?job_id='+encodeURIComponent(job.id))]);
540
558
  if(!isCurrent())return;
541
559
  const last=[...events].reverse().find(e=>e.kind==='runtime_progress');
542
- const p=last?parse(last.data):{};const started=[...events].reverse().find(e=>e.kind==='runtime_started');const start=started?parse(started.data):{};
560
+ const p=last?parse(last.data):{};p.started=[...events].reverse().find(e=>e.kind==='job_started')?.created;const started=[...events].reverse().find(e=>e.kind==='runtime_started');const start=started?parse(started.data):{};
543
561
  const taskSession=start.session_id;
544
562
  let pendingRequests=[];
545
563
  if(taskSession){
@@ -551,13 +569,13 @@ async function refreshProgress(){
551
569
  const req=run?parse(run.requirements):{};
552
570
  const agents=p.agents||[];
553
571
  const stageLabel=typeof p.stage==='string'?p.stage:(p.stages||[]).find(item=>item.status==='active')?.label;
554
- const elapsed=Math.max(0,Math.floor((Date.now()-new Date(job.created))/1000));
572
+ const elapsed=Math.max(0,Math.floor((Date.now()-new Date(p.started||job.created))/1000));
555
573
  const mins=Math.floor(elapsed/60),secs=elapsed%60;
556
574
  // Independent review/check jobs need not own the main runtime's PID.
557
575
  const running=job.status==='running';
558
576
  const labels={running:'进行中',pending_init:'启动中',completed:'已完成',done:'已完成',closed:'已结束',failed:'失败',errored:'失败'};
559
577
  $('run-progress').hidden=false;
560
- $('run-progress').innerHTML=`<div class="section-title"><div><p class="eyebrow">${({learn:'技能学习',review:'独立审阅',assess:'独立评分',revise:'稿件修订',fact_check:'独立事实核查'})[job.kind]||'简报生成'} · ${running?'后台正在运行':'等待后台执行'}</p><h2>${esc(pendingRequests.length?'等待你的确认':stageLabel||(job.status==='queued'?'任务已排队':'正在启动 BriefLoop'))}</h2></div><button class="outline" id="progress-stop">停止任务</button></div><p><strong>${esc(jobModelLabel(job,start))}</strong> · 模型进程 PID ${live.pid||'—'}${live.server_pid?' · 本地服务 PID '+live.server_pid:''}</p><p class="help">本任务已用 ${mins} 分 ${secs} 秒 · ${state.settings.timeout_minutes===0?'不限时':'单次执行上限 '+state.settings.timeout_minutes+' 分钟'} <button id="progress-timeout" class="subtle-button">调整时限</button>${run?` · ${JSON.parse(run.source_ids).length} 份初始来源 · ${req.allow_web?'允许联网':'仅本地来源'}`:''}</p>${p.message?`<p class="progress-message">${esc(p.message)}</p>`:''}${stageRailHTML(p.stages)||`<div class="agent-progress">${agents.map(a=>`<div><strong>${esc(a.role)}</strong><span>${labels[a.status]||esc(a.status)}</span>${a.task?`<p>${esc(a.task)}</p>`:''}</div>`).join('')}</div>`}<p class="help">${p.draft_ready?'正文已可查看,评分独立完成。':'正文保存后会自动显示;等待子 agent 时可能暂时没有新消息。'}${p.last_activity?' 最近活动:'+new Date(p.last_activity).toLocaleTimeString():''}</p>`;
578
+ $('run-progress').innerHTML=`<div class="section-title"><div><p class="eyebrow">${({learn:'技能学习',review:'独立审阅',assess:'独立评分',revise:'稿件修订',fact_check:'独立事实核查'})[job.kind]||'简报生成'} · ${running?'后台正在运行':'等待后台执行'}</p><h2>${esc(pendingRequests.length?'等待你的确认':stageLabel||(job.status==='queued'?'任务已排队':'正在启动 BriefLoop'))}</h2></div><button class="outline" id="progress-stop">停止任务</button></div><p><strong>${esc(jobModelLabel(job,start))}</strong> · 模型进程 PID ${live.pid||'—'}${live.server_pid?' · 本地服务 PID '+live.server_pid:''}</p><p class="help">${job.status==='queued'?'排队等待':p.started?'已执行':'起始时间待确认'} ${job.status==='queued'||p.started?`${mins} 分 ${secs} 秒`:''} · ${state.settings.timeout_minutes===0?'不限时':'单次执行上限 '+state.settings.timeout_minutes+' 分钟'} <button id="progress-timeout" class="subtle-button">调整时限</button>${run?` · ${JSON.parse(run.source_ids).length} 份初始来源 · ${req.allow_web?'允许联网':'仅本地来源'}`:''}</p>${p.message?`<p class="progress-message">${esc(p.message)}</p>`:''}${stageRailHTML(p.stages)||`<div class="agent-progress">${agents.map(a=>`<div><strong>${esc(a.role)}</strong><span>${labels[a.status]||esc(a.status)}</span>${a.task?`<p>${esc(a.task)}</p>`:''}</div>`).join('')}</div>`}<p class="help">${p.draft_ready?'正文已可查看,评分独立完成。':'正文保存后会自动显示;等待子 agent 时可能暂时没有新消息。'}${p.last_activity?' 最近活动:'+new Date(p.last_activity).toLocaleTimeString():''}</p>`;
561
579
  if(pendingRequests.length){
562
580
  $('run-progress').insertAdjacentHTML('beforeend',`<div class="agent-question" role="status"><strong>有 ${pendingRequests.length} 项操作等待确认</strong><p>打开任务对话,查看具体操作并选择允许、拒绝或补充信息。回答后任务会继续。</p><button id="progress-requests" class="primary">查看并处理</button></div>`);
563
581
  $('progress-requests').onclick=()=>selectChat(taskSession);
@@ -765,7 +783,7 @@ function runtimeChoice(){const model=$('chat-model').value.trim();if(!model)thro
765
783
  function messageTime(value){const date=new Date(value);return Number.isNaN(date.getTime())?'':date.toLocaleTimeString('zh-CN',{hour:'2-digit',minute:'2-digit',hour12:false})}
766
784
  function chatError(text=''){$('chat-error').textContent=text;$('chat-error').hidden=!text}
767
785
  function sessionMissing(error){return /会话或消息不存在|会话不存在/.test(String(error&&error.message||error||''))}
768
- function updateComposer(){renderChatBackendChoice();renderChatRuntimePermissions();const readonly=chat.session&&chat.session.lifecycle&&chat.session.lifecycle!=='active';const active=chatActive(),steering=active&&$('chat-mode').value==='steer';if(steering){const runtime=activeChatRuntime();$('chat-permission').value=runtime.permission||'workspace-write';$('chat-model').value=runtime.model||'';assignEffort('chat-effort',effortValue(runtime,'effort'));$('chat-model-provider').value=runtime.model_provider||'';$('chat-service-tier').value=runtime.service_tier||'';const activeMessage=chat.messages.find(m=>m.role==='user'&&m.turn_id===chat.session?.turn_id);$('chat-allow-web').checked=!!activeMessage?.allow_web} renderFastControls();$('chat-allow-web').disabled=readonly||steering||chat.busy;for(const id of ['chat-model','chat-effort','chat-model-provider','chat-service-tier'])$(id).disabled=readonly||steering||chat.busy;$('chat-permission').disabled=readonly||steering||chat.busy;$('new-session').disabled=chat.busy||chat.uploading>0;$('chat-input').readOnly=chat.busy||readonly;document.querySelectorAll('[data-chat-session]').forEach(b=>b.disabled=chat.busy||chat.uploading>0);$('chat-send').disabled=readonly||chat.busy||chat.uploading>0||(!$('chat-input').value.trim()&&!chat.attachments.size)||!$('chat-model').value.trim();const sendLabel=chat.busy?'发送中…':active?($('chat-mode').value==='steer'?'立即补充':'排队发送'):'发送消息';$('chat-send').textContent=chat.busy?'…':'↑';$('chat-send').setAttribute('aria-label',sendLabel);$('chat-send').title=sendLabel;$('chat-stop').hidden=!sessionBusy(chat.session);$('chat-stop').disabled=chat.busy;$('chat-mode').disabled=!active||chat.busy;$('chat-attach').disabled=readonly||chat.busy||chat.uploading>0;$('attach-existing').disabled=readonly||chat.busy;$('chat-attach').querySelector('span').textContent=chat.uploading?'上传中…':'文件';const model=$('chat-model').value.trim(),label=friendlyModel(model)||'输入模型 ID';$('chat-model').title=model?friendlyModel(model)+' · '+model:'输入模型 ID';if(!model)$('chat-send').title='请先选择模型';const chatBackend=chatBackendChoice();const speed=$('chat-service-tier').hidden?'':($('chat-service-tier').value==='fast'?' · Fast(请求)':$('chat-service-tier').value==='default'?' · 标准':'');const effort=chatBackend==='opencode'?(chat.session?.runtime?.variant||state.settings.model_variant||'模型默认'):($('chat-effort').value==='none'?'模型默认':$('chat-effort').value);$('composer-help').textContent=`Enter 发送 · Shift + Enter 换行 · ${label}${['codex','opencode'].includes(chatBackend)?' / '+effort:''}${speed}${active?' · 立即补充沿用当前联网与模型设置;更改设置请排队到下一回合':''}${model?'':' · 请先从模型列表选择或输入模型 ID'}`}
786
+ function updateComposer(){syncCompactReportControls();renderChatBackendChoice();renderChatRuntimePermissions();const readonly=chat.session&&chat.session.lifecycle&&chat.session.lifecycle!=='active';const active=chatActive(),steering=active&&$('chat-mode').value==='steer';if(steering){const runtime=activeChatRuntime();$('chat-permission').value=runtime.permission||'workspace-write';$('chat-model').value=runtime.model||'';assignEffort('chat-effort',effortValue(runtime,'effort'));$('chat-model-provider').value=runtime.model_provider||'';$('chat-service-tier').value=runtime.service_tier||'';const activeMessage=chat.messages.find(m=>m.role==='user'&&m.turn_id===chat.session?.turn_id);$('chat-allow-web').checked=!!activeMessage?.allow_web} renderFastControls();$('chat-allow-web').disabled=readonly||steering||chat.busy;for(const id of ['chat-model','chat-effort','chat-model-provider','chat-service-tier'])$(id).disabled=readonly||steering||chat.busy;$('chat-permission').disabled=readonly||steering||chat.busy;$('new-session').disabled=chat.busy||chat.uploading>0;$('chat-input').readOnly=chat.busy||readonly;document.querySelectorAll('[data-chat-session]').forEach(b=>b.disabled=chat.busy||chat.uploading>0);$('chat-send').disabled=readonly||chat.busy||chat.uploading>0||(!$('chat-input').value.trim()&&!chat.attachments.size)||!$('chat-model').value.trim();const sendLabel=chat.busy?'发送中…':active?($('chat-mode').value==='steer'?'立即补充':'排队发送'):'发送消息';$('chat-send').textContent=chat.busy?'…':'↑';$('chat-send').setAttribute('aria-label',sendLabel);$('chat-send').title=sendLabel;$('chat-stop').hidden=!sessionBusy(chat.session);$('chat-stop').disabled=chat.busy;$('chat-mode').disabled=!active||chat.busy;$('chat-attach').disabled=readonly||chat.busy||chat.uploading>0;$('attach-existing').disabled=readonly||chat.busy;$('chat-attach').querySelector('span').textContent=chat.uploading?'上传中…':'文件';const model=$('chat-model').value.trim(),label=friendlyModel(model)||'输入模型 ID';$('chat-model').title=model?friendlyModel(model)+' · '+model:'输入模型 ID';if(!model)$('chat-send').title='请先选择模型';const chatBackend=chatBackendChoice();const speed=$('chat-service-tier').hidden?'':($('chat-service-tier').value==='fast'?' · Fast(请求)':$('chat-service-tier').value==='default'?' · 标准':'');const effort=chatBackend==='opencode'?(chat.session?.runtime?.variant||state.settings.model_variant||'模型默认'):($('chat-effort').value==='none'?'模型默认':$('chat-effort').value);$('composer-help').textContent=`Enter 发送 · Shift + Enter 换行 · ${label}${['codex','opencode'].includes(chatBackend)?' / '+effort:''}${speed}${active?' · 立即补充沿用当前联网与模型设置;更改设置请排队到下一回合':''}${model?'':' · 请先从模型列表选择或输入模型 ID'}`}
769
787
  function sessionBusy(session){if(!session)return false;if(typeof session.busy==='boolean')return session.busy;return ['starting','running','stopping'].includes(session.status)||!!session.turn_id||(session.id===chat.id&&(chat.messages.some(m=>['queued','sending','delivered','streaming'].includes(m.status))||chat.requests.some(r=>r.status==='pending')))}
770
788
  function renderSessions(){
771
789
  const signature=JSON.stringify([chat.view,chat.id,chat.sessions]);if(renderSessions.signature===signature)return;renderSessions.signature=signature;$('session-view').value=chat.view;
@@ -929,7 +947,8 @@ async function sendChat(event){
929
947
  event.preventDefault();if(chat.busy||chat.uploading||chat.session&&chat.session.lifecycle&&chat.session.lifecycle!=='active')return;const rawInput=$('chat-input').value.trim();const command=/^\/(\w+)(?:\s+([\s\S]*))?$/.exec(rawInput);if(command){const name=command[1].toLowerCase();if(name==='new'){const panel=commandPanel();if(panel)panel.hidden=true;await newChat();return}if(name==='help'){notice(COMMAND_HELP);$('chat-input').value='';const panel=commandPanel();if(panel)panel.hidden=true;updateComposer();return}}const text=rawInput||(chat.attachments.size?'请查看附件。':'');if(!text)return;const discuss=/^\/discuss\b\s*/i.test(text),displayText=text.replace(/^\/discuss\b\s*/i,'').trim()||'讨论需求',sendText=discuss?(DISCUSS_INSTRUCTION+(displayText!=='讨论需求'?('\n\n用户补充:'+displayText):'')):text;chat.home=false;chat.busy=true;chatError();updateComposer();
930
948
  try{
931
949
  const runtime=runtimeChoice();if(!chat.id){const result=await api('harness/session',{title:displayText.slice(0,48),runtime});chat.session=result.session||result;chat.id=chat.session.id;if(!chat.id)throw Error('未能创建会话');localStorage.setItem('briefloop-chat-session',chat.id);rememberDraft()}
932
- const payload={session_id:chat.id,text:sendText,display_text:sendText===displayText?undefined:displayText,mode:chatActive()?$('chat-mode').value:'queue',source_ids:[...chat.attachments],runtime,allow_web:$('chat-allow-web').checked};const signature=JSON.stringify(payload);
950
+ const reportOptions=compactReportInstruction();
951
+ const payload={session_id:chat.id,text:sendText+reportOptions,display_text:reportOptions||sendText!==displayText?displayText:undefined,mode:chatActive()?$('chat-mode').value:'queue',source_ids:[...chat.attachments],runtime,allow_web:$('chat-allow-web').checked};const signature=JSON.stringify(payload);
933
952
  if(!chat.request||chat.request.signature!==signature)chat.request={signature,message_id:crypto.randomUUID()};
934
953
  await api('harness/message',{...payload,message_id:chat.request.message_id});chat.request=null;$('chat-input').value='';chat.attachments.clear();rememberDraft();renderAttachments();
935
954
  // The runtime used here is the chosen model; keep the pending-selection state in sync.
@@ -1332,6 +1351,7 @@ for(const id of ['model-select','model-provider'])$(id).addEventListener('input'
1332
1351
  $('chat-model-provider').oninput=()=>{rememberDraft();updateComposer()};
1333
1352
  for(const id of ['chat-model','chat-model-provider','model-select','model-provider'])$(id).addEventListener('keydown',event=>{if(event.key==='Enter'){event.preventDefault();event.stopPropagation();$(id).blur()}});
1334
1353
 
1354
+ let lengthEdited=false;
1335
1355
  const LENGTH_PRESETS={quick:[350,500],compact:[800,1000],balanced:[1500,2000],detailed:[2000,2500]};
1336
1356
  function initializeLengthInputs(requirements){
1337
1357
  const preset=LENGTH_PRESETS[$('length-preset').value]||LENGTH_PRESETS.balanced;
@@ -1341,8 +1361,8 @@ function validateLengthInputs(){
1341
1361
  const target=Number($('target-words').value),maximum=Number($('max-words').value);
1342
1362
  $('max-words').setCustomValidity(Number.isInteger(target)&&target>0&&Number.isInteger(maximum)&&maximum>0&&maximum<target?'字数上限不能小于目标字数。':'');
1343
1363
  }
1344
- $('length-preset').onchange=()=>{const [target,maximum]=LENGTH_PRESETS[$('length-preset').value];$('target-words').value=target;$('max-words').value=maximum;validateLengthInputs()};
1345
- for(const id of ['target-words','max-words'])$(id).oninput=validateLengthInputs;
1364
+ $('length-preset').onchange=()=>{lengthEdited=true;const [target,maximum]=LENGTH_PRESETS[$('length-preset').value];$('target-words').value=target;$('max-words').value=maximum;validateLengthInputs()};
1365
+ for(const id of ['target-words','max-words'])$(id).oninput=()=>{lengthEdited=true;validateLengthInputs()};
1346
1366
  function renderBriefLength(){
1347
1367
  renderReportDataButton();
1348
1368
  const element=$('brief-length');if(!current){element.hidden=true;return}element.hidden=false;
@@ -1393,7 +1413,7 @@ function initializeResearchBudget(requirements){const budget=requirements.resear
1393
1413
  function renderBudgetProviderScope(){const p=readSearchPolicy(),native=p.primary_provider==='native'||(p.coverage_mode!=='primary_only'&&p.native_search_enabled);$('budget-provider-scope').textContent='受控 API 渠道共享搜索与候选预算;正文按唯一 URL 计量。'+(native?'宿主原生搜索次数未知,单独显示,不计入受控 API 硬上限。':'')}
1394
1414
  $('budget-preset').onchange=()=>{const budget=RESEARCH_BUDGET_PRESETS[$('budget-preset').value];if(budget)for(const [key,id] of Object.entries(BUDGET_FIELDS))$(id).value=budget[key]};
1395
1415
  for(const id of Object.values(BUDGET_FIELDS))$(id).oninput=reflectBudgetPreset;
1396
- $('research-tier').onchange=()=>{const budget=RESEARCH_TIERS[$('research-tier').value];if(!budget)return;for(const [key,id] of Object.entries(BUDGET_FIELDS))$(id).value=budget[key];reflectBudgetPreset();renderBudgetProviderScope()};
1416
+ $('research-tier').onchange=()=>{if($('research-tier').value==='deep'&&!lengthEdited){$('target-words').value=10000;$('max-words').value=12000;validateLengthInputs()}const budget=RESEARCH_TIERS[$('research-tier').value];if(!budget)return;for(const [key,id] of Object.entries(BUDGET_FIELDS))$(id).value=budget[key];reflectBudgetPreset();renderBudgetProviderScope()};
1397
1417
 
1398
1418
  let budgetPolling=false;
1399
1419
  function researchBudgetTarget(){
@@ -2333,3 +2353,48 @@ async function showSearchActivity(runId){
2333
2353
  }catch(e){$('search-activity-body').textContent=e.message}
2334
2354
  }
2335
2355
  $('search-activity-close').onclick=()=>$('search-activity-dialog').close();
2356
+
2357
+ // Compact report controls: same component in the composer and creation form.
2358
+ function compactReportInstruction(){
2359
+ const row=document.querySelector('[data-report-options="chat"]');if(!row)return '';
2360
+ const tier=row.querySelector('[data-option="tier"]').value;
2361
+ const fact=row.querySelector('[data-option="fact"]').checked&&$('chat-allow-web').checked;
2362
+ return `\n\n本轮报告选项(仅当用户要求生成报告时使用,不因此自动生成):research_tier=${tier},fact_check=${fact}。生成时传入 requirements;${tier==='deep'?'深度研究建议 8000–12000 字,默认 target_words=10000、max_words=12000;':''}用户正文另有明确选择则按正文。`;
2363
+ }
2364
+ function compactReportControls(where){
2365
+ const row=document.createElement('div');row.className='compact-report-options';row.dataset.reportOptions=where;
2366
+ row.innerHTML='<label>研究 <select data-option="tier" aria-label="研究深度"><option value="quick">快速</option><option value="standard" selected>标准</option><option value="deep">深度研究</option></select></label><label title="生成后联网补查关键主张,增加时间与用量"><input type="checkbox" data-option="fact">事实核查</label><label title="基于反馈提出改进,经比较验证后采用"><input type="checkbox" data-option="learn" checked>WikiSkill</label><label><input type="number" min="1" max="20" value="1" data-option="rounds" aria-label="WikiSkill 轮数">轮</label><details><summary aria-label="更多报告选项">更多 ⋯</summary><div class="compact-options-menu"><label>单次执行上限 <select data-option="timeout"><option value="30">30 分钟</option><option value="60" selected>60 分钟</option><option value="120">120 分钟</option><option value="0">不限时</option></select></label><label>Scout 并发 <input data-option="scouts" type="number" min="1" max="16" value="4"></label></div></details>';
2367
+ row.addEventListener('change',event=>action(async()=>{
2368
+ const key=event.target.dataset.option;if(!key)return;const value=event.target.type==='checkbox'?event.target.checked:event.target.value;
2369
+ if(key==='tier'){$('research-tier').value=value;$('research-tier').dispatchEvent(new Event('change'))}
2370
+ if(key==='fact')$('requirements').elements.fact_check.checked=value;
2371
+ const field={tier:'research_tier',fact:'fact_checker',learn:'auto_learn',rounds:'k',timeout:'timeout_minutes',scouts:'max_parallel'}[key];
2372
+ const setting=['rounds','timeout','scouts'].includes(key)?Number(value):value;
2373
+ await api('settings',{[field]:setting});state.settings[field]=setting;
2374
+ if(key==='learn')$('auto-learn').checked=value;if(key==='rounds')$('rounds').value=value;if(key==='timeout')$('timeout-minutes').value=value;
2375
+ syncCompactReportControls();
2376
+ }));return row;
2377
+ }
2378
+ function syncCompactReportControls(){
2379
+ if(!state?.settings)return;
2380
+ document.querySelectorAll('[data-report-options]').forEach(row=>{
2381
+ const web=row.dataset.reportOptions==='chat'?$('chat-allow-web').checked:$('requirements').elements.allow_web.checked;
2382
+ for(const [key,value] of Object.entries({tier:row.dataset.reportOptions==='setup'?$('research-tier').value:state.settings.research_tier||'standard',fact:row.dataset.reportOptions==='setup'?$('requirements').elements.fact_check.checked:state.settings.fact_checker,learn:state.settings.auto_learn,rounds:state.settings.k,timeout:state.settings.timeout_minutes,scouts:state.settings.max_parallel})){
2383
+ const input=row.querySelector(`[data-option="${key}"]`);if(document.activeElement===input)continue;if(input.type==='checkbox')input.checked=!!value;else input.value=value;
2384
+ }
2385
+ const fact=row.querySelector('[data-option="fact"]');fact.disabled=!web;if(!web)fact.checked=false;
2386
+ });
2387
+ const reports=$('max-reports');if(reports&&document.activeElement!==reports&&!reports.dataset.editing)reports.value=state.settings.max_reports||4;
2388
+ }
2389
+ function mountCompactReportControls(){
2390
+ const form=$('chat-input').closest('form');form.append(compactReportControls('chat'));
2391
+ const setup=compactReportControls('setup');const tier=$('research-tier').closest('label');tier.before(setup);tier.classList.add('compact-legacy-option');tier.hidden=true;
2392
+ if(tier.nextElementSibling?.classList.contains('help'))tier.nextElementSibling.hidden=true;
2393
+ const fact=$('requirements').elements.fact_check.closest('label');fact.classList.add('compact-legacy-option');fact.hidden=true;if(fact.nextElementSibling?.classList.contains('help'))fact.nextElementSibling.hidden=true;
2394
+ const label=document.createElement('label');label.textContent='同时生成报告数 ';const input=document.createElement('input');input.id='max-reports';input.type='number';input.min='1';input.max='16';input.value='4';label.append(input);$('settings-view-execution').append(label);
2395
+ input.oninput=()=>{input.dataset.editing='1'};input.onchange=()=>{const value=Number(input.value);return action(async()=>{const result=await api('settings',{max_reports:value});state.settings.max_reports=result.max_reports;delete input.dataset.editing;notice('并发数已保存;已运行报告继续,新任务按空位开始')})};
2396
+ const save=document.createElement('button');save.type='button';save.className='outline';save.textContent='保存并发数';save.onclick=()=>input.onchange();label.append(save);
2397
+ for(const control of [$('chat-allow-web'),$('requirements').elements.allow_web])control.addEventListener('change',syncCompactReportControls);
2398
+ syncCompactReportControls();
2399
+ }
2400
+ mountCompactReportControls();
@@ -0,0 +1,14 @@
1
+ // Keep the visible result while a refresh is in flight. Replacing identical
2
+ // markup resets expanded findings and can collapse a scrolled review pane.
3
+ export function beginPanel(box,version,placeholder=''){
4
+ if(box.dataset.reportVersion===version)return;
5
+ box.dataset.reportVersion=version;
6
+ box.innerHTML=placeholder;
7
+ box._reportHTML=placeholder;
8
+ }
9
+ export function updatePanel(box,html){
10
+ if(box._reportHTML===html)return false;
11
+ box.innerHTML=html;
12
+ box._reportHTML=html;
13
+ return true;
14
+ }
@@ -16,7 +16,7 @@ export function taskProgressCard(job,p,{label='报告任务',kindLabel='',expand
16
16
  const stage=(active?(p?.needs_attention?'等待你的确认':p?.stage):states[job.status])||(job.status==='queued'?'等待后台开始':states[job.status]||'读取进度中');
17
17
  const workers=p?.agents||[],activeWorkers=workers.filter(w=>['running','pending_init'].includes(w.status));
18
18
  const tier={quick:'快速研究',standard:'标准研究',deep:'深度研究'}[p?.tier];
19
- const meta=[!p&&!error?'正在读取进度':null,tier,p?.round?`第 ${p.round} 轮`:null,`已${active?'等待 / 运行':'用时'} ${elapsedText(p?.started||job.created,!active?Date.parse(p?.ended||job.updated||job.created):now)}`,p?.last_activity?`最近活动记录 ${elapsedText(p.last_activity,now)}前`:null].filter(Boolean).join(' · ');
19
+ const meta=[!p&&!error?'正在读取进度':null,tier,p?.round?`第 ${p.round} 轮`:null,job.status==='queued'?`已等待 ${elapsedText(job.created,now)} · 尚未执行`:p?.started?`排队 ${elapsedText(p.queued_at||job.created,Date.parse(p.started))} · 已执行 ${elapsedText(p.started,!active?Date.parse(p.ended||job.updated):now)}`:'执行时间待确认',p?.last_activity?`最近活动记录 ${elapsedText(p.last_activity,now)}前`:null].filter(Boolean).join(' · ');
20
20
  const chips=p&&p.run_id?[`已保存 ${p.source_count} 份材料`,...(p.search_metered?[`成功搜索 ${p.search_counts.completed} 次`,...(p.search_counts.failed?[`失败 ${p.search_counts.failed} 次`]:[])]:[]),...(activeWorkers.length&&active?[`${activeWorkers.length} 个子任务进行中`]:[])]:[];
21
21
  const rail=(p?.stages||[]).map(s=>`<li class="${e(s.status)}"><span aria-hidden="true">${s.status==='done'?'✓':'●'}</span>${e(s.label)}</li>`).join('');
22
22
  const timeline=(p?.timeline||[]).map(t=>`<li class="${e(t.status)}"><span class="progress-bullet" aria-hidden="true">${t.status==='done'?'✓':'•'}</span><div><strong>${e(t.label)}</strong>${t.detail?`<p>${e(t.detail)}</p>`:''}</div></li>`).join('');
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "briefloop"
7
- version = "0.22.1"
7
+ version = "0.22.3"
8
8
  description = "Local multi-runtime agent workbench for sourced briefings, independent review and skill learning"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -0,0 +1 @@
1
+ __version__ = "0.22.3"
@@ -10,6 +10,43 @@ ALIGN = {'left': WD_ALIGN_PARAGRAPH.LEFT, 'center': WD_ALIGN_PARAGRAPH.CENTER,
10
10
  'right': WD_ALIGN_PARAGRAPH.RIGHT, 'justify': WD_ALIGN_PARAGRAPH.JUSTIFY}
11
11
 
12
12
 
13
+ def reader_source_blocks(document, sources):
14
+ """Replace only a recognized internal source index, not authored data tables."""
15
+ def text(node):
16
+ return node.get('text', '') + ''.join(text(c) for c in node.get('content', []))
17
+ blocks = document.get('content', [])
18
+ kept, indexed = [], []
19
+ for node in blocks:
20
+ rows = node.get('content', [])
21
+ headers = [text(c).strip() for c in rows[0].get('content', [])] if rows else []
22
+ ids = []
23
+ if (node.get('type') == 'table' and kept and kept[-1].get('type') == 'heading'
24
+ and text(kept[-1]).strip() in ('来源', '参考来源', '参考资料')
25
+ and headers in (['编号', '主体/来源', 'source_id'], ['编号', '主体来源', 'source_id'])
26
+ and len(rows) > 1):
27
+ for row in rows[1:]:
28
+ cells = row.get('content', [])
29
+ if len(cells) != 3 or not text(cells[0]).strip().isdigit():
30
+ break
31
+ if any(len(c.get('content', [])) != 1 or c['content'][0].get('type') != 'paragraph'
32
+ or any(n.get('type') != 'text' for n in c['content'][0].get('content', []))
33
+ for c in cells):
34
+ break
35
+ sid = text(cells[2]).strip()
36
+ if sid not in sources or not sources[sid].get('name'):
37
+ break
38
+ # Do not discard merged cells or additional structured content.
39
+ if any(c.get('attrs', {}).get(k, 1) != 1 for c in cells for k in ('colspan', 'rowspan')):
40
+ break
41
+ ids.append(sid)
42
+ if len(ids) == len(rows) - 1:
43
+ kept.pop()
44
+ indexed.extend(ids)
45
+ continue
46
+ kept.append(node)
47
+ return kept, indexed
48
+
49
+
13
50
  def without_duplicate_cover_heading(document,title):
14
51
  """Drop one repeated cover H1, preserving every surrounding block and table."""
15
52
  from copy import deepcopy
@@ -185,14 +222,22 @@ def render_document(doc, document, *, figures=None, sources=None, append_sources
185
222
  row._tr.get_or_add_trPr().append(OxmlElement('w:cantSplit'))
186
223
  else: raise ValueError('不支持的导出内容:' + kind)
187
224
 
188
- for node in document.get('content', []): block(node)
225
+ blocks, indexed = reader_source_blocks(document, sources) if append_sources else (document.get('content', []), [])
226
+ for node in blocks: block(node)
227
+ for sid in indexed:
228
+ if sid not in used: used.append(sid)
189
229
  if append_sources and used:
190
230
  doc.add_heading('来源', level=2)
191
231
  for i, sid in enumerate(used, 1):
192
232
  source = sources.get(sid, {})
193
- p = doc.add_paragraph(f'{i}. ' + source.get('name', sid))
194
- if source.get('url'):
195
- inline(p, [{'type': 'text', 'text': ' 原文', 'marks': [{'type': 'link', 'attrs': {'href': source['url']}}]}])
233
+ p = doc.add_paragraph(f'{i}. ')
234
+ label = source.get('name') or '引用来源未关联,请补充核对'
235
+ url = source.get('url') or ''
236
+ if url.startswith(('https://', 'http://')):
237
+ inline(p, [{'type': 'text', 'text': label, 'marks': [{'type': 'link', 'attrs': {'href': url}},
238
+ {'type': 'textStyle', 'attrs': {'color': '#0563C1'}}]}])
239
+ else:
240
+ p.add_run(label)
196
241
  from .industry_export import populate_table_of_contents
197
242
  populate_table_of_contents(doc)
198
243
  return doc
@@ -15,7 +15,7 @@ def export_input(store, brief, template_override=None):
15
15
  # rendering template and must change the export fingerprint.
16
16
  requirements = {**requirements, 'template_id': template_override}
17
17
  figures = export_figures(store, brief)
18
- identity = {'renderer': 15 if requirements.get('template_id') else 17, 'version_id': brief['id'], 'brief_hash': brief['hash'],
18
+ identity = {'renderer': 18 if requirements.get('template_id') else 19, 'version_id': brief['id'], 'brief_hash': brief['hash'],
19
19
  'document': brief_document(brief), 'detail': json.loads(brief['detail']),
20
20
  'requirements': requirements,
21
21
  'figures': {fid: {**{k: v for k, v in f.items() if k != 'image_bytes'},
@@ -117,7 +117,7 @@ class Requirements(Model):
117
117
 
118
118
  @model_validator(mode='after')
119
119
  def fill_length_preferences(self):
120
- target,maximum=(5000,5500) if self.report_profile=="industry_periodic" else LENGTH_PRESETS[self.extent]
120
+ target,maximum=(10000,12000) if self.research_tier=="deep" else (5000,5500) if self.report_profile=="industry_periodic" else LENGTH_PRESETS[self.extent]
121
121
  if self.target_words is None:self.target_words=target
122
122
  if self.max_words is None:self.max_words=max(maximum,self.target_words)
123
123
  if self.max_words<self.target_words:
@@ -205,14 +205,16 @@ class Settings(RoleModel):
205
205
  search_policy: SearchPolicy | None = None
206
206
  k: int = Field(default=1, ge=1, le=20)
207
207
  auto_learn: bool = True
208
+ max_reports: int = Field(default=4, ge=1, le=16)
208
209
  max_parallel: int = Field(default=4, ge=1, le=16)
209
- timeout_minutes: int = Field(default=30, ge=0, le=240) # 0 disables the run deadline.
210
+ timeout_minutes: int = Field(default=60, ge=0, le=240) # 0 disables the run deadline.
210
211
  skill_targets: list[str] = Field(default_factory=lambda: ["scout", "analyst"])
211
212
  auto_revision: bool = True
212
213
  default_template_id: str | None = None
213
214
  company_context_enabled: bool | None = None
214
215
  # Workspace-wide default for the per-task fact_check switch; tasks may override.
215
216
  fact_checker: bool = False
217
+ research_tier: Literal['quick','standard','deep'] = 'standard'
216
218
 
217
219
 
218
220
  @model_validator(mode='after')
@@ -110,6 +110,8 @@ def freeze(store, run_id, *, preset=None, structure=None, owner_job_id=None):
110
110
  chosen['depth'] = max(1, min(chosen['depth'], budget['search_requests']))
111
111
  chosen['breadth'] = max(1, min(chosen['breadth'], budget['search_requests'] // chosen['depth']))
112
112
  job = _owner_job(store, run_id)
113
+ if not structure or 'parallel' not in structure:
114
+ chosen['parallel'] = _runtime_snapshot(store, job)['max_parallel']
113
115
  snapshot = {
114
116
  'research_protocol': PROTOCOL,
115
117
  'run_id': run_id,