briefloop 0.26.4__tar.gz → 0.27.0__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 (946) hide show
  1. {briefloop-0.26.4 → briefloop-0.27.0}/CHANGELOG.md +9 -0
  2. {briefloop-0.26.4 → briefloop-0.27.0}/PKG-INFO +1 -1
  3. briefloop-0.27.0/VERSION +1 -0
  4. {briefloop-0.26.4 → briefloop-0.27.0}/desktop/electron/package-lock.json +2 -2
  5. {briefloop-0.26.4 → briefloop-0.27.0}/desktop/electron/package.json +1 -1
  6. briefloop-0.27.0/docs/release-0.27.0.md +13 -0
  7. briefloop-0.27.0/docs/revision-learning.md +16 -0
  8. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/app.js +26 -13
  9. briefloop-0.27.0/frontend/learning-retry.js +11 -0
  10. briefloop-0.27.0/frontend/previous-report.js +32 -0
  11. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/provider-capabilities.js +3 -0
  12. briefloop-0.27.0/frontend/readers.js +52 -0
  13. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/report-browsing.js +1 -1
  14. briefloop-0.27.0/frontend/revision-questions.js +42 -0
  15. briefloop-0.27.0/frontend/skill-verification.js +17 -0
  16. {briefloop-0.26.4 → briefloop-0.27.0}/pyproject.toml +1 -1
  17. briefloop-0.27.0/src/briefloop/__init__.py +1 -0
  18. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/deliverable_spec.py +5 -0
  19. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/docx_text.py +3 -0
  20. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/figure_support.py +6 -0
  21. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/interactive_runtime.py +3 -3
  22. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/learning.py +142 -18
  23. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/learning_budget.py +38 -7
  24. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/models.py +15 -0
  25. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/native_roles.py +47 -0
  26. briefloop-0.27.0/src/briefloop/previous_report.py +141 -0
  27. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/progress.py +3 -0
  28. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/prompt_assets/role.analyst.zh.md +1 -1
  29. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/prompt_assets/role.evaluator.zh.md +1 -1
  30. briefloop-0.27.0/src/briefloop/readers.py +142 -0
  31. briefloop-0.27.0/src/briefloop/revision_edits.py +243 -0
  32. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/runtime.py +11 -4
  33. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/server.py +21 -2
  34. briefloop-0.27.0/src/briefloop/skill_verification.py +231 -0
  35. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/app.js +105 -103
  36. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/index.html +5 -5
  37. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/style.css +37 -0
  38. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/store.py +53 -14
  39. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/writing_guidance.py +2 -1
  40. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop.egg-info/PKG-INFO +1 -1
  41. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop.egg-info/SOURCES.txt +20 -0
  42. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_learning_authorization.mjs +2 -1
  43. briefloop-0.27.0/tests/frontend_learning_retry.mjs +12 -0
  44. briefloop-0.27.0/tests/frontend_previous_report.mjs +23 -0
  45. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_provider_capabilities.mjs +4 -0
  46. briefloop-0.27.0/tests/frontend_readers.mjs +42 -0
  47. briefloop-0.27.0/tests/frontend_revision_questions.mjs +40 -0
  48. briefloop-0.27.0/tests/frontend_skill_verification.mjs +17 -0
  49. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_learning_authorization.py +59 -1
  50. briefloop-0.27.0/tests/test_previous_report.py +140 -0
  51. briefloop-0.27.0/tests/test_reader_profiles.py +133 -0
  52. briefloop-0.27.0/tests/test_revision_edits.py +213 -0
  53. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_runtime_retry.py +23 -0
  54. briefloop-0.27.0/tests/test_skill_verification.py +161 -0
  55. briefloop-0.26.4/VERSION +0 -1
  56. briefloop-0.26.4/src/briefloop/__init__.py +0 -1
  57. {briefloop-0.26.4 → briefloop-0.27.0}/.gitattributes +0 -0
  58. {briefloop-0.26.4 → briefloop-0.27.0}/CONTRIBUTING.md +0 -0
  59. {briefloop-0.26.4 → briefloop-0.27.0}/KNOWN_ISSUES.md +0 -0
  60. {briefloop-0.26.4 → briefloop-0.27.0}/LICENSE +0 -0
  61. {briefloop-0.26.4 → briefloop-0.27.0}/MANIFEST.in +0 -0
  62. {briefloop-0.26.4 → briefloop-0.27.0}/README.md +0 -0
  63. {briefloop-0.26.4 → briefloop-0.27.0}/SECURITY.md +0 -0
  64. {briefloop-0.26.4 → briefloop-0.27.0}/THIRD_PARTY_NOTICES.md +0 -0
  65. {briefloop-0.26.4 → briefloop-0.27.0}/bootstrap.py +0 -0
  66. {briefloop-0.26.4 → briefloop-0.27.0}/docs/OpenCode/347/211/210/346/234/254/345/205/274/345/256/271.md" +0 -0
  67. {briefloop-0.26.4 → briefloop-0.27.0}/docs/WorkBuddy/345/244/226/351/203/250/345/205/245/345/217/243.md" +0 -0
  68. {briefloop-0.26.4 → briefloop-0.27.0}/docs/architecture.md +0 -0
  69. {briefloop-0.26.4 → briefloop-0.27.0}/docs/compose/spec/home-v2.md +0 -0
  70. {briefloop-0.26.4 → briefloop-0.27.0}/docs/draft-first.md +0 -0
  71. {briefloop-0.26.4 → briefloop-0.27.0}/docs/jev-precheck.md +0 -0
  72. {briefloop-0.26.4 → briefloop-0.27.0}/docs/native-integration.md +0 -0
  73. {briefloop-0.26.4 → briefloop-0.27.0}/docs/quality-reading-context.md +0 -0
  74. {briefloop-0.26.4 → briefloop-0.27.0}/docs/release-0.26.0.md +0 -0
  75. {briefloop-0.26.4 → briefloop-0.27.0}/docs/release-0.26.1.md +0 -0
  76. {briefloop-0.26.4 → briefloop-0.27.0}/docs/release-0.26.2.md +0 -0
  77. {briefloop-0.26.4 → briefloop-0.27.0}/docs/release-0.26.3.md +0 -0
  78. {briefloop-0.26.4 → briefloop-0.27.0}/docs/release-0.26.4.md +0 -0
  79. {briefloop-0.26.4 → briefloop-0.27.0}/docs/report-length.md +0 -0
  80. {briefloop-0.26.4 → briefloop-0.27.0}/docs/report-time-window.md +0 -0
  81. {briefloop-0.26.4 → briefloop-0.27.0}/docs/research-handoff.md +0 -0
  82. {briefloop-0.26.4 → briefloop-0.27.0}/docs/sqlite-benchmark.md +0 -0
  83. {briefloop-0.26.4 → briefloop-0.27.0}/docs/technical-report-0.21.0/evidence-index.md +0 -0
  84. {briefloop-0.26.4 → briefloop-0.27.0}/docs/technical-report-0.21.0/technical-report.md +0 -0
  85. {briefloop-0.26.4 → briefloop-0.27.0}/docs/windows.md +0 -0
  86. {briefloop-0.26.4 → briefloop-0.27.0}/docs/writer-input.md +0 -0
  87. {briefloop-0.26.4 → briefloop-0.27.0}/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
  88. {briefloop-0.26.4 → briefloop-0.27.0}/docs//344/274/232/350/256/256/347/272/252/350/246/201.md" +0 -0
  89. {briefloop-0.26.4 → briefloop-0.27.0}/docs//344/275/277/347/224/250/346/214/207/345/215/227.md" +0 -0
  90. {briefloop-0.26.4 → briefloop-0.27.0}/docs//345/206/205/347/275/256/345/274/225/346/223/216.md" +0 -0
  91. {briefloop-0.26.4 → briefloop-0.27.0}/docs//345/215/207/347/272/247/350/257/264/346/230/216.md" +0 -0
  92. {briefloop-0.26.4 → briefloop-0.27.0}/docs//345/233/276/350/241/250/344/270/216Excel.md" +0 -0
  93. {briefloop-0.26.4 → briefloop-0.27.0}/docs//345/244/232Runtime/344/270/216/346/250/241/345/236/213.md" +0 -0
  94. {briefloop-0.26.4 → briefloop-0.27.0}/docs//345/244/232/346/250/241/346/200/201/346/235/245/346/272/220.md" +0 -0
  95. {briefloop-0.26.4 → briefloop-0.27.0}/docs//345/256/232/346/227/266/346/212/245/345/221/212.md" +0 -0
  96. {briefloop-0.26.4 → briefloop-0.27.0}/docs//345/257/271/350/257/235/345/256/277/344/270/273/345/210/207/346/215/242.md" +0 -0
  97. {briefloop-0.26.4 → briefloop-0.27.0}/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
  98. {briefloop-0.26.4 → briefloop-0.27.0}/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
  99. {briefloop-0.26.4 → briefloop-0.27.0}/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
  100. {briefloop-0.26.4 → briefloop-0.27.0}/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
  101. {briefloop-0.26.4 → briefloop-0.27.0}/docs//350/241/214/344/270/232/346/212/245/345/221/212.md" +0 -0
  102. {briefloop-0.26.4 → briefloop-0.27.0}/docs//350/257/201/345/210/270/347/240/224/347/251/266.md" +0 -0
  103. {briefloop-0.26.4 → briefloop-0.27.0}/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
  104. {briefloop-0.26.4 → briefloop-0.27.0}/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
  105. {briefloop-0.26.4 → briefloop-0.27.0}/docs//351/252/214/346/224/266/350/256/260/345/275/225.md" +0 -0
  106. {briefloop-0.26.4 → briefloop-0.27.0}/examples/internal-weekly-report/README.md +0 -0
  107. {briefloop-0.26.4 → briefloop-0.27.0}/examples/internal-weekly-report/report.md +0 -0
  108. {briefloop-0.26.4 → briefloop-0.27.0}/examples/internal-weekly-report/source.txt +0 -0
  109. {briefloop-0.26.4 → briefloop-0.27.0}/examples/meeting-minutes/transcript.txt +0 -0
  110. {briefloop-0.26.4 → briefloop-0.27.0}/examples/stock-research/earnings-event.txt +0 -0
  111. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/api.js +0 -0
  112. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/app-updates.js +0 -0
  113. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/assessment-checks.js +0 -0
  114. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/assessment-panel.js +0 -0
  115. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/citation-evidence.js +0 -0
  116. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/clipboard.js +0 -0
  117. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/composer-options.js +0 -0
  118. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/connectors.js +0 -0
  119. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/delivery.js +0 -0
  120. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/dom.js +0 -0
  121. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/excel-export.js +0 -0
  122. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/fact-check-availability.js +0 -0
  123. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/fact-check-grants.js +0 -0
  124. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/jev-checks.js +0 -0
  125. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/job-presentation.js +0 -0
  126. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/length-controls.js +0 -0
  127. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/mcp-selection.js +0 -0
  128. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/model-catalog.js +0 -0
  129. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/native-requests.js +0 -0
  130. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/notifications.js +0 -0
  131. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/office-tools.js +0 -0
  132. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/polling.js +0 -0
  133. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/quick-report.js +0 -0
  134. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/reasoning-controls.js +0 -0
  135. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/report-export.js +0 -0
  136. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/report-language.js +0 -0
  137. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/report-panels.js +0 -0
  138. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/report-sources.js +0 -0
  139. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/review-controls.js +0 -0
  140. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/review-coverage.js +0 -0
  141. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/review-results.js +0 -0
  142. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/review-status.js +0 -0
  143. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/rich-document.js +0 -0
  144. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/runtime-cards.js +0 -0
  145. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/runtime-permission-modes.js +0 -0
  146. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/runtime-permission-panel.js +0 -0
  147. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/schedules.js +0 -0
  148. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/source-library-search.js +0 -0
  149. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/source-upload.js +0 -0
  150. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/task-progress.js +0 -0
  151. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/template-output.js +0 -0
  152. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/templates.js +0 -0
  153. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/time.js +0 -0
  154. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/uploads.js +0 -0
  155. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/version-diff.js +0 -0
  156. {briefloop-0.26.4 → briefloop-0.27.0}/frontend/welcome.js +0 -0
  157. {briefloop-0.26.4 → briefloop-0.27.0}/package-lock.json +0 -0
  158. {briefloop-0.26.4 → briefloop-0.27.0}/package.json +0 -0
  159. {briefloop-0.26.4 → briefloop-0.27.0}/probes/mcp_m0/README.md +0 -0
  160. {briefloop-0.26.4 → briefloop-0.27.0}/probes/mcp_m0/probe.py +0 -0
  161. {briefloop-0.26.4 → briefloop-0.27.0}/probes/mcp_m0/requirements.txt +0 -0
  162. {briefloop-0.26.4 → briefloop-0.27.0}/probes/mcp_m0/server.py +0 -0
  163. {briefloop-0.26.4 → briefloop-0.27.0}/runtime-bridge/README.md +0 -0
  164. {briefloop-0.26.4 → briefloop-0.27.0}/runtime-bridge/bridge.test.mjs +0 -0
  165. {briefloop-0.26.4 → briefloop-0.27.0}/runtime-bridge/build.mjs +0 -0
  166. {briefloop-0.26.4 → briefloop-0.27.0}/runtime-bridge/catalog.json +0 -0
  167. {briefloop-0.26.4 → briefloop-0.27.0}/runtime-bridge/claude.ts +0 -0
  168. {briefloop-0.26.4 → briefloop-0.27.0}/runtime-bridge/main.ts +0 -0
  169. {briefloop-0.26.4 → briefloop-0.27.0}/runtime-bridge/permission-catalog.ts +0 -0
  170. {briefloop-0.26.4 → briefloop-0.27.0}/runtime-bridge/pi.ts +0 -0
  171. {briefloop-0.26.4 → briefloop-0.27.0}/runtime-bridge/reasoning.ts +0 -0
  172. {briefloop-0.26.4 → briefloop-0.27.0}/runtime-bridge/user-input.ts +0 -0
  173. {briefloop-0.26.4 → briefloop-0.27.0}/runtime-bridge/windows-command.ts +0 -0
  174. {briefloop-0.26.4 → briefloop-0.27.0}/runtime-bridge/zcode.ts +0 -0
  175. {briefloop-0.26.4 → briefloop-0.27.0}/scripts/build_frontend.mjs +0 -0
  176. {briefloop-0.26.4 → briefloop-0.27.0}/scripts/build_frontend_licenses.mjs +0 -0
  177. {briefloop-0.26.4 → briefloop-0.27.0}/scripts/check_versions.py +0 -0
  178. {briefloop-0.26.4 → briefloop-0.27.0}/scripts/sync_versions.py +0 -0
  179. {briefloop-0.26.4 → briefloop-0.27.0}/scripts/test_frontend.mjs +0 -0
  180. {briefloop-0.26.4 → briefloop-0.27.0}/setup.cfg +0 -0
  181. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/__main__.py +0 -0
  182. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/_entrypoint.py +0 -0
  183. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/agent_commands.py +0 -0
  184. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/agent_prompts.py +0 -0
  185. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/analyst.py +0 -0
  186. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/analyst_drafts.py +0 -0
  187. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/app_server.py +0 -0
  188. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/audit_bundle.py +0 -0
  189. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/backends/__init__.py +0 -0
  190. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/backends/opencode_server.py +0 -0
  191. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/backends/opencode_v2.py +0 -0
  192. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/bocha.py +0 -0
  193. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/bridge_harness.py +0 -0
  194. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/chat_dispatch.py +0 -0
  195. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/chat_execution.py +0 -0
  196. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/chat_store.py +0 -0
  197. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/chat_tools.py +0 -0
  198. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/cli.py +0 -0
  199. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/codex_diagnostics.py +0 -0
  200. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/company_context.py +0 -0
  201. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/comparison_contract.py +0 -0
  202. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/conflicts.py +0 -0
  203. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/connectors/MATERIALS.md +0 -0
  204. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/connectors/README.md +0 -0
  205. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/connectors/__init__.py +0 -0
  206. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/connectors/config.py +0 -0
  207. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/connectors/grants.py +0 -0
  208. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/connectors/materials.py +0 -0
  209. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/connectors/receipts.py +0 -0
  210. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/connectors/runtime.py +0 -0
  211. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/connectors/runtime_tools.py +0 -0
  212. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/connectors/service.py +0 -0
  213. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/connectors/stdio_supervisor.py +0 -0
  214. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/connectors/task_client.py +0 -0
  215. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/connectors/tasks.py +0 -0
  216. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/connectors/transport.py +0 -0
  217. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/connectors/windows_acl.py +0 -0
  218. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/default_fonts.py +0 -0
  219. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/delivery_checks.py +0 -0
  220. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/demo.py +0 -0
  221. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/document_export.py +0 -0
  222. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/document_model.py +0 -0
  223. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/document_workflows.py +0 -0
  224. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/draft_checks.py +0 -0
  225. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/draft_completion.py +0 -0
  226. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/duckduckgo.py +0 -0
  227. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/evaluation_reading.py +0 -0
  228. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/evidence.py +0 -0
  229. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/evidence_context.py +0 -0
  230. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/execution_records.py +0 -0
  231. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/execution_timing.py +0 -0
  232. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/export_jobs.py +0 -0
  233. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/exports.py +0 -0
  234. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/external_client.py +0 -0
  235. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/external_requests.py +0 -0
  236. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/fact_check.py +0 -0
  237. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/fast_mode.py +0 -0
  238. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/fast_reports.py +0 -0
  239. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/fast_research.py +0 -0
  240. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/figure_text.py +0 -0
  241. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/figures.py +0 -0
  242. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/harness.py +0 -0
  243. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/host_bins.py +0 -0
  244. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/industry_data.py +0 -0
  245. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/industry_export.py +0 -0
  246. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/jev.py +0 -0
  247. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/jev_checks.py +0 -0
  248. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/length.py +0 -0
  249. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/media.py +0 -0
  250. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/native_engine.py +0 -0
  251. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/native_harness.py +0 -0
  252. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/native_orchestrator.py +0 -0
  253. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/native_providers.py +0 -0
  254. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/notifications.py +0 -0
  255. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/office_cli.py +0 -0
  256. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/ooxml_order.py +0 -0
  257. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/opencode_harness.py +0 -0
  258. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/opencode_version.py +0 -0
  259. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/packet_views.py +0 -0
  260. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/parent_watch.py +0 -0
  261. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/platform_support.py +0 -0
  262. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/process_host.py +0 -0
  263. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/projections.py +0 -0
  264. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/prompt_assets/core.zh.md +0 -0
  265. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/prompt_assets/mode.background.zh.md +0 -0
  266. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/prompt_assets/mode.interactive.zh.md +0 -0
  267. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/prompt_assets/role.chat.zh.md +0 -0
  268. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/prompt_assets/role.fact_checker.zh.md +0 -0
  269. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/prompt_assets/role.maintainer.zh.md +0 -0
  270. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/prompt_assets/role.orchestrator.zh.md +0 -0
  271. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/prompt_assets/role.proposer.zh.md +0 -0
  272. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/prompt_assets/role.quick_writer.zh.md +0 -0
  273. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/prompt_assets/role.reviewer.zh.md +0 -0
  274. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/prompt_assets/role.scout.zh.md +0 -0
  275. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/provider_catalog.py +0 -0
  276. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/reconciliation.py +0 -0
  277. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/release.py +0 -0
  278. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/report_browsing.py +0 -0
  279. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/report_profiles.py +0 -0
  280. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/report_time.py +0 -0
  281. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/report_tools.py +0 -0
  282. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/research_budget.py +0 -0
  283. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/research_handoff.py +0 -0
  284. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/research_plan.py +0 -0
  285. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/review.py +0 -0
  286. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/review_capability.py +0 -0
  287. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/review_learning.py +0 -0
  288. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/revision_metadata.py +0 -0
  289. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/revision_policy.py +0 -0
  290. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/rpc_writer.py +0 -0
  291. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/runtime_bridge.py +0 -0
  292. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/runtime_permissions.py +0 -0
  293. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/runtime_reasoning.py +0 -0
  294. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/schedules.py +0 -0
  295. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/scout.py +0 -0
  296. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/scout_evidence.py +0 -0
  297. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/scout_tools.py +0 -0
  298. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/search_credentials.py +0 -0
  299. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/search_policy.py +0 -0
  300. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/skill_assets/briefloop-external/SKILL.md +0 -0
  301. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/skill_assets/duckduckgo/SKILL.md +0 -0
  302. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/skill_assets/multi-search/SKILL.md +0 -0
  303. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/skill_assets/tavily/SKILL.md +0 -0
  304. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/skills.py +0 -0
  305. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/software_version.py +0 -0
  306. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/source_context.py +0 -0
  307. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/source_extraction.py +0 -0
  308. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/source_ingestion.py +0 -0
  309. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/source_library_search.py +0 -0
  310. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/source_search.py +0 -0
  311. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/source_updates.py +0 -0
  312. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/sources.py +0 -0
  313. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/frontend-licenses.txt +0 -0
  314. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/native-engine-licenses.txt +0 -0
  315. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/native-engine-models.json +0 -0
  316. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/native-engine.mjs +0 -0
  317. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-aider.png +0 -0
  318. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-amr.svg +0 -0
  319. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-antigravity.svg +0 -0
  320. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-bridge.LICENSE.txt +0 -0
  321. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-bridge.NOTICE.txt +0 -0
  322. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-bridge.mjs +0 -0
  323. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-briefloop.svg +0 -0
  324. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-claude.svg +0 -0
  325. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-codebuddy.svg +0 -0
  326. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-codex.svg +0 -0
  327. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-copilot.svg +0 -0
  328. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-cursor-agent.svg +0 -0
  329. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-deepseek.svg +0 -0
  330. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-devin.png +0 -0
  331. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-grok-build.svg +0 -0
  332. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-hermes.svg +0 -0
  333. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-kilo.svg +0 -0
  334. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-kimi.svg +0 -0
  335. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-kiro.svg +0 -0
  336. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-mimo.svg +0 -0
  337. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-opencode.svg +0 -0
  338. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-pi.svg +0 -0
  339. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-qoder.svg +0 -0
  340. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-qwen.svg +0 -0
  341. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-reasoning.json +0 -0
  342. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-reasonix.svg +0 -0
  343. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-trae-cli.png +0 -0
  344. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/runtime-vibe.svg +0 -0
  345. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/static/tokens.css +0 -0
  346. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/task_labels.py +0 -0
  347. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/task_notify.py +0 -0
  348. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/task_progress.py +0 -0
  349. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/tavily.py +0 -0
  350. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/academic-paper-zh-t1.docx +0 -0
  351. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/academic-paper-zh-t1.spec.json +0 -0
  352. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/academic-paper-zh-t2.docx +0 -0
  353. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/academic-paper-zh-t2.spec.json +0 -0
  354. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/academic-paper-zh-t3.docx +0 -0
  355. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/academic-paper-zh-t3.spec.json +0 -0
  356. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/academic-paper-zh-t4.docx +0 -0
  357. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/academic-paper-zh-t4.spec.json +0 -0
  358. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/academic-paper-zh-t5.docx +0 -0
  359. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/academic-paper-zh-t5.spec.json +0 -0
  360. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/annual-report-zh-t1.docx +0 -0
  361. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/annual-report-zh-t1.spec.json +0 -0
  362. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/annual-report-zh-t2.docx +0 -0
  363. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/annual-report-zh-t2.spec.json +0 -0
  364. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/annual-report-zh-t3.docx +0 -0
  365. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/annual-report-zh-t3.spec.json +0 -0
  366. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/annual-report-zh-t4.docx +0 -0
  367. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/annual-report-zh-t4.spec.json +0 -0
  368. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/annual-report-zh-t5.docx +0 -0
  369. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/annual-report-zh-t5.spec.json +0 -0
  370. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/business-report-zh-t1.docx +0 -0
  371. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/business-report-zh-t1.spec.json +0 -0
  372. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/business-report-zh-t2.docx +0 -0
  373. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/business-report-zh-t2.spec.json +0 -0
  374. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/business-report-zh-t3.docx +0 -0
  375. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/business-report-zh-t3.spec.json +0 -0
  376. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/business-report-zh-t4.docx +0 -0
  377. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/business-report-zh-t4.spec.json +0 -0
  378. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/business-report-zh-t5.docx +0 -0
  379. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/business-report-zh-t5.spec.json +0 -0
  380. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-en-t1.docx +0 -0
  381. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-en-t1.spec.json +0 -0
  382. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-en-t2.docx +0 -0
  383. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-en-t2.spec.json +0 -0
  384. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-en-t3.docx +0 -0
  385. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-en-t3.spec.json +0 -0
  386. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-en-t4.docx +0 -0
  387. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-en-t4.spec.json +0 -0
  388. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-en-t5.docx +0 -0
  389. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-en-t5.spec.json +0 -0
  390. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-zh-t1.docx +0 -0
  391. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-zh-t1.spec.json +0 -0
  392. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-zh-t2.docx +0 -0
  393. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-zh-t2.spec.json +0 -0
  394. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-zh-t3.docx +0 -0
  395. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-zh-t3.spec.json +0 -0
  396. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-zh-t4.docx +0 -0
  397. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-zh-t4.spec.json +0 -0
  398. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-zh-t5.docx +0 -0
  399. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/general-report-zh-t5.spec.json +0 -0
  400. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/government-doc-zh-t4.docx +0 -0
  401. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/government-doc-zh-t4.spec.json +0 -0
  402. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/legal-contract-zh-t1.docx +0 -0
  403. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/legal-contract-zh-t1.spec.json +0 -0
  404. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/legal-contract-zh-t2.docx +0 -0
  405. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/legal-contract-zh-t2.spec.json +0 -0
  406. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/legal-contract-zh-t3.docx +0 -0
  407. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/legal-contract-zh-t3.spec.json +0 -0
  408. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/legal-contract-zh-t4.docx +0 -0
  409. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/legal-contract-zh-t4.spec.json +0 -0
  410. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/legal-contract-zh-t5.docx +0 -0
  411. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/legal-contract-zh-t5.spec.json +0 -0
  412. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/meeting-minutes-zh-t1.docx +0 -0
  413. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/meeting-minutes-zh-t1.spec.json +0 -0
  414. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/meeting-minutes-zh-t2.docx +0 -0
  415. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/meeting-minutes-zh-t2.spec.json +0 -0
  416. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/meeting-minutes-zh-t3.docx +0 -0
  417. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/meeting-minutes-zh-t3.spec.json +0 -0
  418. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/meeting-minutes-zh-t4.docx +0 -0
  419. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/meeting-minutes-zh-t4.spec.json +0 -0
  420. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/meeting-minutes-zh-t5.docx +0 -0
  421. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/meeting-minutes-zh-t5.spec.json +0 -0
  422. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-en-t1.docx +0 -0
  423. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-en-t1.spec.json +0 -0
  424. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-en-t2.docx +0 -0
  425. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-en-t2.spec.json +0 -0
  426. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-en-t3.docx +0 -0
  427. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-en-t3.spec.json +0 -0
  428. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-en-t4.docx +0 -0
  429. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-en-t4.spec.json +0 -0
  430. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-en-t5.docx +0 -0
  431. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-en-t5.spec.json +0 -0
  432. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-zh-t1.docx +0 -0
  433. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-zh-t1.spec.json +0 -0
  434. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-zh-t2.docx +0 -0
  435. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-zh-t2.spec.json +0 -0
  436. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-zh-t3.docx +0 -0
  437. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-zh-t3.spec.json +0 -0
  438. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-zh-t4.docx +0 -0
  439. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-zh-t4.spec.json +0 -0
  440. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-zh-t5.docx +0 -0
  441. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_assets/stock-research-zh-t5.spec.json +0 -0
  442. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/template_conversion.py +0 -0
  443. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/templates.py +0 -0
  444. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/user_input.py +0 -0
  445. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/websearch.py +0 -0
  446. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/windows_process.py +0 -0
  447. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/word_import.py +0 -0
  448. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workbook_figures.py +0 -0
  449. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/business_report/evaluation.md +0 -0
  450. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/business_report/manifest.json +0 -0
  451. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/business_report/methods/decision_memo.md +0 -0
  452. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/business_report/methods/industry_periodic.md +0 -0
  453. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/business_report/methods/work_progress.md +0 -0
  454. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/business_report/planning.md +0 -0
  455. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/business_report/writing.md +0 -0
  456. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/general_report/evaluation.md +0 -0
  457. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/general_report/manifest.json +0 -0
  458. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/general_report/planning.md +0 -0
  459. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/general_report/writing.md +0 -0
  460. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/meeting_minutes/evaluation.md +0 -0
  461. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/meeting_minutes/manifest.json +0 -0
  462. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/meeting_minutes/planning.md +0 -0
  463. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/meeting_minutes/writing.md +0 -0
  464. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/stock_research/evaluation.md +0 -0
  465. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/stock_research/manifest.json +0 -0
  466. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/stock_research/methods/company_research.md +0 -0
  467. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/stock_research/methods/event_commentary.md +0 -0
  468. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/stock_research/methods/industry_tracking.md +0 -0
  469. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/stock_research/planning.md +0 -0
  470. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workflow_assets/stock_research/writing.md +0 -0
  471. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workspace_profile.py +0 -0
  472. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/workspaces.py +0 -0
  473. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/writer_assembly.py +0 -0
  474. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/writer_input.py +0 -0
  475. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/xlsx_export.py +0 -0
  476. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop/zhipu.py +0 -0
  477. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop.egg-info/dependency_links.txt +0 -0
  478. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop.egg-info/entry_points.txt +0 -0
  479. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop.egg-info/requires.txt +0 -0
  480. {briefloop-0.26.4 → briefloop-0.27.0}/src/briefloop.egg-info/top_level.txt +0 -0
  481. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/__init__.py +0 -0
  482. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/__main__.py +0 -0
  483. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/_licenses/LICENSE +0 -0
  484. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/_licenses/NOTICE.md +0 -0
  485. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/_licenses/third_party/acorn/LICENSE +0 -0
  486. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/_licenses/third_party/acorn/NOTICE.md +0 -0
  487. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/_licenses/third_party/officeqa/LICENSE-APACHE +0 -0
  488. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/_licenses/third_party/officeqa/NOTICE +0 -0
  489. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/alfworld/__init__.py +0 -0
  490. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/alfworld/act.sh +0 -0
  491. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/alfworld/rollout.py +0 -0
  492. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/alfworld/step.py +0 -0
  493. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/benchmarks/__init__.py +0 -0
  494. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/benchmarks/alfworld.py +0 -0
  495. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/benchmarks/livemath.py +0 -0
  496. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/benchmarks/sealqa.py +0 -0
  497. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/benchmarks/spreadsheet.py +0 -0
  498. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/cli.py +0 -0
  499. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/codex_identity.py +0 -0
  500. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/engine.py +0 -0
  501. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/feedback_loop.py +0 -0
  502. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/isolated/__init__.py +0 -0
  503. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/isolated/audit.py +0 -0
  504. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/isolated/runtime.py +0 -0
  505. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/isolated/tools_server.py +0 -0
  506. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/jsonl.py +0 -0
  507. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/k4_lock.py +0 -0
  508. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/livemath/__init__.py +0 -0
  509. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/livemath/loop.py +0 -0
  510. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/livemath/rollout.py +0 -0
  511. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/native_agents.py +0 -0
  512. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/officeqa/__init__.py +0 -0
  513. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/officeqa/dataset.py +0 -0
  514. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/officeqa/fetch.py +0 -0
  515. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/officeqa/loop.py +0 -0
  516. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/officeqa/retrieval.py +0 -0
  517. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/officeqa/reward.py +0 -0
  518. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/officeqa/rollout.py +0 -0
  519. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/officeqa/scoring.py +0 -0
  520. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/officeqa/wiki_agents.py +0 -0
  521. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/paper_alignment/__init__.py +0 -0
  522. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/paper_alignment/contracts.py +0 -0
  523. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/paper_alignment/evidence.py +0 -0
  524. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/product.py +0 -0
  525. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/product_cli.py +0 -0
  526. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/product_install.py +0 -0
  527. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/product_views.py +0 -0
  528. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/alfworld/id_split/split_manifest.json +0 -0
  529. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/alfworld/id_split/test.json +0 -0
  530. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/alfworld/id_split/train.json +0 -0
  531. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/alfworld/id_split/val.json +0 -0
  532. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/alfworld/wiki/SKILL-s0.md +0 -0
  533. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/alfworld/wiki/index.md +0 -0
  534. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/alfworld/wiki/logs.md +0 -0
  535. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/alfworld/wiki/prompts/maintainer.md +0 -0
  536. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/alfworld/wiki/prompts/proposer.md +0 -0
  537. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/alfworld/wiki/skill-impact.md +0 -0
  538. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/isolated/model-catalog-direct.json +0 -0
  539. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/livemath/id_split/split_manifest.json +0 -0
  540. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/livemath/id_split/test.json +0 -0
  541. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/livemath/id_split/train.json +0 -0
  542. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/livemath/id_split/val.json +0 -0
  543. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/livemath/id_split-v2/split_manifest.json +0 -0
  544. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/livemath/id_split-v2/test.json +0 -0
  545. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/livemath/id_split-v2/train.json +0 -0
  546. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/livemath/id_split-v2/val.json +0 -0
  547. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/livemath/protocol.json +0 -0
  548. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/livemath/wiki/SKILL-s0.md +0 -0
  549. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/livemath/wiki/index.md +0 -0
  550. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/livemath/wiki/logs.md +0 -0
  551. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/livemath/wiki/prompts/maintainer.md +0 -0
  552. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/livemath/wiki/prompts/proposer.md +0 -0
  553. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/livemath/wiki/skill-impact.md +0 -0
  554. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/officeqa/id_split/split_manifest.json +0 -0
  555. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/officeqa/id_split/test.json +0 -0
  556. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/officeqa/id_split/train.json +0 -0
  557. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/officeqa/id_split/val.json +0 -0
  558. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/officeqa/protocol.json +0 -0
  559. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/officeqa/wiki/SKILL-s0.md +0 -0
  560. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/officeqa/wiki/index.md +0 -0
  561. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/officeqa/wiki/logs.md +0 -0
  562. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/officeqa/wiki/prompts/maintainer.md +0 -0
  563. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/officeqa/wiki/prompts/proposer.md +0 -0
  564. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/officeqa/wiki/skill-impact.md +0 -0
  565. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/paper_alignment/README.md +0 -0
  566. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/paper_alignment/prompts/maintainer.paper.md +0 -0
  567. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/paper_alignment/prompts/officeqa.paper.md +0 -0
  568. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/paper_alignment/prompts/proposer.paper.md +0 -0
  569. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/paper_alignment/prompts/spreadsheet.paper.md +0 -0
  570. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/product/agents/claude-code/wikiskill-executor.md +0 -0
  571. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/product/agents/claude-code/wikiskill-maintainer.md +0 -0
  572. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/product/agents/claude-code/wikiskill-proposer.md +0 -0
  573. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/product/agents/codex/wikiskill-executor.toml +0 -0
  574. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/product/agents/codex/wikiskill-maintainer.toml +0 -0
  575. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/product/agents/codex/wikiskill-proposer.toml +0 -0
  576. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/product/entry-skill/SKILL.md +0 -0
  577. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/product/entry-skill/agents/openai.yaml +0 -0
  578. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/product/entry-skill/references/native-subagents.md +0 -0
  579. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/product/entry-skill/references/workflow.md +0 -0
  580. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/product/roles/executor.md +0 -0
  581. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/product/roles/maintainer.md +0 -0
  582. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/product/roles/proposer.md +0 -0
  583. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/final-20260907/manifest.json +0 -0
  584. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/final-20260907/math-episodes.json +0 -0
  585. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/final-20260907/sealqa-pairs.json +0 -0
  586. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/final-20260907/spreadsheet-SKILL.md +0 -0
  587. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/final-20260907/spreadsheet-pairs.json +0 -0
  588. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/final-20260907/summary.json +0 -0
  589. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/repeatability-20260908/example-provenance.json +0 -0
  590. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/repeatability-20260908/installed-smoke.json +0 -0
  591. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/repeatability-20260908/manifest.json +0 -0
  592. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/repeatability-20260908/repeat1-pairs.json +0 -0
  593. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/repeatability-20260908/repeat2-pairs.json +0 -0
  594. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/repeatability-20260908/repeat3-pairs.json +0 -0
  595. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/repeatability-20260908/summary.json +0 -0
  596. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/repeatability-20260908/wiki-deliver-the-recalculated-workbook.md +0 -0
  597. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/skills/livemath/55.md +0 -0
  598. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/skills/livemath/luna.md +0 -0
  599. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/skills/officeqa/55.md +0 -0
  600. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/skills/officeqa/terra.md +0 -0
  601. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/skills/officeqa-retrieval/55.md +0 -0
  602. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/skills/officeqa-retrieval/sol.md +0 -0
  603. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/skills/sealqa/sol.md +0 -0
  604. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/skills/spreadsheet/55.md +0 -0
  605. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/skills/spreadsheet/sol.md +0 -0
  606. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/snapshot.json +0 -0
  607. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/snapshot.sha256 +0 -0
  608. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/update-20260906/livemath-luna-pairs.json +0 -0
  609. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/update-20260906/livemath-luna-skill.md +0 -0
  610. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/update-20260906/manifest.json +0 -0
  611. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/update-20260906/officeqa-luna-skill.md +0 -0
  612. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/update-20260906/officeqa-sol-skill.md +0 -0
  613. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/update-20260906/officeqa-sol-v2-pairs.json +0 -0
  614. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/update-20260906/studies.json +0 -0
  615. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/update-20260907/effort-analysis.json +0 -0
  616. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/update-20260907/effort-pairs.json +0 -0
  617. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/update-20260907/manifest.json +0 -0
  618. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/update-20260907/officeqa-luna-paper-tools-pairs.json +0 -0
  619. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/update-20260907/officeqa-luna-paper-tools-skill.md +0 -0
  620. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/update-20260907/spreadsheet-luna-scoped-python-pairs.json +0 -0
  621. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/update-20260907/spreadsheet-luna-scoped-python-skill.md +0 -0
  622. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/research/update-20260907/studies.json +0 -0
  623. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/runtime/acorn.mjs +0 -0
  624. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/runtime/audit_js.mjs +0 -0
  625. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/sealqa/id_split/split_manifest.json +0 -0
  626. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/sealqa/id_split/test.json +0 -0
  627. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/sealqa/id_split/train.json +0 -0
  628. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/sealqa/id_split/val.json +0 -0
  629. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/sealqa/protocol.json +0 -0
  630. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/sealqa/wiki/SKILL-s0.md +0 -0
  631. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/sealqa/wiki/index.md +0 -0
  632. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/sealqa/wiki/logs.md +0 -0
  633. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/sealqa/wiki/prompts/maintainer.md +0 -0
  634. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/sealqa/wiki/prompts/proposer.md +0 -0
  635. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/sealqa/wiki/skill-impact.md +0 -0
  636. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/spreadsheet/id_split/split_manifest.json +0 -0
  637. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/spreadsheet/id_split/test.json +0 -0
  638. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/spreadsheet/id_split/train.json +0 -0
  639. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/spreadsheet/id_split/val.json +0 -0
  640. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/spreadsheet/protocol.json +0 -0
  641. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/spreadsheet/wiki/SKILL-s0.md +0 -0
  642. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/spreadsheet/wiki/index.md +0 -0
  643. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/spreadsheet/wiki/logs.md +0 -0
  644. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/spreadsheet/wiki/prompts/maintainer.md +0 -0
  645. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/spreadsheet/wiki/prompts/proposer.md +0 -0
  646. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/resources/spreadsheet/wiki/skill-impact.md +0 -0
  647. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/results.py +0 -0
  648. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/score_rules.py +0 -0
  649. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/scorer_trust.py +0 -0
  650. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/sealqa/__init__.py +0 -0
  651. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/sealqa/loop.py +0 -0
  652. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/sealqa/rollout.py +0 -0
  653. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/settings.py +0 -0
  654. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/skill_proposer.py +0 -0
  655. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/spreadsheet/__init__.py +0 -0
  656. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/spreadsheet/loop.py +0 -0
  657. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/spreadsheet/rollout.py +0 -0
  658. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/spreadsheet/study.py +0 -0
  659. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/tool_audit.py +0 -0
  660. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/wiki.py +0 -0
  661. {briefloop-0.26.4 → briefloop-0.27.0}/src/wikiskill/wiki_maintainer.py +0 -0
  662. {briefloop-0.26.4 → briefloop-0.27.0}/start.ps1 +0 -0
  663. {briefloop-0.26.4 → briefloop-0.27.0}/start.sh +0 -0
  664. {briefloop-0.26.4 → briefloop-0.27.0}/tests/check_distribution.py +0 -0
  665. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_app_updates.mjs +0 -0
  666. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_assessment_checks.mjs +0 -0
  667. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_chat_attachments.mjs +0 -0
  668. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_chat_commands.mjs +0 -0
  669. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_chat_drafts.mjs +0 -0
  670. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_chat_layout.mjs +0 -0
  671. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_chat_polling.mjs +0 -0
  672. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_checkout_eol.mjs +0 -0
  673. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_citation_clipboard.mjs +0 -0
  674. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_citation_edit.mjs +0 -0
  675. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_citation_evidence.mjs +0 -0
  676. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_clipboard_fallback.mjs +0 -0
  677. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_excel_export.mjs +0 -0
  678. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_export_menu.mjs +0 -0
  679. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_fact_check_availability.mjs +0 -0
  680. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_fact_check_grants.mjs +0 -0
  681. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_fast_mode.mjs +0 -0
  682. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_home_v2.mjs +0 -0
  683. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_job_presentation.mjs +0 -0
  684. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_length_controls.mjs +0 -0
  685. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_licenses.mjs +0 -0
  686. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_live_status.mjs +0 -0
  687. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_markdown_import.mjs +0 -0
  688. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_mcp_selection.mjs +0 -0
  689. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_model_catalog_refresh.mjs +0 -0
  690. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_model_label.mjs +0 -0
  691. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_model_selection.mjs +0 -0
  692. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_native_requests.mjs +0 -0
  693. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_native_runtime.mjs +0 -0
  694. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_office_tools.mjs +0 -0
  695. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_open_brief_status.mjs +0 -0
  696. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_pending_report.mjs +0 -0
  697. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_polling.mjs +0 -0
  698. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_progress_race.mjs +0 -0
  699. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_quick_report.mjs +0 -0
  700. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_reasoning_controls.mjs +0 -0
  701. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_release_controls.mjs +0 -0
  702. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_release_navigation.mjs +0 -0
  703. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_report_browsing.mjs +0 -0
  704. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_report_chat_drawer.mjs +0 -0
  705. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_report_export.mjs +0 -0
  706. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_report_language.mjs +0 -0
  707. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_report_load.mjs +0 -0
  708. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_report_outline.mjs +0 -0
  709. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_report_panels.mjs +0 -0
  710. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_review_capability.mjs +0 -0
  711. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_review_coverage.mjs +0 -0
  712. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_review_status.mjs +0 -0
  713. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_runtime_discovery.mjs +0 -0
  714. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_runtime_feedback.mjs +0 -0
  715. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_runtime_permission_panel.mjs +0 -0
  716. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_save_barrier.mjs +0 -0
  717. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_settings_workspaces.mjs +0 -0
  718. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_setup_state.mjs +0 -0
  719. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_source_library.mjs +0 -0
  720. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_source_search.mjs +0 -0
  721. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_source_upload.mjs +0 -0
  722. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_startup_recovery.mjs +0 -0
  723. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_task_progress.mjs +0 -0
  724. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_template_groups.mjs +0 -0
  725. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_template_output.mjs +0 -0
  726. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_update_notifications.mjs +0 -0
  727. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_upload_limits.mjs +0 -0
  728. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_version_bodies.mjs +0 -0
  729. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_version_diff.mjs +0 -0
  730. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_welcome_gate.mjs +0 -0
  731. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_workspace_proposal.mjs +0 -0
  732. {briefloop-0.26.4 → briefloop-0.27.0}/tests/frontend_writing_preferences.mjs +0 -0
  733. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_agent_backend.py +0 -0
  734. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_agent_commands.py +0 -0
  735. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_analyst_draft_versions.py +0 -0
  736. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_assessment_admission_recovery.py +0 -0
  737. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_assessment_followup.py +0 -0
  738. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_background_no_question.py +0 -0
  739. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_bridge_harness.py +0 -0
  740. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_builtin_templates.py +0 -0
  741. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_chat_dispatch.py +0 -0
  742. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_chat_execution.py +0 -0
  743. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_chat_model_selection.py +0 -0
  744. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_cli_doctor.py +0 -0
  745. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_codex_idle.py +0 -0
  746. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_connection_test_history.py +0 -0
  747. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_connector_authorization.py +0 -0
  748. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_connector_empty_catalog.py +0 -0
  749. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_connector_materials.py +0 -0
  750. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_connector_tasks.py +0 -0
  751. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_connectors.py +0 -0
  752. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_core.py +0 -0
  753. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_cross_module_regressions.py +0 -0
  754. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_delivery_checks.py +0 -0
  755. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_delivery_consumers.py +0 -0
  756. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_demo.py +0 -0
  757. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_desktop_lifecycle.py +0 -0
  758. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_document_workflows.py +0 -0
  759. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_draft_completion.py +0 -0
  760. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_draft_contract.py +0 -0
  761. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_english_reports.py +0 -0
  762. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_entrypoint.py +0 -0
  763. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_evidence.py +0 -0
  764. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_evidence_parse_failures.py +0 -0
  765. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_execution_records.py +0 -0
  766. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_execution_timing.py +0 -0
  767. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_export_admission.py +0 -0
  768. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_export_layout_swap.py +0 -0
  769. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_export_xlsx.py +0 -0
  770. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_external_requests.py +0 -0
  771. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_fact_check_contract.py +0 -0
  772. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_fact_check_orchestration.py +0 -0
  773. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_fact_check_phase.py +0 -0
  774. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_fact_check_review.py +0 -0
  775. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_fact_check_switch.py +0 -0
  776. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_fact_status_tool.py +0 -0
  777. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_fast_evidence.py +0 -0
  778. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_fast_mode.py +0 -0
  779. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_fast_qualifier_checks.py +0 -0
  780. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_fast_reports.py +0 -0
  781. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_fast_research.py +0 -0
  782. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_figure_exports.py +0 -0
  783. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_figure_flow.py +0 -0
  784. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_figure_text.py +0 -0
  785. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_figures.py +0 -0
  786. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_generation_schema_guidance.py +0 -0
  787. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_harness.py +0 -0
  788. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_host_bins.py +0 -0
  789. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_human_learning.py +0 -0
  790. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_industry_export.py +0 -0
  791. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_industry_flow.py +0 -0
  792. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_industry_research.py +0 -0
  793. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_interactive_runtime.py +0 -0
  794. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_jev_checks.py +0 -0
  795. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_learning_integrity.py +0 -0
  796. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_length.py +0 -0
  797. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_length_policy.py +0 -0
  798. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_markdown_download.py +0 -0
  799. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_media_sources.py +0 -0
  800. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_model_catalog_defaults.py +0 -0
  801. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_multimodal_harness.py +0 -0
  802. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_multimodal_http.py +0 -0
  803. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_native_analyst.py +0 -0
  804. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_native_evaluator.py +0 -0
  805. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_native_harness.py +0 -0
  806. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_native_learning.py +0 -0
  807. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_native_orchestrator.py +0 -0
  808. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_native_provider_storage.py +0 -0
  809. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_native_providers.py +0 -0
  810. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_native_research_closeout.py +0 -0
  811. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_native_review_contract.py +0 -0
  812. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_native_scout.py +0 -0
  813. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_notifications.py +0 -0
  814. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_npm_native_shim.py +0 -0
  815. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_numeric_occurrence_review.py +0 -0
  816. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_office_cli.py +0 -0
  817. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_office_source_structure.py +0 -0
  818. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_office_surfaces.py +0 -0
  819. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_ooxml_order.py +0 -0
  820. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_opencode_harness.py +0 -0
  821. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_opencode_idle.py +0 -0
  822. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_opencode_prompt_versions.py +0 -0
  823. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_opencode_provider.py +0 -0
  824. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_opencode_questions.py +0 -0
  825. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_opencode_reasoning.py +0 -0
  826. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_opencode_review_version.py +0 -0
  827. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_opencode_search_prompt.py +0 -0
  828. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_opencode_server_stdin.py +0 -0
  829. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_opencode_v2.py +0 -0
  830. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_opencode_version_probe.py +0 -0
  831. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_posix_process_tree.py +0 -0
  832. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_pr593_roundtrip.py +0 -0
  833. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_product_summary_consistency.py +0 -0
  834. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_progress.py +0 -0
  835. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_progress_pipeline.py +0 -0
  836. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_provider_catalog.py +0 -0
  837. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_public_research.py +0 -0
  838. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_quality_reading_context.py +0 -0
  839. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_reader_contract.py +0 -0
  840. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_reader_source_export.py +0 -0
  841. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_reader_workflow.py +0 -0
  842. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_reconciliation.py +0 -0
  843. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_release.py +0 -0
  844. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_release_identity.py +0 -0
  845. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_report_browsing.py +0 -0
  846. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_report_concurrency.py +0 -0
  847. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_report_deletion.py +0 -0
  848. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_report_length_feedback.py +0 -0
  849. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_report_path_regressions.py +0 -0
  850. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_report_time.py +0 -0
  851. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_research_budget.py +0 -0
  852. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_research_gap_updates.py +0 -0
  853. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_research_handoff.py +0 -0
  854. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_research_plan.py +0 -0
  855. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_research_response_admission.py +0 -0
  856. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_resume_in_place.py +0 -0
  857. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_review.py +0 -0
  858. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_review_capability.py +0 -0
  859. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_review_finding_consistency.py +0 -0
  860. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_review_learning.py +0 -0
  861. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_review_modes.py +0 -0
  862. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_review_packet_paths.py +0 -0
  863. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_review_packet_utf8.py +0 -0
  864. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_review_schema_drift.py +0 -0
  865. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_review_snapshot.py +0 -0
  866. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_review_visual_input.py +0 -0
  867. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_revision_citations.py +0 -0
  868. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_revision_policy.py +0 -0
  869. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_rich_document.py +0 -0
  870. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_role_models.py +0 -0
  871. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_runtime_bridge.py +0 -0
  872. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_runtime_bridge_idle.py +0 -0
  873. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_runtime_concurrency.py +0 -0
  874. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_runtime_json_bom.py +0 -0
  875. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_runtime_liveness.py +0 -0
  876. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_runtime_names.py +0 -0
  877. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_runtime_permissions.py +0 -0
  878. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_runtime_settlement.py +0 -0
  879. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_schedules.py +0 -0
  880. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_scout_experiment.py +0 -0
  881. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_search_credentials.py +0 -0
  882. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_search_policy.py +0 -0
  883. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_semantic_experiment.py +0 -0
  884. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_semantic_governance.py +0 -0
  885. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_server_boundary.py +0 -0
  886. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_settings_transactions.py +0 -0
  887. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_software_version.py +0 -0
  888. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_source_ingestion.py +0 -0
  889. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_source_library_search.py +0 -0
  890. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_source_recovery_regressions.py +0 -0
  891. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_source_updates.py +0 -0
  892. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_sources_provenance.py +0 -0
  893. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_store_sqlite_benchmark.py +0 -0
  894. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_table_citation_advisory.py +0 -0
  895. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_task_labels.py +0 -0
  896. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_task_notify.py +0 -0
  897. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_task_progress.py +0 -0
  898. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_tavily.py +0 -0
  899. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_template_conversion.py +0 -0
  900. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_template_conversion_http.py +0 -0
  901. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_template_saved_state.py +0 -0
  902. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_templates.py +0 -0
  903. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_user_input.py +0 -0
  904. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_user_source_refresh.py +0 -0
  905. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_version_consistency.py +0 -0
  906. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_websearch.py +0 -0
  907. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_websearch_singleflight.py +0 -0
  908. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_wikiskill_engine_windows.py +0 -0
  909. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_windows_antigravity_permissions.py +0 -0
  910. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_windows_connector_acl.py +0 -0
  911. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_windows_distribution.py +0 -0
  912. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_windows_mcp_supervisor.py +0 -0
  913. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_windows_platform.py +0 -0
  914. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_windows_release_paths.py +0 -0
  915. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_windows_review_paths.py +0 -0
  916. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_windows_runtime_bundle.py +0 -0
  917. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_windows_xlsx_paths.py +0 -0
  918. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_word_import.py +0 -0
  919. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_word_source_locators.py +0 -0
  920. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_word_toc.py +0 -0
  921. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_worker_idle.py +0 -0
  922. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_workspace_action_errors.py +0 -0
  923. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_workspace_profile.py +0 -0
  924. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_workspaces.py +0 -0
  925. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_writer_assembly.py +0 -0
  926. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_writer_cli_guidance.py +0 -0
  927. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_writer_context.py +0 -0
  928. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_writer_input.py +0 -0
  929. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_xlsx_officecli_integration.py +0 -0
  930. {briefloop-0.26.4 → briefloop-0.27.0}/tests/test_xlsx_preview.py +0 -0
  931. {briefloop-0.26.4 → briefloop-0.27.0}/third_party/open-design/LICENSE +0 -0
  932. {briefloop-0.26.4 → briefloop-0.27.0}/third_party/open-design/NOTICE.md +0 -0
  933. {briefloop-0.26.4 → briefloop-0.27.0}/third_party/open-design/acp/constants.ts +0 -0
  934. {briefloop-0.26.4 → briefloop-0.27.0}/third_party/open-design/acp/json.ts +0 -0
  935. {briefloop-0.26.4 → briefloop-0.27.0}/third_party/open-design/acp/models.ts +0 -0
  936. {briefloop-0.26.4 → briefloop-0.27.0}/third_party/open-design/acp/rpc.ts +0 -0
  937. {briefloop-0.26.4 → briefloop-0.27.0}/third_party/open-design/acp/session-params.ts +0 -0
  938. {briefloop-0.26.4 → briefloop-0.27.0}/third_party/open-design/acp/types.ts +0 -0
  939. {briefloop-0.26.4 → briefloop-0.27.0}/third_party/open-design/byok-reference/byok-opencode.ts +0 -0
  940. {briefloop-0.26.4 → briefloop-0.27.0}/third_party/open-design/byok-reference/provider-models.ts +0 -0
  941. {briefloop-0.26.4 → briefloop-0.27.0}/third_party/open-design/core/index.ts +0 -0
  942. {briefloop-0.26.4 → briefloop-0.27.0}/third_party/open-design/core/json-line-stream.ts +0 -0
  943. {briefloop-0.26.4 → briefloop-0.27.0}/third_party/open-design/runtime-models/codex-models.ts +0 -0
  944. {briefloop-0.26.4 → briefloop-0.27.0}/third_party/open-design/runtime-models/mmd-routes.ts +0 -0
  945. {briefloop-0.26.4 → briefloop-0.27.0}/third_party/open-design/runtime-models/models.ts +0 -0
  946. {briefloop-0.26.4 → briefloop-0.27.0}/third_party/open-design/runtime-models/opencode-models.ts +0 -0
