briefloop 0.22.1__tar.gz → 0.22.2__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 (660) hide show
  1. {briefloop-0.22.1 → briefloop-0.22.2}/CHANGELOG.md +7 -0
  2. {briefloop-0.22.1 → briefloop-0.22.2}/PKG-INFO +1 -1
  3. briefloop-0.22.2/VERSION +1 -0
  4. {briefloop-0.22.1 → briefloop-0.22.2}/desktop/electron/package-lock.json +2 -2
  5. {briefloop-0.22.1 → briefloop-0.22.2}/desktop/electron/package.json +1 -1
  6. {briefloop-0.22.1 → briefloop-0.22.2}/frontend/app.js +96 -31
  7. briefloop-0.22.2/frontend/report-panels.js +14 -0
  8. {briefloop-0.22.1 → briefloop-0.22.2}/frontend/task-progress.js +1 -1
  9. {briefloop-0.22.1 → briefloop-0.22.2}/pyproject.toml +1 -1
  10. briefloop-0.22.2/src/briefloop/__init__.py +1 -0
  11. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/models.py +4 -2
  12. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/research_plan.py +2 -0
  13. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/runtime.py +73 -38
  14. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/server.py +7 -3
  15. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/app.js +87 -85
  16. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/index.html +2 -2
  17. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/style.css +9 -0
  18. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/store.py +2 -0
  19. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/task_progress.py +3 -1
  20. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop.egg-info/PKG-INFO +1 -1
  21. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop.egg-info/SOURCES.txt +4 -0
  22. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_open_brief_status.mjs +1 -1
  23. briefloop-0.22.2/tests/frontend_pending_report.mjs +18 -0
  24. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_report_outline.mjs +1 -1
  25. briefloop-0.22.2/tests/frontend_report_panels.mjs +35 -0
  26. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_save_barrier.mjs +1 -1
  27. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_fact_check_orchestration.py +1 -1
  28. briefloop-0.22.2/tests/test_report_concurrency.py +48 -0
  29. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_research_plan.py +11 -1
  30. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_runtime_concurrency.py +1 -1
  31. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_runtime_settlement.py +2 -2
  32. briefloop-0.22.1/VERSION +0 -1
  33. briefloop-0.22.1/src/briefloop/__init__.py +0 -1
  34. {briefloop-0.22.1 → briefloop-0.22.2}/.gitattributes +0 -0
  35. {briefloop-0.22.1 → briefloop-0.22.2}/CONTRIBUTING.md +0 -0
  36. {briefloop-0.22.1 → briefloop-0.22.2}/KNOWN_ISSUES.md +0 -0
  37. {briefloop-0.22.1 → briefloop-0.22.2}/LICENSE +0 -0
  38. {briefloop-0.22.1 → briefloop-0.22.2}/MANIFEST.in +0 -0
  39. {briefloop-0.22.1 → briefloop-0.22.2}/README.md +0 -0
  40. {briefloop-0.22.1 → briefloop-0.22.2}/SECURITY.md +0 -0
  41. {briefloop-0.22.1 → briefloop-0.22.2}/THIRD_PARTY_NOTICES.md +0 -0
  42. {briefloop-0.22.1 → briefloop-0.22.2}/bootstrap.py +0 -0
  43. {briefloop-0.22.1 → briefloop-0.22.2}/docs/WorkBuddy/345/244/226/351/203/250/345/205/245/345/217/243.md" +0 -0
  44. {briefloop-0.22.1 → briefloop-0.22.2}/docs/architecture.md +0 -0
  45. {briefloop-0.22.1 → briefloop-0.22.2}/docs/report-time-window.md +0 -0
  46. {briefloop-0.22.1 → briefloop-0.22.2}/docs/technical-report-0.21.0/evidence-index.md +0 -0
  47. {briefloop-0.22.1 → briefloop-0.22.2}/docs/technical-report-0.21.0/technical-report.md +0 -0
  48. {briefloop-0.22.1 → briefloop-0.22.2}/docs/windows.md +0 -0
  49. {briefloop-0.22.1 → briefloop-0.22.2}/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
  50. {briefloop-0.22.1 → briefloop-0.22.2}/docs//344/274/232/350/256/256/347/272/252/350/246/201.md" +0 -0
  51. {briefloop-0.22.1 → briefloop-0.22.2}/docs//344/275/277/347/224/250/346/214/207/345/215/227.md" +0 -0
  52. {briefloop-0.22.1 → briefloop-0.22.2}/docs//345/215/207/347/272/247/350/257/264/346/230/216.md" +0 -0
  53. {briefloop-0.22.1 → briefloop-0.22.2}/docs//345/233/276/350/241/250/344/270/216Excel.md" +0 -0
  54. {briefloop-0.22.1 → briefloop-0.22.2}/docs//345/244/232Runtime/344/270/216/346/250/241/345/236/213.md" +0 -0
  55. {briefloop-0.22.1 → briefloop-0.22.2}/docs//345/244/232/346/250/241/346/200/201/346/235/245/346/272/220.md" +0 -0
  56. {briefloop-0.22.1 → briefloop-0.22.2}/docs//345/256/232/346/227/266/346/212/245/345/221/212.md" +0 -0
  57. {briefloop-0.22.1 → briefloop-0.22.2}/docs//345/257/271/350/257/235/345/256/277/344/270/273/345/210/207/346/215/242.md" +0 -0
  58. {briefloop-0.22.1 → briefloop-0.22.2}/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
  59. {briefloop-0.22.1 → briefloop-0.22.2}/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
  60. {briefloop-0.22.1 → briefloop-0.22.2}/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
  61. {briefloop-0.22.1 → briefloop-0.22.2}/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
  62. {briefloop-0.22.1 → briefloop-0.22.2}/docs//350/241/214/344/270/232/346/212/245/345/221/212.md" +0 -0
  63. {briefloop-0.22.1 → briefloop-0.22.2}/docs//350/257/201/345/210/270/347/240/224/347/251/266.md" +0 -0
  64. {briefloop-0.22.1 → briefloop-0.22.2}/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
  65. {briefloop-0.22.1 → briefloop-0.22.2}/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
  66. {briefloop-0.22.1 → briefloop-0.22.2}/examples/internal-weekly-report/README.md +0 -0
  67. {briefloop-0.22.1 → briefloop-0.22.2}/examples/internal-weekly-report/report.md +0 -0
  68. {briefloop-0.22.1 → briefloop-0.22.2}/examples/internal-weekly-report/source.txt +0 -0
  69. {briefloop-0.22.1 → briefloop-0.22.2}/examples/meeting-minutes/transcript.txt +0 -0
  70. {briefloop-0.22.1 → briefloop-0.22.2}/examples/stock-research/earnings-event.txt +0 -0
  71. {briefloop-0.22.1 → briefloop-0.22.2}/frontend/clipboard.js +0 -0
  72. {briefloop-0.22.1 → briefloop-0.22.2}/frontend/connectors.js +0 -0
  73. {briefloop-0.22.1 → briefloop-0.22.2}/frontend/mcp-selection.js +0 -0
  74. {briefloop-0.22.1 → briefloop-0.22.2}/frontend/notifications.js +0 -0
  75. {briefloop-0.22.1 → briefloop-0.22.2}/frontend/polling.js +0 -0
  76. {briefloop-0.22.1 → briefloop-0.22.2}/frontend/review-status.js +0 -0
  77. {briefloop-0.22.1 → briefloop-0.22.2}/frontend/rich-document.js +0 -0
  78. {briefloop-0.22.1 → briefloop-0.22.2}/frontend/runtime-cards.js +0 -0
  79. {briefloop-0.22.1 → briefloop-0.22.2}/frontend/schedules.js +0 -0
  80. {briefloop-0.22.1 → briefloop-0.22.2}/frontend/uploads.js +0 -0
  81. {briefloop-0.22.1 → briefloop-0.22.2}/package-lock.json +0 -0
  82. {briefloop-0.22.1 → briefloop-0.22.2}/package.json +0 -0
  83. {briefloop-0.22.1 → briefloop-0.22.2}/probes/mcp_m0/README.md +0 -0
  84. {briefloop-0.22.1 → briefloop-0.22.2}/probes/mcp_m0/probe.py +0 -0
  85. {briefloop-0.22.1 → briefloop-0.22.2}/probes/mcp_m0/requirements.txt +0 -0
  86. {briefloop-0.22.1 → briefloop-0.22.2}/probes/mcp_m0/server.py +0 -0
  87. {briefloop-0.22.1 → briefloop-0.22.2}/runtime-bridge/README.md +0 -0
  88. {briefloop-0.22.1 → briefloop-0.22.2}/runtime-bridge/bridge.test.mjs +0 -0
  89. {briefloop-0.22.1 → briefloop-0.22.2}/runtime-bridge/build.mjs +0 -0
  90. {briefloop-0.22.1 → briefloop-0.22.2}/runtime-bridge/catalog.json +0 -0
  91. {briefloop-0.22.1 → briefloop-0.22.2}/runtime-bridge/main.ts +0 -0
  92. {briefloop-0.22.1 → briefloop-0.22.2}/runtime-bridge/pi.ts +0 -0
  93. {briefloop-0.22.1 → briefloop-0.22.2}/scripts/build_frontend.mjs +0 -0
  94. {briefloop-0.22.1 → briefloop-0.22.2}/scripts/build_frontend_licenses.mjs +0 -0
  95. {briefloop-0.22.1 → briefloop-0.22.2}/scripts/check_versions.py +0 -0
  96. {briefloop-0.22.1 → briefloop-0.22.2}/scripts/test_frontend.mjs +0 -0
  97. {briefloop-0.22.1 → briefloop-0.22.2}/setup.cfg +0 -0
  98. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/__main__.py +0 -0
  99. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/_entrypoint.py +0 -0
  100. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/agent_commands.py +0 -0
  101. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/app_server.py +0 -0
  102. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/audit_bundle.py +0 -0
  103. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/backends/__init__.py +0 -0
  104. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/backends/opencode_server.py +0 -0
  105. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/bocha.py +0 -0
  106. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/bridge_harness.py +0 -0
  107. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/chat_dispatch.py +0 -0
  108. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/chat_execution.py +0 -0
  109. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/chat_store.py +0 -0
  110. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/chat_tools.py +0 -0
  111. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/cli.py +0 -0
  112. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/company_context.py +0 -0
  113. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/conflicts.py +0 -0
  114. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/connectors/MATERIALS.md +0 -0
  115. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/connectors/README.md +0 -0
  116. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/connectors/__init__.py +0 -0
  117. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/connectors/config.py +0 -0
  118. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/connectors/grants.py +0 -0
  119. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/connectors/materials.py +0 -0
  120. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/connectors/receipts.py +0 -0
  121. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/connectors/runtime.py +0 -0
  122. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/connectors/runtime_tools.py +0 -0
  123. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/connectors/service.py +0 -0
  124. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/connectors/stdio_supervisor.py +0 -0
  125. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/connectors/task_client.py +0 -0
  126. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/connectors/tasks.py +0 -0
  127. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/connectors/transport.py +0 -0
  128. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/connectors/windows_acl.py +0 -0
  129. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/default_fonts.py +0 -0
  130. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/deliverable_spec.py +0 -0
  131. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/delivery_checks.py +0 -0
  132. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/demo.py +0 -0
  133. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/document_export.py +0 -0
  134. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/document_model.py +0 -0
  135. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/document_workflows.py +0 -0
  136. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/duckduckgo.py +0 -0
  137. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/evidence.py +0 -0
  138. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/execution_records.py +0 -0
  139. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/export_jobs.py +0 -0
  140. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/exports.py +0 -0
  141. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/external_client.py +0 -0
  142. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/external_requests.py +0 -0
  143. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/fact_check.py +0 -0
  144. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/fast_mode.py +0 -0
  145. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/figure_support.py +0 -0
  146. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/figures.py +0 -0
  147. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/harness.py +0 -0
  148. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/host_bins.py +0 -0
  149. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/industry_data.py +0 -0
  150. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/industry_export.py +0 -0
  151. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/interactive_runtime.py +0 -0
  152. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/learning.py +0 -0
  153. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/length.py +0 -0
  154. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/media.py +0 -0
  155. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/notifications.py +0 -0
  156. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/opencode_harness.py +0 -0
  157. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/parent_watch.py +0 -0
  158. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/platform_support.py +0 -0
  159. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/process_host.py +0 -0
  160. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/progress.py +0 -0
  161. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/projections.py +0 -0
  162. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/reconciliation.py +0 -0
  163. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/release.py +0 -0
  164. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/report_profiles.py +0 -0
  165. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/report_time.py +0 -0
  166. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/report_tools.py +0 -0
  167. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/research_budget.py +0 -0
  168. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/review.py +0 -0
  169. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/review_learning.py +0 -0
  170. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/revision_policy.py +0 -0
  171. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/rpc_writer.py +0 -0
  172. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/runtime_bridge.py +0 -0
  173. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/runtime_permissions.py +0 -0
  174. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/schedules.py +0 -0
  175. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/scout_tools.py +0 -0
  176. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/search_policy.py +0 -0
  177. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/skill_assets/briefloop-external/SKILL.md +0 -0
  178. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/skill_assets/duckduckgo/SKILL.md +0 -0
  179. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/skill_assets/multi-search/SKILL.md +0 -0
  180. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/skill_assets/tavily/SKILL.md +0 -0
  181. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/skills.py +0 -0
  182. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/software_version.py +0 -0
  183. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/source_updates.py +0 -0
  184. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/sources.py +0 -0
  185. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/frontend-licenses.txt +0 -0
  186. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-aider.png +0 -0
  187. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-amr.svg +0 -0
  188. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-antigravity.svg +0 -0
  189. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-bridge.LICENSE.txt +0 -0
  190. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-bridge.NOTICE.txt +0 -0
  191. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-bridge.mjs +0 -0
  192. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-claude.svg +0 -0
  193. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-codebuddy.svg +0 -0
  194. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-codex.svg +0 -0
  195. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-copilot.svg +0 -0
  196. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-cursor-agent.svg +0 -0
  197. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-deepseek.svg +0 -0
  198. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-devin.png +0 -0
  199. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-grok-build.svg +0 -0
  200. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-hermes.svg +0 -0
  201. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-kilo.svg +0 -0
  202. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-kimi.svg +0 -0
  203. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-kiro.svg +0 -0
  204. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-mimo.svg +0 -0
  205. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-opencode.svg +0 -0
  206. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-pi.svg +0 -0
  207. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-qoder.svg +0 -0
  208. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-qwen.svg +0 -0
  209. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-reasonix.svg +0 -0
  210. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-trae-cli.png +0 -0
  211. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/static/runtime-vibe.svg +0 -0
  212. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/task_notify.py +0 -0
  213. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/tavily.py +0 -0
  214. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/academic-paper-zh-t1.docx +0 -0
  215. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/academic-paper-zh-t1.spec.json +0 -0
  216. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/academic-paper-zh-t2.docx +0 -0
  217. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/academic-paper-zh-t2.spec.json +0 -0
  218. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/academic-paper-zh-t3.docx +0 -0
  219. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/academic-paper-zh-t3.spec.json +0 -0
  220. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/academic-paper-zh-t4.docx +0 -0
  221. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/academic-paper-zh-t4.spec.json +0 -0
  222. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/academic-paper-zh-t5.docx +0 -0
  223. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/academic-paper-zh-t5.spec.json +0 -0
  224. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/annual-report-zh-t1.docx +0 -0
  225. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/annual-report-zh-t1.spec.json +0 -0
  226. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/annual-report-zh-t2.docx +0 -0
  227. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/annual-report-zh-t2.spec.json +0 -0
  228. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/annual-report-zh-t3.docx +0 -0
  229. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/annual-report-zh-t3.spec.json +0 -0
  230. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/annual-report-zh-t4.docx +0 -0
  231. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/annual-report-zh-t4.spec.json +0 -0
  232. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/annual-report-zh-t5.docx +0 -0
  233. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/annual-report-zh-t5.spec.json +0 -0
  234. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/business-report-zh-t1.docx +0 -0
  235. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/business-report-zh-t1.spec.json +0 -0
  236. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/business-report-zh-t2.docx +0 -0
  237. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/business-report-zh-t2.spec.json +0 -0
  238. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/business-report-zh-t3.docx +0 -0
  239. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/business-report-zh-t3.spec.json +0 -0
  240. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/business-report-zh-t4.docx +0 -0
  241. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/business-report-zh-t4.spec.json +0 -0
  242. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/business-report-zh-t5.docx +0 -0
  243. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/business-report-zh-t5.spec.json +0 -0
  244. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/general-report-zh-t1.docx +0 -0
  245. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/general-report-zh-t1.spec.json +0 -0
  246. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/general-report-zh-t2.docx +0 -0
  247. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/general-report-zh-t2.spec.json +0 -0
  248. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/general-report-zh-t3.docx +0 -0
  249. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/general-report-zh-t3.spec.json +0 -0
  250. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/general-report-zh-t4.docx +0 -0
  251. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/general-report-zh-t4.spec.json +0 -0
  252. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/general-report-zh-t5.docx +0 -0
  253. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/general-report-zh-t5.spec.json +0 -0
  254. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/government-doc-zh-t4.docx +0 -0
  255. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/government-doc-zh-t4.spec.json +0 -0
  256. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/legal-contract-zh-t1.docx +0 -0
  257. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/legal-contract-zh-t1.spec.json +0 -0
  258. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/legal-contract-zh-t2.docx +0 -0
  259. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/legal-contract-zh-t2.spec.json +0 -0
  260. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/legal-contract-zh-t3.docx +0 -0
  261. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/legal-contract-zh-t3.spec.json +0 -0
  262. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/legal-contract-zh-t4.docx +0 -0
  263. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/legal-contract-zh-t4.spec.json +0 -0
  264. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/legal-contract-zh-t5.docx +0 -0
  265. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/legal-contract-zh-t5.spec.json +0 -0
  266. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/meeting-minutes-zh-t1.docx +0 -0
  267. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/meeting-minutes-zh-t1.spec.json +0 -0
  268. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/meeting-minutes-zh-t2.docx +0 -0
  269. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/meeting-minutes-zh-t2.spec.json +0 -0
  270. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/meeting-minutes-zh-t3.docx +0 -0
  271. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/meeting-minutes-zh-t3.spec.json +0 -0
  272. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/meeting-minutes-zh-t4.docx +0 -0
  273. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/meeting-minutes-zh-t4.spec.json +0 -0
  274. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/meeting-minutes-zh-t5.docx +0 -0
  275. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/meeting-minutes-zh-t5.spec.json +0 -0
  276. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/stock-research-zh-t1.docx +0 -0
  277. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/stock-research-zh-t1.spec.json +0 -0
  278. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/stock-research-zh-t2.docx +0 -0
  279. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/stock-research-zh-t2.spec.json +0 -0
  280. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/stock-research-zh-t3.docx +0 -0
  281. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/stock-research-zh-t3.spec.json +0 -0
  282. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/stock-research-zh-t4.docx +0 -0
  283. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/stock-research-zh-t4.spec.json +0 -0
  284. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/stock-research-zh-t5.docx +0 -0
  285. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/template_assets/stock-research-zh-t5.spec.json +0 -0
  286. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/templates.py +0 -0
  287. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/websearch.py +0 -0
  288. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/windows_process.py +0 -0
  289. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/word_import.py +0 -0
  290. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workbook_figures.py +0 -0
  291. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/business_report/evaluation.md +0 -0
  292. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/business_report/manifest.json +0 -0
  293. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/business_report/methods/decision_memo.md +0 -0
  294. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/business_report/methods/industry_periodic.md +0 -0
  295. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/business_report/methods/work_progress.md +0 -0
  296. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/business_report/planning.md +0 -0
  297. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/business_report/writing.md +0 -0
  298. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/general_report/evaluation.md +0 -0
  299. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/general_report/manifest.json +0 -0
  300. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/general_report/planning.md +0 -0
  301. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/general_report/writing.md +0 -0
  302. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/meeting_minutes/evaluation.md +0 -0
  303. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/meeting_minutes/manifest.json +0 -0
  304. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/meeting_minutes/planning.md +0 -0
  305. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/meeting_minutes/writing.md +0 -0
  306. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/stock_research/evaluation.md +0 -0
  307. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/stock_research/manifest.json +0 -0
  308. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/stock_research/methods/company_research.md +0 -0
  309. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/stock_research/methods/event_commentary.md +0 -0
  310. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/stock_research/methods/industry_tracking.md +0 -0
  311. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/stock_research/planning.md +0 -0
  312. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workflow_assets/stock_research/writing.md +0 -0
  313. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workspace_profile.py +0 -0
  314. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/workspaces.py +0 -0
  315. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop/zhipu.py +0 -0
  316. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop.egg-info/dependency_links.txt +0 -0
  317. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop.egg-info/entry_points.txt +0 -0
  318. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop.egg-info/requires.txt +0 -0
  319. {briefloop-0.22.1 → briefloop-0.22.2}/src/briefloop.egg-info/top_level.txt +0 -0
  320. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/__init__.py +0 -0
  321. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/__main__.py +0 -0
  322. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/_licenses/LICENSE +0 -0
  323. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/_licenses/NOTICE.md +0 -0
  324. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/_licenses/third_party/acorn/LICENSE +0 -0
  325. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/_licenses/third_party/acorn/NOTICE.md +0 -0
  326. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/_licenses/third_party/officeqa/LICENSE-APACHE +0 -0
  327. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/_licenses/third_party/officeqa/NOTICE +0 -0
  328. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/alfworld/__init__.py +0 -0
  329. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/alfworld/act.sh +0 -0
  330. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/alfworld/rollout.py +0 -0
  331. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/alfworld/step.py +0 -0
  332. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/benchmarks/__init__.py +0 -0
  333. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/benchmarks/alfworld.py +0 -0
  334. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/benchmarks/livemath.py +0 -0
  335. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/benchmarks/sealqa.py +0 -0
  336. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/benchmarks/spreadsheet.py +0 -0
  337. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/cli.py +0 -0
  338. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/codex_identity.py +0 -0
  339. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/engine.py +0 -0
  340. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/feedback_loop.py +0 -0
  341. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/isolated/__init__.py +0 -0
  342. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/isolated/audit.py +0 -0
  343. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/isolated/runtime.py +0 -0
  344. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/isolated/tools_server.py +0 -0
  345. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/jsonl.py +0 -0
  346. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/k4_lock.py +0 -0
  347. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/livemath/__init__.py +0 -0
  348. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/livemath/loop.py +0 -0
  349. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/livemath/rollout.py +0 -0
  350. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/native_agents.py +0 -0
  351. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/officeqa/__init__.py +0 -0
  352. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/officeqa/dataset.py +0 -0
  353. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/officeqa/fetch.py +0 -0
  354. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/officeqa/loop.py +0 -0
  355. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/officeqa/retrieval.py +0 -0
  356. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/officeqa/reward.py +0 -0
  357. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/officeqa/rollout.py +0 -0
  358. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/officeqa/scoring.py +0 -0
  359. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/officeqa/wiki_agents.py +0 -0
  360. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/paper_alignment/__init__.py +0 -0
  361. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/paper_alignment/contracts.py +0 -0
  362. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/paper_alignment/evidence.py +0 -0
  363. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/product.py +0 -0
  364. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/product_cli.py +0 -0
  365. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/product_install.py +0 -0
  366. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/product_views.py +0 -0
  367. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/alfworld/id_split/split_manifest.json +0 -0
  368. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/alfworld/id_split/test.json +0 -0
  369. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/alfworld/id_split/train.json +0 -0
  370. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/alfworld/id_split/val.json +0 -0
  371. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/alfworld/wiki/SKILL-s0.md +0 -0
  372. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/alfworld/wiki/index.md +0 -0
  373. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/alfworld/wiki/logs.md +0 -0
  374. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/alfworld/wiki/prompts/maintainer.md +0 -0
  375. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/alfworld/wiki/prompts/proposer.md +0 -0
  376. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/alfworld/wiki/skill-impact.md +0 -0
  377. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/isolated/model-catalog-direct.json +0 -0
  378. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/livemath/id_split/split_manifest.json +0 -0
  379. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/livemath/id_split/test.json +0 -0
  380. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/livemath/id_split/train.json +0 -0
  381. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/livemath/id_split/val.json +0 -0
  382. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/livemath/id_split-v2/split_manifest.json +0 -0
  383. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/livemath/id_split-v2/test.json +0 -0
  384. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/livemath/id_split-v2/train.json +0 -0
  385. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/livemath/id_split-v2/val.json +0 -0
  386. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/livemath/protocol.json +0 -0
  387. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/livemath/wiki/SKILL-s0.md +0 -0
  388. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/livemath/wiki/index.md +0 -0
  389. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/livemath/wiki/logs.md +0 -0
  390. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/livemath/wiki/prompts/maintainer.md +0 -0
  391. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/livemath/wiki/prompts/proposer.md +0 -0
  392. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/livemath/wiki/skill-impact.md +0 -0
  393. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/officeqa/id_split/split_manifest.json +0 -0
  394. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/officeqa/id_split/test.json +0 -0
  395. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/officeqa/id_split/train.json +0 -0
  396. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/officeqa/id_split/val.json +0 -0
  397. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/officeqa/protocol.json +0 -0
  398. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/officeqa/wiki/SKILL-s0.md +0 -0
  399. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/officeqa/wiki/index.md +0 -0
  400. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/officeqa/wiki/logs.md +0 -0
  401. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/officeqa/wiki/prompts/maintainer.md +0 -0
  402. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/officeqa/wiki/prompts/proposer.md +0 -0
  403. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/officeqa/wiki/skill-impact.md +0 -0
  404. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/paper_alignment/README.md +0 -0
  405. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/paper_alignment/prompts/maintainer.paper.md +0 -0
  406. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/paper_alignment/prompts/officeqa.paper.md +0 -0
  407. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/paper_alignment/prompts/proposer.paper.md +0 -0
  408. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/paper_alignment/prompts/spreadsheet.paper.md +0 -0
  409. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/product/agents/claude-code/wikiskill-executor.md +0 -0
  410. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/product/agents/claude-code/wikiskill-maintainer.md +0 -0
  411. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/product/agents/claude-code/wikiskill-proposer.md +0 -0
  412. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/product/agents/codex/wikiskill-executor.toml +0 -0
  413. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/product/agents/codex/wikiskill-maintainer.toml +0 -0
  414. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/product/agents/codex/wikiskill-proposer.toml +0 -0
  415. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/product/entry-skill/SKILL.md +0 -0
  416. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/product/entry-skill/agents/openai.yaml +0 -0
  417. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/product/entry-skill/references/native-subagents.md +0 -0
  418. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/product/entry-skill/references/workflow.md +0 -0
  419. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/product/roles/executor.md +0 -0
  420. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/product/roles/maintainer.md +0 -0
  421. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/product/roles/proposer.md +0 -0
  422. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/final-20260907/manifest.json +0 -0
  423. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/final-20260907/math-episodes.json +0 -0
  424. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/final-20260907/sealqa-pairs.json +0 -0
  425. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/final-20260907/spreadsheet-SKILL.md +0 -0
  426. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/final-20260907/spreadsheet-pairs.json +0 -0
  427. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/final-20260907/summary.json +0 -0
  428. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/repeatability-20260908/example-provenance.json +0 -0
  429. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/repeatability-20260908/installed-smoke.json +0 -0
  430. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/repeatability-20260908/manifest.json +0 -0
  431. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/repeatability-20260908/repeat1-pairs.json +0 -0
  432. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/repeatability-20260908/repeat2-pairs.json +0 -0
  433. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/repeatability-20260908/repeat3-pairs.json +0 -0
  434. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/repeatability-20260908/summary.json +0 -0
  435. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/repeatability-20260908/wiki-deliver-the-recalculated-workbook.md +0 -0
  436. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/skills/livemath/55.md +0 -0
  437. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/skills/livemath/luna.md +0 -0
  438. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/skills/officeqa/55.md +0 -0
  439. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/skills/officeqa/terra.md +0 -0
  440. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/skills/officeqa-retrieval/55.md +0 -0
  441. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/skills/officeqa-retrieval/sol.md +0 -0
  442. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/skills/sealqa/sol.md +0 -0
  443. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/skills/spreadsheet/55.md +0 -0
  444. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/skills/spreadsheet/sol.md +0 -0
  445. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/snapshot.json +0 -0
  446. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/snapshot.sha256 +0 -0
  447. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/update-20260906/livemath-luna-pairs.json +0 -0
  448. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/update-20260906/livemath-luna-skill.md +0 -0
  449. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/update-20260906/manifest.json +0 -0
  450. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/update-20260906/officeqa-luna-skill.md +0 -0
  451. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/update-20260906/officeqa-sol-skill.md +0 -0
  452. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/update-20260906/officeqa-sol-v2-pairs.json +0 -0
  453. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/update-20260906/studies.json +0 -0
  454. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/update-20260907/effort-analysis.json +0 -0
  455. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/update-20260907/effort-pairs.json +0 -0
  456. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/update-20260907/manifest.json +0 -0
  457. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/update-20260907/officeqa-luna-paper-tools-pairs.json +0 -0
  458. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/update-20260907/officeqa-luna-paper-tools-skill.md +0 -0
  459. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/update-20260907/spreadsheet-luna-scoped-python-pairs.json +0 -0
  460. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/update-20260907/spreadsheet-luna-scoped-python-skill.md +0 -0
  461. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/research/update-20260907/studies.json +0 -0
  462. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/runtime/acorn.mjs +0 -0
  463. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/runtime/audit_js.mjs +0 -0
  464. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/sealqa/id_split/split_manifest.json +0 -0
  465. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/sealqa/id_split/test.json +0 -0
  466. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/sealqa/id_split/train.json +0 -0
  467. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/sealqa/id_split/val.json +0 -0
  468. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/sealqa/protocol.json +0 -0
  469. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/sealqa/wiki/SKILL-s0.md +0 -0
  470. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/sealqa/wiki/index.md +0 -0
  471. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/sealqa/wiki/logs.md +0 -0
  472. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/sealqa/wiki/prompts/maintainer.md +0 -0
  473. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/sealqa/wiki/prompts/proposer.md +0 -0
  474. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/sealqa/wiki/skill-impact.md +0 -0
  475. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/spreadsheet/id_split/split_manifest.json +0 -0
  476. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/spreadsheet/id_split/test.json +0 -0
  477. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/spreadsheet/id_split/train.json +0 -0
  478. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/spreadsheet/id_split/val.json +0 -0
  479. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/spreadsheet/protocol.json +0 -0
  480. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/spreadsheet/wiki/SKILL-s0.md +0 -0
  481. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/spreadsheet/wiki/index.md +0 -0
  482. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/spreadsheet/wiki/logs.md +0 -0
  483. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/spreadsheet/wiki/prompts/maintainer.md +0 -0
  484. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/spreadsheet/wiki/prompts/proposer.md +0 -0
  485. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/resources/spreadsheet/wiki/skill-impact.md +0 -0
  486. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/results.py +0 -0
  487. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/score_rules.py +0 -0
  488. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/scorer_trust.py +0 -0
  489. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/sealqa/__init__.py +0 -0
  490. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/sealqa/loop.py +0 -0
  491. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/sealqa/rollout.py +0 -0
  492. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/settings.py +0 -0
  493. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/skill_proposer.py +0 -0
  494. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/spreadsheet/__init__.py +0 -0
  495. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/spreadsheet/loop.py +0 -0
  496. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/spreadsheet/rollout.py +0 -0
  497. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/spreadsheet/study.py +0 -0
  498. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/tool_audit.py +0 -0
  499. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/wiki.py +0 -0
  500. {briefloop-0.22.1 → briefloop-0.22.2}/src/wikiskill/wiki_maintainer.py +0 -0
  501. {briefloop-0.22.1 → briefloop-0.22.2}/start.ps1 +0 -0
  502. {briefloop-0.22.1 → briefloop-0.22.2}/start.sh +0 -0
  503. {briefloop-0.22.1 → briefloop-0.22.2}/tests/check_distribution.py +0 -0
  504. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_app_updates.mjs +0 -0
  505. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_chat_attachments.mjs +0 -0
  506. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_chat_commands.mjs +0 -0
  507. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_checkout_eol.mjs +0 -0
  508. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_citation_clipboard.mjs +0 -0
  509. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_citation_edit.mjs +0 -0
  510. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_clipboard_fallback.mjs +0 -0
  511. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_fast_mode.mjs +0 -0
  512. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_licenses.mjs +0 -0
  513. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_live_status.mjs +0 -0
  514. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_markdown_import.mjs +0 -0
  515. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_mcp_selection.mjs +0 -0
  516. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_model_label.mjs +0 -0
  517. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_model_selection.mjs +0 -0
  518. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_polling.mjs +0 -0
  519. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_progress_race.mjs +0 -0
  520. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_report_chat_drawer.mjs +0 -0
  521. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_report_load.mjs +0 -0
  522. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_review_status.mjs +0 -0
  523. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_runtime_discovery.mjs +0 -0
  524. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_runtime_feedback.mjs +0 -0
  525. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_settings_workspaces.mjs +0 -0
  526. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_setup_state.mjs +0 -0
  527. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_source_library.mjs +0 -0
  528. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_task_progress.mjs +0 -0
  529. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_template_groups.mjs +0 -0
  530. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_upload_limits.mjs +0 -0
  531. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_welcome_gate.mjs +0 -0
  532. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_workspace_proposal.mjs +0 -0
  533. {briefloop-0.22.1 → briefloop-0.22.2}/tests/frontend_writing_preferences.mjs +0 -0
  534. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_agent_backend.py +0 -0
  535. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_agent_commands.py +0 -0
  536. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_assessment_admission_recovery.py +0 -0
  537. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_bridge_harness.py +0 -0
  538. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_builtin_templates.py +0 -0
  539. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_chat_dispatch.py +0 -0
  540. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_chat_execution.py +0 -0
  541. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_chat_model_selection.py +0 -0
  542. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_codex_idle.py +0 -0
  543. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_connection_test_history.py +0 -0
  544. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_connector_authorization.py +0 -0
  545. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_connector_empty_catalog.py +0 -0
  546. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_connector_materials.py +0 -0
  547. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_connector_tasks.py +0 -0
  548. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_connectors.py +0 -0
  549. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_core.py +0 -0
  550. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_cross_module_regressions.py +0 -0
  551. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_delivery_checks.py +0 -0
  552. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_demo.py +0 -0
  553. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_desktop_lifecycle.py +0 -0
  554. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_document_workflows.py +0 -0
  555. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_draft_contract.py +0 -0
  556. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_entrypoint.py +0 -0
  557. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_evidence.py +0 -0
  558. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_evidence_parse_failures.py +0 -0
  559. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_execution_records.py +0 -0
  560. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_export_admission.py +0 -0
  561. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_export_layout_swap.py +0 -0
  562. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_external_requests.py +0 -0
  563. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_fact_check_contract.py +0 -0
  564. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_fact_check_phase.py +0 -0
  565. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_fact_check_review.py +0 -0
  566. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_fact_check_switch.py +0 -0
  567. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_fact_status_tool.py +0 -0
  568. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_fast_mode.py +0 -0
  569. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_figure_exports.py +0 -0
  570. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_figure_flow.py +0 -0
  571. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_figures.py +0 -0
  572. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_harness.py +0 -0
  573. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_host_bins.py +0 -0
  574. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_human_learning.py +0 -0
  575. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_industry_export.py +0 -0
  576. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_industry_flow.py +0 -0
  577. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_industry_research.py +0 -0
  578. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_interactive_runtime.py +0 -0
  579. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_learning_integrity.py +0 -0
  580. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_length.py +0 -0
  581. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_media_sources.py +0 -0
  582. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_multimodal_harness.py +0 -0
  583. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_multimodal_http.py +0 -0
  584. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_notifications.py +0 -0
  585. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_npm_native_shim.py +0 -0
  586. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_opencode_harness.py +0 -0
  587. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_opencode_idle.py +0 -0
  588. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_opencode_provider.py +0 -0
  589. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_opencode_search_prompt.py +0 -0
  590. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_opencode_server_stdin.py +0 -0
  591. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_posix_process_tree.py +0 -0
  592. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_pr593_roundtrip.py +0 -0
  593. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_progress.py +0 -0
  594. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_progress_pipeline.py +0 -0
  595. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_public_research.py +0 -0
  596. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_reader_contract.py +0 -0
  597. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_reader_workflow.py +0 -0
  598. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_reconciliation.py +0 -0
  599. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_release.py +0 -0
  600. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_report_path_regressions.py +0 -0
  601. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_report_time.py +0 -0
  602. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_research_budget.py +0 -0
  603. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_research_handoff.py +0 -0
  604. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_resume_in_place.py +0 -0
  605. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_review.py +0 -0
  606. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_review_learning.py +0 -0
  607. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_review_packet_paths.py +0 -0
  608. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_review_schema_drift.py +0 -0
  609. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_review_snapshot.py +0 -0
  610. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_review_visual_input.py +0 -0
  611. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_revision_policy.py +0 -0
  612. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_rich_document.py +0 -0
  613. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_role_models.py +0 -0
  614. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_runtime_bridge.py +0 -0
  615. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_runtime_bridge_idle.py +0 -0
  616. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_runtime_json_bom.py +0 -0
  617. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_runtime_liveness.py +0 -0
  618. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_runtime_permissions.py +0 -0
  619. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_runtime_retry.py +0 -0
  620. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_schedules.py +0 -0
  621. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_search_policy.py +0 -0
  622. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_server_boundary.py +0 -0
  623. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_software_version.py +0 -0
  624. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_source_recovery_regressions.py +0 -0
  625. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_source_updates.py +0 -0
  626. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_sources_provenance.py +0 -0
  627. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_task_notify.py +0 -0
  628. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_task_progress.py +0 -0
  629. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_tavily.py +0 -0
  630. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_templates.py +0 -0
  631. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_version_consistency.py +0 -0
  632. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_websearch.py +0 -0
  633. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_windows_connector_acl.py +0 -0
  634. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_windows_distribution.py +0 -0
  635. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_windows_mcp_supervisor.py +0 -0
  636. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_windows_platform.py +0 -0
  637. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_windows_runtime_bundle.py +0 -0
  638. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_word_import.py +0 -0
  639. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_word_toc.py +0 -0
  640. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_worker_idle.py +0 -0
  641. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_workspace_action_errors.py +0 -0
  642. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_workspace_profile.py +0 -0
  643. {briefloop-0.22.1 → briefloop-0.22.2}/tests/test_workspaces.py +0 -0
  644. {briefloop-0.22.1 → briefloop-0.22.2}/third_party/open-design/LICENSE +0 -0
  645. {briefloop-0.22.1 → briefloop-0.22.2}/third_party/open-design/NOTICE.md +0 -0
  646. {briefloop-0.22.1 → briefloop-0.22.2}/third_party/open-design/acp/constants.ts +0 -0
  647. {briefloop-0.22.1 → briefloop-0.22.2}/third_party/open-design/acp/json.ts +0 -0
  648. {briefloop-0.22.1 → briefloop-0.22.2}/third_party/open-design/acp/models.ts +0 -0
  649. {briefloop-0.22.1 → briefloop-0.22.2}/third_party/open-design/acp/rpc.ts +0 -0
  650. {briefloop-0.22.1 → briefloop-0.22.2}/third_party/open-design/acp/session-params.ts +0 -0
  651. {briefloop-0.22.1 → briefloop-0.22.2}/third_party/open-design/acp/types.ts +0 -0
  652. {briefloop-0.22.1 → briefloop-0.22.2}/third_party/open-design/byok-reference/byok-opencode.ts +0 -0
  653. {briefloop-0.22.1 → briefloop-0.22.2}/third_party/open-design/byok-reference/provider-models.ts +0 -0
  654. {briefloop-0.22.1 → briefloop-0.22.2}/third_party/open-design/core/index.ts +0 -0
  655. {briefloop-0.22.1 → briefloop-0.22.2}/third_party/open-design/core/json-line-stream.ts +0 -0
  656. {briefloop-0.22.1 → briefloop-0.22.2}/third_party/open-design/runtime-models/codex-models.ts +0 -0
  657. {briefloop-0.22.1 → briefloop-0.22.2}/third_party/open-design/runtime-models/fallbacks.json +0 -0
  658. {briefloop-0.22.1 → briefloop-0.22.2}/third_party/open-design/runtime-models/mmd-routes.ts +0 -0
  659. {briefloop-0.22.1 → briefloop-0.22.2}/third_party/open-design/runtime-models/models.ts +0 -0
  660. {briefloop-0.22.1 → briefloop-0.22.2}/third_party/open-design/runtime-models/opencode-models.ts +0 -0
@@ -1,5 +1,12 @@
1
1
  # 变更记录
2
2
 
3
+ ## 0.22.2
4
+
5
+ - 首页和新建报告提供紧凑研究深度、事实核查与 WikiSkill 控件;默认执行上限 60 分钟,深度研究默认目标 10,000 字、上限 12,000 字,保留用户明确篇幅。
6
+ - 同时生成报告数默认 4,可在设置中调整;Scout 并发独立调整,冻结计划不再受较低预设限制。排队等待与执行时间分别展示。
7
+ - 新报告生成期间显示独立等待页,版本选择器列出排队和生成中报告;已有稿件仍可切换查看。
8
+ - 核查与评分面板轮询保留已有内容,相同结果不重建,旧版本响应不覆盖新版本。
9
+
3
10
  ## 0.22.1
4
11
 
5
12
  - 修复桌面后台启动 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.2
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.2
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "briefloop-desktop",
3
- "version": "0.22.1",
3
+ "version": "0.22.2",
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.2",
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.2",
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.2"
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.2"
@@ -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,