briefloop 0.27.0__tar.gz → 0.28.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 (951) hide show
  1. {briefloop-0.27.0 → briefloop-0.28.0}/PKG-INFO +4 -2
  2. {briefloop-0.27.0 → briefloop-0.28.0}/README.md +3 -1
  3. {briefloop-0.27.0 → briefloop-0.28.0}/pyproject.toml +1 -1
  4. briefloop-0.28.0/src/briefloop/__init__.py +1 -0
  5. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/bridge_harness.py +2 -2
  6. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/chat_store.py +5 -0
  7. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/chat_tools.py +32 -6
  8. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/cli.py +8 -0
  9. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/deliverable_spec.py +3 -1
  10. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/execution_records.py +17 -0
  11. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/external_client.py +17 -4
  12. briefloop-0.28.0/src/briefloop/external_mcp.py +177 -0
  13. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/external_requests.py +3 -2
  14. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/fast_reports.py +30 -4
  15. briefloop-0.28.0/src/briefloop/feedback_view.py +12 -0
  16. briefloop-0.28.0/src/briefloop/finding_anchors.py +56 -0
  17. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/industry_data.py +2 -0
  18. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/interactive_runtime.py +19 -6
  19. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/learning.py +8 -4
  20. briefloop-0.28.0/src/briefloop/model_budget.py +56 -0
  21. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/models.py +56 -5
  22. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/native_orchestrator.py +27 -5
  23. briefloop-0.28.0/src/briefloop/plain_isolation.py +134 -0
  24. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/progress.py +63 -1
  25. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.analyst.zh.md +1 -1
  26. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.orchestrator.zh.md +1 -1
  27. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/report_profiles.py +1 -1
  28. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/research_handoff.py +10 -3
  29. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/research_plan.py +78 -7
  30. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/review.py +42 -6
  31. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/review_capability.py +15 -2
  32. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/runtime.py +73 -14
  33. briefloop-0.28.0/src/briefloop/scout_coverage.py +210 -0
  34. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/scout_tools.py +9 -1
  35. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/server.py +6 -3
  36. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/skill_assets/briefloop-external/SKILL.md +2 -0
  37. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/app.js +92 -92
  38. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/index.html +3 -3
  39. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/style.css +6 -0
  40. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/store.py +75 -7
  41. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/task_progress.py +25 -3
  42. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop.egg-info/PKG-INFO +4 -2
  43. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop.egg-info/SOURCES.txt +7 -433
  44. briefloop-0.27.0/.gitattributes +0 -5
  45. briefloop-0.27.0/CHANGELOG.md +0 -2481
  46. briefloop-0.27.0/CONTRIBUTING.md +0 -33
  47. briefloop-0.27.0/KNOWN_ISSUES.md +0 -24
  48. briefloop-0.27.0/MANIFEST.in +0 -24
  49. briefloop-0.27.0/SECURITY.md +0 -9
  50. briefloop-0.27.0/VERSION +0 -1
  51. briefloop-0.27.0/bootstrap.py +0 -55
  52. briefloop-0.27.0/desktop/electron/package-lock.json +0 -3638
  53. briefloop-0.27.0/desktop/electron/package.json +0 -65
  54. briefloop-0.27.0/docs/OpenCode/347/211/210/346/234/254/345/205/274/345/256/271.md +0 -58
  55. briefloop-0.27.0/docs/WorkBuddy/345/244/226/351/203/250/345/205/245/345/217/243.md +0 -32
  56. briefloop-0.27.0/docs/architecture.md +0 -105
  57. briefloop-0.27.0/docs/compose/spec/home-v2.md +0 -81
  58. briefloop-0.27.0/docs/draft-first.md +0 -73
  59. briefloop-0.27.0/docs/jev-precheck.md +0 -23
  60. briefloop-0.27.0/docs/native-integration.md +0 -31
  61. briefloop-0.27.0/docs/quality-reading-context.md +0 -15
  62. briefloop-0.27.0/docs/release-0.26.0.md +0 -23
  63. briefloop-0.27.0/docs/release-0.26.1.md +0 -19
  64. briefloop-0.27.0/docs/release-0.26.2.md +0 -17
  65. briefloop-0.27.0/docs/release-0.26.3.md +0 -30
  66. briefloop-0.27.0/docs/release-0.26.4.md +0 -9
  67. briefloop-0.27.0/docs/release-0.27.0.md +0 -13
  68. briefloop-0.27.0/docs/report-length.md +0 -20
  69. briefloop-0.27.0/docs/report-time-window.md +0 -23
  70. briefloop-0.27.0/docs/research-handoff.md +0 -39
  71. briefloop-0.27.0/docs/revision-learning.md +0 -16
  72. briefloop-0.27.0/docs/sqlite-benchmark.md +0 -78
  73. briefloop-0.27.0/docs/technical-report-0.21.0/evidence-index.md +0 -475
  74. briefloop-0.27.0/docs/technical-report-0.21.0/technical-report.md +0 -347
  75. briefloop-0.27.0/docs/windows.md +0 -96
  76. briefloop-0.27.0/docs/writer-input.md +0 -56
  77. 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 -20
  78. briefloop-0.27.0/docs//344/274/232/350/256/256/347/272/252/350/246/201.md +0 -23
  79. briefloop-0.27.0/docs//344/275/277/347/224/250/346/214/207/345/215/227.md +0 -112
  80. briefloop-0.27.0/docs//345/206/205/347/275/256/345/274/225/346/223/216.md +0 -50
  81. briefloop-0.27.0/docs//345/215/207/347/272/247/350/257/264/346/230/216.md +0 -66
  82. briefloop-0.27.0/docs//345/233/276/350/241/250/344/270/216Excel.md +0 -41
  83. briefloop-0.27.0/docs//345/244/232Runtime/344/270/216/346/250/241/345/236/213.md +0 -85
  84. briefloop-0.27.0/docs//345/244/232/346/250/241/346/200/201/346/235/245/346/272/220.md +0 -32
  85. briefloop-0.27.0/docs//345/256/232/346/227/266/346/212/245/345/221/212.md +0 -29
  86. 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 -11
  87. 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 -64
  88. 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 -64
  89. 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 -44
  90. 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 -35
  91. briefloop-0.27.0/docs//350/241/214/344/270/232/346/212/245/345/221/212.md +0 -60
  92. briefloop-0.27.0/docs//350/257/201/345/210/270/347/240/224/347/251/266.md +0 -15
  93. 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 -30
  94. 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 -15
  95. briefloop-0.27.0/docs//351/252/214/346/224/266/350/256/260/345/275/225.md +0 -395
  96. briefloop-0.27.0/examples/internal-weekly-report/README.md +0 -22
  97. briefloop-0.27.0/examples/internal-weekly-report/report.md +0 -19
  98. briefloop-0.27.0/examples/internal-weekly-report/source.txt +0 -7
  99. briefloop-0.27.0/examples/meeting-minutes/transcript.txt +0 -13
  100. briefloop-0.27.0/examples/stock-research/earnings-event.txt +0 -17
  101. briefloop-0.27.0/frontend/api.js +0 -22
  102. briefloop-0.27.0/frontend/app-updates.js +0 -90
  103. briefloop-0.27.0/frontend/app.js +0 -2420
  104. briefloop-0.27.0/frontend/assessment-checks.js +0 -11
  105. briefloop-0.27.0/frontend/assessment-panel.js +0 -211
  106. briefloop-0.27.0/frontend/citation-evidence.js +0 -13
  107. briefloop-0.27.0/frontend/clipboard.js +0 -10
  108. briefloop-0.27.0/frontend/composer-options.js +0 -43
  109. briefloop-0.27.0/frontend/connectors.js +0 -93
  110. briefloop-0.27.0/frontend/delivery.js +0 -82
  111. briefloop-0.27.0/frontend/dom.js +0 -7
  112. briefloop-0.27.0/frontend/excel-export.js +0 -30
  113. briefloop-0.27.0/frontend/fact-check-availability.js +0 -14
  114. briefloop-0.27.0/frontend/fact-check-grants.js +0 -33
  115. briefloop-0.27.0/frontend/jev-checks.js +0 -55
  116. briefloop-0.27.0/frontend/job-presentation.js +0 -32
  117. briefloop-0.27.0/frontend/learning-retry.js +0 -11
  118. briefloop-0.27.0/frontend/length-controls.js +0 -67
  119. briefloop-0.27.0/frontend/mcp-selection.js +0 -31
  120. briefloop-0.27.0/frontend/model-catalog.js +0 -198
  121. briefloop-0.27.0/frontend/native-requests.js +0 -121
  122. briefloop-0.27.0/frontend/notifications.js +0 -58
  123. briefloop-0.27.0/frontend/office-tools.js +0 -118
  124. briefloop-0.27.0/frontend/polling.js +0 -17
  125. briefloop-0.27.0/frontend/previous-report.js +0 -32
  126. briefloop-0.27.0/frontend/provider-capabilities.js +0 -22
  127. briefloop-0.27.0/frontend/quick-report.js +0 -79
  128. briefloop-0.27.0/frontend/readers.js +0 -52
  129. briefloop-0.27.0/frontend/reasoning-controls.js +0 -68
  130. briefloop-0.27.0/frontend/report-browsing.js +0 -113
  131. briefloop-0.27.0/frontend/report-export.js +0 -106
  132. briefloop-0.27.0/frontend/report-language.js +0 -58
  133. briefloop-0.27.0/frontend/report-panels.js +0 -14
  134. briefloop-0.27.0/frontend/report-sources.js +0 -43
  135. briefloop-0.27.0/frontend/review-controls.js +0 -144
  136. briefloop-0.27.0/frontend/review-coverage.js +0 -12
  137. briefloop-0.27.0/frontend/review-results.js +0 -20
  138. briefloop-0.27.0/frontend/review-status.js +0 -99
  139. briefloop-0.27.0/frontend/revision-questions.js +0 -42
  140. briefloop-0.27.0/frontend/rich-document.js +0 -110
  141. briefloop-0.27.0/frontend/runtime-cards.js +0 -55
  142. briefloop-0.27.0/frontend/runtime-permission-modes.js +0 -32
  143. briefloop-0.27.0/frontend/runtime-permission-panel.js +0 -91
  144. briefloop-0.27.0/frontend/schedules.js +0 -33
  145. briefloop-0.27.0/frontend/skill-verification.js +0 -17
  146. briefloop-0.27.0/frontend/source-library-search.js +0 -30
  147. briefloop-0.27.0/frontend/source-upload.js +0 -65
  148. briefloop-0.27.0/frontend/task-progress.js +0 -26
  149. briefloop-0.27.0/frontend/template-output.js +0 -171
  150. briefloop-0.27.0/frontend/templates.js +0 -91
  151. briefloop-0.27.0/frontend/time.js +0 -25
  152. briefloop-0.27.0/frontend/uploads.js +0 -46
  153. briefloop-0.27.0/frontend/version-diff.js +0 -43
  154. briefloop-0.27.0/frontend/welcome.js +0 -22
  155. briefloop-0.27.0/package-lock.json +0 -1092
  156. briefloop-0.27.0/package.json +0 -21
  157. briefloop-0.27.0/probes/mcp_m0/README.md +0 -92
  158. briefloop-0.27.0/probes/mcp_m0/probe.py +0 -273
  159. briefloop-0.27.0/probes/mcp_m0/requirements.txt +0 -2
  160. briefloop-0.27.0/probes/mcp_m0/server.py +0 -149
  161. briefloop-0.27.0/runtime-bridge/README.md +0 -67
  162. briefloop-0.27.0/runtime-bridge/bridge.test.mjs +0 -517
  163. briefloop-0.27.0/runtime-bridge/build.mjs +0 -6
  164. briefloop-0.27.0/runtime-bridge/catalog.json +0 -205
  165. briefloop-0.27.0/runtime-bridge/claude.ts +0 -62
  166. briefloop-0.27.0/runtime-bridge/main.ts +0 -344
  167. briefloop-0.27.0/runtime-bridge/permission-catalog.ts +0 -72
  168. briefloop-0.27.0/runtime-bridge/pi.ts +0 -89
  169. briefloop-0.27.0/runtime-bridge/reasoning.ts +0 -43
  170. briefloop-0.27.0/runtime-bridge/user-input.ts +0 -53
  171. briefloop-0.27.0/runtime-bridge/windows-command.ts +0 -22
  172. briefloop-0.27.0/runtime-bridge/zcode.ts +0 -123
  173. briefloop-0.27.0/scripts/build_frontend.mjs +0 -41
  174. briefloop-0.27.0/scripts/build_frontend_licenses.mjs +0 -71
  175. briefloop-0.27.0/scripts/check_versions.py +0 -169
  176. briefloop-0.27.0/scripts/sync_versions.py +0 -39
  177. briefloop-0.27.0/scripts/test_frontend.mjs +0 -14
  178. briefloop-0.27.0/src/briefloop/__init__.py +0 -1
  179. briefloop-0.27.0/start.ps1 +0 -6
  180. briefloop-0.27.0/start.sh +0 -4
  181. briefloop-0.27.0/tests/check_distribution.py +0 -62
  182. briefloop-0.27.0/tests/frontend_app_updates.mjs +0 -70
  183. briefloop-0.27.0/tests/frontend_assessment_checks.mjs +0 -12
  184. briefloop-0.27.0/tests/frontend_chat_attachments.mjs +0 -52
  185. briefloop-0.27.0/tests/frontend_chat_commands.mjs +0 -30
  186. briefloop-0.27.0/tests/frontend_chat_drafts.mjs +0 -79
  187. briefloop-0.27.0/tests/frontend_chat_layout.mjs +0 -116
  188. briefloop-0.27.0/tests/frontend_chat_polling.mjs +0 -81
  189. briefloop-0.27.0/tests/frontend_checkout_eol.mjs +0 -34
  190. briefloop-0.27.0/tests/frontend_citation_clipboard.mjs +0 -71
  191. briefloop-0.27.0/tests/frontend_citation_edit.mjs +0 -40
  192. briefloop-0.27.0/tests/frontend_citation_evidence.mjs +0 -14
  193. briefloop-0.27.0/tests/frontend_clipboard_fallback.mjs +0 -10
  194. briefloop-0.27.0/tests/frontend_excel_export.mjs +0 -111
  195. briefloop-0.27.0/tests/frontend_export_menu.mjs +0 -12
  196. briefloop-0.27.0/tests/frontend_fact_check_availability.mjs +0 -25
  197. briefloop-0.27.0/tests/frontend_fact_check_grants.mjs +0 -140
  198. briefloop-0.27.0/tests/frontend_fast_mode.mjs +0 -34
  199. briefloop-0.27.0/tests/frontend_home_v2.mjs +0 -95
  200. briefloop-0.27.0/tests/frontend_job_presentation.mjs +0 -22
  201. briefloop-0.27.0/tests/frontend_learning_authorization.mjs +0 -63
  202. briefloop-0.27.0/tests/frontend_learning_retry.mjs +0 -12
  203. briefloop-0.27.0/tests/frontend_length_controls.mjs +0 -62
  204. briefloop-0.27.0/tests/frontend_licenses.mjs +0 -41
  205. briefloop-0.27.0/tests/frontend_live_status.mjs +0 -24
  206. briefloop-0.27.0/tests/frontend_markdown_import.mjs +0 -23
  207. briefloop-0.27.0/tests/frontend_mcp_selection.mjs +0 -11
  208. briefloop-0.27.0/tests/frontend_model_catalog_refresh.mjs +0 -154
  209. briefloop-0.27.0/tests/frontend_model_label.mjs +0 -53
  210. briefloop-0.27.0/tests/frontend_model_selection.mjs +0 -65
  211. briefloop-0.27.0/tests/frontend_native_requests.mjs +0 -49
  212. briefloop-0.27.0/tests/frontend_native_runtime.mjs +0 -42
  213. briefloop-0.27.0/tests/frontend_office_tools.mjs +0 -289
  214. briefloop-0.27.0/tests/frontend_open_brief_status.mjs +0 -139
  215. briefloop-0.27.0/tests/frontend_pending_report.mjs +0 -19
  216. briefloop-0.27.0/tests/frontend_polling.mjs +0 -68
  217. briefloop-0.27.0/tests/frontend_previous_report.mjs +0 -23
  218. briefloop-0.27.0/tests/frontend_progress_race.mjs +0 -106
  219. briefloop-0.27.0/tests/frontend_provider_capabilities.mjs +0 -75
  220. briefloop-0.27.0/tests/frontend_quick_report.mjs +0 -71
  221. briefloop-0.27.0/tests/frontend_readers.mjs +0 -42
  222. briefloop-0.27.0/tests/frontend_reasoning_controls.mjs +0 -58
  223. briefloop-0.27.0/tests/frontend_release_controls.mjs +0 -78
  224. briefloop-0.27.0/tests/frontend_release_navigation.mjs +0 -94
  225. briefloop-0.27.0/tests/frontend_report_browsing.mjs +0 -69
  226. briefloop-0.27.0/tests/frontend_report_chat_drawer.mjs +0 -43
  227. briefloop-0.27.0/tests/frontend_report_export.mjs +0 -131
  228. briefloop-0.27.0/tests/frontend_report_language.mjs +0 -41
  229. briefloop-0.27.0/tests/frontend_report_load.mjs +0 -26
  230. briefloop-0.27.0/tests/frontend_report_outline.mjs +0 -68
  231. briefloop-0.27.0/tests/frontend_report_panels.mjs +0 -79
  232. briefloop-0.27.0/tests/frontend_review_capability.mjs +0 -101
  233. briefloop-0.27.0/tests/frontend_review_coverage.mjs +0 -27
  234. briefloop-0.27.0/tests/frontend_review_status.mjs +0 -112
  235. briefloop-0.27.0/tests/frontend_revision_questions.mjs +0 -40
  236. briefloop-0.27.0/tests/frontend_runtime_discovery.mjs +0 -58
  237. briefloop-0.27.0/tests/frontend_runtime_feedback.mjs +0 -16
  238. briefloop-0.27.0/tests/frontend_runtime_permission_panel.mjs +0 -112
  239. briefloop-0.27.0/tests/frontend_save_barrier.mjs +0 -212
  240. briefloop-0.27.0/tests/frontend_settings_workspaces.mjs +0 -24
  241. briefloop-0.27.0/tests/frontend_setup_state.mjs +0 -109
  242. briefloop-0.27.0/tests/frontend_skill_verification.mjs +0 -17
  243. briefloop-0.27.0/tests/frontend_source_library.mjs +0 -65
  244. briefloop-0.27.0/tests/frontend_source_search.mjs +0 -24
  245. briefloop-0.27.0/tests/frontend_source_upload.mjs +0 -51
  246. briefloop-0.27.0/tests/frontend_startup_recovery.mjs +0 -99
  247. briefloop-0.27.0/tests/frontend_task_progress.mjs +0 -64
  248. briefloop-0.27.0/tests/frontend_template_groups.mjs +0 -74
  249. briefloop-0.27.0/tests/frontend_template_output.mjs +0 -149
  250. briefloop-0.27.0/tests/frontend_update_notifications.mjs +0 -48
  251. briefloop-0.27.0/tests/frontend_upload_limits.mjs +0 -23
  252. briefloop-0.27.0/tests/frontend_version_bodies.mjs +0 -78
  253. briefloop-0.27.0/tests/frontend_version_diff.mjs +0 -19
  254. briefloop-0.27.0/tests/frontend_welcome_gate.mjs +0 -114
  255. briefloop-0.27.0/tests/frontend_workspace_proposal.mjs +0 -34
  256. briefloop-0.27.0/tests/frontend_writing_preferences.mjs +0 -45
  257. briefloop-0.27.0/tests/test_agent_backend.py +0 -36
  258. briefloop-0.27.0/tests/test_agent_commands.py +0 -197
  259. briefloop-0.27.0/tests/test_analyst_draft_versions.py +0 -183
  260. briefloop-0.27.0/tests/test_assessment_admission_recovery.py +0 -17
  261. briefloop-0.27.0/tests/test_assessment_followup.py +0 -103
  262. briefloop-0.27.0/tests/test_background_no_question.py +0 -33
  263. briefloop-0.27.0/tests/test_bridge_harness.py +0 -389
  264. briefloop-0.27.0/tests/test_builtin_templates.py +0 -110
  265. briefloop-0.27.0/tests/test_chat_dispatch.py +0 -82
  266. briefloop-0.27.0/tests/test_chat_execution.py +0 -137
  267. briefloop-0.27.0/tests/test_chat_model_selection.py +0 -84
  268. briefloop-0.27.0/tests/test_cli_doctor.py +0 -16
  269. briefloop-0.27.0/tests/test_codex_idle.py +0 -63
  270. briefloop-0.27.0/tests/test_connection_test_history.py +0 -58
  271. briefloop-0.27.0/tests/test_connector_authorization.py +0 -137
  272. briefloop-0.27.0/tests/test_connector_empty_catalog.py +0 -86
  273. briefloop-0.27.0/tests/test_connector_materials.py +0 -217
  274. briefloop-0.27.0/tests/test_connector_tasks.py +0 -23
  275. briefloop-0.27.0/tests/test_connectors.py +0 -191
  276. briefloop-0.27.0/tests/test_core.py +0 -86
  277. briefloop-0.27.0/tests/test_cross_module_regressions.py +0 -43
  278. briefloop-0.27.0/tests/test_delivery_checks.py +0 -388
  279. briefloop-0.27.0/tests/test_delivery_consumers.py +0 -64
  280. briefloop-0.27.0/tests/test_demo.py +0 -77
  281. briefloop-0.27.0/tests/test_desktop_lifecycle.py +0 -162
  282. briefloop-0.27.0/tests/test_document_workflows.py +0 -104
  283. briefloop-0.27.0/tests/test_draft_completion.py +0 -92
  284. briefloop-0.27.0/tests/test_draft_contract.py +0 -72
  285. briefloop-0.27.0/tests/test_english_reports.py +0 -121
  286. briefloop-0.27.0/tests/test_entrypoint.py +0 -22
  287. briefloop-0.27.0/tests/test_evidence.py +0 -175
  288. briefloop-0.27.0/tests/test_evidence_parse_failures.py +0 -91
  289. briefloop-0.27.0/tests/test_execution_records.py +0 -49
  290. briefloop-0.27.0/tests/test_execution_timing.py +0 -4
  291. briefloop-0.27.0/tests/test_export_admission.py +0 -253
  292. briefloop-0.27.0/tests/test_export_layout_swap.py +0 -59
  293. briefloop-0.27.0/tests/test_export_xlsx.py +0 -628
  294. briefloop-0.27.0/tests/test_external_requests.py +0 -85
  295. briefloop-0.27.0/tests/test_fact_check_contract.py +0 -261
  296. briefloop-0.27.0/tests/test_fact_check_orchestration.py +0 -309
  297. briefloop-0.27.0/tests/test_fact_check_phase.py +0 -124
  298. briefloop-0.27.0/tests/test_fact_check_review.py +0 -51
  299. briefloop-0.27.0/tests/test_fact_check_switch.py +0 -34
  300. briefloop-0.27.0/tests/test_fact_status_tool.py +0 -50
  301. briefloop-0.27.0/tests/test_fast_evidence.py +0 -68
  302. briefloop-0.27.0/tests/test_fast_mode.py +0 -59
  303. briefloop-0.27.0/tests/test_fast_qualifier_checks.py +0 -50
  304. briefloop-0.27.0/tests/test_fast_reports.py +0 -74
  305. briefloop-0.27.0/tests/test_fast_research.py +0 -44
  306. briefloop-0.27.0/tests/test_figure_exports.py +0 -85
  307. briefloop-0.27.0/tests/test_figure_flow.py +0 -46
  308. briefloop-0.27.0/tests/test_figure_text.py +0 -89
  309. briefloop-0.27.0/tests/test_figures.py +0 -109
  310. briefloop-0.27.0/tests/test_generation_schema_guidance.py +0 -60
  311. briefloop-0.27.0/tests/test_harness.py +0 -415
  312. briefloop-0.27.0/tests/test_host_bins.py +0 -95
  313. briefloop-0.27.0/tests/test_human_learning.py +0 -101
  314. briefloop-0.27.0/tests/test_industry_export.py +0 -69
  315. briefloop-0.27.0/tests/test_industry_flow.py +0 -72
  316. briefloop-0.27.0/tests/test_industry_research.py +0 -69
  317. briefloop-0.27.0/tests/test_interactive_runtime.py +0 -126
  318. briefloop-0.27.0/tests/test_jev_checks.py +0 -157
  319. briefloop-0.27.0/tests/test_learning_authorization.py +0 -170
  320. briefloop-0.27.0/tests/test_learning_integrity.py +0 -50
  321. briefloop-0.27.0/tests/test_length.py +0 -44
  322. briefloop-0.27.0/tests/test_length_policy.py +0 -94
  323. briefloop-0.27.0/tests/test_markdown_download.py +0 -30
  324. briefloop-0.27.0/tests/test_media_sources.py +0 -188
  325. briefloop-0.27.0/tests/test_model_catalog_defaults.py +0 -50
  326. briefloop-0.27.0/tests/test_multimodal_harness.py +0 -96
  327. briefloop-0.27.0/tests/test_multimodal_http.py +0 -32
  328. briefloop-0.27.0/tests/test_native_analyst.py +0 -221
  329. briefloop-0.27.0/tests/test_native_evaluator.py +0 -232
  330. briefloop-0.27.0/tests/test_native_harness.py +0 -383
  331. briefloop-0.27.0/tests/test_native_learning.py +0 -90
  332. briefloop-0.27.0/tests/test_native_orchestrator.py +0 -401
  333. briefloop-0.27.0/tests/test_native_provider_storage.py +0 -49
  334. briefloop-0.27.0/tests/test_native_providers.py +0 -71
  335. briefloop-0.27.0/tests/test_native_research_closeout.py +0 -38
  336. briefloop-0.27.0/tests/test_native_review_contract.py +0 -114
  337. briefloop-0.27.0/tests/test_native_scout.py +0 -343
  338. briefloop-0.27.0/tests/test_notifications.py +0 -45
  339. briefloop-0.27.0/tests/test_npm_native_shim.py +0 -34
  340. briefloop-0.27.0/tests/test_numeric_occurrence_review.py +0 -157
  341. briefloop-0.27.0/tests/test_office_cli.py +0 -699
  342. briefloop-0.27.0/tests/test_office_source_structure.py +0 -101
  343. briefloop-0.27.0/tests/test_office_surfaces.py +0 -170
  344. briefloop-0.27.0/tests/test_ooxml_order.py +0 -54
  345. briefloop-0.27.0/tests/test_opencode_harness.py +0 -895
  346. briefloop-0.27.0/tests/test_opencode_idle.py +0 -224
  347. briefloop-0.27.0/tests/test_opencode_prompt_versions.py +0 -55
  348. briefloop-0.27.0/tests/test_opencode_provider.py +0 -94
  349. briefloop-0.27.0/tests/test_opencode_questions.py +0 -187
  350. briefloop-0.27.0/tests/test_opencode_reasoning.py +0 -40
  351. briefloop-0.27.0/tests/test_opencode_review_version.py +0 -79
  352. briefloop-0.27.0/tests/test_opencode_search_prompt.py +0 -80
  353. briefloop-0.27.0/tests/test_opencode_server_stdin.py +0 -135
  354. briefloop-0.27.0/tests/test_opencode_v2.py +0 -303
  355. briefloop-0.27.0/tests/test_opencode_version_probe.py +0 -40
  356. briefloop-0.27.0/tests/test_posix_process_tree.py +0 -165
  357. briefloop-0.27.0/tests/test_pr593_roundtrip.py +0 -44
  358. briefloop-0.27.0/tests/test_previous_report.py +0 -140
  359. briefloop-0.27.0/tests/test_product_summary_consistency.py +0 -45
  360. briefloop-0.27.0/tests/test_progress.py +0 -50
  361. briefloop-0.27.0/tests/test_progress_pipeline.py +0 -18
  362. briefloop-0.27.0/tests/test_provider_catalog.py +0 -185
  363. briefloop-0.27.0/tests/test_public_research.py +0 -152
  364. briefloop-0.27.0/tests/test_quality_reading_context.py +0 -147
  365. briefloop-0.27.0/tests/test_reader_contract.py +0 -182
  366. briefloop-0.27.0/tests/test_reader_profiles.py +0 -133
  367. briefloop-0.27.0/tests/test_reader_source_export.py +0 -149
  368. briefloop-0.27.0/tests/test_reader_workflow.py +0 -109
  369. briefloop-0.27.0/tests/test_reconciliation.py +0 -183
  370. briefloop-0.27.0/tests/test_release.py +0 -366
  371. briefloop-0.27.0/tests/test_release_identity.py +0 -71
  372. briefloop-0.27.0/tests/test_report_browsing.py +0 -141
  373. briefloop-0.27.0/tests/test_report_concurrency.py +0 -20
  374. briefloop-0.27.0/tests/test_report_deletion.py +0 -84
  375. briefloop-0.27.0/tests/test_report_length_feedback.py +0 -103
  376. briefloop-0.27.0/tests/test_report_path_regressions.py +0 -57
  377. briefloop-0.27.0/tests/test_report_time.py +0 -124
  378. briefloop-0.27.0/tests/test_research_budget.py +0 -184
  379. briefloop-0.27.0/tests/test_research_gap_updates.py +0 -212
  380. briefloop-0.27.0/tests/test_research_handoff.py +0 -111
  381. briefloop-0.27.0/tests/test_research_plan.py +0 -300
  382. briefloop-0.27.0/tests/test_research_response_admission.py +0 -173
  383. briefloop-0.27.0/tests/test_resume_in_place.py +0 -20
  384. briefloop-0.27.0/tests/test_review.py +0 -75
  385. briefloop-0.27.0/tests/test_review_capability.py +0 -172
  386. briefloop-0.27.0/tests/test_review_finding_consistency.py +0 -251
  387. briefloop-0.27.0/tests/test_review_learning.py +0 -47
  388. briefloop-0.27.0/tests/test_review_modes.py +0 -48
  389. briefloop-0.27.0/tests/test_review_packet_paths.py +0 -63
  390. briefloop-0.27.0/tests/test_review_packet_utf8.py +0 -236
  391. briefloop-0.27.0/tests/test_review_schema_drift.py +0 -41
  392. briefloop-0.27.0/tests/test_review_snapshot.py +0 -52
  393. briefloop-0.27.0/tests/test_review_visual_input.py +0 -118
  394. briefloop-0.27.0/tests/test_revision_citations.py +0 -164
  395. briefloop-0.27.0/tests/test_revision_edits.py +0 -213
  396. briefloop-0.27.0/tests/test_revision_policy.py +0 -71
  397. briefloop-0.27.0/tests/test_rich_document.py +0 -245
  398. briefloop-0.27.0/tests/test_role_models.py +0 -26
  399. briefloop-0.27.0/tests/test_runtime_bridge.py +0 -79
  400. briefloop-0.27.0/tests/test_runtime_bridge_idle.py +0 -75
  401. briefloop-0.27.0/tests/test_runtime_concurrency.py +0 -6
  402. briefloop-0.27.0/tests/test_runtime_json_bom.py +0 -46
  403. briefloop-0.27.0/tests/test_runtime_liveness.py +0 -168
  404. briefloop-0.27.0/tests/test_runtime_names.py +0 -40
  405. briefloop-0.27.0/tests/test_runtime_permissions.py +0 -183
  406. briefloop-0.27.0/tests/test_runtime_retry.py +0 -57
  407. briefloop-0.27.0/tests/test_runtime_settlement.py +0 -51
  408. briefloop-0.27.0/tests/test_schedules.py +0 -53
  409. briefloop-0.27.0/tests/test_scout_experiment.py +0 -54
  410. briefloop-0.27.0/tests/test_search_credentials.py +0 -79
  411. briefloop-0.27.0/tests/test_search_policy.py +0 -56
  412. briefloop-0.27.0/tests/test_semantic_experiment.py +0 -348
  413. briefloop-0.27.0/tests/test_semantic_governance.py +0 -199
  414. briefloop-0.27.0/tests/test_server_boundary.py +0 -183
  415. briefloop-0.27.0/tests/test_settings_transactions.py +0 -188
  416. briefloop-0.27.0/tests/test_skill_verification.py +0 -161
  417. briefloop-0.27.0/tests/test_software_version.py +0 -37
  418. briefloop-0.27.0/tests/test_source_ingestion.py +0 -218
  419. briefloop-0.27.0/tests/test_source_library_search.py +0 -100
  420. briefloop-0.27.0/tests/test_source_recovery_regressions.py +0 -31
  421. briefloop-0.27.0/tests/test_source_updates.py +0 -225
  422. briefloop-0.27.0/tests/test_sources_provenance.py +0 -327
  423. briefloop-0.27.0/tests/test_store_sqlite_benchmark.py +0 -110
  424. briefloop-0.27.0/tests/test_table_citation_advisory.py +0 -102
  425. briefloop-0.27.0/tests/test_task_labels.py +0 -50
  426. briefloop-0.27.0/tests/test_task_notify.py +0 -75
  427. briefloop-0.27.0/tests/test_task_progress.py +0 -3
  428. briefloop-0.27.0/tests/test_tavily.py +0 -108
  429. briefloop-0.27.0/tests/test_template_conversion.py +0 -339
  430. briefloop-0.27.0/tests/test_template_conversion_http.py +0 -86
  431. briefloop-0.27.0/tests/test_template_saved_state.py +0 -54
  432. briefloop-0.27.0/tests/test_templates.py +0 -46
  433. briefloop-0.27.0/tests/test_user_input.py +0 -139
  434. briefloop-0.27.0/tests/test_user_source_refresh.py +0 -167
  435. briefloop-0.27.0/tests/test_version_consistency.py +0 -73
  436. briefloop-0.27.0/tests/test_websearch.py +0 -29
  437. briefloop-0.27.0/tests/test_websearch_singleflight.py +0 -56
  438. briefloop-0.27.0/tests/test_wikiskill_engine_windows.py +0 -48
  439. briefloop-0.27.0/tests/test_windows_antigravity_permissions.py +0 -19
  440. briefloop-0.27.0/tests/test_windows_connector_acl.py +0 -119
  441. briefloop-0.27.0/tests/test_windows_distribution.py +0 -27
  442. briefloop-0.27.0/tests/test_windows_mcp_supervisor.py +0 -54
  443. briefloop-0.27.0/tests/test_windows_platform.py +0 -366
  444. briefloop-0.27.0/tests/test_windows_release_paths.py +0 -99
  445. briefloop-0.27.0/tests/test_windows_review_paths.py +0 -114
  446. briefloop-0.27.0/tests/test_windows_runtime_bundle.py +0 -43
  447. briefloop-0.27.0/tests/test_windows_xlsx_paths.py +0 -98
  448. briefloop-0.27.0/tests/test_word_import.py +0 -53
  449. briefloop-0.27.0/tests/test_word_source_locators.py +0 -93
  450. briefloop-0.27.0/tests/test_word_toc.py +0 -78
  451. briefloop-0.27.0/tests/test_worker_idle.py +0 -43
  452. briefloop-0.27.0/tests/test_workspace_action_errors.py +0 -35
  453. briefloop-0.27.0/tests/test_workspace_profile.py +0 -40
  454. briefloop-0.27.0/tests/test_workspaces.py +0 -166
  455. briefloop-0.27.0/tests/test_writer_assembly.py +0 -100
  456. briefloop-0.27.0/tests/test_writer_cli_guidance.py +0 -86
  457. briefloop-0.27.0/tests/test_writer_context.py +0 -132
  458. briefloop-0.27.0/tests/test_writer_input.py +0 -443
  459. briefloop-0.27.0/tests/test_xlsx_officecli_integration.py +0 -125
  460. briefloop-0.27.0/tests/test_xlsx_preview.py +0 -128
  461. briefloop-0.27.0/third_party/open-design/LICENSE +0 -201
  462. briefloop-0.27.0/third_party/open-design/NOTICE.md +0 -39
  463. briefloop-0.27.0/third_party/open-design/acp/constants.ts +0 -60
  464. briefloop-0.27.0/third_party/open-design/acp/json.ts +0 -147
  465. briefloop-0.27.0/third_party/open-design/acp/models.ts +0 -324
  466. briefloop-0.27.0/third_party/open-design/acp/rpc.ts +0 -327
  467. briefloop-0.27.0/third_party/open-design/acp/session-params.ts +0 -107
  468. briefloop-0.27.0/third_party/open-design/acp/types.ts +0 -18
  469. briefloop-0.27.0/third_party/open-design/byok-reference/byok-opencode.ts +0 -281
  470. briefloop-0.27.0/third_party/open-design/byok-reference/provider-models.ts +0 -427
  471. briefloop-0.27.0/third_party/open-design/core/index.ts +0 -1
  472. briefloop-0.27.0/third_party/open-design/core/json-line-stream.ts +0 -319
  473. briefloop-0.27.0/third_party/open-design/runtime-models/codex-models.ts +0 -110
  474. briefloop-0.27.0/third_party/open-design/runtime-models/mmd-routes.ts +0 -166
  475. briefloop-0.27.0/third_party/open-design/runtime-models/models.ts +0 -233
  476. briefloop-0.27.0/third_party/open-design/runtime-models/opencode-models.ts +0 -101
  477. {briefloop-0.27.0 → briefloop-0.28.0}/LICENSE +0 -0
  478. {briefloop-0.27.0 → briefloop-0.28.0}/THIRD_PARTY_NOTICES.md +0 -0
  479. {briefloop-0.27.0 → briefloop-0.28.0}/setup.cfg +0 -0
  480. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/__main__.py +0 -0
  481. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/_entrypoint.py +0 -0
  482. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/agent_commands.py +0 -0
  483. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/agent_prompts.py +0 -0
  484. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/analyst.py +0 -0
  485. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/analyst_drafts.py +0 -0
  486. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/app_server.py +0 -0
  487. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/audit_bundle.py +0 -0
  488. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/backends/__init__.py +0 -0
  489. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/backends/opencode_server.py +0 -0
  490. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/backends/opencode_v2.py +0 -0
  491. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/bocha.py +0 -0
  492. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/chat_dispatch.py +0 -0
  493. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/chat_execution.py +0 -0
  494. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/codex_diagnostics.py +0 -0
  495. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/company_context.py +0 -0
  496. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/comparison_contract.py +0 -0
  497. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/conflicts.py +0 -0
  498. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/MATERIALS.md +0 -0
  499. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/README.md +0 -0
  500. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/__init__.py +0 -0
  501. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/config.py +0 -0
  502. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/grants.py +0 -0
  503. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/materials.py +0 -0
  504. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/receipts.py +0 -0
  505. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/runtime.py +0 -0
  506. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/runtime_tools.py +0 -0
  507. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/service.py +0 -0
  508. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/stdio_supervisor.py +0 -0
  509. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/task_client.py +0 -0
  510. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/tasks.py +0 -0
  511. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/transport.py +0 -0
  512. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/windows_acl.py +0 -0
  513. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/default_fonts.py +0 -0
  514. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/delivery_checks.py +0 -0
  515. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/demo.py +0 -0
  516. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/document_export.py +0 -0
  517. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/document_model.py +0 -0
  518. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/document_workflows.py +0 -0
  519. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/docx_text.py +0 -0
  520. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/draft_checks.py +0 -0
  521. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/draft_completion.py +0 -0
  522. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/duckduckgo.py +0 -0
  523. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/evaluation_reading.py +0 -0
  524. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/evidence.py +0 -0
  525. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/evidence_context.py +0 -0
  526. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/execution_timing.py +0 -0
  527. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/export_jobs.py +0 -0
  528. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/exports.py +0 -0
  529. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/fact_check.py +0 -0
  530. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/fast_mode.py +0 -0
  531. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/fast_research.py +0 -0
  532. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/figure_support.py +0 -0
  533. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/figure_text.py +0 -0
  534. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/figures.py +0 -0
  535. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/harness.py +0 -0
  536. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/host_bins.py +0 -0
  537. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/industry_export.py +0 -0
  538. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/jev.py +0 -0
  539. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/jev_checks.py +0 -0
  540. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/learning_budget.py +0 -0
  541. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/length.py +0 -0
  542. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/media.py +0 -0
  543. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/native_engine.py +0 -0
  544. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/native_harness.py +0 -0
  545. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/native_providers.py +0 -0
  546. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/native_roles.py +0 -0
  547. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/notifications.py +0 -0
  548. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/office_cli.py +0 -0
  549. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/ooxml_order.py +0 -0
  550. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/opencode_harness.py +0 -0
  551. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/opencode_version.py +0 -0
  552. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/packet_views.py +0 -0
  553. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/parent_watch.py +0 -0
  554. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/platform_support.py +0 -0
  555. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/previous_report.py +0 -0
  556. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/process_host.py +0 -0
  557. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/projections.py +0 -0
  558. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/core.zh.md +0 -0
  559. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/mode.background.zh.md +0 -0
  560. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/mode.interactive.zh.md +0 -0
  561. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.chat.zh.md +0 -0
  562. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.evaluator.zh.md +0 -0
  563. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.fact_checker.zh.md +0 -0
  564. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.maintainer.zh.md +0 -0
  565. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.proposer.zh.md +0 -0
  566. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.quick_writer.zh.md +0 -0
  567. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.reviewer.zh.md +0 -0
  568. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.scout.zh.md +0 -0
  569. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/provider_catalog.py +0 -0
  570. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/readers.py +0 -0
  571. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/reconciliation.py +0 -0
  572. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/release.py +0 -0
  573. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/report_browsing.py +0 -0
  574. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/report_time.py +0 -0
  575. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/report_tools.py +0 -0
  576. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/research_budget.py +0 -0
  577. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/review_learning.py +0 -0
  578. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/revision_edits.py +0 -0
  579. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/revision_metadata.py +0 -0
  580. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/revision_policy.py +0 -0
  581. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/rpc_writer.py +0 -0
  582. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/runtime_bridge.py +0 -0
  583. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/runtime_permissions.py +0 -0
  584. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/runtime_reasoning.py +0 -0
  585. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/schedules.py +0 -0
  586. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/scout.py +0 -0
  587. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/scout_evidence.py +0 -0
  588. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/search_credentials.py +0 -0
  589. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/search_policy.py +0 -0
  590. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/skill_assets/duckduckgo/SKILL.md +0 -0
  591. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/skill_assets/multi-search/SKILL.md +0 -0
  592. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/skill_assets/tavily/SKILL.md +0 -0
  593. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/skill_verification.py +0 -0
  594. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/skills.py +0 -0
  595. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/software_version.py +0 -0
  596. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/source_context.py +0 -0
  597. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/source_extraction.py +0 -0
  598. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/source_ingestion.py +0 -0
  599. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/source_library_search.py +0 -0
  600. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/source_search.py +0 -0
  601. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/source_updates.py +0 -0
  602. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/sources.py +0 -0
  603. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/frontend-licenses.txt +0 -0
  604. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/native-engine-licenses.txt +0 -0
  605. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/native-engine-models.json +0 -0
  606. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/native-engine.mjs +0 -0
  607. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-aider.png +0 -0
  608. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-amr.svg +0 -0
  609. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-antigravity.svg +0 -0
  610. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-bridge.LICENSE.txt +0 -0
  611. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-bridge.NOTICE.txt +0 -0
  612. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-bridge.mjs +0 -0
  613. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-briefloop.svg +0 -0
  614. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-claude.svg +0 -0
  615. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-codebuddy.svg +0 -0
  616. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-codex.svg +0 -0
  617. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-copilot.svg +0 -0
  618. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-cursor-agent.svg +0 -0
  619. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-deepseek.svg +0 -0
  620. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-devin.png +0 -0
  621. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-grok-build.svg +0 -0
  622. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-hermes.svg +0 -0
  623. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-kilo.svg +0 -0
  624. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-kimi.svg +0 -0
  625. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-kiro.svg +0 -0
  626. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-mimo.svg +0 -0
  627. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-opencode.svg +0 -0
  628. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-pi.svg +0 -0
  629. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-qoder.svg +0 -0
  630. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-qwen.svg +0 -0
  631. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-reasoning.json +0 -0
  632. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-reasonix.svg +0 -0
  633. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-trae-cli.png +0 -0
  634. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-vibe.svg +0 -0
  635. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/tokens.css +0 -0
  636. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/task_labels.py +0 -0
  637. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/task_notify.py +0 -0
  638. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/tavily.py +0 -0
  639. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t1.docx +0 -0
  640. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t1.spec.json +0 -0
  641. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t2.docx +0 -0
  642. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t2.spec.json +0 -0
  643. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t3.docx +0 -0
  644. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t3.spec.json +0 -0
  645. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t4.docx +0 -0
  646. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t4.spec.json +0 -0
  647. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t5.docx +0 -0
  648. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t5.spec.json +0 -0
  649. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t1.docx +0 -0
  650. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t1.spec.json +0 -0
  651. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t2.docx +0 -0
  652. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t2.spec.json +0 -0
  653. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t3.docx +0 -0
  654. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t3.spec.json +0 -0
  655. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t4.docx +0 -0
  656. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t4.spec.json +0 -0
  657. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t5.docx +0 -0
  658. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t5.spec.json +0 -0
  659. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t1.docx +0 -0
  660. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t1.spec.json +0 -0
  661. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t2.docx +0 -0
  662. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t2.spec.json +0 -0
  663. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t3.docx +0 -0
  664. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t3.spec.json +0 -0
  665. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t4.docx +0 -0
  666. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t4.spec.json +0 -0
  667. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t5.docx +0 -0
  668. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t5.spec.json +0 -0
  669. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t1.docx +0 -0
  670. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t1.spec.json +0 -0
  671. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t2.docx +0 -0
  672. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t2.spec.json +0 -0
  673. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t3.docx +0 -0
  674. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t3.spec.json +0 -0
  675. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t4.docx +0 -0
  676. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t4.spec.json +0 -0
  677. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t5.docx +0 -0
  678. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t5.spec.json +0 -0
  679. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t1.docx +0 -0
  680. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t1.spec.json +0 -0
  681. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t2.docx +0 -0
  682. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t2.spec.json +0 -0
  683. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t3.docx +0 -0
  684. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t3.spec.json +0 -0
  685. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t4.docx +0 -0
  686. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t4.spec.json +0 -0
  687. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t5.docx +0 -0
  688. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t5.spec.json +0 -0
  689. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/government-doc-zh-t4.docx +0 -0
  690. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/government-doc-zh-t4.spec.json +0 -0
  691. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t1.docx +0 -0
  692. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t1.spec.json +0 -0
  693. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t2.docx +0 -0
  694. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t2.spec.json +0 -0
  695. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t3.docx +0 -0
  696. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t3.spec.json +0 -0
  697. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t4.docx +0 -0
  698. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t4.spec.json +0 -0
  699. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t5.docx +0 -0
  700. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t5.spec.json +0 -0
  701. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t1.docx +0 -0
  702. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t1.spec.json +0 -0
  703. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t2.docx +0 -0
  704. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t2.spec.json +0 -0
  705. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t3.docx +0 -0
  706. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t3.spec.json +0 -0
  707. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t4.docx +0 -0
  708. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t4.spec.json +0 -0
  709. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t5.docx +0 -0
  710. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t5.spec.json +0 -0
  711. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t1.docx +0 -0
  712. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t1.spec.json +0 -0
  713. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t2.docx +0 -0
  714. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t2.spec.json +0 -0
  715. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t3.docx +0 -0
  716. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t3.spec.json +0 -0
  717. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t4.docx +0 -0
  718. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t4.spec.json +0 -0
  719. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t5.docx +0 -0
  720. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t5.spec.json +0 -0
  721. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t1.docx +0 -0
  722. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t1.spec.json +0 -0
  723. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t2.docx +0 -0
  724. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t2.spec.json +0 -0
  725. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t3.docx +0 -0
  726. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t3.spec.json +0 -0
  727. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t4.docx +0 -0
  728. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t4.spec.json +0 -0
  729. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t5.docx +0 -0
  730. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t5.spec.json +0 -0
  731. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_conversion.py +0 -0
  732. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/templates.py +0 -0
  733. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/user_input.py +0 -0
  734. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/websearch.py +0 -0
  735. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/windows_process.py +0 -0
  736. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/word_import.py +0 -0
  737. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workbook_figures.py +0 -0
  738. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/business_report/evaluation.md +0 -0
  739. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/business_report/manifest.json +0 -0
  740. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/business_report/methods/decision_memo.md +0 -0
  741. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/business_report/methods/industry_periodic.md +0 -0
  742. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/business_report/methods/work_progress.md +0 -0
  743. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/business_report/planning.md +0 -0
  744. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/business_report/writing.md +0 -0
  745. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/general_report/evaluation.md +0 -0
  746. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/general_report/manifest.json +0 -0
  747. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/general_report/planning.md +0 -0
  748. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/general_report/writing.md +0 -0
  749. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/meeting_minutes/evaluation.md +0 -0
  750. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/meeting_minutes/manifest.json +0 -0
  751. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/meeting_minutes/planning.md +0 -0
  752. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/meeting_minutes/writing.md +0 -0
  753. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/stock_research/evaluation.md +0 -0
  754. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/stock_research/manifest.json +0 -0
  755. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/stock_research/methods/company_research.md +0 -0
  756. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/stock_research/methods/event_commentary.md +0 -0
  757. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/stock_research/methods/industry_tracking.md +0 -0
  758. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/stock_research/planning.md +0 -0
  759. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/stock_research/writing.md +0 -0
  760. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workspace_profile.py +0 -0
  761. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workspaces.py +0 -0
  762. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/writer_assembly.py +0 -0
  763. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/writer_input.py +0 -0
  764. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/writing_guidance.py +0 -0
  765. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/xlsx_export.py +0 -0
  766. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/zhipu.py +0 -0
  767. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop.egg-info/dependency_links.txt +0 -0
  768. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop.egg-info/entry_points.txt +0 -0
  769. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop.egg-info/requires.txt +0 -0
  770. {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop.egg-info/top_level.txt +0 -0
  771. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/__init__.py +0 -0
  772. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/__main__.py +0 -0
  773. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/_licenses/LICENSE +0 -0
  774. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/_licenses/NOTICE.md +0 -0
  775. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/_licenses/third_party/acorn/LICENSE +0 -0
  776. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/_licenses/third_party/acorn/NOTICE.md +0 -0
  777. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/_licenses/third_party/officeqa/LICENSE-APACHE +0 -0
  778. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/_licenses/third_party/officeqa/NOTICE +0 -0
  779. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/alfworld/__init__.py +0 -0
  780. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/alfworld/act.sh +0 -0
  781. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/alfworld/rollout.py +0 -0
  782. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/alfworld/step.py +0 -0
  783. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/benchmarks/__init__.py +0 -0
  784. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/benchmarks/alfworld.py +0 -0
  785. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/benchmarks/livemath.py +0 -0
  786. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/benchmarks/sealqa.py +0 -0
  787. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/benchmarks/spreadsheet.py +0 -0
  788. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/cli.py +0 -0
  789. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/codex_identity.py +0 -0
  790. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/engine.py +0 -0
  791. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/feedback_loop.py +0 -0
  792. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/isolated/__init__.py +0 -0
  793. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/isolated/audit.py +0 -0
  794. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/isolated/runtime.py +0 -0
  795. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/isolated/tools_server.py +0 -0
  796. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/jsonl.py +0 -0
  797. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/k4_lock.py +0 -0
  798. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/livemath/__init__.py +0 -0
  799. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/livemath/loop.py +0 -0
  800. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/livemath/rollout.py +0 -0
  801. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/native_agents.py +0 -0
  802. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/officeqa/__init__.py +0 -0
  803. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/officeqa/dataset.py +0 -0
  804. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/officeqa/fetch.py +0 -0
  805. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/officeqa/loop.py +0 -0
  806. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/officeqa/retrieval.py +0 -0
  807. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/officeqa/reward.py +0 -0
  808. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/officeqa/rollout.py +0 -0
  809. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/officeqa/scoring.py +0 -0
  810. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/officeqa/wiki_agents.py +0 -0
  811. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/paper_alignment/__init__.py +0 -0
  812. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/paper_alignment/contracts.py +0 -0
  813. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/paper_alignment/evidence.py +0 -0
  814. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/product.py +0 -0
  815. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/product_cli.py +0 -0
  816. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/product_install.py +0 -0
  817. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/product_views.py +0 -0
  818. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/id_split/split_manifest.json +0 -0
  819. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/id_split/test.json +0 -0
  820. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/id_split/train.json +0 -0
  821. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/id_split/val.json +0 -0
  822. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/wiki/SKILL-s0.md +0 -0
  823. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/wiki/index.md +0 -0
  824. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/wiki/logs.md +0 -0
  825. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/wiki/prompts/maintainer.md +0 -0
  826. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/wiki/prompts/proposer.md +0 -0
  827. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/wiki/skill-impact.md +0 -0
  828. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/isolated/model-catalog-direct.json +0 -0
  829. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/id_split/split_manifest.json +0 -0
  830. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/id_split/test.json +0 -0
  831. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/id_split/train.json +0 -0
  832. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/id_split/val.json +0 -0
  833. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/id_split-v2/split_manifest.json +0 -0
  834. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/id_split-v2/test.json +0 -0
  835. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/id_split-v2/train.json +0 -0
  836. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/id_split-v2/val.json +0 -0
  837. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/protocol.json +0 -0
  838. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/wiki/SKILL-s0.md +0 -0
  839. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/wiki/index.md +0 -0
  840. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/wiki/logs.md +0 -0
  841. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/wiki/prompts/maintainer.md +0 -0
  842. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/wiki/prompts/proposer.md +0 -0
  843. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/wiki/skill-impact.md +0 -0
  844. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/id_split/split_manifest.json +0 -0
  845. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/id_split/test.json +0 -0
  846. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/id_split/train.json +0 -0
  847. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/id_split/val.json +0 -0
  848. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/protocol.json +0 -0
  849. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/wiki/SKILL-s0.md +0 -0
  850. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/wiki/index.md +0 -0
  851. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/wiki/logs.md +0 -0
  852. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/wiki/prompts/maintainer.md +0 -0
  853. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/wiki/prompts/proposer.md +0 -0
  854. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/wiki/skill-impact.md +0 -0
  855. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/paper_alignment/README.md +0 -0
  856. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/paper_alignment/prompts/maintainer.paper.md +0 -0
  857. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/paper_alignment/prompts/officeqa.paper.md +0 -0
  858. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/paper_alignment/prompts/proposer.paper.md +0 -0
  859. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/paper_alignment/prompts/spreadsheet.paper.md +0 -0
  860. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/agents/claude-code/wikiskill-executor.md +0 -0
  861. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/agents/claude-code/wikiskill-maintainer.md +0 -0
  862. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/agents/claude-code/wikiskill-proposer.md +0 -0
  863. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/agents/codex/wikiskill-executor.toml +0 -0
  864. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/agents/codex/wikiskill-maintainer.toml +0 -0
  865. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/agents/codex/wikiskill-proposer.toml +0 -0
  866. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/entry-skill/SKILL.md +0 -0
  867. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/entry-skill/agents/openai.yaml +0 -0
  868. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/entry-skill/references/native-subagents.md +0 -0
  869. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/entry-skill/references/workflow.md +0 -0
  870. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/roles/executor.md +0 -0
  871. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/roles/maintainer.md +0 -0
  872. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/roles/proposer.md +0 -0
  873. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/final-20260907/manifest.json +0 -0
  874. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/final-20260907/math-episodes.json +0 -0
  875. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/final-20260907/sealqa-pairs.json +0 -0
  876. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/final-20260907/spreadsheet-SKILL.md +0 -0
  877. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/final-20260907/spreadsheet-pairs.json +0 -0
  878. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/final-20260907/summary.json +0 -0
  879. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/repeatability-20260908/example-provenance.json +0 -0
  880. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/repeatability-20260908/installed-smoke.json +0 -0
  881. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/repeatability-20260908/manifest.json +0 -0
  882. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/repeatability-20260908/repeat1-pairs.json +0 -0
  883. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/repeatability-20260908/repeat2-pairs.json +0 -0
  884. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/repeatability-20260908/repeat3-pairs.json +0 -0
  885. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/repeatability-20260908/summary.json +0 -0
  886. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/repeatability-20260908/wiki-deliver-the-recalculated-workbook.md +0 -0
  887. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/skills/livemath/55.md +0 -0
  888. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/skills/livemath/luna.md +0 -0
  889. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/skills/officeqa/55.md +0 -0
  890. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/skills/officeqa/terra.md +0 -0
  891. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/skills/officeqa-retrieval/55.md +0 -0
  892. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/skills/officeqa-retrieval/sol.md +0 -0
  893. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/skills/sealqa/sol.md +0 -0
  894. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/skills/spreadsheet/55.md +0 -0
  895. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/skills/spreadsheet/sol.md +0 -0
  896. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/snapshot.json +0 -0
  897. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/snapshot.sha256 +0 -0
  898. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260906/livemath-luna-pairs.json +0 -0
  899. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260906/livemath-luna-skill.md +0 -0
  900. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260906/manifest.json +0 -0
  901. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260906/officeqa-luna-skill.md +0 -0
  902. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260906/officeqa-sol-skill.md +0 -0
  903. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260906/officeqa-sol-v2-pairs.json +0 -0
  904. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260906/studies.json +0 -0
  905. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260907/effort-analysis.json +0 -0
  906. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260907/effort-pairs.json +0 -0
  907. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260907/manifest.json +0 -0
  908. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260907/officeqa-luna-paper-tools-pairs.json +0 -0
  909. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260907/officeqa-luna-paper-tools-skill.md +0 -0
  910. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260907/spreadsheet-luna-scoped-python-pairs.json +0 -0
  911. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260907/spreadsheet-luna-scoped-python-skill.md +0 -0
  912. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260907/studies.json +0 -0
  913. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/runtime/acorn.mjs +0 -0
  914. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/runtime/audit_js.mjs +0 -0
  915. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/id_split/split_manifest.json +0 -0
  916. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/id_split/test.json +0 -0
  917. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/id_split/train.json +0 -0
  918. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/id_split/val.json +0 -0
  919. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/protocol.json +0 -0
  920. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/wiki/SKILL-s0.md +0 -0
  921. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/wiki/index.md +0 -0
  922. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/wiki/logs.md +0 -0
  923. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/wiki/prompts/maintainer.md +0 -0
  924. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/wiki/prompts/proposer.md +0 -0
  925. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/wiki/skill-impact.md +0 -0
  926. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/id_split/split_manifest.json +0 -0
  927. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/id_split/test.json +0 -0
  928. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/id_split/train.json +0 -0
  929. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/id_split/val.json +0 -0
  930. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/protocol.json +0 -0
  931. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/wiki/SKILL-s0.md +0 -0
  932. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/wiki/index.md +0 -0
  933. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/wiki/logs.md +0 -0
  934. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/wiki/prompts/maintainer.md +0 -0
  935. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/wiki/prompts/proposer.md +0 -0
  936. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/wiki/skill-impact.md +0 -0
  937. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/results.py +0 -0
  938. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/score_rules.py +0 -0
  939. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/scorer_trust.py +0 -0
  940. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/sealqa/__init__.py +0 -0
  941. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/sealqa/loop.py +0 -0
  942. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/sealqa/rollout.py +0 -0
  943. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/settings.py +0 -0
  944. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/skill_proposer.py +0 -0
  945. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/spreadsheet/__init__.py +0 -0
  946. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/spreadsheet/loop.py +0 -0
  947. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/spreadsheet/rollout.py +0 -0
  948. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/spreadsheet/study.py +0 -0
  949. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/tool_audit.py +0 -0
  950. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/wiki.py +0 -0
  951. {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/wiki_maintainer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: briefloop
3
- Version: 0.27.0
3
+ Version: 0.28.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
@@ -286,6 +286,8 @@ briefloop external --workspace "/absolute/workspace" request --file request.json
286
286
 
287
287
  详见 [外部 Agent 调用文档](docs/WorkBuddy外部入口.md)、[随包 Skill 与请求示例](src/briefloop/skill_assets/briefloop-external/SKILL.md);官网提供 [调用指南](https://briefloop.ai/docs/external-agent.html)。
288
288
 
289
+ 下一版增加本机 stdio MCP 服务:客户端执行 `briefloop mcp --workspace "/absolute/workspace"`,即可发现与 external 相同的报告工具。启动时固定工作区路径和身份;不启动后台服务、不新增网络监听。配置示例、工具参数及异步查询方式见 [MCP 调用说明](docs/WorkBuddy外部入口.md#本机-stdio-mcp)。
290
+
289
291
  会议纪要内容方法:选择内置纪要模板即可建议相应用途,输入本次会议转写或笔记,整理决议、待办和未定事项。见 [会议纪要说明与合成材料](docs/会议纪要.md)。
290
292
 
291
293
  证券研究方法提供事件点评、公司研究和行业跟踪,按来源区分实际、预测与估值假设,使用有依据的数据生成图表。见 [证券研究说明与合成材料](docs/证券研究.md)。
@@ -327,7 +329,7 @@ npm test
327
329
 
328
330
  Reviewer 使用本任务固定核查包,在独立会话中返回结构化发现及处理说明的复核结果。设置可选**普通审阅**(默认)或**严格审阅**:普通模式通过 Codex、OpenCode 1.x/2.x 或 BriefLoop Agent 的实际只读通道执行,不承诺宿主自动加载的全局/项目上下文完全隔离;严格模式额外强制包内读取,目前由 BriefLoop Agent 的专用核查工具提供。选择严格模式不会自动降级或更换执行后端。两种模式使用相同的事实、证据及交付检查,新任务冻结实际模式,历史未记录模式的审阅不被补标为严格。
329
331
 
330
- 工作稿Word下载保持可用。“正式交付”另行检查当前版本的独立审阅、重要主张及必答内容、核心未核验、重大未决发现和冲突;高分不能抵消阻断项。审计包单独导出,逐来源选择原件、摘录或仅定位,缺省仅定位;离线校验为结构与一致性检查,不是事实真伪自动证明。旧正式件保留,更正或后续更新另建版本。
332
+ 独立审阅可在任一执行引擎上运行:Codex、OpenCode 与内置引擎强制只读;Claude、Antigravity 等 CLI 宿主无法由 BriefLoop 关闭自带工具,审阅改用其原生权限运行,记录上标明“未强制只读”并列出宿主报告的工具使用。严格审阅仍只在内置引擎上执行。工作稿Word下载保持可用。“正式交付”另行检查当前版本的独立审阅、重要主张及必答内容、核心未核验、重大未决发现和冲突;高分不能抵消阻断项。审计包单独导出,逐来源选择原件、摘录或仅定位,缺省仅定位;离线校验为结构与一致性检查,不是事实真伪自动证明。旧正式件保留,更正或后续更新另建版本。
331
333
 
332
334
  存在受限来源时,无法逐来源归属的审阅、回应、历史与内部研究自由文本会明确省略;包中保留身份、状态、定位和获准的证据片段。正式报告本身仍随包提供。旧版受限包需重新导出以应用完整权限投影,旧版全原件包继续支持下载和离线校验。
333
335
 
@@ -246,6 +246,8 @@ briefloop external --workspace "/absolute/workspace" request --file request.json
246
246
 
247
247
  详见 [外部 Agent 调用文档](docs/WorkBuddy外部入口.md)、[随包 Skill 与请求示例](src/briefloop/skill_assets/briefloop-external/SKILL.md);官网提供 [调用指南](https://briefloop.ai/docs/external-agent.html)。
248
248
 
249
+ 下一版增加本机 stdio MCP 服务:客户端执行 `briefloop mcp --workspace "/absolute/workspace"`,即可发现与 external 相同的报告工具。启动时固定工作区路径和身份;不启动后台服务、不新增网络监听。配置示例、工具参数及异步查询方式见 [MCP 调用说明](docs/WorkBuddy外部入口.md#本机-stdio-mcp)。
250
+
249
251
  会议纪要内容方法:选择内置纪要模板即可建议相应用途,输入本次会议转写或笔记,整理决议、待办和未定事项。见 [会议纪要说明与合成材料](docs/会议纪要.md)。
250
252
 
251
253
  证券研究方法提供事件点评、公司研究和行业跟踪,按来源区分实际、预测与估值假设,使用有依据的数据生成图表。见 [证券研究说明与合成材料](docs/证券研究.md)。
@@ -287,7 +289,7 @@ npm test
287
289
 
288
290
  Reviewer 使用本任务固定核查包,在独立会话中返回结构化发现及处理说明的复核结果。设置可选**普通审阅**(默认)或**严格审阅**:普通模式通过 Codex、OpenCode 1.x/2.x 或 BriefLoop Agent 的实际只读通道执行,不承诺宿主自动加载的全局/项目上下文完全隔离;严格模式额外强制包内读取,目前由 BriefLoop Agent 的专用核查工具提供。选择严格模式不会自动降级或更换执行后端。两种模式使用相同的事实、证据及交付检查,新任务冻结实际模式,历史未记录模式的审阅不被补标为严格。
289
291
 
290
- 工作稿Word下载保持可用。“正式交付”另行检查当前版本的独立审阅、重要主张及必答内容、核心未核验、重大未决发现和冲突;高分不能抵消阻断项。审计包单独导出,逐来源选择原件、摘录或仅定位,缺省仅定位;离线校验为结构与一致性检查,不是事实真伪自动证明。旧正式件保留,更正或后续更新另建版本。
292
+ 独立审阅可在任一执行引擎上运行:Codex、OpenCode 与内置引擎强制只读;Claude、Antigravity 等 CLI 宿主无法由 BriefLoop 关闭自带工具,审阅改用其原生权限运行,记录上标明“未强制只读”并列出宿主报告的工具使用。严格审阅仍只在内置引擎上执行。工作稿Word下载保持可用。“正式交付”另行检查当前版本的独立审阅、重要主张及必答内容、核心未核验、重大未决发现和冲突;高分不能抵消阻断项。审计包单独导出,逐来源选择原件、摘录或仅定位,缺省仅定位;离线校验为结构与一致性检查,不是事实真伪自动证明。旧正式件保留,更正或后续更新另建版本。
291
293
 
292
294
  存在受限来源时,无法逐来源归属的审阅、回应、历史与内部研究自由文本会明确省略;包中保留身份、状态、定位和获准的证据片段。正式报告本身仍随包提供。旧版受限包需重新导出以应用完整权限投影,旧版全原件包继续支持下载和离线校验。
293
295
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "briefloop"
7
- version = "0.27.0"
7
+ version = "0.28.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.28.0"
@@ -1,4 +1,4 @@
1
- from .execution_records import sanitize
1
+ from .execution_records import sanitize, public_tool_name
2
2
  """Native CLI transports projected into the existing ChatStore, not another agent loop."""
3
3
  import base64
4
4
  import hashlib
@@ -239,7 +239,7 @@ class BridgeHarness(OpencodeHarness):
239
239
  elif kind=='tool':
240
240
  key=event.get('id') or uid('tool');tools[key]={**tools.get(key,{}),**event}
241
241
  tool=tools[key];complete=tool.get('status') in ('completed','failed','error')
242
- item={'id':key,'type':'runtime_tool','tool':tool.get('name','工具'),'status':tool.get('status','running'),
242
+ item={'id':key,'type':'runtime_tool','tool':public_tool_name(tool.get('name')),'status':tool.get('status','running'),
243
243
  'input':sanitize(tool.get('input')), 'output':sanitize(tool.get('output'))}
244
244
  self.chat.event(sid,'item/completed' if complete else 'item/started',{'item':item,'turnId':mid})
245
245
  if complete:
@@ -138,6 +138,11 @@ class ChatStore:
138
138
  event['data']['tokenUsage']=project_usage(event['seq'],event['data'])
139
139
  if not private:
140
140
  for message in messages:message.pop('prompt',None)
141
+ from .execution_records import public_tool_name
142
+ for event in events:
143
+ item = event['data'].get('item') if isinstance(event['data'], dict) else None
144
+ if isinstance(item, dict) and item.get('type') == 'runtime_tool':
145
+ item['tool'] = public_tool_name(item.get('tool'))
141
146
  if not reasoning:
142
147
  for message in messages:message.pop('reasoning',None)
143
148
  return {'session':session,'messages':messages,'events':events,'requests':requests,'token_usage':token_usage}
@@ -13,6 +13,15 @@ def _notify_owner(request):
13
13
  """Conversation that owns a task started from chat; never guessed."""
14
14
  return request.get('session_id') or os.environ.get('BRIEFLOOP_CHAT_SESSION') or None
15
15
 
16
+ def _session_backend(store, session_id):
17
+ if not session_id:
18
+ return None
19
+ rows = store.rows('SELECT runtime FROM chat_sessions WHERE id=?', (session_id,))
20
+ try:
21
+ return json.loads(rows[0]['runtime']).get('backend') if rows else None
22
+ except (TypeError, ValueError):
23
+ return None
24
+
16
25
  WORKSPACE_ACTIONS = (
17
26
  'capabilities','source_snapshot','source_change','source_impacts','refresh_source',
18
27
  'set_reader_contract','conflict_create','conflict_response','review_response','review_status',
@@ -20,7 +29,7 @@ WORKSPACE_ACTIONS = (
20
29
  'revise_document','templates','workflows','template_rebuild','template_import','import_word_revision',
21
30
  'company_review_complete','company_read','company_config','company_update','company_resolve',
22
31
  'profile_read','profile_update',
23
- 'freeze_research_plan','research_status','begin_research_round','finish_research_round',
32
+ 'freeze_research_plan','research_status','begin_research_round','finish_research_round','set_scout_tasks',
24
33
  'reconciliation_candidates','reconciliation_save','reconciliation_read',
25
34
  'export_word','inspect','generate','assess','comment','learn',
26
35
  )
@@ -143,6 +152,15 @@ def workspace_action(store, request):
143
152
  if action=='research_status':
144
153
  from .research_plan import status
145
154
  return status(store,request['run_id'])
155
+ if action=='set_scout_tasks':
156
+ from .scout_coverage import declare, update
157
+ if 'scout_tasks' in request:
158
+ result=declare(store,request['run_id'],request['scout_tasks'],round_id=request.get('round_id'))
159
+ if 'scout_outcomes' in request:
160
+ result=update(store,request['run_id'],request['scout_outcomes'],round_id=request.get('round_id'))
161
+ if 'scout_tasks' not in request and 'scout_outcomes' not in request:
162
+ raise ValueError('需要 scout_tasks 或 scout_outcomes')
163
+ return result
146
164
  if action=='freeze_research_plan':
147
165
  from .research_plan import freeze
148
166
  return freeze(store,request['run_id'],preset=request.get('preset'),structure=request.get('structure'))
@@ -151,7 +169,8 @@ def workspace_action(store, request):
151
169
  return begin_round(store,request['run_id'],target_gap_ids=request.get('target_gap_ids'),tasks=request.get('tasks'),job_id=request.get('job_id'))
152
170
  if action=='finish_research_round':
153
171
  from .research_plan import finish_round
154
- return finish_round(store,request['run_id'],round_id=request.get('round_id'),gaps=request.get('gaps'),summary=request.get('summary',''),gap_updates=request.get('gap_updates'),job_id=request.get('job_id'))
172
+ return finish_round(store,request['run_id'],round_id=request.get('round_id'),gaps=request.get('gaps'),summary=request.get('summary',''),gap_updates=request.get('gap_updates'),job_id=request.get('job_id'),
173
+ continue_research=request.get('continue_research') is True,early_stop_reason=str(request.get('early_stop_reason') or ''),scout_outcomes=request.get('scout_outcomes'))
155
174
  if action=='reconciliation_candidates':
156
175
  from .reconciliation import candidates
157
176
  return candidates(store,request['run_id'])
@@ -186,7 +205,12 @@ def workspace_action(store, request):
186
205
  runtime_payload={}
187
206
  if request.get('runtime'):
188
207
  from .backends import validate_backend
189
- backend=validate_backend(request['runtime'].get('agent_backend',store.settings().get('agent_backend','codex')))
208
+ # A model name only means something on its own engine. Without an explicit
209
+ # engine, use the engine of the conversation that sent this model, never the
210
+ # workspace default (a Claude chat once produced "Antigravity · opus").
211
+ backend=request['runtime'].get('agent_backend') or _session_backend(store,_notify_owner(request)) \
212
+ or store.settings().get('agent_backend','codex')
213
+ backend=validate_backend(backend)
190
214
  settings=Settings.model_validate({**store.settings(),**request['runtime'],'agent_backend':backend})
191
215
  runtime_payload={'runtime':runtime_fields(settings.model_dump(),backend),'agent_backend':backend}
192
216
  run=store.create_run(requirements.model_dump(),source_ids,research_protocol="quality_v1",
@@ -261,8 +285,9 @@ def chat_instructions(store, runtime, *, internal=False, allow_web=False, backen
261
285
  subagent_note=(OPENCODE_V2_SUBAGENT+'优先不传 model override,继承当前已冻结模型和推理档位;不要启动嵌套模型 CLI。'
262
286
  '宿主 question 工具不可用;需要澄清时直接在聊天回复中提问,用户下一条消息会继续本任务。')
263
287
  else:
264
- request_runtime={'model':runtime['model'],'reasoning_effort':runtime.get('effort'),
288
+ request_runtime={'agent_backend':backend,'model':runtime['model'],'reasoning_effort':runtime.get('effort'),
265
289
  'model_provider':runtime.get('model_provider')}
290
+ if backend=='codex':request_runtime['service_tier']=runtime.get('service_tier')
266
291
  runtime_json=json.dumps(request_runtime,ensure_ascii=False)
267
292
  runtime_label=runtime.get('effort') if runtime.get('effort') is not None else '不指定(provider 默认)'
268
293
  provider_label=runtime.get('model_provider') or f'沿用本机 {BACKEND_LABELS[backend]} 配置'
@@ -301,9 +326,10 @@ def chat_instructions(store, runtime, *, internal=False, allow_web=False, backen
301
326
  - {{"action":"profile_read"}}:读取本工作区基础设定(称呼、公司/组织、岗位等)。
302
327
  - {{"action":"profile_update","profile":{{"name":"称呼","organization":"公司/组织","role":"岗位","location":"城市","focus":"主要工作","report_types":"常做报告"}}}}:按上文约定保存用户主动提供或任务确有必要的基础信息;只写用户明确说过的内容,不猜、不编造,也不把这些当作报告证据。
303
328
  - {{"action":"research_status","run_id":"真实run ID"}}:读取该任务冻结的研究计划、轮次与用量。
329
+ - {{"action":"set_scout_tasks","run_id":"真实run ID","scout_tasks":[{{"slot_id":"scout-1","assignment":"明确研究方向","result_file":"本轮结果绝对路径"}}]}}:派发前登记完整承诺分工,与 plan.json.scout_tasks 相同;空计划明确写 []。预分配槽位不是承诺。分工不可静默删除;可追加新分工。实际派发后可用同 action 的 scout_outcomes=[{{"slot_id":"scout-1","status":"dispatched","reason":"真实子任务句柄"}}] 记录派发。join-scouts 自动接纳有效结果。
304
330
  - {{"action":"freeze_research_plan","run_id":"真实run ID","preset":"quick|standard|deep","structure":{{"breadth":6,"depth":2,"parallel":2}}}}:在第一次受控联网前冻结研究计划。预算只读取任务已授权的额度,不能借冻结扩大额度或替换模型/搜索源;相同内容重复提交幂等,不同内容会被拒绝。
305
331
  - {{"action":"begin_research_round","run_id":"真实run ID","target_gap_ids":["真实gap ID"],"tasks":[{{"slot_id":"scout-1"}}]}}:在当前轮已结束、且未超过 depth 上限时开始下一轮;必须引用前轮真实缺口 ID。
306
- - {{"action":"finish_research_round","run_id":"真实run ID","gaps":[{{"description":"真实缺口","source_ids":[],"related_claim_ids":[],"requirement_ids":[]}}],"summary":"本轮结论"}}:结束当前轮并生成真实 gap ID;可选 gap_updates 明确变更已登记缺口状态,每项 gap_id/status(open|partial|resolved)/reason/evidence(source_id/locator/excerpt,partial/resolved 至少一条,open 可为空),partial 另填 remaining_question;covered 不会关闭缺口。之后才能 begin 下一轮。
332
+ - {{"action":"finish_research_round","run_id":"真实run ID","gaps":[{{"description":"真实缺口","source_ids":[],"related_claim_ids":[],"requirement_ids":[]}}],"summary":"本轮结论"}}:结束当前轮并生成真实 gap ID;每个已承诺 Scout 分工须已 join,或在 scout_outcomes 中明确 slot_id、status=failed|skipped、reason,保留未检范围;不必用满槽位、预算或后续轮次。可选 gap_updates 明确变更已登记缺口状态,每项 gap_id/status(open|partial|resolved)/reason/evidence(source_id/locator/excerpt,partial/resolved 至少一条,open 可为空),partial 另填 remaining_question;covered 不会关闭缺口。还要继续检索时带 "continue_research":true;只完成第 1 轮且受控搜索额度用了不到一半就结束研究时,必须带 "early_stop_reason" 说明为何已覆盖本期重要事件,否则会被拒绝。之后才能 begin 下一轮。
307
333
  - {{"action":"reconciliation_candidates","run_id":"真实run ID"}}:读取本任务冻结的候选清单(来源与来源陈述),用于写作前对照。
308
334
  - {{"action":"reconciliation_save","run_id":"真实run ID","reconciliation":{{"status":"complete|partial|not_applicable|failed","examined_claim_ids":[],"unexamined_claim_ids":[],"relations":[{{"member_claim_ids":["真实claim ID","真实claim ID"],"relation":"compatible|different_scope|temporal_sequence|correction|supersession|republication|attributed_difference|contradiction|unknown","scope":"","basis_span_ids":[],"reason":"","proposed_treatment":"","affected_requirement_ids":[]}}],"open_questions":[],"coverage_notes":""}}}}:保存写作前对照快照。必须用 examined ∪ unexamined 明确覆盖候选清单全部来源陈述;关系必须引用真实来源陈述;不判定真假,只登记依据与建议写法。重复相同内容幂等。
309
335
  - {{"action":"reconciliation_read","run_id":"真实run ID","reconciliation_id":"真实对照ID"}}:读取对照快照;输入变化时返回 stale 标记。
@@ -311,7 +337,7 @@ def chat_instructions(store, runtime, *, internal=False, allow_web=False, backen
311
337
  - {{"action":"templates"}}:读取可选模板。用户要求上传材料用作主模板时用 {{"action":"template_import","source_id":"DOCX来源ID"}} 启动一次准备;准备完成后 generate.requirements.template_id 选择具体版本。需要重新准备已有模板版式时,用 {{"action":"template_rebuild","template_id":"已有模板ID"}} 从保留原件创建新模板版本;原模板和已绑定稿件保持不变,新任务选择返回的新模板ID。
312
338
  - {{"action":"read_report","version_id":"稿件ID"}}:读取富文档 JSON、引用和已存正文的 length_stats;revise_document 回执也给出保存后的确定性计数。按 count/rule 核对原始要求、读者约定及当前反馈,不估算字数;over_limit 只比较结构化 max_words,不表示已满足全部篇幅要求。用户明确要求修改内容/章节/图表时,将修改后的 JSON 保存到工作区文件,再用 {{"action":"revise_document","base_version":"刚读取版本ID","document_file":"工作区内JSON绝对路径"}} 保存新版本,不覆盖用户并发编辑。可选 citations 完整替换引用列表(source_id/locator/excerpt,schema 见 capabilities),省略则保留;只修改引用也保存新版本,定位描述不表示已独立核验。
313
339
  - {{"action":"import_word_revision","base_version":"用户指定基础版本","source_id":"DOCX来源ID"}}:导入用户修改的 Word。返回 needs_alignment 时先核对原件和基础版本,向用户说明对齐问题;仅按用户明确选择提供 accept_unaligned=true。用户希望更新模板时另用 template_import 并提供 parent_id。
314
- - {{"action":"generate","requirements":{{"title":"标题","objective":"用户目的","audience":"读者","language":"zh|en","extent":"compact|balanced|detailed","research_tier":"quick|standard|deep","allow_web":{str(bool(allow_web)).lower()},"period":"时间范围"}},"source_ids":["真实来源ID"],"runtime":{runtime_json}}}:正式生成可在页面编辑的简报。language 是报告正文语言(默认 zh);用户要英文报告时写 en,不传 target_words 时篇幅按英文词数默认。research_tier 是研究深度档位(默认 standard):quick 单轮检索,deep 预排 4 轮迭代研究;按用户明确要求选,用户未提就不写该字段。
340
+ - {{"action":"generate","requirements":{{"title":"标题","objective":"用户目的","audience":"读者","language":"zh|en","extent":"compact|balanced|detailed","research_tier":"quick|standard|deep","allow_web":{str(bool(allow_web)).lower()},"period":"时间范围"}},"source_ids":["真实来源ID"],"runtime":{runtime_json}}}:正式生成可在页面编辑的简报。language 是报告正文语言(默认 zh);用户要英文报告时写 en,不传 target_words 时篇幅按英文词数默认。research_tier 是研究深度档位(默认 standard):quick 单轮检索,deep 预排 4 轮迭代研究;按用户明确要求选,用户未提就不写该字段。scout_limit 是本报告最多可同时派发的 Scout 数(1–16),在提交前按信息量决定:一周左右约 4,月报约 8,跨多个行业或市场的大型报告可到 12–16;不写时系统按期间自动设定(月报 8,其余沿用工作区设置)。
315
341
  提交 generate 时,必须把本轮已经确认的 key_questions、writing_preferences、章节、期间和篇幅完整写进 requirements,不能只传标题摘要。用户给出的执行约束同样在提交前冻结:target_minutes 是软目标;hard_timeout_minutes=0 表示不设硬截止;research_budget 包含 search_requests、candidate_urls、source_pages;search_policy 沿用已授权设置。不得说“后台稍后配置”而遗漏已指定的额度。并行数要求写入 writing_preferences,供主 Agent 冻结研究计划时选择 structure.parallel;不改变共享预算。提交回执中的实际冻结值与用户要求不一致时明确说明,不宣称已应用。
316
342
  - {{"action":"assess","version_id":"真实简报版本ID"}}:为已有稿件安排评分。
317
343
  - {{"action":"comment","version_id":"真实简报版本ID","text":"用户反馈"}}:记录用户明确提出的反馈。页面自动学习开启时,保存反馈可能稍后自动触发学习,要如实告知。
@@ -51,6 +51,8 @@ def main():
51
51
  er.add_argument('--file',required=True,help='UTF-8 JSON 请求文件')
52
52
  ed=es.add_parser('download',help='下载指定已完成导出任务的Word,不覆盖不同内容的文件')
53
53
  ed.add_argument('--job',required=True);ed.add_argument('--output',required=True)
54
+ mcp=sub.add_parser('mcp',help='stdio MCP 服务;只连接用户选定的现有本机工作区')
55
+ mcp.add_argument('--workspace',required=True,help='已选择工作区的绝对路径;不自动创建或启动服务')
54
56
  tool=sub.add_parser('tool',help='agent 使用的来源工具')
55
57
  tool.add_argument('--workspace',required=True)
56
58
  ts=tool.add_subparsers(dest='tool',required=True)
@@ -136,6 +138,12 @@ def main():
136
138
  print(json.dumps(result,ensure_ascii=False))
137
139
  except (OSError,ValueError,KeyError,http.client.HTTPException) as exc:
138
140
  p.exit(2,json.dumps({'status':'error','message':sanitize(str(exc))},ensure_ascii=False)+'\n')
141
+ elif a.command=='mcp':
142
+ from .external_mcp import serve as serve_mcp
143
+ try:serve_mcp(a.workspace)
144
+ except ValueError as exc:
145
+ from .execution_records import sanitize
146
+ p.exit(2,sanitize(str(exc))+'\n')
139
147
  elif a.command=='serve':
140
148
  from .server import serve
141
149
  serve(a.workspace,a.port,paused=a.paused,backend=a.backend)
@@ -212,8 +212,10 @@ def instructions(spec, role='analyst', *, include_spec=True):
212
212
 
213
213
  def research_record(store, brief):
214
214
  detail = json.loads(brief['detail']); refs = detail.get('citations', [])
215
+ from .plain_isolation import public_notes
216
+ notes = public_notes(detail.get('research_notes', []))
215
217
  return {'version_id': brief['id'], 'brief_hash': brief['hash'],
216
- 'notes': detail.get('research_notes', []), 'gaps': detail.get('gaps', []),
218
+ 'notes': notes, 'gaps': detail.get('gaps', []),
217
219
  'citations': [{**ref, 'source_name': store.one('sources', ref['source_id'])['name']} for ref in refs],
218
220
  'assessments': [json.loads(x['data']) for x in store.rows('SELECT data FROM assessments WHERE version_id=? ORDER BY rowid DESC', (brief['id'],))]}
219
221
 
@@ -15,6 +15,23 @@ _SECRET_HEADER=re.compile(r'''(?im)(?<![\w-])((?:proxy[-_])?authorization|(?:set
15
15
  _SECRET_ENV=re.compile(r'''(?ix)(["']?\b(?:[a-z0-9]+_)*(?:authorization|cookie)["']?\s*=\s*)(?:\[credential[ ]omitted\]|"[^"\n]*"|'[^'\n]*'|[^\s,;&}\]]+)''')
16
16
  _PRIVATE_KEY=re.compile(r'-----BEGIN (?:[A-Z ]+)?PRIVATE KEY-----.*?-----END (?:[A-Z ]+)?PRIVATE KEY-----',re.S)
17
17
 
18
+ # ACP "names" can be entire commands, paths or arbitrary host descriptions.
19
+ # Only exact known identifiers belong in compact public tool summaries.
20
+ _PUBLIC_TOOLS = frozenset('''Read Write Edit MultiEdit Bash Glob Grep LS NotebookEdit TodoWrite Task Agent WebFetch WebSearch
21
+ read write edit bash glob grep find ls task subagent shell search_web web_search webfetch websearch
22
+ read_file write_file edit_file list_directory read_many_files execute_command run_command
23
+ commandExecution command_execution fileChange mcpToolCall dynamicToolCall collabAgentToolCall
24
+ collab_tool_call imageView webSearch runtime_tool opencode_tool subagent_activity'''.split())
25
+ _OTHER_TOOL = '其他宿主工具'
26
+
27
+
28
+ def public_tool_name(value):
29
+ return value if isinstance(value, str) and value in _PUBLIC_TOOLS else _OTHER_TOOL
30
+
31
+
32
+ def public_tool_names(values):
33
+ return sorted({public_tool_name(value) for value in values}) if isinstance(values, list) else []
34
+
18
35
 
19
36
  def _secret_field(key, value):
20
37
  name = re.sub(r'([a-z0-9])([A-Z])', r'\1_\2', str(key)).lower()
@@ -10,6 +10,13 @@ from urllib.parse import urlsplit, urlencode
10
10
  from .workspaces import _workspace_id, _validated_info, _alive, _read_api
11
11
 
12
12
 
13
+ class RequestError(ValueError):
14
+ """HTTP status without reflecting the server's possibly input-bearing error."""
15
+ def __init__(self, status):
16
+ self.status = status
17
+ super().__init__(f'外部请求失败 (HTTP {status})')
18
+
19
+
13
20
  def discover(workspace):
14
21
  root = Path(workspace).expanduser().resolve()
15
22
  wid = _workspace_id(root) if root.is_dir() else None
@@ -22,13 +29,19 @@ def discover(workspace):
22
29
  if urlsplit(info['url']).hostname != '127.0.0.1':
23
30
  return {**result, 'status': 'service_unavailable', 'message': '工作区未使用受支持的本地服务地址'}
24
31
  try:
32
+ caps = _read_api(info['url'], '/api/external/capabilities')
33
+ if caps.get('protocol') != 1:
34
+ return {**result, 'status': 'unsupported', 'message': '此版本未提供外部任务接口'}
35
+ service_path = caps.get('workspace_path')
36
+ if (not isinstance(service_path, str) or not Path(service_path).is_absolute()
37
+ or Path(service_path).resolve() != root or caps.get('workspace_id') != wid):
38
+ return {**result, 'status': 'identity_changed', 'message': '服务与选定工作区的路径或身份不匹配,未连接'}
39
+ # Verify only the narrow identity response before reading runtime/task
40
+ # state or obtaining a session token from a possibly copied service URL.
25
41
  runtime = _read_api(info['url'], '/api/runtime')
26
42
  status = _read_api(info['url'], '/api/service-status')
27
- caps = _read_api(info['url'], '/api/external/capabilities')
28
43
  if runtime.get('server_pid') != info['pid'] or status.get('pid') != info['pid'] or status.get('workspace_id') != wid:
29
44
  return {**result, 'status': 'identity_changed', 'message': '服务与工作区身份不匹配,未连接'}
30
- if caps.get('protocol') != 1:
31
- return {**result, 'status': 'unsupported', 'message': '此版本未提供外部任务接口'}
32
45
  ready = bool(runtime.get('worker_alive')) and not status.get('draining')
33
46
  return {**result, 'url': info['url'], 'pid': info['pid'], 'ready': ready,
34
47
  'status': 'ready' if ready else 'not_ready', 'capabilities': caps}
@@ -60,7 +73,7 @@ class Client:
60
73
  raise ValueError('响应过大;请通过 BriefLoop 页面读取报告')
61
74
  value = json.loads(data)
62
75
  if response.status != 200:
63
- raise ValueError(value.get('error', '外部请求失败') + f' (HTTP {response.status})')
76
+ raise RequestError(response.status)
64
77
  return value
65
78
  finally:
66
79
  connection.close()
@@ -0,0 +1,177 @@
1
+ """Stdio MCP adapter to the existing, authenticated local external client.
2
+
3
+ No Store, Worker, credentials, model calls or HTTP listener live in this process.
4
+ The selected canonical path and durable workspace identity cannot be changed by
5
+ tool arguments or by replacing the workspace while a client is connected.
6
+ """
7
+ import http.client
8
+ import json
9
+ from pathlib import Path
10
+
11
+ import anyio
12
+ from jsonschema import Draft202012Validator
13
+ from mcp.server import Server
14
+ from mcp.server.stdio import stdio_server
15
+ from mcp.types import CallToolResult, ListToolsResult, TextContent, Tool, ToolAnnotations
16
+
17
+ from . import __version__
18
+ from .external_client import Client, RequestError, discover
19
+ from .external_requests import FIELDS, MUTATIONS
20
+ from .workspaces import _workspace_id
21
+
22
+
23
+ ID = {'type': 'string', 'minLength': 1}
24
+ REQUEST_ID = {'type': 'string', 'pattern': r'^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$'}
25
+ PROPERTIES = {
26
+ 'source_id': ID, 'job_id': ID, 'version_id': ID, 'base_version': ID,
27
+ 'requirements': {'type': 'object'}, 'editor_document': {'type': 'object'},
28
+ 'source_ids': {'type': 'array', 'items': ID},
29
+ }
30
+ DESCRIPTIONS = {
31
+ 'discover': '检查启动时选定工作区的现有服务和能力;不创建或启动服务。',
32
+ 'inspect': '列出选定工作区最近 100 个来源和 20 个稿件;返回真实 ID。',
33
+ 'source': '读取指定来源正文和出处。source_id 必须来自该工作区。',
34
+ 'submit': '提交报告,立即返回 job_id/run_id;用 query 查进度。沿用工作区模型、企业背景与需求规则。每次新写操作使用稳定 request_id;响应丢失仅重发原 ID 和原内容。',
35
+ 'query': '查询原 job_id 的实际状态、安全错误、版本和 Word 文件可用性;不重建失败任务。latest_version_id 可来自后续修订。',
36
+ 'read': '读取精确 version_id 的 Markdown 和完整 editor_document。',
37
+ 'revise': '保存 base_version 的完整 editor_document 为新版本,保留图表、引用和未修改节点;已有新版本时报冲突。用稳定 request_id 重试原内容。',
38
+ 'export': '排队生成明确 version_id 的 Word 工作稿,立即返回 job_id;query 至 artifact_available=true 后 download。不代表正式交付审核通过。用稳定 request_id 重试原内容。',
39
+ 'download': '将已完成导出 job_id 的 Word 保存到明确 output 文件路径;父目录须已存在。校验 SHA256、复用相同文件,不覆盖不同内容,不重新排队。',
40
+ }
41
+
42
+
43
+ class WorkspaceUnavailable(ValueError):
44
+ pass
45
+
46
+
47
+ def failure(code, message):
48
+ return {'status': 'error', 'code': code, 'message': message}
49
+
50
+
51
+ def request_failure(status):
52
+ if status == 409:
53
+ return failure('conflict', '稿件已有更新或 request_id 已用于不同内容;请核对原请求,并重新读取最新版本后合并修订')
54
+ if status == 400:
55
+ return failure('invalid_request', '请求参数或报告配置不符合要求;请检查需求、来源 ID、完整富文档及工作区设置')
56
+ if status == 403:
57
+ return failure('access_denied', '本地服务拒绝鉴权;请重新连接用户选定的工作区')
58
+ if status == 503:
59
+ return failure('service_unavailable', '本地服务尚未就绪或正在停止接收任务;请查询原任务,不自动重建')
60
+ return failure('request_failed', '本地服务请求失败;写操作结果可能未知,请保留原 request_id 和原内容重试')
61
+
62
+
63
+ def tools():
64
+ catalog = []
65
+ for action, description in DESCRIPTIONS.items():
66
+ if action == 'download':
67
+ properties = {'job_id': ID, 'output': {'type': 'string', 'minLength': 1}}
68
+ required = list(properties)
69
+ else:
70
+ fields = FIELDS.get(action, set())
71
+ properties = {field: PROPERTIES[field] for field in sorted(fields)}
72
+ required = sorted(fields - ({'source_ids'} if action == 'submit' else set()))
73
+ if action in MUTATIONS:
74
+ properties['request_id'] = REQUEST_ID
75
+ required.append('request_id')
76
+ catalog.append(Tool(
77
+ name='briefloop_' + action, description=description,
78
+ input_schema={'type': 'object', 'properties': properties,
79
+ 'required': required, 'additionalProperties': False},
80
+ annotations=ToolAnnotations(
81
+ read_only_hint=action not in MUTATIONS | {'download'},
82
+ destructive_hint=False, idempotent_hint=True,
83
+ # Only submit can invoke models or research outside this
84
+ # workspace. Revise saves as author=agent, without learning.
85
+ open_world_hint=action == 'submit',
86
+ ),
87
+ ))
88
+ return catalog
89
+
90
+
91
+ class WorkspaceAdapter:
92
+ def __init__(self, workspace):
93
+ path = Path(workspace).expanduser()
94
+ if not path.is_absolute():
95
+ raise ValueError('--workspace 必须是用户选定工作区的绝对路径')
96
+ self.root = path.resolve()
97
+ self.workspace_id = _workspace_id(self.root) if self.root.is_dir() else None
98
+
99
+ def discovery(self):
100
+ info = discover(self.root)
101
+ if info.get('workspace_id') != self.workspace_id:
102
+ return {'path': str(self.root), 'workspace_id': self.workspace_id,
103
+ 'ready': False, 'status': 'identity_changed',
104
+ 'message': '工作区身份已变化;请重新启动 MCP 连接到用户选择的工作区'}
105
+ return info
106
+
107
+ def invoke(self, action, arguments):
108
+ if action == 'discover':
109
+ return self.discovery()
110
+ if not self.workspace_id:
111
+ raise WorkspaceUnavailable()
112
+ try:
113
+ client = Client(self.root)
114
+ except ValueError:
115
+ raise WorkspaceUnavailable() from None
116
+ if client.info['workspace_id'] != self.workspace_id:
117
+ raise WorkspaceUnavailable()
118
+ if action == 'download':
119
+ return client.download(arguments['job_id'], arguments['output'])
120
+ return client.request({'action': action, 'workspace_id': self.workspace_id, **arguments})
121
+
122
+
123
+ def create_server(workspace):
124
+ adapter = WorkspaceAdapter(workspace)
125
+ catalog = tools()
126
+ validators = {tool.name: Draft202012Validator(tool.input_schema) for tool in catalog}
127
+ limiter = anyio.CapacityLimiter(4)
128
+
129
+ async def list_tools(context, params):
130
+ return ListToolsResult(tools=catalog)
131
+
132
+ async def call_tool(context, params):
133
+ arguments = params.arguments if params.arguments is not None else {}
134
+ validator = validators.get(params.name)
135
+ # Never echo invalid arguments (which may contain credential-shaped
136
+ # values), validation traces or internal exception details to clients.
137
+ if validator is None:
138
+ value = failure('unknown_tool', '未知 BriefLoop 工具')
139
+ failed = True
140
+ elif not validator.is_valid(arguments):
141
+ value = failure('invalid_arguments', '工具参数不符合公布的 schema;不得传入其他工作区或服务地址')
142
+ failed = True
143
+ else:
144
+ try:
145
+ action = params.name.removeprefix('briefloop_')
146
+ value = await anyio.to_thread.run_sync(adapter.invoke, action, arguments, limiter=limiter)
147
+ failed = False
148
+ except WorkspaceUnavailable:
149
+ value = failure('workspace_unavailable', '选定工作区服务尚未就绪,或服务路径/身份不匹配;请在 BriefLoop 打开用户选定的工作区后重新连接')
150
+ failed = True
151
+ except RequestError as exc:
152
+ value = request_failure(exc.status)
153
+ failed = True
154
+ except (OSError, http.client.HTTPException):
155
+ value = failure('local_io_failed', '本地服务通信或文件操作失败;写操作结果可能未知,请使用原 request_id 和原内容重试')
156
+ failed = True
157
+ except (ValueError, KeyError):
158
+ value = failure('invalid_request', '请求、完整富文档或下载目标不符合要求;请检查指定 ID、父目录及目标文件,不覆盖不同内容')
159
+ failed = True
160
+ except Exception:
161
+ value = failure('request_failed', '本地外部请求失败;写操作结果可能未知,请用原 request_id 和原内容重试,勿新建任务')
162
+ failed = True
163
+ return CallToolResult(content=[TextContent(type='text', text=json.dumps(value, ensure_ascii=False))],
164
+ structured_content=value, is_error=failed)
165
+
166
+ return Server('BriefLoop', version=__version__, on_list_tools=list_tools, on_call_tool=call_tool,
167
+ instructions='仅操作启动时用户选定的本机工作区。先 discover 确认 ready,再 inspect/source。写操作保留原 request_id 与完整请求;submit/export 返回 job_id 后查询,不等待模型生成。修订先读取精确版本、保留完整富文档;Word 是指定版本的工作稿。MCP 取消或断开不取消已接收的后台任务;重连后查询原任务。')
168
+
169
+
170
+ def serve(workspace):
171
+ server = create_server(workspace)
172
+
173
+ async def run():
174
+ async with stdio_server() as (read, write):
175
+ await server.run(read, write, server.create_initialization_options())
176
+
177
+ anyio.run(run)
@@ -51,9 +51,10 @@ class _RequestStore(Store):
51
51
  return [dict(row) for row in self.connection.execute(query, args)]
52
52
 
53
53
 
54
- def capabilities():
54
+ def capabilities(store):
55
55
  return {'protocol': 1, 'actions': list(FIELDS), 'request_id_required': sorted(MUTATIONS),
56
- 'export_kind': 'working_draft', 'starts_service': False}
56
+ 'export_kind': 'working_draft', 'starts_service': False,
57
+ 'workspace_path': str(store.root.resolve()), 'workspace_id': store.meta('workspace_id')}
57
58
 
58
59
 
59
60
  def _operation(store, action, body):
@@ -55,8 +55,18 @@ def _plain_turn(worker, job, folder, prompt, *, phase=None):
55
55
  (folder / 'packet').mkdir(exist_ok=True)
56
56
  task = {**job, 'allow_web': False, 'plain_output': 'response.txt', 'plain_phase':phase, 'input_source_ids': [],
57
57
  'native_packet': {'role': 'quick_writer', 'run_id': json.loads(job['payload'])['run_id']}}
58
- return worker.runtime.execute(task, prompt, folder,
59
- resume_on_complete=int(json.loads(job['payload']).get('attempt',1))>1)
58
+ result = worker.runtime.execute(task, prompt, folder,
59
+ resume_on_complete=int(json.loads(job['payload']).get('attempt',1))>1)
60
+ from . import plain_isolation
61
+ isolation = plain_isolation.record(json.loads(job['payload']).get('agent_backend', 'codex'), folder)
62
+ worker.store.event(job['id'], 'plain_isolation', {'phase': phase or folder.name, **isolation,
63
+ 'message': plain_isolation.summary(isolation)})
64
+ return result
65
+
66
+
67
+ def _isolation(folder):
68
+ path = folder / 'isolation.json'
69
+ return json.loads(path.read_text(encoding='utf-8')) if path.exists() else None
60
70
 
61
71
 
62
72
  def _response(folder):
@@ -126,6 +136,10 @@ def generate(worker, job):
126
136
  data = {'title': req['title'], 'editor_document': markdown_document(text),
127
137
  'citations': [{'source_id': aliases[a]['source_id']} for a in sorted(cited)],
128
138
  'research_notes': [{'kind': 'fast_draft', 'summary': '一轮聚焦检索后根据已读取原文写作;未做完整事实核查,依据定位与评价在后台继续。' if research else '直接依据已有材料写作;未联网补搜,依据定位与评价在后台继续。'}]}
139
+ isolation = _isolation(folder / 'fast-writing')
140
+ if isolation:
141
+ from .plain_isolation import summary
142
+ data['research_notes'].append({'kind': 'fast_isolation', 'summary': summary(isolation), **isolation})
129
143
  if research:
130
144
  data['research_notes'].append({'kind':'fast_web_gaps','summary':'本次搜索与读取记录','gaps':research['gaps'],'reading_notices':research.get('notices',[]),
131
145
  'questions_before_reading':research.get('questions_before_reading',[])})
@@ -159,7 +173,8 @@ def enrich(worker, job, brief, folder):
159
173
  raise Conflict('材料与快速写作时的原文不同,请使用当前材料新建任务。')
160
174
  phase = folder / 'evidence'
161
175
  prompt = ('核对已保存报告,为重要结论补原文定位。不要改写正文,不搜索、不调用工具、不生成新的报告。'
162
- '只返回一个 JSON 对象,包含 citations 数组及 number_bindings 数组;没有可定位依据时留空,不猜测。'
176
+ '只返回一个 JSON 对象,包含 citations、number_bindings 和 unsupported 三个数组;没有可定位依据时留空,不猜测。'
177
+ 'unsupported 列出正文中在全部来源里找不到依据的重要结论,每条给 report_quote(正文连续原句)和 reason;不要因措辞概括而列入。'
163
178
  '每条 citation 使用 source_id(下方来源别名,如 S1)、report_quote(正文连续原句)、excerpt(连续逐字原文)。'
164
179
  'report_quote 必须能在报告正文中逐字找到;摘录应包含对应的主体、期间、单位及限定条件,不能用同来源的无关段落充数。'
165
180
  '无需猜行号;同一摘录在来源中重复时提供更长的唯一摘录。来源标题及相邻上下文由程序从冻结原文补入。'
@@ -212,8 +227,19 @@ def enrich(worker, job, brief, folder):
212
227
  details = {key:value for key,value in json.loads(brief['detail']).items() if key in BriefDraft.model_fields}
213
228
  details['citations'] = citations + [c for c in details.get('citations', []) if c['source_id'] not in {r['source_id'] for r in citations}]
214
229
  details['number_bindings'] = numbers
230
+ # Claims the materials do not cover. Mostly a slip in an enforced turn; in an
231
+ # observed turn it is where outside information the CLI brought in shows up.
232
+ unsupported = [{'report_quote': item['report_quote'], 'reason': str(item.get('reason', ''))[:500]}
233
+ for item in (data.get('unsupported') if isinstance(data.get('unsupported'), list) else [])[:30]
234
+ if isinstance(item, dict) and isinstance(item.get('report_quote'), str)
235
+ and item['report_quote'].strip() and item['report_quote'] in brief['markdown']]
215
236
  details.setdefault('research_notes', []).append({'kind': 'fast_evidence', 'summary': '逐字定位已检查;支持关系仍需评价。', 'rejected': rejected})
216
- (phase / 'admission.json').write_text(dump({'citations': citations, 'number_bindings': numbers, 'rejected': rejected}), encoding='utf-8')
237
+ if unsupported:
238
+ details['research_notes'].append({'kind': 'fast_unsupported', 'summary': '以下结论在所选材料中找不到原文依据,需核实或删除。', 'items': unsupported})
239
+ store.event(job['id'], 'fast_unsupported', {'version_id': brief['id'], 'count': len(unsupported),
240
+ 'message': f'{len(unsupported)} 条结论在所选材料中找不到原文依据,已单独列出。'})
241
+ (phase / 'admission.json').write_text(dump({'citations': citations, 'number_bindings': numbers, 'rejected': rejected,
242
+ 'unsupported': unsupported}), encoding='utf-8')
217
243
  if worker.runtime.cancelled.is_set() or worker.stopping.is_set():
218
244
  raise InterruptedError('依据补全已停止,初稿和结果保留。')
219
245
  from .draft_completion import verify_input
@@ -0,0 +1,12 @@
1
+ """Bounded feedback history with persisted job status and workspace-wide counts."""
2
+
3
+
4
+ def snapshot(store):
5
+ # batch_id is the learning job's primary key, not a position in recent jobs.
6
+ # At most 100 indexed joins; never scan/parse job payloads per feedback item.
7
+ items = store.rows("SELECT f.*, j.status AS learning_status FROM feedback f "
8
+ "LEFT JOIN jobs j ON j.id=f.batch_id AND j.kind='learn' "
9
+ "ORDER BY f.rowid DESC LIMIT 100")
10
+ counts = store.rows("SELECT count(*) AS total, "
11
+ "count(CASE WHEN batch_id IS NULL THEN 1 END) AS pending FROM feedback")[0]
12
+ return {'feedback': items, 'feedback_summary': counts}