@@ -1,5 +1,14 @@
1
1
  # 变更记录
2
2
 
3
+ ## 0.27.0 — 2026-09-30
4
+
5
+ - 从往期报告开始新任务,导入正文或 Word 修订,确认读者、结构、口径与禁区后再生成。
6
+ - 按读者保存偏好;将修订区分为写作经验、事实纠错与待确认事项,避免把不确定改动直接学成规则。
7
+ - 对已采用技能跟踪相关修订是否再次出现,未完成的复验明确保留为未核验。
8
+ - API 提供商保存提示随 BriefLoop Agent / OpenCode 执行引擎切换,准确说明本机配置归属。
9
+
10
+ 发行与验收范围见 [0.27.0 记录](docs/release-0.27.0.md)。上一正式版 0.26.4 保留供回退。
11
+
3
12
  ## 0.26.4 — 2026-09-29
4
13
 
5
14
  - App 更新后自动准备新后端,首次安装与修复仍由用户触发;启动页显示真实阶段。
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: briefloop
3
- Version: 0.26.4
3
+ Version: 0.27.0
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.27.0
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "briefloop-desktop",
3
- "version": "0.26.4",
3
+ "version": "0.27.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "briefloop-desktop",
9
- "version": "0.26.4",
9
+ "version": "0.27.0",
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.26.4",
3
+ "version": "0.27.0",
4
4
  "private": true,
5
5
  "description": "BriefLoop local desktop workspace",
6
6
  "author": "Stahl-G",
@@ -0,0 +1,13 @@
1
+ # BriefLoop 0.27.0
2
+
3
+ 本批合入 PR #862 的往期报告启动、读者档案与修订学习,以及 PR #863 的执行引擎配置提示修复。新能力按用户约定升级到 0.27.0;未合入预算、语义实验或依赖锁等其他开发分支。
4
+
5
+ - 从往期正文或 Word 修订反推新报告要求,经确认再开始。
6
+ - 将读者偏好、写作经验、事实纠错及不确定修订分别保存;未核验的技能复现结果保持明确。
7
+ - 保存 API 配置时,提示准确区分 BriefLoop Agent 与 OpenCode 的本机配置。
8
+
9
+ 冻结提交统一构建一次后端 wheel,Mac、Windows 与 Python/CLI 复用;发布时上传已有工件,不重建同版本文件。上一正式版 v0.26.4 及其工件保留供回退。
10
+
11
+ 验收证据:#863 四项 CI 通过;最新主线相关 42 项 Python 检查及配置提示切换检查通过。已有真实模型合成报告在更新并重启 WebUI 后,正文、两版本、评分、来源和 Word 导出均保留。真实模型结果来自隔离实验,不代表正式报告质量已全面核验。Mac 锁屏使桌面原生界面与实际升级交互尚未核验,不能以构建或包内版本检查替代。平台工件与渠道状态以正式发行资产及验证记录为准。
12
+
13
+ Mac 工件未作 Developer ID 签名或公证;Windows 工件未签名。更新前保存并退出 App,保留原工作区与报告。
@@ -0,0 +1,16 @@
1
+ # 修订学习闭环(#858)
2
+
3
+ 保存与学习分开。保存原稿、改稿、评论及导入 Word 修订不启动模型;开始学习时,确认界面列出一次独立分类会话和每轮整理、提案、比较与试写上限。会话数不是宿主内部回合、Token 或费用上限。旧预算未包含分类调用时暂停,原任务与反馈保留;“确认预算后重试”创建关联的新尝试。
4
+
5
+ ## 当前行为
6
+
7
+ - 按正文块拆分改动,Evaluator 对照来源判断口味、事实纠错、读者特定,保留理由与判断者。事实纠错不进入写作技能。所有不确定改动先隔离;较大改动集中提问,小改动在经验页可选确认。人工确认只作为新的反馈消费一次。
8
+ - 读者档案只记录名称、决策用途与偏好,报告冻结当时档案,刷新保持选择。读者专属反馈保留待学习,不进入全局技能;历史独立读者技能及其派生版本不能全局启用,原记录保留。
9
+ - 离线比较保留的候选仍可按原机制用于报告,但“用于报告”和“证明跨期有效”是两个状态。后续单次模型标记只显示初步线索;交付、空 repeats、跳过及未评估均不证明未复发。不自动标为已采用或没有改善,不编造基线和复发率。
10
+ - 导入 MD/TXT/DOCX 可提出读者、结构与口径约定,用户确认后使用。未出现的内容不推定为禁区。Word 插入/删除文本及整行修订保存前后版本,表格保留行列文本。导入文件只作约定和写法参考,不能自动作为本期证据或事实引用;原件仍保留。
11
+
12
+ ## 仍未完成
13
+
14
+ 共享 WikiSkill 的读者适用条件及跨读者验收、完整报告级复发观察、双独立模型家族判定与人工分歧处理、真实基线和留出系列验收、连续三期真实周期报告均未完成。Issue #858 保持开放。当前不得用两份报告或 50% 阈值证明学习有效。
15
+
16
+ 导入是文本与修订抽取,不承诺 Word 原版式、批注或任意复杂修订的无损往返。历史材料的数字和结论不是本期事实。
@@ -42,6 +42,11 @@ import {Markdown} from '@tiptap/markdown';
42
42
  import {connectorSettings} from './connectors.js';
43
43
  import {mcpSelection} from './mcp-selection.js';
44
44
  import {appUpdatesUI} from './app-updates.js';
45
+ import {revisionQuestionsUI} from './revision-questions.js';
46
+ import {readersUI} from './readers.js';
47
+ import {verificationBadge} from './skill-verification.js';
48
+ import {previousReportUI} from './previous-report.js';
49
+ import {learningRetry} from './learning-retry.js';
45
50
  import {templatesUI,GENRE_META,ICONS,splitTemplateName} from './templates.js';
46
51
  import {createTemplateOutput} from './template-output.js';
47
52
  import {deliveryUI,changeTypeLabel,displayDate} from './delivery.js';
@@ -82,6 +87,12 @@ let followUpdates=true;
82
87
  let state,current,pendingRun=null,editor,dirty=false,saving=false,saveTimer,learnTimer,markdownMode=false,selected=new Set(),referenceSelected=new Set();
83
88
  const reportSources=createReportSources({$,esc,getState:()=>state,getCurrent:()=>current,runSourceIds,sourceState,sourceStatusChip,sourceTitle,sourceHost,openSource:id=>openSourceDrawer(id,sourceUsage()).catch(err=>notice(err.message,true))});
84
89
  const reportBrowsing=createReportBrowsing({api,getState:()=>state,getCurrent:()=>current,openBrief,page,notice,reportStatus,reportDescription,reportIconMeta,svgLineIcon,runSourceCount,openRelease:b=>action(()=>delivery.openReleaseDialog(b)),onUsageOpen:closeSourceDrawer,onContext:()=>{assessment();citations();renderBriefLength();renderReportStatus();renderAssistantSummary()}});
90
+ const revisionQuestions=revisionQuestionsUI({api,action:(...args)=>action(...args)});
91
+ const retryLearning=learningRetry({api,getPlan:()=>state?.learning_authorization?.plan,confirm:text=>confirm(text),describePlan:learningPlanText});
92
+ const readerProfiles=readersUI({api,action:(...args)=>action(...args)});
93
+ readerProfiles.bind();
94
+ const previousReport=previousReportUI({api,uploadPayload,getUploadLimits,notice:(...args)=>notice(...args),saveReader:reader=>action(async()=>{const saved=await api('reader-save',reader);await refresh();const select=$('reader-select');if(select){select.value=saved.id;select.dispatchEvent(new Event('change'))}},'读者档案已保存,下一份报告可复用'),openChat:async({text,source_id})=>{await openChatHome();chat.attachments.add(source_id);renderAttachments();$('chat-input').value=text;rememberDraft();updateComposer();$('chat-input').focus()}});
95
+ previousReport.bind();
85
96
  function notice(s,error=false){$('notice').textContent=s;$('notice').classList.toggle('error',error);$('notice').hidden=false;clearTimeout(notice.timer);notice.timer=setTimeout(()=>$('notice').hidden=true,error?12000:4500)}
86
97
  function page(name){if(document.body.classList.contains('report-chat-open'))setReportChatOpen(false);if(((name==='chat'&&!chat.id)||name==='setup')&&(state?.settings?.model_selection_required||!state?.settings?.model)){notice('请先选择 Agent 和模型');name='welcome'}if(name!=='settings-dialog'&&$('custom-api-key'))$('custom-api-key').value='';for(const id of ['chat','report','reports','sources','templates','setup','learning','settings-dialog','welcome'])$(id).hidden=id!==name;document.querySelectorAll('nav [data-page]').forEach(b=>b.classList.toggle('active',b.dataset.page===name));if(name==='learning')refreshCandidates();if(name==='setup'){if(typeof reportMcpSelection!=='undefined')reportMcpSelection.refresh();moveSearchSettings('setup');applyPendingSetupFields()}else if($('tavily-key')){$('tavily-key').value='';$('bocha-key').value='';$('zhipu-key').value=''}if(name==='reports'){renderTasks();renderTaskGraph();renderReports()}if(['reports','templates','learning'].includes(name))activity?.readCategory(name)}
87
98
  document.querySelectorAll('[data-page]').forEach(b=>b.onclick=()=>page(b.dataset.page));
@@ -393,26 +404,28 @@ function render(first){
393
404
  renderWorkflowChoices(first);
394
405
  if($('review-open'))$('review-open').textContent='审阅与需处理'+(state.conflicts?.length?' · '+state.conflicts.length+' 项来源分歧':'');
395
406
  if(first&&$('report-system-clock')&&state.system_clock)$('report-system-clock').textContent=`本机日期:${state.system_clock.today} · ${state.system_clock.timezone};提交时再次由后台核对。`;
396
- if(first){$('settings-chat-web-default').checked=state.settings.chat_allow_web!==false;$('chat-allow-web').checked=state.settings.chat_allow_web!==false;$('timeout-minutes').value=state.settings.timeout_minutes;$('hard-timeout-minutes').value=state.settings.hard_timeout_minutes||0;$('company-mode').value=state.settings.company_context_enabled==null?'ask':state.settings.company_context_enabled?'on':'off';$('auto-revision').checked=state.settings.auto_revision!==false;state.sources.filter(s=>s.status==='ready').forEach(s=>selected.add(s.id));$('rounds').value=state.settings.k;$('auto-learn').checked=state.learning_authorization?.state==='authorized';$('model-select').value=state.settings.model_selection_required?'':state.settings.model||'';assignEffort('effort-select',settingsEffort(state.settings,state.settings.agent_backend||'codex'));$('model-provider').value=state.settings.model_provider||'';$('service-tier').value=state.settings.service_tier||'';$('agent-backend').value=state.settings.agent_backend||'codex';$('model-variant').value=state.settings.agent_backend==='mimo'?(state.settings.runtime_efforts?.mimo||''):(state.settings.model_variant||'');updateModelLabel();renderRoleModels();renderReviewRuntime();renderBackend();loadSearchPolicy();renderSearchProvider();refreshRuntimeDiscovery();office.syncSettingsToggle();if(state.requirements)for(const [k,v] of Object.entries(state.requirements)){const e=$('requirements').elements[k];if(e)e.type==='checkbox'?e.checked=v:e.value=v}$('requirements').elements.key_questions_text.value=(state.requirements?.key_questions||[]).join('\n');$('requirements').elements.manual_sections_text.value=(state.requirements?.manual_sections||[]).join('\n');reportLanguageForm.restore(state.requirements?.language);initializeLengthInputs(state.requirements||{});initializeResearchBudget(state.requirements||{});initializeReportProfile(state.requirements||{});if(!state.requirements||state.requirements.fact_check==null)$('requirements').elements.fact_check.checked=!!state.settings.fact_checker;syncFactCheckControl();quickReport.sync();syncWorkflowProfile(false);previewReportTime()}
397
- $('source-count').textContent=state.sources.length+' 份';$('source-list').innerHTML=state.sources.map(s=>`<div class="source-item"><input type="checkbox" data-check="${s.id}" ${selected.has(s.id)?'checked':''} ${s.status!=='ready'?'disabled':''} aria-label="选择 ${esc(s.name)}"><button data-source="${s.id}">${esc(s.name)}</button><span class="tag ${s.status==='failed'?'error':''}">${esc(sourceStatusLabel(s))}</span>${['failed','cancelled','interrupted'].includes(s.status)?`<button data-retry-source="${s.id}">重试</button>`:''}</div>`).join('');
407
+ if(first){$('settings-chat-web-default').checked=state.settings.chat_allow_web!==false;$('chat-allow-web').checked=state.settings.chat_allow_web!==false;$('timeout-minutes').value=state.settings.timeout_minutes;$('hard-timeout-minutes').value=state.settings.hard_timeout_minutes||0;$('company-mode').value=state.settings.company_context_enabled==null?'ask':state.settings.company_context_enabled?'on':'off';$('auto-revision').checked=state.settings.auto_revision!==false;state.sources.filter(s=>s.status==='ready'&&s.usage!=='previous_report').forEach(s=>selected.add(s.id));$('rounds').value=state.settings.k;$('auto-learn').checked=state.learning_authorization?.state==='authorized';$('model-select').value=state.settings.model_selection_required?'':state.settings.model||'';assignEffort('effort-select',settingsEffort(state.settings,state.settings.agent_backend||'codex'));$('model-provider').value=state.settings.model_provider||'';$('service-tier').value=state.settings.service_tier||'';$('agent-backend').value=state.settings.agent_backend||'codex';$('model-variant').value=state.settings.agent_backend==='mimo'?(state.settings.runtime_efforts?.mimo||''):(state.settings.model_variant||'');updateModelLabel();renderRoleModels();renderReviewRuntime();renderBackend();loadSearchPolicy();renderSearchProvider();refreshRuntimeDiscovery();office.syncSettingsToggle();if(state.requirements)for(const [k,v] of Object.entries(state.requirements)){const e=$('requirements').elements[k];if(e)e.type==='checkbox'?e.checked=v:e.value=v}$('requirements').elements.key_questions_text.value=(state.requirements?.key_questions||[]).join('\n');$('requirements').elements.manual_sections_text.value=(state.requirements?.manual_sections||[]).join('\n');reportLanguageForm.restore(state.requirements?.language);initializeLengthInputs(state.requirements||{});initializeResearchBudget(state.requirements||{});initializeReportProfile(state.requirements||{});if(!state.requirements||state.requirements.fact_check==null)$('requirements').elements.fact_check.checked=!!state.settings.fact_checker;syncFactCheckControl();quickReport.sync();syncWorkflowProfile(false);previewReportTime()}
408
+ $('source-count').textContent=state.sources.length+' 份';$('source-list').innerHTML=state.sources.map(s=>`<div class="source-item"><input type="checkbox" data-check="${s.id}" ${selected.has(s.id)?'checked':''} ${s.status!=='ready'||s.usage==='previous_report'?'disabled':''} aria-label="选择 ${esc(s.name)}"><button data-source="${s.id}">${esc(s.name)}</button><span class="tag ${s.status==='failed'?'error':''}">${esc(s.usage==='previous_report'?'往期报告 · 参考用途':sourceStatusLabel(s))}</span>${['failed','cancelled','interrupted'].includes(s.status)?`<button data-retry-source="${s.id}">重试</button>`:''}</div>`).join('');
398
409
  document.querySelectorAll('[data-retry-source]').forEach(b=>b.onclick=()=>action(async()=>{const s=await api('retry-source',{source_id:b.dataset.retrySource});selected.delete(b.dataset.retrySource);if(s.status==='ready')selected.add(s.id);notice(sourceStatusLabel(s),['failed','cancelled','interrupted'].includes(s.status))}));
399
410
  document.querySelectorAll('[data-check]').forEach(b=>b.onchange=()=>{if(b.checked){selected.add(b.dataset.check);referenceSelected.delete(b.dataset.check);renderReferenceSources()}else selected.delete(b.dataset.check)});renderReferenceSources();
400
411
  renderVersionSelect();
401
412
 
402
413
  tryOpenPending();if(!current&&!pendingRun&&!openBrief.request&&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()}
403
414
  syncPendingReport();
404
- $('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(taskLabel(j.kind)||j.kind)}<small>${esc(jobExecutionLabel(j,jobModelLabel))} · ${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):'')||moment(j.created))}</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}">${esc(jobResumeLabel(j))}</button>${['review','learn'].includes(j.kind)?`<button data-retry-current="${j.id}">按当前模型重试</button>`:''}`:''}</div>`).join('');
405
- 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();templatesPage.render();if($('welcome')&&!$('welcome').hidden)renderWelcome();
415
+ $('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(taskLabel(j.kind)||j.kind)}<small>${esc(jobExecutionLabel(j,jobModelLabel))} · ${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):'')||moment(j.created))}</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}">${esc(jobResumeLabel(j))}</button>${['review','learn'].includes(j.kind)?`<button data-retry-current="${j.id}">${j.kind==='learn'?'确认预算后重试':'按当前模型重试'}</button>`:''}`:''}</div>`).join('');
416
+ 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(()=>retryLearning(state.jobs.find(j=>j.id===b.dataset.retryCurrent))));renderTasks();renderTaskGraph();renderTaskBanner();renderAssistantSummary();renderReportStatus();renderReports();renderSourcesPage();templatesPage.render();if($('welcome')&&!$('welcome').hidden)renderWelcome();
406
417
  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()}));
407
- $('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}),'下一轮将使用所选技能'));
418
+ revisionQuestions.render(state.revision_edits);
419
+ readerProfiles.render(state.readers,{readerId:state.requirements?.reader_id});
420
+ $('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>${verificationBadge(state.skill_verifications?.[s.id])}<p>${esc(s.reason)}</p>${s.reader_scope_ids?.length?'<span class="tag">历史读者专属版本 · 暂不启用</span>':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}),'下一轮将使用所选技能'));
408
421
  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();
409
422
  }
410
423
  function renderVersionSelect(){
411
424
  const visible=[];
412
425
  for(const runId of [...new Set(state.briefs.map(b=>b.run_id))]){
413
- const versions=state.briefs.filter(b=>b.run_id===runId),latest=versions[0],original=[...versions].reverse().find(b=>['agent','example'].includes(b.author));
414
- if(latest)visible.push({brief:latest,label:latest.author==='example'?'合成示例':latest.author==='user'?'当前编辑稿':latest.parent_id?quickReport.versionLabel(latest):'生成原稿'});
415
- if(original&&original.id!==latest?.id)visible.push({brief:original,label:original.author==='example'?'合成示例':'生成原稿'});
426
+ const versions=state.briefs.filter(b=>b.run_id===runId),latest=versions[0],original=[...versions].reverse().find(b=>['agent','example','import'].includes(b.author));
427
+ if(latest)visible.push({brief:latest,label:latest.author==='example'?'合成示例':latest.author==='import'?'往期原稿':latest.author==='user'?'当前编辑稿':latest.parent_id?quickReport.versionLabel(latest):'生成原稿'});
428
+ if(original&&original.id!==latest?.id)visible.push({brief:original,label:original.author==='example'?'合成示例':original.author==='import'?'往期原稿':'生成原稿'});
416
429
  }
417
430
  if(current&&!visible.some(v=>v.brief.id===current.id))visible.push({brief:current,label:'正在查看历史快照'});
418
431
  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('');
@@ -538,14 +551,14 @@ async function previewReportTime(){
538
551
  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}
539
552
  }
540
553
  for(const key of ['period','period_start','period_end','report_timezone'])$('requirements').elements[key].addEventListener('change',previewReportTime);
541
- $('requirements').onsubmit=e=>{e.preventDefault();action(async()=>{const f=new FormData(e.target),req=Object.fromEntries(f.entries());if(!['fast','fast_web'].includes(req.completion_mode)&&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);Object.assign(req,lengthControls.read(),quickReport.read());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('任务已排队,后台会生成简报')})};
554
+ $('requirements').onsubmit=e=>{e.preventDefault();action(async()=>{const f=new FormData(e.target),req=Object.fromEntries(f.entries());if(!['fast','fast_web'].includes(req.completion_mode)&&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);Object.assign(req,lengthControls.read(),quickReport.read());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);if(!req.reader_id)delete req.reader_id;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('任务已排队,后台会生成简报')})};
542
555
  $('upload').onchange=e=>action(async()=>{preflightSources(e.target.files,getUploadLimits());for(const f of e.target.files){const s=await uploadSource(f);if(s.status==='ready')selected.add(s.id)}e.target.value=''},'来源已保存');
543
556
  $('add-url').onclick=()=>action(async()=>{const s=await api('source-url',{url:$('source-url').value});if(s.status==='ready')selected.add(s.id);$('source-url').value='';notice(s.status==='ready'?'网页已读取':'来源已保存,但读取失败:'+s.error,s.status!=='ready')});
544
557
  $('rescore').onclick=()=>action(async()=>{await savedVersion();await api('assess',{version_id:current.id,session_id:chat.id||undefined})},'已提交评分');
545
558
  $('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()},'反馈已保存');
546
559
  // Saving feedback is free; starting a learning validation calls models (#727).
547
560
  function learningPlanText(plan){
548
- return `每轮最多用 ${plan.cases} 份历史报告,每份基线和候选各试写一次(最多 ${plan.trial_generations_per_round} 次,可复用的基线不重写),另有整理经验、提出候选和一次成对比较;`+
561
+ return `每轮最多用 ${plan.cases} 份历史报告,每份基线和候选各试写一次(最多 ${plan.trial_generations_per_round} 次,可复用的基线不重写),每批还会最多启动 ${plan.triage_turns_per_batch} 个独立改动分类会话,每轮另有整理经验、提出候选和一次成对比较;`+
549
562
  `最多 ${plan.rounds} 轮,含用户明确需求时最多 ${plan.rounds_with_explicit_requirement} 轮,试写合计不超过 ${plan.max_trial_generations} 次。试写使用固定来源,不联网检索。`+
550
563
  `执行后端:${plan.backend_label} · ${plan.model||'尚未选择模型'}${roleModelText(plan)}。`+
551
564
  `上限计的是试写次数,不含宿主内部子 agent 的回合或 token 数;费用以宿主或 API 账户实际计费为准,BriefLoop 无法估算金额。`;
@@ -688,7 +701,7 @@ async function refreshProgress(){
688
701
  if(typeof isLocalFileJob!=='undefined'&&isLocalFileJob(job||paused)){await localFileProgress.render(job||paused,isCurrent);return;}
689
702
  if(!job){
690
703
  $('run-progress').hidden=!paused;
691
- if(paused){const service=await api('runtime');if(!isCurrent())return;$('run-progress').innerHTML=`<div class="section-title"><h2>${paused.status==='failed'?'任务未完成':'任务已暂停'}</h2><button id="paused-resume" class="primary">恢复任务(沿用原模型)</button></div><p>当前没有继续执行这个任务。已有来源和产物保留。</p><p class="help">本地服务 PID ${service.server_pid||'—'}(页面与任务管理) · ${service.pid?'模型进程 PID '+service.pid:'本工作区没有模型进程'}</p><p class="help">${esc(paused.error||'')}</p><p class="help">恢复会沿用原来的模型与后端。审阅和学习也可按当前模型重试,旧任务记录会保留。</p>${['review','learn'].includes(paused.kind)?'<button id="paused-retry-current" class="outline">按当前模型重试</button>':''}<button id="paused-settings" class="outline">修改模型与要求</button><button id="paused-dismiss" class="outline">清除这个任务</button>`;if($('paused-retry-current'))$('paused-retry-current').onclick=()=>action(()=>api('resume',{job_id:paused.id,use_current_model:true}),'已按当前设置创建重试,旧任务保留');$('paused-settings').onclick=()=>page('setup');$('paused-resume').onclick=()=>action(()=>api('resume',{job_id:paused.id}),'已按页面显示的模型提交');$('paused-dismiss').onclick=()=>action(()=>api('task-dismiss',{job_id:paused.id}),'已清除这个未完成任务')}
704
+ if(paused){const service=await api('runtime');if(!isCurrent())return;$('run-progress').innerHTML=`<div class="section-title"><h2>${paused.status==='failed'?'任务未完成':'任务已暂停'}</h2><button id="paused-resume" class="primary">恢复任务(沿用原模型)</button></div><p>当前没有继续执行这个任务。已有来源和产物保留。</p><p class="help">本地服务 PID ${service.server_pid||'—'}(页面与任务管理) · ${service.pid?'模型进程 PID '+service.pid:'本工作区没有模型进程'}</p><p class="help">${esc(paused.error||'')}</p><p class="help">恢复会沿用原来的模型与后端。审阅和学习也可按当前模型重试,旧任务记录会保留。</p>${['review','learn'].includes(paused.kind)?`<button id="paused-retry-current" class="outline">${paused.kind==='learn'?'确认预算后重试':'按当前模型重试'}</button>`:''}<button id="paused-settings" class="outline">修改模型与要求</button><button id="paused-dismiss" class="outline">清除这个任务</button>`;if($('paused-retry-current'))$('paused-retry-current').onclick=()=>action(()=>retryLearning(paused));$('paused-settings').onclick=()=>page('setup');$('paused-resume').onclick=()=>action(()=>api('resume',{job_id:paused.id}),'已按页面显示的模型提交');$('paused-dismiss').onclick=()=>action(()=>api('task-dismiss',{job_id:paused.id}),'已清除这个未完成任务')}
692
705
  return
693
706
  }
694
707
  if(job.kind==='source_refresh'){
@@ -829,7 +842,7 @@ $('version-diff').onclick=()=>action(async()=>{
829
842
  const history=typeof reportBrowsing==='undefined'?{items:versions.slice(index+1)}:await reportBrowsing.comparisonVersions(target);if(current!==target)return;
830
843
  const older=history.items;let nextCursor=history.next_cursor;
831
844
  if(!older.length){notice('这是第一稿,还没有可比较的上一版本');return}
832
- const label=b=>moment(b.created)+' · '+(b.author==='agent'?'AI 稿件':b.author==='user'?'用户修改':'原稿');
845
+ const label=b=>moment(b.created)+' · '+(b.author==='agent'?'AI 稿件':b.author==='user'?'用户修改':b.author==='import'?'往期原稿':'原稿');
833
846
  function fillComparison(){ $('diff-base').innerHTML=older.map((b,i)=>`<option value="${esc(b.id)}">${i===0?'上一稿 · ':!b.parent_id?'第一稿 · ':''}${esc(label(b))}</option>`).join('')+(nextCursor?'<option value="more">加载更多历史版本…</option>':'')}fillComparison();
834
847
  $('diff-target').textContent='当前稿 · '+label(target);
835
848
  function documentFor(b){
@@ -1036,7 +1049,7 @@ function renderMessages(){
1036
1049
  const label=message.role==='user'?'你':(message.mode==='notice'?'任务状态':'BriefLoop');
1037
1050
  node.innerHTML=`<div class="message-heading"><strong>${label}</strong><span>${messageTime(message.created)}</span><span class="message-state">${esc(chatStates[message.status]||message.status)}${message.mode==='steer'&&message.role==='user'?' · 中途补充':''}</span></div>${reasoningHTML(message)}<div class="message-body">${message.text?esc(message.text):(streaming?typingHTML():'')}</div>${files.length?`<div class="message-files">${files.map(file=>`<button type="button" data-message-source="${esc(file.id)}">▤ ${esc(file.name)}</button>`).join('')}</div>`:''}${messageActionsHTML()}`;
1038
1051
  const reasoning=node.querySelector('.message-reasoning');if(reasoning&&reasoningOpen)reasoning.open=true;
1039
- const reqBlock=/```briefloop-requirements\s*([\s\S]*?)```/.exec(message.text||'');if(reqBlock){const apply=document.createElement('button');apply.type='button';apply.className='outline apply-requirements';apply.textContent='应用到材料与需求';apply.onclick=()=>applyRequirements(reqBlock[1].trim());node.append(apply)}
1052
+ const reqBlock=/```briefloop-requirements\s*([\s\S]*?)```/.exec(message.text||'');if(reqBlock){const apply=document.createElement('button');apply.type='button';apply.className='outline apply-requirements';apply.textContent='应用到材料与需求';apply.onclick=()=>applyRequirements(reqBlock[1].trim());node.append(apply)}previousReport.appendReaderAction(node,message.text);
1040
1053
  workspaceProposal(node,message.text);
1041
1054
  bindMessageActions(node,message);
1042
1055
  node.querySelectorAll('[data-message-source]').forEach(button=>button.onclick=()=>action(async()=>showSource(await api('source?id='+encodeURIComponent(button.dataset.messageSource)))));
@@ -0,0 +1,11 @@
1
+ // A linked retry can confirm a new budget while leaving the old batch intact.
2
+ export function learningRetry({api,getPlan,confirm,describePlan}){
3
+ return async job=>{
4
+ const body={job_id:job.id,use_current_model:true};
5
+ if(job.kind==='learn'){
6
+ const plan=getPlan();if(!plan||!confirm('按当前模型新建学习尝试,保留原任务与反馈。\n\n'+describePlan(plan)))return;
7
+ body.confirm_plan=plan.fingerprint;
8
+ }
9
+ return api('resume',body);
10
+ };
11
+ }
@@ -0,0 +1,32 @@
1
+ // Start from a previous report (#858): import it, then let the BriefLoop agent
2
+ // derive the brief contract in /discuss for the user to confirm.
3
+ import {$ as lookup} from './dom.js';
4
+
5
+ export function previousReportPrompt(title){
6
+ return `/discuss 这是我们已经交付过的一期报告《${title}》(见附件)。请阅读它,反推这份周期报告的简报约定:读者是谁、读完要做什么决定;沿用的章节结构;数字单位、时间范围与来源等口径;有明确依据的禁区(没有写不等于禁止)。往期数字不是本期事实;全部约定先作为待确认建议,看不出来的列为未决项,不要猜。整理好后给出 briefloop-requirements,读者清楚时再给一个 briefloop-reader。`;
7
+ }
8
+
9
+ export function readerBlock(text){
10
+ const match=/```briefloop-reader\s*([\s\S]*?)```/.exec(text||'');if(!match)return null;
11
+ try{const value=JSON.parse(match[1].trim());if(!value||typeof value.name!=='string'||!value.name.trim())return null;
12
+ return {name:value.name.trim(),decisions:typeof value.decisions==='string'?value.decisions:'',preferences:typeof value.preferences==='string'?value.preferences:''}}catch{return null}
13
+ }
14
+
15
+ export function previousReportUI({api,uploadPayload,getUploadLimits,openChat,notice,saveReader,$=lookup}){
16
+ async function importFile(file){
17
+ const result=await api('import-previous',await uploadPayload(file,getUploadLimits(),{}));
18
+ await openChat({text:previousReportPrompt(result.title),source_id:result.source_id});
19
+ notice(result.tracked_changes?'已导入往期报告;其中的 Word 修订已记为改稿,下次学习时分类。确认后把请求发给 BriefLoop。':'已导入往期报告。确认后把请求发给 BriefLoop,它会反推简报约定。');
20
+ return result;
21
+ }
22
+ function bind(){
23
+ const input=$('previous-report-file');
24
+ if(input)input.onchange=async e=>{const file=e.target.files[0];e.target.value='';if(!file)return;try{await importFile(file)}catch(error){notice(error.message,true)}};
25
+ }
26
+ function appendReaderAction(node,text){
27
+ const reader=readerBlock(text);if(!reader||!saveReader)return;
28
+ const button=document.createElement('button');button.type='button';button.className='outline apply-requirements';button.textContent='保存为读者档案';
29
+ button.onclick=()=>saveReader(reader);node.append(button);
30
+ }
31
+ return {bind,importFile,appendReaderAction};
32
+ }
@@ -4,6 +4,9 @@ export function createProviderCapabilities({$}) {
4
4
  function reset(engine) {
5
5
  field().value='';
6
6
  $('custom-reasoning-capability').hidden=engine!=='native';
7
+ $('provider-save-help').textContent=engine==='native'
8
+ ?'保存同名 Provider 会更新 BriefLoop Agent 的本机接口地址;填写 Key 会更新该 Provider 的本机凭据。仅保存配置,不测试推理、不启动任务。'
9
+ :'保存同名 Provider 会更新本机 OpenCode 的接口地址;填写 Key 会更新该 Provider 的本机凭据。仅保存配置,不测试推理、不启动任务。';
7
10
  }
8
11
  function load(config,engine) {
9
12
  reset(engine);
@@ -0,0 +1,52 @@
1
+ // Reader profiles (#858): pick a saved reader for a report, and manage profiles
2
+ // and retain historical reader-specific learning records on the learning page.
3
+ import {$ as lookup,esc} from './dom.js';
4
+
5
+ export function readersUI({api,action,$=lookup}){
6
+ let editing=null,known=[],initialized=false;
7
+ function fillSelect(readers,readerId){
8
+ const select=$('reader-select');if(!select)return;
9
+ const value=initialized?select.value:readerId??select.value;
10
+ select.innerHTML='<option value="">不指定读者档案</option>'+readers.map(r=>`<option value="${esc(r.id)}">${esc(r.name)}</option>`).join('');
11
+ select.value=readers.some(r=>r.id===value)?value:'';initialized=true;
12
+ }
13
+ function onSelect(){
14
+ const select=$('reader-select'),audience=select?.form?.elements?.audience;if(!select||!audience)return;
15
+ const chosen=known.find(r=>r.id===select.value);
16
+ // Fill the audience only when it still holds the default or another reader's name.
17
+ if(chosen&&(!audience.value.trim()||audience.value==='自己'||known.some(r=>r.name===audience.value)))audience.value=chosen.name;
18
+ }
19
+ function profileHTML(reader){
20
+ return `<div class="reader-profile" data-reader="${esc(reader.id)}"><div class="reader-profile-head"><strong>${esc(reader.name)}</strong><span>${reader.skill_id?'历史专属技能 '+esc(reader.skill_id)+'(暂不启用)':'使用工作区技能'}</span></div>${reader.decisions?`<p><small>用报告做什么决定</small>${esc(reader.decisions)}</p>`:''}${reader.preferences?`<p><small>偏好</small>${esc(reader.preferences)}</p>`:''}<div class="reader-profile-actions"><button type="button" class="outline" data-reader-edit>编辑</button>${reader.skill_id?'<button type="button" class="outline" data-reader-unbind>清除历史绑定</button>':''}<button type="button" class="ghost" data-reader-archive>归档</button></div>${reader.wiki?`<details><summary>历史读者经验(暂不启用)</summary><pre class="reader-wiki">${esc(reader.wiki)}</pre></details>`:''}</div>`;
21
+ }
22
+ function renderList(readers){
23
+ const box=$('reader-profiles');if(!box)return;
24
+ box.innerHTML=readers.length?readers.map(profileHTML).join(''):'<p class="help">还没有读者档案。写给固定读者的报告,建一个档案后,报告会记录用途与偏好。读者特定改动先保留,等待适用条件与跨读者验证。</p>';
25
+ box.querySelectorAll('[data-reader]').forEach(node=>{
26
+ const reader=readers.find(r=>r.id===node.dataset.reader);
27
+ node.querySelector('[data-reader-edit]').onclick=()=>openForm(reader);
28
+ node.querySelector('[data-reader-archive]').onclick=()=>action(()=>api('reader-archive',{id:reader.id}),'读者档案已归档,旧报告保留原样');
29
+ const unbind=node.querySelector('[data-reader-unbind]');
30
+ if(unbind)unbind.onclick=()=>action(()=>api('reader-skill',{reader_id:reader.id,skill_id:null}),'已清除历史专属技能绑定');
31
+ });
32
+ }
33
+ function openForm(reader=null){
34
+ const form=$('reader-form');if(!form)return;
35
+ editing=reader?.id||null;form.hidden=false;
36
+ form.elements.name.value=reader?.name||'';form.elements.decisions.value=reader?.decisions||'';form.elements.preferences.value=reader?.preferences||'';
37
+ form.querySelector('[data-reader-form-title]').textContent=reader?'编辑读者档案':'新建读者档案';
38
+ form.elements.name.focus?.();
39
+ }
40
+ function bind(){
41
+ const add=$('reader-add');if(add)add.onclick=()=>openForm();
42
+ const form=$('reader-form');
43
+ if(form){
44
+ form.onsubmit=e=>{e.preventDefault();const body={name:form.elements.name.value,decisions:form.elements.decisions.value,preferences:form.elements.preferences.value,...(editing?{id:editing}:{})};
45
+ action(async()=>{await api('reader-save',body);form.hidden=true;editing=null},'读者档案已保存');};
46
+ const cancel=form.querySelector('[data-reader-cancel]');if(cancel)cancel.onclick=()=>{form.hidden=true;editing=null};
47
+ }
48
+ const select=$('reader-select');if(select)select.addEventListener('change',onSelect);
49
+ }
50
+ function render(readers=[],{readerId}={}){known=readers;fillSelect(readers,readerId);renderList(readers)}
51
+ return {render,bind,openForm};
52
+ }
@@ -71,7 +71,7 @@ export function createReportBrowsing({api,getState,getCurrent,openBrief,page,not
71
71
  const result=await historyPage(current.run_id,append?historyData?.next_cursor||'':'');
72
72
  if(ticket!==historyTicket||getCurrent()?.run_id!==current.run_id||!$('history-dialog').open)return;
73
73
  historyData={...result,items:append?[...historyData.items,...result.items]:result.items};
74
- $('history-list').innerHTML=historyData.items.map(b=>`<button class="history-row" data-history-version="${esc(b.id)}"><strong>${b.id===b.latest_version_id?'当前稿件':b.author==='agent'?'生成稿件':'历史快照'}</strong><span>${dateTimeSeconds(b.created)}</span></button>`).join('')+(result.next_cursor?'<button type="button" data-testid="history-load-more">加载更多历史版本</button>':'');
74
+ $('history-list').innerHTML=historyData.items.map(b=>`<button class="history-row" data-history-version="${esc(b.id)}"><strong>${b.id===b.latest_version_id?'当前稿件':b.author==='agent'?'生成稿件':b.author==='import'?'往期原稿':'历史快照'}</strong><span>${dateTimeSeconds(b.created)}</span></button>`).join('')+(result.next_cursor?'<button type="button" data-testid="history-load-more">加载更多历史版本</button>':'');
75
75
  $('history-list').querySelectorAll('[data-history-version]').forEach(button=>button.onclick=()=>{if(openBrief(historyData.items.find(b=>b.id===button.dataset.historyVersion))){$('history-dialog').close()}});
76
76
  const more=$('history-list').querySelector('[data-testid="history-load-more"]');if(more)more.onclick=()=>{more.disabled=true;read(true).catch(error=>{more.disabled=false;notice(error.message,true)})};
77
77
  }
@@ -0,0 +1,42 @@
1
+ // Revision questions (#858): edits the Evaluator was unsure about, asked once,
2
+ // and the ledger of fact corrections that never become writing skills.
3
+ import {$ as lookup,esc} from './dom.js';
4
+
5
+ export const CATEGORY_CHOICES=[
6
+ ['taste','写法偏好','原稿没错,只是我想这样写'],
7
+ ['fact_correction','事实纠错','原稿的数字、事实或口径不对'],
8
+ ['reader_specific','只针对这位读者','换一位读者未必要这样改'],
9
+ ];
10
+
11
+ function excerpt(text,limit=160){const value=String(text||'').replace(/\s+/g,' ').trim();return value.length>limit?value.slice(0,limit)+'…':value}
12
+
13
+ export function questionHTML(edit){
14
+ const change=edit.op==='delete'?`删掉了:<q>${esc(excerpt(edit.before))}</q>`:edit.op==='insert'?`加入了:<q>${esc(excerpt(edit.after))}</q>`:`把 <q>${esc(excerpt(edit.before))}</q> 改成 <q>${esc(excerpt(edit.after))}</q>`;
15
+ return `<div class="revision-question" data-edit="${esc(edit.id)}"><p class="revision-question-where">${esc(edit.heading||'正文')}</p><p>${change}</p><p class="help">为什么这样改?</p><div class="revision-question-choices">${CATEGORY_CHOICES.map(([value,label,tip])=>`<button type="button" class="outline" data-answer="${value}" title="${esc(tip)}">${esc(label)}</button>`).join('')}<button type="button" class="ghost" data-answer="skip" title="这处改动不进入学习">跳过</button></div></div>`;
16
+ }
17
+
18
+ export function revisionQuestionsUI({api,action,$=lookup}){
19
+ function bind(box){
20
+ box.querySelectorAll('[data-answer]').forEach(button=>button.onclick=()=>{
21
+ const edit=button.closest('[data-edit]').dataset.edit,category=button.dataset.answer;
22
+ action(()=>api('revision-answer',{edit_id:edit,category}),category==='skip'?'已跳过,这处改动不进入学习':category==='fact_correction'?'已记为事实纠错,不作为写作经验':category==='reader_specific'?'读者特定改动已保留;未绑定读者时保持未确认,不进入全局学习':'已记下,会进入下一次学习');
23
+ });
24
+ }
25
+ function render(value){
26
+ const questions=value?.questions||[],unconfirmed=value?.unconfirmed||[],corrections=value?.fact_corrections||[];
27
+ const box=$('revision-questions');
28
+ if(box){
29
+ box.hidden=!questions.length&&!unconfirmed.length;
30
+ box.innerHTML=questions.length?`<h3>${questions.length} 处改动需要你确认原因</h3><p class="help">只问拿不准、改动较大的地方。事实纠错不会写进写作技巧;跳过的改动不进入学习。</p>${questions.map(questionHTML).join('')}`:'';
31
+ if(unconfirmed.length)box.innerHTML+=`<details><summary>${unconfirmed.length} 处未确认改动 · 不进入学习</summary><p class="help">无需逐条处理。你也可以展开后确认改动原因。</p>${unconfirmed.map(questionHTML).join('')}</details>`;
32
+ bind(box);
33
+ }
34
+ const ledger=$('fact-corrections');
35
+ if(ledger){
36
+ ledger.innerHTML=corrections.length?corrections.map(edit=>`<div class="fact-correction"><small>${esc(edit.heading||'正文')} · ${edit.decided_by==='user'?'你确认':'Evaluator 判断'}</small><p><del>${esc(excerpt(edit.before,120))}</del> → ${esc(excerpt(edit.after,120))}</p></div>`).join(''):'<p class="help">还没有事实纠错记录。</p>';
37
+ }
38
+ const hint=$('revision-questions-hint');
39
+ if(hint){hint.hidden=!questions.length;hint.textContent=questions.length?`有 ${questions.length} 处改动等你确认原因,在“经验”页处理。`:''}
40
+ }
41
+ return {render};
42
+ }
@@ -0,0 +1,17 @@
1
+ // Edit triage records preliminary positive flags, without a report-wide absence
2
+ // assessment or calibrated acceptance. Legacy automatic labels are not proof.
3
+ import {esc} from './dom.js';
4
+
5
+ export function verificationBadge(value){
6
+ if(!value)return '';
7
+ const untracked=value.status==='untracked'&&!value.registration_conflict;
8
+ const status=untracked?'untracked':'pending';
9
+ const label=untracked?'无可追踪改动':'待验收';
10
+ const parts=untracked?['没有可追踪的改动']:['初步观察,未验收',`完整核验 ${value.observed||0} 份 · 未知 ${value.unknown??value.reports??0} 份`];
11
+ if(value.flagged_reports)parts.push(`明确标出复发 ${value.repeats||0} 次(${value.flagged_reports} 份报告)`);
12
+ if(value.excluded)parts.push(`范围不一致,排除 ${value.excluded} 份`);
13
+ if(value.registration_conflict)parts.push('同一技能对应不同读者或批次,绑定待澄清');
14
+ if(!untracked)parts.push(value.note||'尚未完成完整复发核验、双模型 family 校准、人工分歧处理与留出验收');
15
+ if(value.legacy_status_corrected||['adopted','not_improving'].includes(value.status))parts.push(value.legacy_note||'旧自动状态不证明验收,原记录与技能保留');
16
+ return `<span class="skill-verification skill-verification-${esc(status)}"><span class="tag">${esc(label)}</span><small>${esc(parts.join(' · '))}</small></span>`;
17
+ }
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "briefloop"
7
- version = "0.26.4"
7
+ version = "0.27.0"
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.27.0"
@@ -66,6 +66,11 @@ def resolve(requirements, template=None, *, reader_contract=None):
66
66
  'requirement_items': requirement_items(requirements),
67
67
  'references': '正文短编号,图表简注,文末精简来源表;详细核查另存',
68
68
  'interpretation_rule': 'objective及requirement_items保留用户原始要求;reader_contract是待对照原文核查的执行解释,不得降级或替换明确要求。'}
69
+ if requirements.get('reader_profile'):
70
+ # Only runs written for a saved reader carry it, so older contracts keep their identity.
71
+ profile = requirements['reader_profile']
72
+ spec['reader_profile'] = {'name': profile.get('name', ''), 'decisions': profile.get('decisions', ''),
73
+ 'preferences': profile.get('preferences', '')}
69
74
  if requirements.get('target_minutes') is not None:
70
75
  spec['target_minutes'] = requirements['target_minutes']
71
76
  # Legacy max_words stays advisory without changing its saved contract hash.
@@ -26,6 +26,8 @@ def _paragraph_text(paragraph):
26
26
  parts.append(element.tail or '')
27
27
  continue
28
28
  kind = _name(element)
29
+ # Tracked deletions are not part of the document as it now reads.
30
+ if kind in ('del', 'moveFrom'): continue
29
31
  if kind in ('br', 'cr'): parts.append('\n')
30
32
  elif kind == 'tab': parts.append('\t')
31
33
  parts.append(element.text or '')
@@ -80,6 +82,7 @@ def document_text(document):
80
82
  if depth > 50: raise ValueError('DOCX 表格嵌套过深')
81
83
  lines.append('[DOCX ' + path + ']')
82
84
  for row_index, row in enumerate(_blocks(element, {'tr'}), 1):
85
+ if _property(row, 'trPr', 'del') is not None:continue
83
86
  before = _columns(row, 'trPr', 'gridBefore', 0)
84
87
  after = _columns(row, 'trPr', 'gridAfter', 0)
85
88
  lines.append(f'[DOCX {path} row {row_index} gridBefore={before} gridAfter={after}]')
@@ -37,6 +37,12 @@ def sync_content_citations(store, run_id, detail, document, figures):
37
37
  if sid not in present:
38
38
  ref={'source_id':sid,'locator':locator,'excerpt':''}
39
39
  citations.append(ref);derived.append(ref);present.add(sid)
40
+ # The final set includes bibliography, data rows, rich nodes and figures.
41
+ # Every saving path calls this helper before committing a draft/revision.
42
+ from .previous_report import source_usage
43
+ for ref in citations:
44
+ if ref['source_id'] in references or source_usage(store,ref['source_id'])=='previous_report':
45
+ raise ValueError('往期报告或风格参考不能作为报告事实引用')
40
46
  detail['citations']=citations
41
47
  detail['content_citations']=derived
42
48
 
@@ -52,7 +52,7 @@ def _usable_output(job, folder, store=None):
52
52
  try:ScoutResult.model_validate(json.loads(filesystem_path(folder/'result.json').read_text(encoding='utf-8-sig')));return True
53
53
  except (OSError,ValueError):return False
54
54
  if role in ('evaluator','scorer','assessor'):
55
- name='comparison.json' if job.get('evaluation_mode')=='pairwise' or role=='assessor' else 'assessment.json'
55
+ name='comparison.json' if job.get('evaluation_mode')=='pairwise' or role=='assessor' else 'triage.json' if job.get('evaluation_mode')=='triage' else 'assessment.json'
56
56
  elif job['kind'] in ('generate','revise'):name='draft.json'
57
57
  elif job['kind']=='assess':name='assessment.json'
58
58
  else:return True # WikiSkill handoffs already request resume_on_complete.
@@ -237,7 +237,7 @@ class InteractiveRuntime:
237
237
  _write(marker, binding)
238
238
  snapshot = harness.snapshot(binding['session_id'])
239
239
  else:
240
- evaluation_title='Evaluator · 比较' if job.get('evaluation_mode')=='pairwise' else 'Evaluator · 评分'
240
+ evaluation_title={'pairwise':'Evaluator · 比较','triage':'Evaluator · 改动分类'}.get(job.get('evaluation_mode'),'Evaluator · 评分')
241
241
  title = {'evaluator': evaluation_title, 'scorer': 'Evaluator · 评分', 'assessor': 'Evaluator · 比较', 'maintainer': '整理反馈经验', 'proposer': '提出技能改进'}.get(job.get('runtime_role'))
242
242
  title = title or task_label(job['kind'], '简报任务')
243
243
  session = harness.create_session(title, runtime, folder)
@@ -303,7 +303,7 @@ class InteractiveRuntime:
303
303
  label = {'company_review':'先检查并维护本轮企业背景,完成后再进入报告写作。', 'generate': '请按已保存的要求研究来源并生成简报。',
304
304
  'assess': '请核对这份简报的要求、内容与来源并给出评分。',
305
305
  'learn': '请继续整理反馈、更新经验并完成当前技能改进步骤。'}.get(job['kind'], '请完成当前简报任务。')
306
- evaluation_label='请使用 Evaluator 成对比较模式,依据任务与来源比较新旧稿件。' if job.get('evaluation_mode')=='pairwise' else '请使用 Evaluator 单稿评分模式,核对简报要求、内容与来源。'
306
+ evaluation_label={'pairwise':'请使用 Evaluator 成对比较模式,依据任务与来源比较新旧稿件。','triage':'请使用 Evaluator 改动分类模式,对照来源判断每处用户改动的性质。'}.get(job.get('evaluation_mode'),'请使用 Evaluator 单稿评分模式,核对简报要求、内容与来源。')
307
307
  label = {'evaluator': evaluation_label, 'scorer': '请使用 Evaluator 单稿评分模式核对简报。', 'assessor': '请使用 Evaluator 成对比较模式核对新旧稿件。', 'maintainer': '请从反馈中整理可复用经验。', 'proposer': '请依据经验提出技能改进。'}.get(job.get('runtime_role'), label)
308
308
  harness.start_internal(filesystem_path(folder / 'prompt.md').read_text(encoding='utf-8'), session_id=sid,
309
309
  runtime=runtime, cwd=folder, job_id=job['id'], display_text=label,