briefloop 0.26.0__tar.gz → 0.26.1__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 (940) hide show
  1. {briefloop-0.26.0 → briefloop-0.26.1}/CHANGELOG.md +10 -2
  2. {briefloop-0.26.0 → briefloop-0.26.1}/PKG-INFO +5 -3
  3. {briefloop-0.26.0 → briefloop-0.26.1}/README.md +4 -2
  4. briefloop-0.26.1/VERSION +1 -0
  5. {briefloop-0.26.0 → briefloop-0.26.1}/desktop/electron/package-lock.json +2 -2
  6. {briefloop-0.26.0 → briefloop-0.26.1}/desktop/electron/package.json +1 -1
  7. briefloop-0.26.1/docs/release-0.26.1.md +19 -0
  8. {briefloop-0.26.0 → briefloop-0.26.1}/docs//344/275/277/347/224/250/346/214/207/345/215/227.md +1 -1
  9. {briefloop-0.26.0 → briefloop-0.26.1}/docs//345/206/205/347/275/256/345/274/225/346/223/216.md +1 -1
  10. {briefloop-0.26.0 → briefloop-0.26.1}/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 +1 -1
  11. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/app.js +27 -119
  12. briefloop-0.26.1/frontend/model-catalog.js +171 -0
  13. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/reasoning-controls.js +1 -1
  14. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/review-controls.js +1 -1
  15. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/runtime-cards.js +2 -2
  16. {briefloop-0.26.0 → briefloop-0.26.1}/pyproject.toml +1 -1
  17. {briefloop-0.26.0 → briefloop-0.26.1}/runtime-bridge/README.md +1 -1
  18. {briefloop-0.26.0 → briefloop-0.26.1}/runtime-bridge/bridge.test.mjs +15 -5
  19. {briefloop-0.26.0 → briefloop-0.26.1}/runtime-bridge/main.ts +11 -11
  20. briefloop-0.26.1/src/briefloop/__init__.py +1 -0
  21. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/backends/opencode_server.py +2 -31
  22. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/harness.py +1 -1
  23. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/models.py +2 -2
  24. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/native_harness.py +19 -6
  25. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/native_providers.py +65 -3
  26. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/opencode_harness.py +3 -3
  27. briefloop-0.26.1/src/briefloop/provider_catalog.py +155 -0
  28. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/release.py +34 -15
  29. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/review.py +67 -13
  30. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/runtime_reasoning.py +10 -4
  31. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/server.py +6 -1
  32. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/app.js +95 -95
  33. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/index.html +4 -4
  34. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/native-engine.mjs +2 -2
  35. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-bridge.NOTICE.txt +2 -4
  36. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-bridge.mjs +14 -174
  37. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/store.py +2 -2
  38. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop.egg-info/PKG-INFO +5 -3
  39. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop.egg-info/SOURCES.txt +6 -2
  40. briefloop-0.26.1/tests/frontend_model_catalog_refresh.mjs +144 -0
  41. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_model_label.mjs +4 -4
  42. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_model_selection.mjs +0 -15
  43. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_native_runtime.mjs +3 -2
  44. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_provider_capabilities.mjs +3 -1
  45. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_reasoning_controls.mjs +1 -0
  46. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_save_barrier.mjs +2 -1
  47. briefloop-0.26.1/tests/test_agent_backend.py +36 -0
  48. briefloop-0.26.1/tests/test_assessment_admission_recovery.py +17 -0
  49. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_assessment_followup.py +0 -67
  50. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_background_no_question.py +0 -10
  51. briefloop-0.26.1/tests/test_connector_tasks.py +23 -0
  52. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_core.py +0 -56
  53. briefloop-0.26.1/tests/test_cross_module_regressions.py +43 -0
  54. briefloop-0.26.1/tests/test_desktop_lifecycle.py +162 -0
  55. briefloop-0.26.1/tests/test_draft_completion.py +92 -0
  56. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_draft_contract.py +0 -61
  57. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_execution_records.py +0 -25
  58. briefloop-0.26.1/tests/test_execution_timing.py +4 -0
  59. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_export_xlsx.py +0 -59
  60. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_external_requests.py +0 -66
  61. briefloop-0.26.1/tests/test_fact_check_orchestration.py +309 -0
  62. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_fact_check_phase.py +0 -54
  63. briefloop-0.26.1/tests/test_fact_check_review.py +51 -0
  64. briefloop-0.26.1/tests/test_fact_check_switch.py +34 -0
  65. briefloop-0.26.1/tests/test_fast_evidence.py +68 -0
  66. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_fast_mode.py +0 -29
  67. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_fast_qualifier_checks.py +0 -37
  68. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_fast_reports.py +0 -74
  69. briefloop-0.26.1/tests/test_fast_research.py +44 -0
  70. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_harness.py +0 -21
  71. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_human_learning.py +0 -41
  72. briefloop-0.26.1/tests/test_interactive_runtime.py +126 -0
  73. briefloop-0.26.1/tests/test_learning_authorization.py +112 -0
  74. briefloop-0.26.1/tests/test_learning_integrity.py +50 -0
  75. briefloop-0.26.1/tests/test_model_catalog_defaults.py +41 -0
  76. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_multimodal_harness.py +0 -24
  77. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_native_harness.py +8 -16
  78. briefloop-0.26.1/tests/test_native_research_closeout.py +38 -0
  79. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_native_review_contract.py +1 -25
  80. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_notifications.py +0 -15
  81. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_office_cli.py +0 -51
  82. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_office_surfaces.py +0 -119
  83. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_opencode_harness.py +6 -4
  84. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_opencode_idle.py +15 -13
  85. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_opencode_provider.py +2 -0
  86. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_opencode_search_prompt.py +0 -32
  87. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_pr593_roundtrip.py +0 -22
  88. briefloop-0.26.1/tests/test_progress.py +5 -0
  89. briefloop-0.26.1/tests/test_provider_catalog.py +185 -0
  90. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_public_research.py +2 -32
  91. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_reader_workflow.py +0 -18
  92. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_release.py +0 -343
  93. briefloop-0.26.1/tests/test_report_concurrency.py +20 -0
  94. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_report_deletion.py +0 -17
  95. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_report_length_feedback.py +0 -14
  96. briefloop-0.26.1/tests/test_research_budget.py +184 -0
  97. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_research_handoff.py +0 -55
  98. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_research_plan.py +0 -121
  99. briefloop-0.26.1/tests/test_review.py +75 -0
  100. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_review_capability.py +0 -134
  101. briefloop-0.26.1/tests/test_review_finding_consistency.py +251 -0
  102. briefloop-0.26.1/tests/test_review_learning.py +47 -0
  103. briefloop-0.26.1/tests/test_review_modes.py +48 -0
  104. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_review_packet_utf8.py +0 -28
  105. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_review_snapshot.py +0 -39
  106. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_revision_policy.py +0 -50
  107. briefloop-0.26.1/tests/test_role_models.py +26 -0
  108. briefloop-0.26.1/tests/test_runtime_concurrency.py +6 -0
  109. briefloop-0.26.1/tests/test_runtime_json_bom.py +46 -0
  110. briefloop-0.26.1/tests/test_runtime_retry.py +34 -0
  111. briefloop-0.26.1/tests/test_runtime_settlement.py +51 -0
  112. briefloop-0.26.1/tests/test_schedules.py +53 -0
  113. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_scout_experiment.py +0 -21
  114. briefloop-0.26.1/tests/test_search_policy.py +56 -0
  115. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_source_ingestion.py +0 -32
  116. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_source_recovery_regressions.py +0 -12
  117. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_task_notify.py +0 -8
  118. briefloop-0.26.1/tests/test_task_progress.py +3 -0
  119. briefloop-0.26.1/tests/test_template_saved_state.py +54 -0
  120. briefloop-0.26.1/tests/test_templates.py +46 -0
  121. briefloop-0.26.1/tests/test_websearch.py +29 -0
  122. briefloop-0.26.1/tests/test_websearch_singleflight.py +56 -0
  123. {briefloop-0.26.0 → briefloop-0.26.1}/third_party/open-design/NOTICE.md +2 -4
  124. briefloop-0.26.0/VERSION +0 -1
  125. briefloop-0.26.0/src/briefloop/__init__.py +0 -1
  126. briefloop-0.26.0/tests/frontend_model_catalog_refresh.mjs +0 -24
  127. briefloop-0.26.0/tests/test_agent_backend.py +0 -122
  128. briefloop-0.26.0/tests/test_assessment_admission_recovery.py +0 -52
  129. briefloop-0.26.0/tests/test_connector_tasks.py +0 -194
  130. briefloop-0.26.0/tests/test_cross_module_regressions.py +0 -91
  131. briefloop-0.26.0/tests/test_desktop_lifecycle.py +0 -348
  132. briefloop-0.26.0/tests/test_draft_completion.py +0 -349
  133. briefloop-0.26.0/tests/test_execution_timing.py +0 -31
  134. briefloop-0.26.0/tests/test_fact_check_orchestration.py +0 -700
  135. briefloop-0.26.0/tests/test_fact_check_review.py +0 -98
  136. briefloop-0.26.0/tests/test_fact_check_switch.py +0 -115
  137. briefloop-0.26.0/tests/test_fast_evidence.py +0 -137
  138. briefloop-0.26.0/tests/test_fast_research.py +0 -136
  139. briefloop-0.26.0/tests/test_interactive_runtime.py +0 -324
  140. briefloop-0.26.0/tests/test_learning_authorization.py +0 -265
  141. briefloop-0.26.0/tests/test_learning_integrity.py +0 -215
  142. briefloop-0.26.0/tests/test_native_research_closeout.py +0 -109
  143. briefloop-0.26.0/tests/test_progress.py +0 -164
  144. briefloop-0.26.0/tests/test_report_concurrency.py +0 -174
  145. briefloop-0.26.0/tests/test_research_budget.py +0 -514
  146. briefloop-0.26.0/tests/test_review.py +0 -562
  147. briefloop-0.26.0/tests/test_review_final_reply.py +0 -57
  148. briefloop-0.26.0/tests/test_review_learning.py +0 -148
  149. briefloop-0.26.0/tests/test_review_modes.py +0 -171
  150. briefloop-0.26.0/tests/test_role_models.py +0 -171
  151. briefloop-0.26.0/tests/test_runtime_concurrency.py +0 -41
  152. briefloop-0.26.0/tests/test_runtime_json_bom.py +0 -105
  153. briefloop-0.26.0/tests/test_runtime_retry.py +0 -118
  154. briefloop-0.26.0/tests/test_runtime_settlement.py +0 -288
  155. briefloop-0.26.0/tests/test_schedules.py +0 -127
  156. briefloop-0.26.0/tests/test_search_policy.py +0 -156
  157. briefloop-0.26.0/tests/test_task_progress.py +0 -84
  158. briefloop-0.26.0/tests/test_template_saved_state.py +0 -154
  159. briefloop-0.26.0/tests/test_templates.py +0 -160
  160. briefloop-0.26.0/tests/test_websearch.py +0 -133
  161. briefloop-0.26.0/tests/test_websearch_singleflight.py +0 -340
  162. briefloop-0.26.0/third_party/open-design/runtime-models/fallbacks.json +0 -160
  163. {briefloop-0.26.0 → briefloop-0.26.1}/.gitattributes +0 -0
  164. {briefloop-0.26.0 → briefloop-0.26.1}/CONTRIBUTING.md +0 -0
  165. {briefloop-0.26.0 → briefloop-0.26.1}/KNOWN_ISSUES.md +0 -0
  166. {briefloop-0.26.0 → briefloop-0.26.1}/LICENSE +0 -0
  167. {briefloop-0.26.0 → briefloop-0.26.1}/MANIFEST.in +0 -0
  168. {briefloop-0.26.0 → briefloop-0.26.1}/SECURITY.md +0 -0
  169. {briefloop-0.26.0 → briefloop-0.26.1}/THIRD_PARTY_NOTICES.md +0 -0
  170. {briefloop-0.26.0 → briefloop-0.26.1}/bootstrap.py +0 -0
  171. {briefloop-0.26.0 → briefloop-0.26.1}/docs/OpenCode/347/211/210/346/234/254/345/205/274/345/256/271.md" +0 -0
  172. {briefloop-0.26.0 → briefloop-0.26.1}/docs/WorkBuddy/345/244/226/351/203/250/345/205/245/345/217/243.md" +0 -0
  173. {briefloop-0.26.0 → briefloop-0.26.1}/docs/architecture.md +0 -0
  174. {briefloop-0.26.0 → briefloop-0.26.1}/docs/compose/spec/home-v2.md +0 -0
  175. {briefloop-0.26.0 → briefloop-0.26.1}/docs/draft-first.md +0 -0
  176. {briefloop-0.26.0 → briefloop-0.26.1}/docs/jev-precheck.md +0 -0
  177. {briefloop-0.26.0 → briefloop-0.26.1}/docs/native-integration.md +0 -0
  178. {briefloop-0.26.0 → briefloop-0.26.1}/docs/quality-reading-context.md +0 -0
  179. {briefloop-0.26.0 → briefloop-0.26.1}/docs/release-0.26.0.md +0 -0
  180. {briefloop-0.26.0 → briefloop-0.26.1}/docs/report-length.md +0 -0
  181. {briefloop-0.26.0 → briefloop-0.26.1}/docs/report-time-window.md +0 -0
  182. {briefloop-0.26.0 → briefloop-0.26.1}/docs/research-handoff.md +0 -0
  183. {briefloop-0.26.0 → briefloop-0.26.1}/docs/sqlite-benchmark.md +0 -0
  184. {briefloop-0.26.0 → briefloop-0.26.1}/docs/technical-report-0.21.0/evidence-index.md +0 -0
  185. {briefloop-0.26.0 → briefloop-0.26.1}/docs/technical-report-0.21.0/technical-report.md +0 -0
  186. {briefloop-0.26.0 → briefloop-0.26.1}/docs/windows.md +0 -0
  187. {briefloop-0.26.0 → briefloop-0.26.1}/docs/writer-input.md +0 -0
  188. {briefloop-0.26.0 → briefloop-0.26.1}/docs//344/272/247/345/223/201/345/256/232/344/275/215/344/270/216/351/252/214/350/257/201.md" +0 -0
  189. {briefloop-0.26.0 → briefloop-0.26.1}/docs//344/274/232/350/256/256/347/272/252/350/246/201.md" +0 -0
  190. {briefloop-0.26.0 → briefloop-0.26.1}/docs//345/215/207/347/272/247/350/257/264/346/230/216.md" +0 -0
  191. {briefloop-0.26.0 → briefloop-0.26.1}/docs//345/233/276/350/241/250/344/270/216Excel.md" +0 -0
  192. {briefloop-0.26.0 → briefloop-0.26.1}/docs//345/244/232Runtime/344/270/216/346/250/241/345/236/213.md" +0 -0
  193. {briefloop-0.26.0 → briefloop-0.26.1}/docs//345/244/232/346/250/241/346/200/201/346/235/245/346/272/220.md" +0 -0
  194. {briefloop-0.26.0 → briefloop-0.26.1}/docs//345/256/232/346/227/266/346/212/245/345/221/212.md" +0 -0
  195. {briefloop-0.26.0 → briefloop-0.26.1}/docs//345/257/271/350/257/235/345/256/277/344/270/273/345/210/207/346/215/242.md" +0 -0
  196. {briefloop-0.26.0 → briefloop-0.26.1}/docs//346/212/245/345/221/212/347/274/226/350/276/221/344/270/216/346/250/241/346/235/277.md" +0 -0
  197. {briefloop-0.26.0 → briefloop-0.26.1}/docs//346/241/214/351/235/242/345/256/211/350/243/205/344/270/216/346/233/264/346/226/260.md" +0 -0
  198. {briefloop-0.26.0 → briefloop-0.26.1}/docs//346/267/261/345/272/246/347/240/224/347/251/266/344/270/216/344/272/213/345/256/236/346/240/270/346/237/245.md" +0 -0
  199. {briefloop-0.26.0 → briefloop-0.26.1}/docs//347/211/210/346/234/254/344/270/200/350/207/264/346/200/247/346/243/200/346/237/245.md" +0 -0
  200. {briefloop-0.26.0 → briefloop-0.26.1}/docs//350/241/214/344/270/232/346/212/245/345/221/212.md" +0 -0
  201. {briefloop-0.26.0 → briefloop-0.26.1}/docs//350/257/201/345/210/270/347/240/224/347/251/266.md" +0 -0
  202. {briefloop-0.26.0 → briefloop-0.26.1}/docs//350/257/201/346/215/256/344/270/216/347/273/223/350/256/272/350/277/275/346/272/257.md" +0 -0
  203. {briefloop-0.26.0 → briefloop-0.26.1}/docs//351/252/214/346/224/266/350/256/260/345/275/225.md" +0 -0
  204. {briefloop-0.26.0 → briefloop-0.26.1}/examples/internal-weekly-report/README.md +0 -0
  205. {briefloop-0.26.0 → briefloop-0.26.1}/examples/internal-weekly-report/report.md +0 -0
  206. {briefloop-0.26.0 → briefloop-0.26.1}/examples/internal-weekly-report/source.txt +0 -0
  207. {briefloop-0.26.0 → briefloop-0.26.1}/examples/meeting-minutes/transcript.txt +0 -0
  208. {briefloop-0.26.0 → briefloop-0.26.1}/examples/stock-research/earnings-event.txt +0 -0
  209. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/api.js +0 -0
  210. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/app-updates.js +0 -0
  211. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/assessment-checks.js +0 -0
  212. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/assessment-panel.js +0 -0
  213. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/citation-evidence.js +0 -0
  214. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/clipboard.js +0 -0
  215. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/connectors.js +0 -0
  216. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/delivery.js +0 -0
  217. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/dom.js +0 -0
  218. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/excel-export.js +0 -0
  219. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/fact-check-availability.js +0 -0
  220. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/fact-check-grants.js +0 -0
  221. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/jev-checks.js +0 -0
  222. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/job-presentation.js +0 -0
  223. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/length-controls.js +0 -0
  224. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/mcp-selection.js +0 -0
  225. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/notifications.js +0 -0
  226. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/office-tools.js +0 -0
  227. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/polling.js +0 -0
  228. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/provider-capabilities.js +0 -0
  229. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/quick-report.js +0 -0
  230. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/report-browsing.js +0 -0
  231. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/report-export.js +0 -0
  232. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/report-language.js +0 -0
  233. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/report-panels.js +0 -0
  234. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/review-coverage.js +0 -0
  235. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/review-results.js +0 -0
  236. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/review-status.js +0 -0
  237. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/rich-document.js +0 -0
  238. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/schedules.js +0 -0
  239. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/source-library-search.js +0 -0
  240. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/source-upload.js +0 -0
  241. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/task-progress.js +0 -0
  242. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/template-output.js +0 -0
  243. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/templates.js +0 -0
  244. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/time.js +0 -0
  245. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/uploads.js +0 -0
  246. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/version-diff.js +0 -0
  247. {briefloop-0.26.0 → briefloop-0.26.1}/frontend/welcome.js +0 -0
  248. {briefloop-0.26.0 → briefloop-0.26.1}/package-lock.json +0 -0
  249. {briefloop-0.26.0 → briefloop-0.26.1}/package.json +0 -0
  250. {briefloop-0.26.0 → briefloop-0.26.1}/probes/mcp_m0/README.md +0 -0
  251. {briefloop-0.26.0 → briefloop-0.26.1}/probes/mcp_m0/probe.py +0 -0
  252. {briefloop-0.26.0 → briefloop-0.26.1}/probes/mcp_m0/requirements.txt +0 -0
  253. {briefloop-0.26.0 → briefloop-0.26.1}/probes/mcp_m0/server.py +0 -0
  254. {briefloop-0.26.0 → briefloop-0.26.1}/runtime-bridge/build.mjs +0 -0
  255. {briefloop-0.26.0 → briefloop-0.26.1}/runtime-bridge/catalog.json +0 -0
  256. {briefloop-0.26.0 → briefloop-0.26.1}/runtime-bridge/pi.ts +0 -0
  257. {briefloop-0.26.0 → briefloop-0.26.1}/runtime-bridge/reasoning.ts +0 -0
  258. {briefloop-0.26.0 → briefloop-0.26.1}/runtime-bridge/windows-command.ts +0 -0
  259. {briefloop-0.26.0 → briefloop-0.26.1}/runtime-bridge/zcode.ts +0 -0
  260. {briefloop-0.26.0 → briefloop-0.26.1}/scripts/build_frontend.mjs +0 -0
  261. {briefloop-0.26.0 → briefloop-0.26.1}/scripts/build_frontend_licenses.mjs +0 -0
  262. {briefloop-0.26.0 → briefloop-0.26.1}/scripts/check_versions.py +0 -0
  263. {briefloop-0.26.0 → briefloop-0.26.1}/scripts/test_frontend.mjs +0 -0
  264. {briefloop-0.26.0 → briefloop-0.26.1}/setup.cfg +0 -0
  265. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/__main__.py +0 -0
  266. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/_entrypoint.py +0 -0
  267. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/agent_commands.py +0 -0
  268. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/agent_prompts.py +0 -0
  269. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/analyst.py +0 -0
  270. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/analyst_drafts.py +0 -0
  271. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/app_server.py +0 -0
  272. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/audit_bundle.py +0 -0
  273. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/backends/__init__.py +0 -0
  274. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/backends/opencode_v2.py +0 -0
  275. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/bocha.py +0 -0
  276. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/bridge_harness.py +0 -0
  277. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/chat_dispatch.py +0 -0
  278. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/chat_execution.py +0 -0
  279. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/chat_store.py +0 -0
  280. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/chat_tools.py +0 -0
  281. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/cli.py +0 -0
  282. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/codex_diagnostics.py +0 -0
  283. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/company_context.py +0 -0
  284. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/comparison_contract.py +0 -0
  285. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/conflicts.py +0 -0
  286. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/connectors/MATERIALS.md +0 -0
  287. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/connectors/README.md +0 -0
  288. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/connectors/__init__.py +0 -0
  289. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/connectors/config.py +0 -0
  290. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/connectors/grants.py +0 -0
  291. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/connectors/materials.py +0 -0
  292. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/connectors/receipts.py +0 -0
  293. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/connectors/runtime.py +0 -0
  294. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/connectors/runtime_tools.py +0 -0
  295. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/connectors/service.py +0 -0
  296. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/connectors/stdio_supervisor.py +0 -0
  297. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/connectors/task_client.py +0 -0
  298. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/connectors/tasks.py +0 -0
  299. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/connectors/transport.py +0 -0
  300. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/connectors/windows_acl.py +0 -0
  301. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/default_fonts.py +0 -0
  302. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/deliverable_spec.py +0 -0
  303. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/delivery_checks.py +0 -0
  304. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/demo.py +0 -0
  305. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/document_export.py +0 -0
  306. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/document_model.py +0 -0
  307. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/document_workflows.py +0 -0
  308. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/docx_text.py +0 -0
  309. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/draft_checks.py +0 -0
  310. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/draft_completion.py +0 -0
  311. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/duckduckgo.py +0 -0
  312. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/evaluation_reading.py +0 -0
  313. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/evidence.py +0 -0
  314. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/evidence_context.py +0 -0
  315. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/execution_records.py +0 -0
  316. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/execution_timing.py +0 -0
  317. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/export_jobs.py +0 -0
  318. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/exports.py +0 -0
  319. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/external_client.py +0 -0
  320. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/external_requests.py +0 -0
  321. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/fact_check.py +0 -0
  322. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/fast_mode.py +0 -0
  323. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/fast_reports.py +0 -0
  324. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/fast_research.py +0 -0
  325. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/figure_support.py +0 -0
  326. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/figure_text.py +0 -0
  327. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/figures.py +0 -0
  328. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/host_bins.py +0 -0
  329. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/industry_data.py +0 -0
  330. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/industry_export.py +0 -0
  331. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/interactive_runtime.py +0 -0
  332. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/jev.py +0 -0
  333. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/jev_checks.py +0 -0
  334. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/learning.py +0 -0
  335. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/learning_budget.py +0 -0
  336. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/length.py +0 -0
  337. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/media.py +0 -0
  338. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/native_engine.py +0 -0
  339. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/native_orchestrator.py +0 -0
  340. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/native_roles.py +0 -0
  341. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/notifications.py +0 -0
  342. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/office_cli.py +0 -0
  343. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/ooxml_order.py +0 -0
  344. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/opencode_version.py +0 -0
  345. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/packet_views.py +0 -0
  346. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/parent_watch.py +0 -0
  347. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/platform_support.py +0 -0
  348. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/process_host.py +0 -0
  349. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/progress.py +0 -0
  350. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/projections.py +0 -0
  351. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/prompt_assets/core.zh.md +0 -0
  352. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/prompt_assets/mode.background.zh.md +0 -0
  353. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/prompt_assets/mode.interactive.zh.md +0 -0
  354. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/prompt_assets/role.analyst.zh.md +0 -0
  355. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/prompt_assets/role.chat.zh.md +0 -0
  356. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/prompt_assets/role.evaluator.zh.md +0 -0
  357. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/prompt_assets/role.fact_checker.zh.md +0 -0
  358. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/prompt_assets/role.maintainer.zh.md +0 -0
  359. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/prompt_assets/role.orchestrator.zh.md +0 -0
  360. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/prompt_assets/role.proposer.zh.md +0 -0
  361. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/prompt_assets/role.quick_writer.zh.md +0 -0
  362. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/prompt_assets/role.reviewer.zh.md +0 -0
  363. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/prompt_assets/role.scout.zh.md +0 -0
  364. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/reconciliation.py +0 -0
  365. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/report_browsing.py +0 -0
  366. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/report_profiles.py +0 -0
  367. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/report_time.py +0 -0
  368. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/report_tools.py +0 -0
  369. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/research_budget.py +0 -0
  370. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/research_handoff.py +0 -0
  371. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/research_plan.py +0 -0
  372. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/review_capability.py +0 -0
  373. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/review_learning.py +0 -0
  374. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/revision_policy.py +0 -0
  375. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/rpc_writer.py +0 -0
  376. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/runtime.py +0 -0
  377. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/runtime_bridge.py +0 -0
  378. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/runtime_permissions.py +0 -0
  379. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/schedules.py +0 -0
  380. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/scout.py +0 -0
  381. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/scout_evidence.py +0 -0
  382. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/scout_tools.py +0 -0
  383. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/search_credentials.py +0 -0
  384. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/search_policy.py +0 -0
  385. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/skill_assets/briefloop-external/SKILL.md +0 -0
  386. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/skill_assets/duckduckgo/SKILL.md +0 -0
  387. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/skill_assets/multi-search/SKILL.md +0 -0
  388. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/skill_assets/tavily/SKILL.md +0 -0
  389. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/skills.py +0 -0
  390. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/software_version.py +0 -0
  391. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/source_context.py +0 -0
  392. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/source_extraction.py +0 -0
  393. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/source_ingestion.py +0 -0
  394. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/source_library_search.py +0 -0
  395. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/source_search.py +0 -0
  396. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/source_updates.py +0 -0
  397. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/sources.py +0 -0
  398. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/frontend-licenses.txt +0 -0
  399. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/native-engine-licenses.txt +0 -0
  400. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/native-engine-models.json +0 -0
  401. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-aider.png +0 -0
  402. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-amr.svg +0 -0
  403. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-antigravity.svg +0 -0
  404. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-bridge.LICENSE.txt +0 -0
  405. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-briefloop.svg +0 -0
  406. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-claude.svg +0 -0
  407. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-codebuddy.svg +0 -0
  408. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-codex.svg +0 -0
  409. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-copilot.svg +0 -0
  410. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-cursor-agent.svg +0 -0
  411. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-deepseek.svg +0 -0
  412. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-devin.png +0 -0
  413. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-grok-build.svg +0 -0
  414. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-hermes.svg +0 -0
  415. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-kilo.svg +0 -0
  416. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-kimi.svg +0 -0
  417. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-kiro.svg +0 -0
  418. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-mimo.svg +0 -0
  419. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-opencode.svg +0 -0
  420. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-pi.svg +0 -0
  421. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-qoder.svg +0 -0
  422. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-qwen.svg +0 -0
  423. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-reasoning.json +0 -0
  424. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-reasonix.svg +0 -0
  425. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-trae-cli.png +0 -0
  426. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/runtime-vibe.svg +0 -0
  427. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/style.css +0 -0
  428. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/static/tokens.css +0 -0
  429. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/task_labels.py +0 -0
  430. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/task_notify.py +0 -0
  431. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/task_progress.py +0 -0
  432. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/tavily.py +0 -0
  433. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/academic-paper-zh-t1.docx +0 -0
  434. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/academic-paper-zh-t1.spec.json +0 -0
  435. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/academic-paper-zh-t2.docx +0 -0
  436. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/academic-paper-zh-t2.spec.json +0 -0
  437. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/academic-paper-zh-t3.docx +0 -0
  438. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/academic-paper-zh-t3.spec.json +0 -0
  439. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/academic-paper-zh-t4.docx +0 -0
  440. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/academic-paper-zh-t4.spec.json +0 -0
  441. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/academic-paper-zh-t5.docx +0 -0
  442. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/academic-paper-zh-t5.spec.json +0 -0
  443. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/annual-report-zh-t1.docx +0 -0
  444. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/annual-report-zh-t1.spec.json +0 -0
  445. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/annual-report-zh-t2.docx +0 -0
  446. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/annual-report-zh-t2.spec.json +0 -0
  447. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/annual-report-zh-t3.docx +0 -0
  448. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/annual-report-zh-t3.spec.json +0 -0
  449. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/annual-report-zh-t4.docx +0 -0
  450. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/annual-report-zh-t4.spec.json +0 -0
  451. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/annual-report-zh-t5.docx +0 -0
  452. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/annual-report-zh-t5.spec.json +0 -0
  453. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/business-report-zh-t1.docx +0 -0
  454. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/business-report-zh-t1.spec.json +0 -0
  455. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/business-report-zh-t2.docx +0 -0
  456. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/business-report-zh-t2.spec.json +0 -0
  457. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/business-report-zh-t3.docx +0 -0
  458. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/business-report-zh-t3.spec.json +0 -0
  459. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/business-report-zh-t4.docx +0 -0
  460. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/business-report-zh-t4.spec.json +0 -0
  461. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/business-report-zh-t5.docx +0 -0
  462. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/business-report-zh-t5.spec.json +0 -0
  463. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-en-t1.docx +0 -0
  464. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-en-t1.spec.json +0 -0
  465. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-en-t2.docx +0 -0
  466. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-en-t2.spec.json +0 -0
  467. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-en-t3.docx +0 -0
  468. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-en-t3.spec.json +0 -0
  469. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-en-t4.docx +0 -0
  470. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-en-t4.spec.json +0 -0
  471. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-en-t5.docx +0 -0
  472. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-en-t5.spec.json +0 -0
  473. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-zh-t1.docx +0 -0
  474. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-zh-t1.spec.json +0 -0
  475. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-zh-t2.docx +0 -0
  476. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-zh-t2.spec.json +0 -0
  477. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-zh-t3.docx +0 -0
  478. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-zh-t3.spec.json +0 -0
  479. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-zh-t4.docx +0 -0
  480. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-zh-t4.spec.json +0 -0
  481. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-zh-t5.docx +0 -0
  482. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/general-report-zh-t5.spec.json +0 -0
  483. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/government-doc-zh-t4.docx +0 -0
  484. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/government-doc-zh-t4.spec.json +0 -0
  485. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/legal-contract-zh-t1.docx +0 -0
  486. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/legal-contract-zh-t1.spec.json +0 -0
  487. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/legal-contract-zh-t2.docx +0 -0
  488. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/legal-contract-zh-t2.spec.json +0 -0
  489. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/legal-contract-zh-t3.docx +0 -0
  490. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/legal-contract-zh-t3.spec.json +0 -0
  491. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/legal-contract-zh-t4.docx +0 -0
  492. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/legal-contract-zh-t4.spec.json +0 -0
  493. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/legal-contract-zh-t5.docx +0 -0
  494. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/legal-contract-zh-t5.spec.json +0 -0
  495. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/meeting-minutes-zh-t1.docx +0 -0
  496. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/meeting-minutes-zh-t1.spec.json +0 -0
  497. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/meeting-minutes-zh-t2.docx +0 -0
  498. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/meeting-minutes-zh-t2.spec.json +0 -0
  499. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/meeting-minutes-zh-t3.docx +0 -0
  500. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/meeting-minutes-zh-t3.spec.json +0 -0
  501. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/meeting-minutes-zh-t4.docx +0 -0
  502. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/meeting-minutes-zh-t4.spec.json +0 -0
  503. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/meeting-minutes-zh-t5.docx +0 -0
  504. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/meeting-minutes-zh-t5.spec.json +0 -0
  505. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-en-t1.docx +0 -0
  506. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-en-t1.spec.json +0 -0
  507. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-en-t2.docx +0 -0
  508. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-en-t2.spec.json +0 -0
  509. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-en-t3.docx +0 -0
  510. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-en-t3.spec.json +0 -0
  511. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-en-t4.docx +0 -0
  512. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-en-t4.spec.json +0 -0
  513. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-en-t5.docx +0 -0
  514. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-en-t5.spec.json +0 -0
  515. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-zh-t1.docx +0 -0
  516. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-zh-t1.spec.json +0 -0
  517. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-zh-t2.docx +0 -0
  518. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-zh-t2.spec.json +0 -0
  519. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-zh-t3.docx +0 -0
  520. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-zh-t3.spec.json +0 -0
  521. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-zh-t4.docx +0 -0
  522. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-zh-t4.spec.json +0 -0
  523. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-zh-t5.docx +0 -0
  524. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_assets/stock-research-zh-t5.spec.json +0 -0
  525. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/template_conversion.py +0 -0
  526. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/templates.py +0 -0
  527. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/websearch.py +0 -0
  528. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/windows_process.py +0 -0
  529. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/word_import.py +0 -0
  530. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workbook_figures.py +0 -0
  531. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/business_report/evaluation.md +0 -0
  532. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/business_report/manifest.json +0 -0
  533. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/business_report/methods/decision_memo.md +0 -0
  534. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/business_report/methods/industry_periodic.md +0 -0
  535. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/business_report/methods/work_progress.md +0 -0
  536. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/business_report/planning.md +0 -0
  537. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/business_report/writing.md +0 -0
  538. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/general_report/evaluation.md +0 -0
  539. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/general_report/manifest.json +0 -0
  540. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/general_report/planning.md +0 -0
  541. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/general_report/writing.md +0 -0
  542. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/meeting_minutes/evaluation.md +0 -0
  543. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/meeting_minutes/manifest.json +0 -0
  544. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/meeting_minutes/planning.md +0 -0
  545. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/meeting_minutes/writing.md +0 -0
  546. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/stock_research/evaluation.md +0 -0
  547. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/stock_research/manifest.json +0 -0
  548. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/stock_research/methods/company_research.md +0 -0
  549. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/stock_research/methods/event_commentary.md +0 -0
  550. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/stock_research/methods/industry_tracking.md +0 -0
  551. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/stock_research/planning.md +0 -0
  552. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workflow_assets/stock_research/writing.md +0 -0
  553. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workspace_profile.py +0 -0
  554. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/workspaces.py +0 -0
  555. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/writer_assembly.py +0 -0
  556. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/writer_input.py +0 -0
  557. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/writing_guidance.py +0 -0
  558. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/xlsx_export.py +0 -0
  559. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop/zhipu.py +0 -0
  560. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop.egg-info/dependency_links.txt +0 -0
  561. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop.egg-info/entry_points.txt +0 -0
  562. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop.egg-info/requires.txt +0 -0
  563. {briefloop-0.26.0 → briefloop-0.26.1}/src/briefloop.egg-info/top_level.txt +0 -0
  564. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/__init__.py +0 -0
  565. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/__main__.py +0 -0
  566. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/_licenses/LICENSE +0 -0
  567. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/_licenses/NOTICE.md +0 -0
  568. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/_licenses/third_party/acorn/LICENSE +0 -0
  569. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/_licenses/third_party/acorn/NOTICE.md +0 -0
  570. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/_licenses/third_party/officeqa/LICENSE-APACHE +0 -0
  571. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/_licenses/third_party/officeqa/NOTICE +0 -0
  572. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/alfworld/__init__.py +0 -0
  573. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/alfworld/act.sh +0 -0
  574. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/alfworld/rollout.py +0 -0
  575. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/alfworld/step.py +0 -0
  576. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/benchmarks/__init__.py +0 -0
  577. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/benchmarks/alfworld.py +0 -0
  578. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/benchmarks/livemath.py +0 -0
  579. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/benchmarks/sealqa.py +0 -0
  580. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/benchmarks/spreadsheet.py +0 -0
  581. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/cli.py +0 -0
  582. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/codex_identity.py +0 -0
  583. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/engine.py +0 -0
  584. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/feedback_loop.py +0 -0
  585. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/isolated/__init__.py +0 -0
  586. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/isolated/audit.py +0 -0
  587. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/isolated/runtime.py +0 -0
  588. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/isolated/tools_server.py +0 -0
  589. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/jsonl.py +0 -0
  590. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/k4_lock.py +0 -0
  591. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/livemath/__init__.py +0 -0
  592. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/livemath/loop.py +0 -0
  593. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/livemath/rollout.py +0 -0
  594. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/native_agents.py +0 -0
  595. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/officeqa/__init__.py +0 -0
  596. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/officeqa/dataset.py +0 -0
  597. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/officeqa/fetch.py +0 -0
  598. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/officeqa/loop.py +0 -0
  599. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/officeqa/retrieval.py +0 -0
  600. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/officeqa/reward.py +0 -0
  601. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/officeqa/rollout.py +0 -0
  602. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/officeqa/scoring.py +0 -0
  603. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/officeqa/wiki_agents.py +0 -0
  604. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/paper_alignment/__init__.py +0 -0
  605. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/paper_alignment/contracts.py +0 -0
  606. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/paper_alignment/evidence.py +0 -0
  607. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/product.py +0 -0
  608. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/product_cli.py +0 -0
  609. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/product_install.py +0 -0
  610. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/product_views.py +0 -0
  611. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/alfworld/id_split/split_manifest.json +0 -0
  612. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/alfworld/id_split/test.json +0 -0
  613. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/alfworld/id_split/train.json +0 -0
  614. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/alfworld/id_split/val.json +0 -0
  615. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/alfworld/wiki/SKILL-s0.md +0 -0
  616. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/alfworld/wiki/index.md +0 -0
  617. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/alfworld/wiki/logs.md +0 -0
  618. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/alfworld/wiki/prompts/maintainer.md +0 -0
  619. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/alfworld/wiki/prompts/proposer.md +0 -0
  620. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/alfworld/wiki/skill-impact.md +0 -0
  621. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/isolated/model-catalog-direct.json +0 -0
  622. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/livemath/id_split/split_manifest.json +0 -0
  623. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/livemath/id_split/test.json +0 -0
  624. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/livemath/id_split/train.json +0 -0
  625. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/livemath/id_split/val.json +0 -0
  626. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/livemath/id_split-v2/split_manifest.json +0 -0
  627. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/livemath/id_split-v2/test.json +0 -0
  628. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/livemath/id_split-v2/train.json +0 -0
  629. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/livemath/id_split-v2/val.json +0 -0
  630. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/livemath/protocol.json +0 -0
  631. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/livemath/wiki/SKILL-s0.md +0 -0
  632. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/livemath/wiki/index.md +0 -0
  633. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/livemath/wiki/logs.md +0 -0
  634. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/livemath/wiki/prompts/maintainer.md +0 -0
  635. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/livemath/wiki/prompts/proposer.md +0 -0
  636. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/livemath/wiki/skill-impact.md +0 -0
  637. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/officeqa/id_split/split_manifest.json +0 -0
  638. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/officeqa/id_split/test.json +0 -0
  639. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/officeqa/id_split/train.json +0 -0
  640. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/officeqa/id_split/val.json +0 -0
  641. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/officeqa/protocol.json +0 -0
  642. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/officeqa/wiki/SKILL-s0.md +0 -0
  643. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/officeqa/wiki/index.md +0 -0
  644. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/officeqa/wiki/logs.md +0 -0
  645. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/officeqa/wiki/prompts/maintainer.md +0 -0
  646. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/officeqa/wiki/prompts/proposer.md +0 -0
  647. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/officeqa/wiki/skill-impact.md +0 -0
  648. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/paper_alignment/README.md +0 -0
  649. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/paper_alignment/prompts/maintainer.paper.md +0 -0
  650. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/paper_alignment/prompts/officeqa.paper.md +0 -0
  651. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/paper_alignment/prompts/proposer.paper.md +0 -0
  652. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/paper_alignment/prompts/spreadsheet.paper.md +0 -0
  653. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/product/agents/claude-code/wikiskill-executor.md +0 -0
  654. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/product/agents/claude-code/wikiskill-maintainer.md +0 -0
  655. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/product/agents/claude-code/wikiskill-proposer.md +0 -0
  656. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/product/agents/codex/wikiskill-executor.toml +0 -0
  657. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/product/agents/codex/wikiskill-maintainer.toml +0 -0
  658. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/product/agents/codex/wikiskill-proposer.toml +0 -0
  659. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/product/entry-skill/SKILL.md +0 -0
  660. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/product/entry-skill/agents/openai.yaml +0 -0
  661. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/product/entry-skill/references/native-subagents.md +0 -0
  662. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/product/entry-skill/references/workflow.md +0 -0
  663. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/product/roles/executor.md +0 -0
  664. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/product/roles/maintainer.md +0 -0
  665. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/product/roles/proposer.md +0 -0
  666. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/final-20260907/manifest.json +0 -0
  667. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/final-20260907/math-episodes.json +0 -0
  668. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/final-20260907/sealqa-pairs.json +0 -0
  669. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/final-20260907/spreadsheet-SKILL.md +0 -0
  670. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/final-20260907/spreadsheet-pairs.json +0 -0
  671. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/final-20260907/summary.json +0 -0
  672. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/repeatability-20260908/example-provenance.json +0 -0
  673. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/repeatability-20260908/installed-smoke.json +0 -0
  674. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/repeatability-20260908/manifest.json +0 -0
  675. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/repeatability-20260908/repeat1-pairs.json +0 -0
  676. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/repeatability-20260908/repeat2-pairs.json +0 -0
  677. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/repeatability-20260908/repeat3-pairs.json +0 -0
  678. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/repeatability-20260908/summary.json +0 -0
  679. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/repeatability-20260908/wiki-deliver-the-recalculated-workbook.md +0 -0
  680. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/skills/livemath/55.md +0 -0
  681. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/skills/livemath/luna.md +0 -0
  682. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/skills/officeqa/55.md +0 -0
  683. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/skills/officeqa/terra.md +0 -0
  684. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/skills/officeqa-retrieval/55.md +0 -0
  685. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/skills/officeqa-retrieval/sol.md +0 -0
  686. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/skills/sealqa/sol.md +0 -0
  687. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/skills/spreadsheet/55.md +0 -0
  688. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/skills/spreadsheet/sol.md +0 -0
  689. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/snapshot.json +0 -0
  690. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/snapshot.sha256 +0 -0
  691. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/update-20260906/livemath-luna-pairs.json +0 -0
  692. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/update-20260906/livemath-luna-skill.md +0 -0
  693. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/update-20260906/manifest.json +0 -0
  694. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/update-20260906/officeqa-luna-skill.md +0 -0
  695. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/update-20260906/officeqa-sol-skill.md +0 -0
  696. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/update-20260906/officeqa-sol-v2-pairs.json +0 -0
  697. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/update-20260906/studies.json +0 -0
  698. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/update-20260907/effort-analysis.json +0 -0
  699. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/update-20260907/effort-pairs.json +0 -0
  700. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/update-20260907/manifest.json +0 -0
  701. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/update-20260907/officeqa-luna-paper-tools-pairs.json +0 -0
  702. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/update-20260907/officeqa-luna-paper-tools-skill.md +0 -0
  703. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/update-20260907/spreadsheet-luna-scoped-python-pairs.json +0 -0
  704. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/update-20260907/spreadsheet-luna-scoped-python-skill.md +0 -0
  705. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/research/update-20260907/studies.json +0 -0
  706. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/runtime/acorn.mjs +0 -0
  707. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/runtime/audit_js.mjs +0 -0
  708. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/sealqa/id_split/split_manifest.json +0 -0
  709. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/sealqa/id_split/test.json +0 -0
  710. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/sealqa/id_split/train.json +0 -0
  711. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/sealqa/id_split/val.json +0 -0
  712. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/sealqa/protocol.json +0 -0
  713. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/sealqa/wiki/SKILL-s0.md +0 -0
  714. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/sealqa/wiki/index.md +0 -0
  715. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/sealqa/wiki/logs.md +0 -0
  716. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/sealqa/wiki/prompts/maintainer.md +0 -0
  717. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/sealqa/wiki/prompts/proposer.md +0 -0
  718. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/sealqa/wiki/skill-impact.md +0 -0
  719. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/spreadsheet/id_split/split_manifest.json +0 -0
  720. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/spreadsheet/id_split/test.json +0 -0
  721. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/spreadsheet/id_split/train.json +0 -0
  722. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/spreadsheet/id_split/val.json +0 -0
  723. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/spreadsheet/protocol.json +0 -0
  724. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/spreadsheet/wiki/SKILL-s0.md +0 -0
  725. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/spreadsheet/wiki/index.md +0 -0
  726. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/spreadsheet/wiki/logs.md +0 -0
  727. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/spreadsheet/wiki/prompts/maintainer.md +0 -0
  728. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/spreadsheet/wiki/prompts/proposer.md +0 -0
  729. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/resources/spreadsheet/wiki/skill-impact.md +0 -0
  730. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/results.py +0 -0
  731. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/score_rules.py +0 -0
  732. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/scorer_trust.py +0 -0
  733. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/sealqa/__init__.py +0 -0
  734. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/sealqa/loop.py +0 -0
  735. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/sealqa/rollout.py +0 -0
  736. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/settings.py +0 -0
  737. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/skill_proposer.py +0 -0
  738. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/spreadsheet/__init__.py +0 -0
  739. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/spreadsheet/loop.py +0 -0
  740. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/spreadsheet/rollout.py +0 -0
  741. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/spreadsheet/study.py +0 -0
  742. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/tool_audit.py +0 -0
  743. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/wiki.py +0 -0
  744. {briefloop-0.26.0 → briefloop-0.26.1}/src/wikiskill/wiki_maintainer.py +0 -0
  745. {briefloop-0.26.0 → briefloop-0.26.1}/start.ps1 +0 -0
  746. {briefloop-0.26.0 → briefloop-0.26.1}/start.sh +0 -0
  747. {briefloop-0.26.0 → briefloop-0.26.1}/tests/check_distribution.py +0 -0
  748. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_app_updates.mjs +0 -0
  749. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_assessment_checks.mjs +0 -0
  750. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_chat_attachments.mjs +0 -0
  751. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_chat_commands.mjs +0 -0
  752. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_chat_drafts.mjs +0 -0
  753. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_chat_layout.mjs +0 -0
  754. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_chat_polling.mjs +0 -0
  755. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_checkout_eol.mjs +0 -0
  756. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_citation_clipboard.mjs +0 -0
  757. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_citation_edit.mjs +0 -0
  758. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_citation_evidence.mjs +0 -0
  759. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_clipboard_fallback.mjs +0 -0
  760. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_excel_export.mjs +0 -0
  761. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_export_menu.mjs +0 -0
  762. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_fact_check_availability.mjs +0 -0
  763. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_fact_check_grants.mjs +0 -0
  764. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_fast_mode.mjs +0 -0
  765. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_home_v2.mjs +0 -0
  766. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_job_presentation.mjs +0 -0
  767. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_learning_authorization.mjs +0 -0
  768. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_length_controls.mjs +0 -0
  769. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_licenses.mjs +0 -0
  770. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_live_status.mjs +0 -0
  771. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_markdown_import.mjs +0 -0
  772. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_mcp_selection.mjs +0 -0
  773. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_office_tools.mjs +0 -0
  774. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_open_brief_status.mjs +0 -0
  775. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_pending_report.mjs +0 -0
  776. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_polling.mjs +0 -0
  777. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_progress_race.mjs +0 -0
  778. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_quick_report.mjs +0 -0
  779. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_release_controls.mjs +0 -0
  780. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_release_navigation.mjs +0 -0
  781. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_report_browsing.mjs +0 -0
  782. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_report_chat_drawer.mjs +0 -0
  783. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_report_export.mjs +0 -0
  784. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_report_language.mjs +0 -0
  785. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_report_load.mjs +0 -0
  786. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_report_outline.mjs +0 -0
  787. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_report_panels.mjs +0 -0
  788. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_review_capability.mjs +0 -0
  789. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_review_coverage.mjs +0 -0
  790. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_review_status.mjs +0 -0
  791. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_runtime_discovery.mjs +0 -0
  792. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_runtime_feedback.mjs +0 -0
  793. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_settings_workspaces.mjs +0 -0
  794. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_setup_state.mjs +0 -0
  795. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_source_library.mjs +0 -0
  796. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_source_search.mjs +0 -0
  797. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_source_upload.mjs +0 -0
  798. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_startup_recovery.mjs +0 -0
  799. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_task_progress.mjs +0 -0
  800. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_template_groups.mjs +0 -0
  801. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_template_output.mjs +0 -0
  802. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_update_notifications.mjs +0 -0
  803. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_upload_limits.mjs +0 -0
  804. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_version_bodies.mjs +0 -0
  805. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_version_diff.mjs +0 -0
  806. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_welcome_gate.mjs +0 -0
  807. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_workspace_proposal.mjs +0 -0
  808. {briefloop-0.26.0 → briefloop-0.26.1}/tests/frontend_writing_preferences.mjs +0 -0
  809. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_agent_commands.py +0 -0
  810. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_analyst_draft_versions.py +0 -0
  811. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_bridge_harness.py +0 -0
  812. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_builtin_templates.py +0 -0
  813. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_chat_dispatch.py +0 -0
  814. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_chat_execution.py +0 -0
  815. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_chat_model_selection.py +0 -0
  816. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_cli_doctor.py +0 -0
  817. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_codex_idle.py +0 -0
  818. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_connection_test_history.py +0 -0
  819. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_connector_authorization.py +0 -0
  820. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_connector_empty_catalog.py +0 -0
  821. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_connector_materials.py +0 -0
  822. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_connectors.py +0 -0
  823. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_delivery_checks.py +0 -0
  824. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_delivery_consumers.py +0 -0
  825. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_demo.py +0 -0
  826. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_document_workflows.py +0 -0
  827. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_english_reports.py +0 -0
  828. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_entrypoint.py +0 -0
  829. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_evidence.py +0 -0
  830. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_evidence_parse_failures.py +0 -0
  831. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_export_admission.py +0 -0
  832. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_export_layout_swap.py +0 -0
  833. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_fact_check_contract.py +0 -0
  834. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_fact_status_tool.py +0 -0
  835. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_figure_exports.py +0 -0
  836. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_figure_flow.py +0 -0
  837. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_figure_text.py +0 -0
  838. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_figures.py +0 -0
  839. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_generation_schema_guidance.py +0 -0
  840. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_host_bins.py +0 -0
  841. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_industry_export.py +0 -0
  842. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_industry_flow.py +0 -0
  843. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_industry_research.py +0 -0
  844. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_jev_checks.py +0 -0
  845. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_length.py +0 -0
  846. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_length_policy.py +0 -0
  847. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_markdown_download.py +0 -0
  848. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_media_sources.py +0 -0
  849. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_multimodal_http.py +0 -0
  850. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_native_analyst.py +0 -0
  851. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_native_evaluator.py +0 -0
  852. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_native_learning.py +0 -0
  853. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_native_orchestrator.py +0 -0
  854. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_native_provider_storage.py +0 -0
  855. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_native_providers.py +0 -0
  856. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_native_scout.py +0 -0
  857. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_npm_native_shim.py +0 -0
  858. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_numeric_occurrence_review.py +0 -0
  859. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_office_source_structure.py +0 -0
  860. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_ooxml_order.py +0 -0
  861. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_opencode_prompt_versions.py +0 -0
  862. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_opencode_reasoning.py +0 -0
  863. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_opencode_review_version.py +0 -0
  864. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_opencode_server_stdin.py +0 -0
  865. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_opencode_v2.py +0 -0
  866. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_opencode_version_probe.py +0 -0
  867. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_posix_process_tree.py +0 -0
  868. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_product_summary_consistency.py +0 -0
  869. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_progress_pipeline.py +0 -0
  870. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_quality_reading_context.py +0 -0
  871. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_reader_contract.py +0 -0
  872. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_reader_source_export.py +0 -0
  873. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_reconciliation.py +0 -0
  874. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_report_browsing.py +0 -0
  875. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_report_path_regressions.py +0 -0
  876. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_report_time.py +0 -0
  877. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_research_gap_updates.py +0 -0
  878. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_research_response_admission.py +0 -0
  879. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_resume_in_place.py +0 -0
  880. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_review_packet_paths.py +0 -0
  881. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_review_schema_drift.py +0 -0
  882. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_review_visual_input.py +0 -0
  883. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_revision_citations.py +0 -0
  884. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_rich_document.py +0 -0
  885. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_runtime_bridge.py +0 -0
  886. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_runtime_bridge_idle.py +0 -0
  887. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_runtime_liveness.py +0 -0
  888. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_runtime_names.py +0 -0
  889. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_runtime_permissions.py +0 -0
  890. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_search_credentials.py +0 -0
  891. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_semantic_experiment.py +0 -0
  892. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_semantic_governance.py +0 -0
  893. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_server_boundary.py +0 -0
  894. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_settings_transactions.py +0 -0
  895. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_software_version.py +0 -0
  896. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_source_library_search.py +0 -0
  897. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_source_updates.py +0 -0
  898. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_sources_provenance.py +0 -0
  899. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_store_sqlite_benchmark.py +0 -0
  900. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_table_citation_advisory.py +0 -0
  901. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_task_labels.py +0 -0
  902. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_tavily.py +0 -0
  903. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_template_conversion.py +0 -0
  904. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_template_conversion_http.py +0 -0
  905. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_user_source_refresh.py +0 -0
  906. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_version_consistency.py +0 -0
  907. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_wikiskill_engine_windows.py +0 -0
  908. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_windows_antigravity_permissions.py +0 -0
  909. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_windows_connector_acl.py +0 -0
  910. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_windows_distribution.py +0 -0
  911. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_windows_mcp_supervisor.py +0 -0
  912. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_windows_platform.py +0 -0
  913. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_windows_runtime_bundle.py +0 -0
  914. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_word_import.py +0 -0
  915. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_word_source_locators.py +0 -0
  916. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_word_toc.py +0 -0
  917. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_worker_idle.py +0 -0
  918. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_workspace_action_errors.py +0 -0
  919. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_workspace_profile.py +0 -0
  920. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_workspaces.py +0 -0
  921. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_writer_assembly.py +0 -0
  922. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_writer_cli_guidance.py +0 -0
  923. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_writer_context.py +0 -0
  924. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_writer_input.py +0 -0
  925. {briefloop-0.26.0 → briefloop-0.26.1}/tests/test_xlsx_officecli_integration.py +0 -0
  926. {briefloop-0.26.0 → briefloop-0.26.1}/third_party/open-design/LICENSE +0 -0
  927. {briefloop-0.26.0 → briefloop-0.26.1}/third_party/open-design/acp/constants.ts +0 -0
  928. {briefloop-0.26.0 → briefloop-0.26.1}/third_party/open-design/acp/json.ts +0 -0
  929. {briefloop-0.26.0 → briefloop-0.26.1}/third_party/open-design/acp/models.ts +0 -0
  930. {briefloop-0.26.0 → briefloop-0.26.1}/third_party/open-design/acp/rpc.ts +0 -0
  931. {briefloop-0.26.0 → briefloop-0.26.1}/third_party/open-design/acp/session-params.ts +0 -0
  932. {briefloop-0.26.0 → briefloop-0.26.1}/third_party/open-design/acp/types.ts +0 -0
  933. {briefloop-0.26.0 → briefloop-0.26.1}/third_party/open-design/byok-reference/byok-opencode.ts +0 -0
  934. {briefloop-0.26.0 → briefloop-0.26.1}/third_party/open-design/byok-reference/provider-models.ts +0 -0
  935. {briefloop-0.26.0 → briefloop-0.26.1}/third_party/open-design/core/index.ts +0 -0
  936. {briefloop-0.26.0 → briefloop-0.26.1}/third_party/open-design/core/json-line-stream.ts +0 -0
  937. {briefloop-0.26.0 → briefloop-0.26.1}/third_party/open-design/runtime-models/codex-models.ts +0 -0
  938. {briefloop-0.26.0 → briefloop-0.26.1}/third_party/open-design/runtime-models/mmd-routes.ts +0 -0
  939. {briefloop-0.26.0 → briefloop-0.26.1}/third_party/open-design/runtime-models/models.ts +0 -0
  940. {briefloop-0.26.0 → briefloop-0.26.1}/third_party/open-design/runtime-models/opencode-models.ts +0 -0
@@ -1,6 +1,14 @@
1
1
  # 变更记录
2
2
 
3
- ## 0.26.0 · 发行候选(未发布)
3
+ ## 0.26.1 · 发行准备
4
+
5
+ - 修复独立审阅评分重大问题未进入正式核查发现时仍被接纳为完成的缺陷;增加显式关联与历史交付防御,原始拒绝结果保留。重大证据问题不能借非强制条款降为普通提示,草稿编辑与下载继续可用。
6
+ - 模型候选改为实时提供方 API / CLI 宿主目录,移除内置静态候选、具体型号自动预选与固定档位回退;保存连接后旧响应不会覆盖新目录。
7
+ - 按用户要求移除依赖预选型号、必须额外强绑模型才能运行的旧测试;新的审阅接纳验证直接回放保存结果,不派发模型。
8
+
9
+ 发行与平台验证见 [0.26.1 记录](docs/release-0.26.1.md),准备状态不表示现有安装已升级。
10
+
11
+ ## 0.26.0
4
12
 
5
13
  - 新增已有材料及联网快速报告:先保存可编辑下载的初稿,再后台补依据和评价;不额外限制输入字符数,用户编辑优先,正式交付继续绑定独立审阅。
6
14
  - 引用支持正文原句、来源标题与原文上下文;数字检查显示实际可核对范围。快速稿补充事实状态、日期、范围与语义支持检查,未核查保持明确;独立审阅展示逐条结论判断及未核查事项。
@@ -9,7 +17,7 @@
9
17
  - 模型目录按需刷新,报告列表与状态查询优化;增加后台原件读取、Word/已有报告模板入口、表格与分页保护,以及导出版本恢复和内部定位清理。
10
18
  - 纳入 Windows UTF-8 读取/锁修复、SQLite 测量工具和隔离语义实验。没有把实验指标或单个平台检查当作正式发行验收。
11
19
 
12
- 本版本正在集成;渠道与原生安装验收仍按 [发行候选清单](docs/release-0.26.0.md) 推进,不表示现有 App 或 PyPI 已升级。
20
+ 0.26.0 已发布至 GitHub Releases 与 PyPI;冻结前的 [候选清单](docs/release-0.26.0.md) 保留为历史过程记录,实际渠道与原生验收边界见正式发行说明。
13
21
 
14
22
  ## 0.25.0
15
23
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: briefloop
3
- Version: 0.26.0
3
+ Version: 0.26.1
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
@@ -136,14 +136,16 @@ Windows 也可不安装桌面 App,直接启动同一套 Python 服务与网页
136
136
 
137
137
  ## 执行后端与模型
138
138
 
139
+ 新工作区不预选具体模型或思考强度。BriefLoop Agent 从已保存提供方的模型 API 实时读取目录;Agent CLI 使用所选宿主公开的目录或本机路由。打开选择器或点击刷新会重新查询,失败不填回静态模型清单。页面区分目录来源、查询时间和错误;目录可见不代表推理调用已通过。提供方不支持列举模型时仍可手输 ID,已有用户选择和在运行任务不被目录刷新改写。
140
+
139
141
  工作区默认使用 Codex(Responses 通道)。执行宿主可在启动时用 `--backend` 指定,或在网页设置页切换;已排队/已开始的任务冻结原后端,不跟随切换。设置页会检测本机已安装的 CLI,并读取各自的模型目录。
140
142
 
141
143
  | 宿主 | 接入方式 | 模型目录 |
142
144
  | --- | --- | --- |
143
145
  | Codex | 原生 app-server | 原生 `debug models` |
144
146
  | Opencode | 本机原生服务 | 本机 provider/model 配置 |
145
- | Claude Code | bridge(stream-json) | 本机路由;无路由时给内置建议 |
146
- | Kimi、Hermes | bridge(ACP) | ACP 模型目录;读取失败给内置建议 |
147
+ | Claude Code | bridge(stream-json) | 本机路由;未公开目录时支持宿主默认或手输 |
148
+ | Kimi、Hermes | bridge(ACP) | ACP 模型目录;读取失败明确显示原因 |
147
149
  | Reasonix | bridge(ACP) | 原生 `doctor --json` |
148
150
  | MiMo | bridge(JSON 事件流) | 原生 `models --verbose` |
149
151
  | CodeBuddy Code | bridge(原生 `--acp`) | ACP 原生模型目录;支持手输模型 ID |
@@ -96,14 +96,16 @@ Windows 也可不安装桌面 App,直接启动同一套 Python 服务与网页
96
96
 
97
97
  ## 执行后端与模型
98
98
 
99
+ 新工作区不预选具体模型或思考强度。BriefLoop Agent 从已保存提供方的模型 API 实时读取目录;Agent CLI 使用所选宿主公开的目录或本机路由。打开选择器或点击刷新会重新查询,失败不填回静态模型清单。页面区分目录来源、查询时间和错误;目录可见不代表推理调用已通过。提供方不支持列举模型时仍可手输 ID,已有用户选择和在运行任务不被目录刷新改写。
100
+
99
101
  工作区默认使用 Codex(Responses 通道)。执行宿主可在启动时用 `--backend` 指定,或在网页设置页切换;已排队/已开始的任务冻结原后端,不跟随切换。设置页会检测本机已安装的 CLI,并读取各自的模型目录。
100
102
 
101
103
  | 宿主 | 接入方式 | 模型目录 |
102
104
  | --- | --- | --- |
103
105
  | Codex | 原生 app-server | 原生 `debug models` |
104
106
  | Opencode | 本机原生服务 | 本机 provider/model 配置 |
105
- | Claude Code | bridge(stream-json) | 本机路由;无路由时给内置建议 |
106
- | Kimi、Hermes | bridge(ACP) | ACP 模型目录;读取失败给内置建议 |
107
+ | Claude Code | bridge(stream-json) | 本机路由;未公开目录时支持宿主默认或手输 |
108
+ | Kimi、Hermes | bridge(ACP) | ACP 模型目录;读取失败明确显示原因 |
107
109
  | Reasonix | bridge(ACP) | 原生 `doctor --json` |
108
110
  | MiMo | bridge(JSON 事件流) | 原生 `models --verbose` |
109
111
  | CodeBuddy Code | bridge(原生 `--acp`) | ACP 原生模型目录;支持手输模型 ID |
@@ -0,0 +1 @@
1
+ 0.26.1
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "briefloop-desktop",
3
- "version": "0.26.0",
3
+ "version": "0.26.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "briefloop-desktop",
9
- "version": "0.26.0",
9
+ "version": "0.26.1",
10
10
  "hasInstallScript": true,
11
11
  "license": "MIT",
12
12
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "briefloop-desktop",
3
- "version": "0.26.0",
3
+ "version": "0.26.1",
4
4
  "private": true,
5
5
  "description": "BriefLoop local desktop workspace",
6
6
  "author": "Stahl-G",
@@ -0,0 +1,19 @@
1
+ # BriefLoop 0.26.1
2
+
3
+ 本次为 0.26.0 后的修复版本,当前处于发行准备;渠道状态以正式 Release 与验收记录为准。
4
+
5
+ ## 审阅结果不能丢失重大问题
6
+
7
+ 独立审阅中的评分发现与正式核查发现增加关联检查。模型在评分里指出重大问题,却没有把它纳入正式发现时,产品会要求补全审阅,不再接受为完整结果。错误指出需要处理的条目,原始输出保留,普通草稿仍可编辑与下载。
8
+
9
+ 旧版本已经保存的不一致审阅也会在正式交付前被识别;旧记录和原稿不改写,需要补全或重新完成审阅。程序不根据相似措辞猜测关联、不把评分条目自动转换为已核查事实。明确关联的描述可以不同;未提供关联的旧结果只在描述完全相同时兼容。
10
+
11
+ ## 模型目录来自实际服务
12
+
13
+ BriefLoop Agent 查询已保存提供方的模型 API;Agent CLI 使用宿主目录或本机路由。不再展示内置静态模型建议,新工作区也不自动选具体模型和 High。页面明确目录来源、查询状态和错误;提供方不支持列举模型时可手动输入 ID。保存连接后迟到的旧请求不能覆盖新目录。
14
+
15
+ 已保存的模型选择与运行任务保持原配置。目录能读取不代表已验证推理、工具调用或账户额度;必要的模型协议兼容信息仍单独保留。
16
+
17
+ ## 验证边界
18
+
19
+ 审阅修复使用原始失败结果的副本回放及无需模型派发的离线接纳/交付检查;未改写实验原件,不将结构通过等同事实正确。模型目录已在提供方 API 与网页验证,连接失败也如实显示。各平台安装、导出和更新结果将在冻结构建后单独记录。0.26.0 的原生验收记录不计为本版通过。
@@ -20,7 +20,7 @@
20
20
 
21
21
  ## 模型与权限
22
22
 
23
- 主链和 Evaluator、Wiki Maintainer、Skill Proposer 可以分别配置模型。常用模型只是输入建议,自定义 ID 原样交给所选宿主。Codex 的 provider 填写本机 Codex 中已经配置的名称,留空沿用本机配置;其它宿主使用它自己的账号与模型配置(Opencode 可另外在“API 提供商”登记协议、Base URL、Key 和模型)。“模型默认”不额外传推理档位。
23
+ 主链和 Evaluator、Wiki Maintainer、Skill Proposer 可以分别配置模型。模型候选来自实时提供方 API 或所选宿主目录,不使用内置模型建议;自定义 ID 原样交给所选宿主。Codex 的 provider 填写本机 Codex 中已经配置的名称,留空沿用本机配置;其它宿主使用它自己的账号与模型配置(Opencode 可另外在“API 提供商”登记协议、Base URL、Key 和模型)。“模型默认”不额外传推理档位。
24
24
 
25
25
  执行宿主可在设置页切换,已排队或已开始的任务冻结原宿主。输入区只显示当前宿主真正支持的控件:权限档位来自宿主声明的能力,只有一个档位时不显示该下拉;“立即补充”只在支持运行中追加的宿主出现;不支持读图的宿主会在附图时直接提示。切换宿主会清空不再适用的角色模型,留空即继承主链模型。
26
26
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## 使用入口
6
6
 
7
- 在“设置 → 模型与提供商”选择“BriefLoop 内置引擎”。在 API 提供商表单选择用于内置引擎,填写 Provider ID、接口地址、API Key、模型 ID,然后保存并选用。支持表单中的 Chat Completions、Responses 和 Anthropic Messages 协议;不同提供商实际支持的接口和工具能力仍需短测试确认。模型格式为 `provider/model`,可从已配置目录选择或直接输入。
7
+ 在“设置 → 模型与提供商”选择“BriefLoop 内置引擎”。在 API 提供商表单选择用于内置引擎,填写 Provider ID、接口地址、API Key、模型 ID,然后保存并选用。支持表单中的 Chat Completions、Responses 和 Anthropic Messages 协议;不同提供商实际支持的接口和工具能力仍需短测试确认。模型格式为 `provider/model`,候选实时读取已保存提供方的 API,不合并 Pi 内置清单或实验预设;提供方不提供目录时仍可直接输入。目录读取与推理连通性分别显示。未选择思考强度时沿用 Pi SDK 默认或恢复会话的原档位,不额外指定 Low/High。
8
8
 
9
9
  密钥保存在本机 `~/.config/briefloop/native-engine/providers.json`,权限为当前用户读写,不进入工作区、Git、报告、核查包或目录返回值。留空密钥可保留该模型已有密钥。同一提供商使用同一接口与密钥。环境需要 Node.js 22.19+;桌面可使用随壳提供的 Node 模式,不需要安装 OpenCode 或其他 Agent CLI。
10
10
 
@@ -10,6 +10,6 @@
10
10
 
11
11
  ACP 是共用连接协议,但每个 CLI 仍有自己的启动命令、登录方式与能力协商。Kilo、Kiro、Vibe 复用现有 ACP Bridge;本轮接通了设置和执行入口,尚未安装的运行时不会显示为真实测试通过。受限审阅等能力仍由宿主实际权限决定。
12
12
 
13
- 模型列表来自该宿主返回的目录、本机配置或明确标出的内置建议,也可输入模型 ID。选择目录中的模型不表示已验证账号权限。点击“测试”后会打开普通对话,显示回复、错误或停止状态;真实请求可能消耗所配置提供商的额度。
13
+ BriefLoop Agent 的模型列表来自已保存提供方的 API;Agent CLI 的列表来自宿主目录或本机路由。打开选择器或刷新时重新查询,读取失败会显示原因,不添加内置模型建议;仍可输入模型 ID。选择目录中的模型不表示已验证账号权限。点击“测试”后会打开普通对话,显示回复、错误或停止状态;真实请求可能消耗所配置提供商的额度。
14
14
 
15
15
  首页的宿主选择器用于下一回合;已经开始或排队的回合保留冻结配置。运行时名称仍可在该回合的执行信息中查看。
@@ -5,6 +5,7 @@ import {api,uploadSource,setToken,getUploadLimits,setSourceUploadHost} from './a
5
5
  import {createReportBrowsing} from './report-browsing.js';
6
6
  import {createSourceLibrarySearch} from './source-library-search.js';
7
7
  import {createProviderCapabilities} from './provider-capabilities.js';
8
+ import {createModelCatalog,createProviderCatalog} from './model-catalog.js';
8
9
  const providerCapabilities=createProviderCapabilities({$});
9
10
  const reasoning=reasoningControls({api});
10
11
  import {createAssessmentPanel} from './assessment-panel.js';
@@ -386,7 +387,7 @@ function render(first){
386
387
  renderWorkflowChoices(first);
387
388
  if($('review-open'))$('review-open').textContent='审阅与需处理'+(state.conflicts?.length?' · '+state.conflicts.length+' 项来源分歧':'');
388
389
  if(first&&$('report-system-clock')&&state.system_clock)$('report-system-clock').textContent=`本机日期:${state.system_clock.today} · ${state.system_clock.timezone};提交时再次由后台核对。`;
389
- if(first){$('settings-chat-web-default').checked=state.settings.chat_allow_web!==false;$('chat-allow-web').checked=state.settings.chat_allow_web!==false;$('timeout-minutes').value=state.settings.timeout_minutes;$('hard-timeout-minutes').value=state.settings.hard_timeout_minutes||0;$('company-mode').value=state.settings.company_context_enabled==null?'ask':state.settings.company_context_enabled?'on':'off';$('auto-revision').checked=state.settings.auto_revision!==false;state.sources.filter(s=>s.status==='ready').forEach(s=>selected.add(s.id));$('rounds').value=state.settings.k;$('auto-learn').checked=state.learning_authorization?.state==='authorized';$('model-select').value=state.settings.model_selection_required?'':state.settings.model||'gpt-5.6-luna';assignEffort('effort-select',settingsEffort(state.settings,state.settings.agent_backend||'codex'));$('model-provider').value=state.settings.model_provider||'';$('service-tier').value=state.settings.service_tier||'';$('agent-backend').value=state.settings.agent_backend||'codex';$('model-variant').value=state.settings.agent_backend==='mimo'?(state.settings.runtime_efforts?.mimo||''):(state.settings.model_variant||'');updateModelLabel();renderRoleModels();renderReviewRuntime();renderBackend();loadSearchPolicy();renderSearchProvider();refreshRuntimeDiscovery();office.syncSettingsToggle();if(state.requirements)for(const [k,v] of Object.entries(state.requirements)){const e=$('requirements').elements[k];if(e)e.type==='checkbox'?e.checked=v:e.value=v}$('requirements').elements.key_questions_text.value=(state.requirements?.key_questions||[]).join('\n');$('requirements').elements.manual_sections_text.value=(state.requirements?.manual_sections||[]).join('\n');reportLanguageForm.restore(state.requirements?.language);initializeLengthInputs(state.requirements||{});initializeResearchBudget(state.requirements||{});initializeReportProfile(state.requirements||{});if(!state.requirements||state.requirements.fact_check==null)$('requirements').elements.fact_check.checked=!!state.settings.fact_checker;syncFactCheckControl();quickReport.sync();syncWorkflowProfile(false);previewReportTime()}
390
+ if(first){$('settings-chat-web-default').checked=state.settings.chat_allow_web!==false;$('chat-allow-web').checked=state.settings.chat_allow_web!==false;$('timeout-minutes').value=state.settings.timeout_minutes;$('hard-timeout-minutes').value=state.settings.hard_timeout_minutes||0;$('company-mode').value=state.settings.company_context_enabled==null?'ask':state.settings.company_context_enabled?'on':'off';$('auto-revision').checked=state.settings.auto_revision!==false;state.sources.filter(s=>s.status==='ready').forEach(s=>selected.add(s.id));$('rounds').value=state.settings.k;$('auto-learn').checked=state.learning_authorization?.state==='authorized';$('model-select').value=state.settings.model_selection_required?'':state.settings.model||'';assignEffort('effort-select',settingsEffort(state.settings,state.settings.agent_backend||'codex'));$('model-provider').value=state.settings.model_provider||'';$('service-tier').value=state.settings.service_tier||'';$('agent-backend').value=state.settings.agent_backend||'codex';$('model-variant').value=state.settings.agent_backend==='mimo'?(state.settings.runtime_efforts?.mimo||''):(state.settings.model_variant||'');updateModelLabel();renderRoleModels();renderReviewRuntime();renderBackend();loadSearchPolicy();renderSearchProvider();refreshRuntimeDiscovery();office.syncSettingsToggle();if(state.requirements)for(const [k,v] of Object.entries(state.requirements)){const e=$('requirements').elements[k];if(e)e.type==='checkbox'?e.checked=v:e.value=v}$('requirements').elements.key_questions_text.value=(state.requirements?.key_questions||[]).join('\n');$('requirements').elements.manual_sections_text.value=(state.requirements?.manual_sections||[]).join('\n');reportLanguageForm.restore(state.requirements?.language);initializeLengthInputs(state.requirements||{});initializeResearchBudget(state.requirements||{});initializeReportProfile(state.requirements||{});if(!state.requirements||state.requirements.fact_check==null)$('requirements').elements.fact_check.checked=!!state.settings.fact_checker;syncFactCheckControl();quickReport.sync();syncWorkflowProfile(false);previewReportTime()}
390
391
  $('source-count').textContent=state.sources.length+' 份';$('source-list').innerHTML=state.sources.map(s=>`<div class="source-item"><input type="checkbox" data-check="${s.id}" ${selected.has(s.id)?'checked':''} ${s.status!=='ready'?'disabled':''} aria-label="选择 ${esc(s.name)}"><button data-source="${s.id}">${esc(s.name)}</button><span class="tag ${s.status==='failed'?'error':''}">${esc(sourceStatusLabel(s))}</span>${['failed','cancelled','interrupted'].includes(s.status)?`<button data-retry-source="${s.id}">重试</button>`:''}</div>`).join('');
391
392
  document.querySelectorAll('[data-retry-source]').forEach(b=>b.onclick=()=>action(async()=>{const s=await api('retry-source',{source_id:b.dataset.retrySource});selected.delete(b.dataset.retrySource);if(s.status==='ready')selected.add(s.id);notice(sourceStatusLabel(s),['failed','cancelled','interrupted'].includes(s.status))}));
392
393
  document.querySelectorAll('[data-check]').forEach(b=>b.onchange=()=>{if(b.checked){selected.add(b.dataset.check);referenceSelected.delete(b.dataset.check);renderReferenceSources()}else selected.delete(b.dataset.check)});renderReferenceSources();
@@ -719,8 +720,8 @@ async function refreshProgress(){
719
720
  finally{if(progressRequest===request)progressRequest=null}
720
721
  }
721
722
 
722
- function friendlyModel(model){return ({'default':'宿主默认模型','gpt-5.6-luna':'Luna','gpt-5.6-terra':'Terra','gpt-5.6-sol':'Sol','gpt-6-astra':'Astra'}[model]||model)}
723
- function effortValue(runtime,key){return Object.prototype.hasOwnProperty.call(runtime,key)?(runtime[key]||'none'):'high'}
723
+ function friendlyModel(model){return model==='default'?'宿主默认模型':model}
724
+ function effortValue(runtime,key){return Object.prototype.hasOwnProperty.call(runtime,key)?(runtime[key]||'none'):'none'}
724
725
  function assignEffort(id,value){const input=$(id);if(![...input.options].some(o=>o.value===value))input.add(new Option(value,value));input.value=value}
725
726
  function activeChatRuntime(){return chat.messages.find(m=>m.role==='user'&&m.turn_id===chat.session?.turn_id&&m.runtime)?.runtime||chat.session?.runtime||{}}
726
727
  const fastCapabilities=new Map();
@@ -738,7 +739,7 @@ function renderBackend(){
738
739
  $('variant-field').hidden=!variant;document.querySelector('.main-provider-field').style.display=codex?'':'none';
739
740
  $('effort-select').hidden=variant;$('effort-select').closest('label').hidden=variant;
740
741
  reasoning.configure($(variant?'model-variant':'effort-select'),backend,$('model-select').value.trim(),{variant});
741
- $('model-select').placeholder=['opencode','briefloop-native'].includes(backend)?'如 opencode-go/gpt-5.6-luna':'输入任意模型 ID';
742
+ $('model-select').placeholder=['opencode','briefloop-native'].includes(backend)?'输入 provider/model':'输入任意模型 ID';
742
743
  document.querySelectorAll('.role-variant-field').forEach(e=>e.hidden=!variant);
743
744
  document.querySelectorAll('.role-provider-field').forEach(e=>e.style.display=codex?'':'none');
744
745
  document.querySelectorAll('.role-effort-select').forEach(e=>{e.style.display=variant?'none':'';reasoning.configure(variant?$(`role-${e.dataset.roleEffort}-variant`):e,backend,$(`role-${e.dataset.roleEffort}-model`).value.trim()||$('model-select').value.trim(),{variant})});
@@ -796,65 +797,14 @@ async function refreshRuntimeDiscovery(force=false){
796
797
  $('runtime-discovery-status').textContent='正在检测执行引擎…';$('runtime-discovery-refresh').disabled=true;
797
798
  try{const data=await api('runtimes'+(force?'?refresh=1':''));runtimeCatalog=data.runtimes||[];renderRuntimeDiscovery();if(typeof office!=='undefined'&&data.capabilities?.officecli)office.renderSettingsCapability(data.capabilities.officecli);$('runtime-discovery-status').textContent=`检测到 ${runtimeCatalog.filter(r=>r.installed).length} 个本机 CLI,其中 ${runtimeCatalog.filter(r=>r.available).length} 个可选择;检测未验证账号与模型调用,需另行短测试。`+(data.diagnostic?` ${data.diagnostic}`:'');await refreshModelSuggestions(force)}catch(e){$('runtime-discovery-status').textContent='检测失败:'+e.message}finally{$('runtime-discovery-refresh').disabled=false;runtimeScanned=true;if($('welcome')&&!$('welcome').hidden)renderWelcome()}
798
799
  }
799
- $('agent-backend').onchange=()=>action(async()=>{const backend=backendValue(),dropped=Object.keys(state.settings.role_models||{}).length;await api('settings',{agent_backend:backend,model_selection_required:true,role_models:{}});state.settings.agent_backend=backend;state.settings.model_selection_required=true;state.settings.role_models={};assignEffort('effort-select',settingsEffort(state.settings,backend));$('model-variant').value=backend==='mimo'?(state.settings.runtime_efforts?.mimo||''):(state.settings.model_variant||'');reasoning.refresh();$('model-select').value='';$('chat-model').value='';modelCatalog={backend:null,at:0,models:[]};renderRuntimeDiscovery();renderRoleModels();renderBackend();updateComposer();await refreshModelSuggestions();notice(dropped?'宿主已切换;原宿主的角色模型已清空,留空即继承主链模型':'Runtime 已保存;请选择或输入模型')});$('model-variant').onchange=()=>action(saveModel,'Variant 已保存;下一次启动生效');
800
- let modelCatalog={backend:null,at:0,models:[]};
801
- const modelCatalogs=new Map();
802
- function modelTargetBackend(target){return target==='chat-model'?chatBackendChoice():backendValue()}
803
- async function fetchModelCatalog(force=false,backend=backendValue()){
804
- const now=Date.now(),cached=modelCatalogs.get(backend);
805
- if(!force&&cached&&now-cached.at<3600000){if(backend===backendValue())modelCatalog=cached;return cached.models;}
806
- let data;
807
- try{data=await api('models?backend='+encodeURIComponent(backend)+(force?'&refresh=1':''))}
808
- catch(error){if(force){const failure={backend,at:0,models:[],diagnostic:error.message||'模型目录读取失败'};modelCatalogs.set(backend,failure);if(backend===backendValue())modelCatalog=failure}throw error}
809
- const catalog={backend,at:now,models:(data.models||[]).map(m=>typeof m==='string'?{id:m,name:friendlyModel(m)}:{...m,name:m.name||m.label||friendlyModel(m.id),provider:m.provider||runtimeName(backend)}),diagnostic:data.diagnostic||data.error||'',source:data.source||'',note:data.note||''};modelCatalogs.set(backend,catalog);if(backend===backendValue())modelCatalog=catalog;refreshRuntimeModelSummaries();return catalog.models;
810
- }
811
- async function refreshModelSuggestions(force=false){
812
- if(force)fastCapabilities.clear();renderFastControls();
813
- const backend=backendValue();$('model-suggestions').innerHTML='';refreshInlineModelPickers();
814
- try{const models=await fetchModelCatalog(force);if(backend!==backendValue())return;
815
- $('model-suggestions').innerHTML=models.map(m=>`<option value="${esc(m.id)}" label="${esc(m.name||m.id)}"></option>`).join('');refreshInlineModelPickers();
816
- if($('runtime-model-status'))$('runtime-model-status').textContent=modelCatalog.diagnostic||`${runtimeName(backend)}:${models.length} ${modelCatalog.source==='builtin_hints'?'项内置建议':'个模型'}${modelCatalog.source?' · '+({native_config:'本机配置',host:'宿主目录',host_default_only:'宿主未提供目录',builtin_hints:'非实时目录',local_routes:'本机路由'}[modelCatalog.source]||modelCatalog.source):''}。${modelCatalog.note||'可直接输入其他模型 ID。'}`;
817
- }catch(e){if($('runtime-model-status'))$('runtime-model-status').textContent='模型目录读取失败:'+e.message+';可手动输入模型 ID。'}
818
- }
819
- let modelPickerTarget=null;
820
- async function openModelPicker(targetId){
821
- modelPickerTarget=targetId;
822
- $('model-picker-search').value='';
823
- $('model-picker').showModal();
824
- await refreshCurrentModelPicker();
825
- }
826
- function refreshCurrentModelPicker(){return renderModelPicker(true)}
827
- async function renderModelPicker(force=false){
828
- const backend=modelTargetBackend(modelPickerTarget);let models,status,error='';
829
- try{
830
- models=await fetchModelCatalog(force,backend);refreshInlineModelPickers();
831
- const note=modelCatalogs.get(backend)?.note;
832
- status=`${runtimeName(backend)} · ${models.length} ${modelCatalogs.get(backend)?.source==='builtin_hints'?'项内置建议':'个模型'};${note||'可手填模型 ID'}`;
833
- }catch(e){models=[];error=e.message||'模型目录读取失败';refreshInlineModelPickers()}
834
- const q=$('model-picker-search').value.trim().toLowerCase();
835
- const shown=models.filter(m=>!q||m.id.toLowerCase().includes(q)||(m.name||'').toLowerCase().includes(q)||(m.provider||'').toLowerCase().includes(q));
836
- $('model-picker-status').textContent=(error?('读取失败:'+error+';可直接手填模型 ID'):(models.length?status:emptyCatalogLabel(backend,modelCatalogs.get(backend))))+(q?` · 筛出 ${shown.length} 个`:'');
837
- let lastProvider=null,html='';
838
- for(const m of shown){
839
- if(m.provider!==lastProvider){lastProvider=m.provider;html+=`<h3 class="workspace-list-heading">${esc(m.provider)}</h3>`}
840
- html+=`<button type="button" class="workspace-choice" data-model-pick="${esc(m.id)}"><span><strong>${esc(m.id)}</strong><small>${esc(m.name||'')}</small></span><em>选用</em></button>`;
841
- }
842
- const custom=$('model-picker-search').value.trim();
843
- const customChoice=custom&&!/\s/.test(custom)&&!shown.some(m=>m.id===custom)?`<button type="button" class="workspace-choice" data-model-pick="${esc(custom)}"><span><strong>${esc(custom)}</strong><small>使用此模型 ID</small></span><em>选用</em></button>`:'';
844
- $('model-picker-list').innerHTML=(html||(error?('<p class="help">读取失败:'+esc(error)+'</p>'):(models.length?'<p class="help">没有匹配的模型。可直接输入完整模型 ID 后按回车选用。</p>':'<p class="help">'+esc(emptyCatalogLabel(backend,modelCatalogs.get(backend)))+'</p>')))+customChoice;
845
- $('model-picker-list').querySelectorAll('[data-model-pick]').forEach(b=>b.onclick=()=>pickModel(b.dataset.modelPick));
846
- }
847
- function pickModel(id){
848
- const el=modelPickerTarget&&$(modelPickerTarget);
849
- $('model-picker').close();
850
- if(!el)return;
851
- el.value=id;
852
- el.dispatchEvent(new Event('change',{bubbles:true}));
853
- }
800
+ $('agent-backend').onchange=()=>action(async()=>{const backend=backendValue(),dropped=Object.keys(state.settings.role_models||{}).length;await api('settings',{agent_backend:backend,model_selection_required:true,role_models:{}});state.settings.agent_backend=backend;state.settings.model_selection_required=true;state.settings.role_models={};assignEffort('effort-select',settingsEffort(state.settings,backend));$('model-variant').value=backend==='mimo'?(state.settings.runtime_efforts?.mimo||''):(state.settings.model_variant||'');reasoning.refresh();$('model-select').value='';$('chat-model').value='';renderRuntimeDiscovery();renderRoleModels();renderBackend();updateComposer();await refreshModelSuggestions();notice(dropped?'宿主已切换;原宿主的角色模型已清空,留空即继承主链模型':'Runtime 已保存;请选择或输入模型')});$('model-variant').onchange=()=>action(saveModel,'Variant 已保存;下一次启动生效');
801
+ const modelDirectory=createModelCatalog({api,$,getBackend:backendValue,getChatBackend:chatBackendChoice,runtimeName,onCatalogChange:refreshRuntimeModelSummaries});
802
+ const {catalogs:modelCatalogs,fetchModelCatalog,openModelPicker,refreshCurrentModelPicker,renderModelPicker,pickModel,refreshInlineModelPickers,setupModelPickers}=modelDirectory;
803
+ async function refreshModelSuggestions(force=false){if(force)fastCapabilities.clear();renderFastControls();await modelDirectory.refreshModelSuggestions()}
854
804
  $('model-picker-close').onclick=()=>$('model-picker').close();
855
805
  $('model-picker-search').oninput=()=>renderModelPicker();
856
806
  $('model-picker-search').onkeydown=event=>{if(event.key==='Enter'&&!event.isComposing){event.preventDefault();const id=event.target.value.trim();if(id&&!/\s/.test(id))pickModel(id)}};
857
- $('model-picker-refresh').onclick=()=>action(refreshCurrentModelPicker,'模型目录已刷新');
807
+ $('model-picker-refresh').onclick=()=>refreshCurrentModelPicker();
858
808
  $('model-select').onchange=()=>{reasoning.refresh();renderBackend();return action(saveModel,'模型已保存;下一次启动生效')};$('service-tier').onchange=()=>action(saveModel,'速度已保存;下一次启动生效');$('effort-select').onchange=()=>action(saveModel,'推理档位已保存;下一次启动生效');$('model-provider').onchange=()=>action(saveModel,'Provider 已保存;下一次启动生效');$('model-browse').onclick=()=>openModelPicker('model-select');
859
809
  $('model-apply-session').onclick=()=>{
860
810
  const session=chat.session;
@@ -933,7 +883,7 @@ function restoreDraft({preserveNewDraft=false}={}){
933
883
  const runtime=saved||sessionRuntime||fallback;
934
884
  // Searching is the expected default for a fresh chat; a saved draft keeps the user's own choice.
935
885
  $('chat-input').value=d?.text||'';chat.attachments=new Set(d?.sources||[]);$('chat-allow-web').checked=d&&('allow_web' in d)?!!d.allow_web:(chat.id?[...(chat.messages||[])].reverse().find(m=>m.role==='user'&&m.purpose!=='runtime_test')?.allow_web??(state.settings.chat_allow_web!==false):state.settings.chat_allow_web!==false);chat.hostOptions=runtime.host_options||{};
936
- $('chat-model').value=runtime.model||'';assignEffort('chat-effort',Object.hasOwn(runtime,'effort')?effortValue(runtime,'effort'):(backend==='codex'?'high':'none'));if($('chat-variant'))$('chat-variant').value=runtime.variant||(runtime.backend==='mimo'?runtime.effort:'')||'';
886
+ $('chat-model').value=runtime.model||'';assignEffort('chat-effort',Object.hasOwn(runtime,'effort')?effortValue(runtime,'effort'):'none');if($('chat-variant'))$('chat-variant').value=runtime.variant||(runtime.backend==='mimo'?runtime.effort:'')||'';
937
887
  $('chat-model-provider').value=runtime.model_provider||'';$('chat-service-tier').value=runtime.service_tier||'';$('chat-permission').value=runtime.permission||'workspace-write';
938
888
  renderAttachments();updateComposer();autoSizeChatInput();refreshInlineModelPickers();
939
889
  }
@@ -970,7 +920,7 @@ function renderChatRuntimePermissions(){
970
920
  const effortField=document.querySelector('label[for="chat-effort"]');
971
921
  if(effortField)effortField.hidden=['opencode','briefloop-native','mimo'].includes(backend);
972
922
  }
973
- function runtimeChoice(){const model=$('chat-model').value.trim();if(!model)throw Error('请输入模型 ID');const backend=chatBackendChoice();if(!['codex','opencode','briefloop-native'].includes(backend)){return {model:reasoningModel(backend,model,$('chat-effort').value),backend,effort:backend==='mimo'?($('chat-variant').value.trim()||null):($('chat-effort').value==='none'?null:$('chat-effort').value),permission:'runtime-native',host_options:chat.hostOptions||{}}}if(['opencode','briefloop-native'].includes(backend)){if(!model.includes('/'))throw Error('Opencode 模型必须是 provider/model 形式,例如 opencode-go/gpt-5.6-luna');return {model,backend,variant:($('chat-variant')?.value||'').trim()||null,permission:$('chat-permission').value}}return {model,backend,model_provider:$('chat-model-provider').value.trim()||null,effort:$('chat-effort').value,service_tier:selectedServiceTier('chat-service-tier',fastControlConfig('chat'),true),permission:$('chat-permission').value}}
923
+ function runtimeChoice(){const model=$('chat-model').value.trim();if(!model)throw Error('请输入模型 ID');const backend=chatBackendChoice();if(!['codex','opencode','briefloop-native'].includes(backend)){return {model:reasoningModel(backend,model,$('chat-effort').value),backend,effort:backend==='mimo'?($('chat-variant').value.trim()||null):($('chat-effort').value==='none'?null:$('chat-effort').value),permission:'runtime-native',host_options:chat.hostOptions||{}}}if(['opencode','briefloop-native'].includes(backend)){if(!model.includes('/'))throw Error('模型必须是 provider/model 形式');return {model,backend,variant:($('chat-variant')?.value||'').trim()||null,permission:$('chat-permission').value}}return {model,backend,model_provider:$('chat-model-provider').value.trim()||null,effort:$('chat-effort').value,service_tier:selectedServiceTier('chat-service-tier',fastControlConfig('chat'),true),permission:$('chat-permission').value}}
974
924
  function messageTime(value){return clock(value)}
975
925
  function chatError(text=''){$('chat-error').textContent=text;$('chat-error').hidden=!text}
976
926
  function sessionMissing(error){return /会话或消息不存在|会话不存在/.test(String(error&&error.message||error||''))}
@@ -1509,7 +1459,7 @@ $('chat-permission').onchange=()=>{rememberDraft();updateComposer()};
1509
1459
  function showSettings(){$('settings-chat-web-default').checked=state.settings.chat_allow_web!==false;$('timeout-minutes').value=state.settings.timeout_minutes;$('hard-timeout-minutes').value=state.settings.hard_timeout_minutes||0;moveSearchSettings('settings');page('settings-dialog');$('settings-dialog').scrollIntoView({block:'start'});refreshRuntimeDiscovery();office.syncSettingsToggle();updateLearningPause().catch(()=>{});refreshTavilySettings().catch(()=>{})}
1510
1460
  $('settings-open').onclick=showSettings;$('settings-close').onclick=()=>page('chat');
1511
1461
  {
1512
- const modelPanel=document.querySelector('.model-settings');const shortcut=document.createElement('div');shortcut.className='setup-settings-shortcut';shortcut.innerHTML='<div><span>生成模型</span><strong id="setup-model-summary">Luna / high</strong></div><button type="button" class="outline">模型与角色设置</button>';shortcut.querySelector('button').onclick=showSettings;modelPanel.before(shortcut);$('settings-model-block').append(modelPanel);
1462
+ const modelPanel=document.querySelector('.model-settings');const shortcut=document.createElement('div');shortcut.className='setup-settings-shortcut';shortcut.innerHTML='<div><span>生成模型</span><strong id="setup-model-summary">未指定模型</strong></div><button type="button" class="outline">模型与角色设置</button>';shortcut.querySelector('button').onclick=showSettings;modelPanel.before(shortcut);$('settings-model-block').append(modelPanel);
1513
1463
  const providerRow=document.querySelector('.chat-provider-row');providerRow.querySelector('label').textContent='当前对话 Provider';providerRow.querySelector('span').textContent='用于当前对话下一次执行';$('settings-model-block').append(providerRow);
1514
1464
  const learningControl=document.querySelector('.learning-control'),learningHelp=learningControl.nextElementSibling,autoLearnLabel=$('auto-learn').closest('label');$('settings-learning-block').append(learningControl,learningHelp,autoLearnLabel);
1515
1465
  const link=document.createElement('button');link.type='button';link.className='outline feedback-settings';link.textContent='学习设置';link.onclick=showSettings;$('learn-now').before(link);
@@ -1879,43 +1829,6 @@ $('report-data-open').onclick=()=>action(async()=>{
1879
1829
  });
1880
1830
 
1881
1831
 
1882
- // An explicit select lists every suggestion; the text input stays unrestricted.
1883
- function emptyCatalogLabel(backend,catalog){const why=String(catalog?.diagnostic||'').trim()||'没有读取到模型列表';return `${runtimeName(backend)}:${why}(可直接输入模型 ID)`}
1884
- function refreshInlineModelPickers(){
1885
- const chatBackend=modelTargetBackend('chat-model');
1886
- if(!modelCatalogs.has(chatBackend))fetchModelCatalog(false,chatBackend).then(()=>refreshInlineModelPickers()).catch(e=>{modelCatalogs.set(chatBackend,{backend:chatBackend,at:0,models:[],diagnostic:e.message||'模型目录读取失败'});refreshInlineModelPickers()});
1887
- document.querySelectorAll('.model-picker-select').forEach(select=>{
1888
- const input=select.parentElement.querySelector('input');select.replaceChildren(new Option('▾',''));
1889
- const backend=modelTargetBackend(input?.id),catalog=modelCatalogs.get(backend),models=catalog?.models||[];
1890
- for(const model of models)select.add(new Option(model.name+' · '+model.id,model.id));
1891
- if(!models.length){const warn=new Option(emptyCatalogLabel(backend,catalog),'__empty__');warn.disabled=true;select.add(warn)}
1892
- select.add(new Option('输入其他模型 ID…','__custom__'));
1893
- select.add(new Option('搜索全部模型…','__browse__'));
1894
- if(input?.dataset.roleModel)select.add(new Option('继承主链模型','__inherit__'));
1895
- });
1896
- }
1897
- function setupModelPickers(root=document){
1898
- for(const input of root.querySelectorAll('input[list="model-suggestions"]')){
1899
- input.removeAttribute('list');
1900
- const wrap=document.createElement('span');wrap.className='model-picker';input.before(wrap);wrap.append(input);
1901
- const select=document.createElement('select');select.className='model-picker-select';select.setAttribute('aria-label',input.id==='chat-model'?'选择模型':'选择'+(input.getAttribute('aria-label')||'模型'));select.title='常用模型建议;也可直接在左侧输入其他模型 ID';
1902
- select.add(new Option('▾',''));
1903
- const models=modelCatalogs.get(modelTargetBackend(input?.id))?.models||[];
1904
- for(const model of models)select.add(new Option(model.name+' · '+model.id,model.id));
1905
- select.add(new Option('输入其他模型 ID…','__custom__'));
1906
- select.add(new Option('搜索全部模型…','__browse__'));
1907
- if(input.dataset.roleModel)select.add(new Option('继承主链模型','__inherit__'));
1908
- select.onchange=()=>{
1909
- const model=select.value;select.value='';if(input.disabled)return;
1910
- if(model==='__custom__'){input.focus();input.select();return}
1911
- if(model==='__browse__'){openModelPicker(input.id);return}
1912
- if(!model)return;input.value=model==='__inherit__'?'':model;
1913
- input.dispatchEvent(new Event('input',{bubbles:true}));input.dispatchEvent(new Event('change',{bubbles:true}));input.focus();
1914
- };
1915
- wrap.append(select);
1916
- new MutationObserver(()=>{select.disabled=input.disabled}).observe(input,{attributes:true,attributeFilter:['disabled']});select.disabled=input.disabled;
1917
- }
1918
- }
1919
1832
  setupModelPickers();
1920
1833
 
1921
1834
 
@@ -2002,7 +1915,7 @@ $('template-default').onclick=()=>action(()=>api('settings',{default_template_id
2002
1915
 
2003
1916
  let savedProviderConfigurations=[];
2004
1917
  function providerEndpoint(){return $('provider-engine').value==='briefloop-native'?'native':'opencode'}
2005
- $('provider-engine').onchange=()=>{$('custom-api-key').value='';$('custom-provider').value='';$('provider-open').click()};
1918
+ $('provider-engine').onchange=()=>{providerDirectory.invalidate();$('custom-api-key').value='';$('custom-provider').value='';$('provider-open').click()};
2006
1919
  $('provider-open').onclick=async()=>{$('provider-result').textContent='';$('custom-supports-images').value='';providerCapabilities.reset(providerEndpoint());$('provider-use').hidden=true;settingsView('models');settingsModelTab('api');
2007
1920
  try{const r=await api(providerEndpoint()+'/providers');savedProviderConfigurations=r.configurations||[];
2008
1921
  $('custom-saved').innerHTML='<option value="">新建配置</option>'+savedProviderConfigurations.map((p,i)=>`<option value="${i}">${esc(p.name)} · ${esc(p.model)}</option>`).join('');
@@ -2025,30 +1938,25 @@ $('provider-close').onclick=()=>{$('custom-api-key').value='';if(welcomeFromProv
2025
1938
  $('provider-dialog').addEventListener('close',()=>{$('custom-api-key').value=''});
2026
1939
  $('provider-form').onsubmit=async event=>{
2027
1940
  event.preventDefault();const button=$('provider-save');button.disabled=true;$('provider-result').textContent='正在保存到本机…';
2028
- const body={protocol:$('custom-protocol').value,name:$('custom-name').value.trim(),context_limit:$('custom-context-limit').value?Number($('custom-context-limit').value):null,output_limit:$('custom-output-limit').value?Number($('custom-output-limit').value):null,provider:$('custom-provider').value.trim(),base_url:$('custom-base-url').value.trim(),model:$('custom-model').value.trim(),api_key:$('custom-api-key').value,supports_images:$('custom-supports-images').value===''?null:$('custom-supports-images').value==='true',...providerCapabilities.read(providerEndpoint())};
1941
+ const engine=providerEndpoint(),backend=engine==='native'?'briefloop-native':'opencode';
1942
+ const body={protocol:$('custom-protocol').value,name:$('custom-name').value.trim(),context_limit:$('custom-context-limit').value?Number($('custom-context-limit').value):null,output_limit:$('custom-output-limit').value?Number($('custom-output-limit').value):null,provider:$('custom-provider').value.trim(),base_url:$('custom-base-url').value.trim(),model:$('custom-model').value.trim(),api_key:$('custom-api-key').value,supports_images:$('custom-supports-images').value===''?null:$('custom-supports-images').value==='true',...providerCapabilities.read(engine)};
2029
1943
  $('custom-api-key').value='';
2030
1944
  try{
2031
- const result=await api(providerEndpoint()+'/provider',body);body.api_key='';
2032
- $('provider-use').hidden=false;$('provider-use').dataset.model=result.model;$('provider-use').dataset.backend=$('provider-engine').value;
1945
+ const result=await api(engine+'/provider',body);body.api_key='';
1946
+ modelDirectory.invalidate(backend);providerDirectory.invalidate(engine,body.provider);
1947
+ const refreshed=modelDirectory.fetchModelCatalog(true,backend);
1948
+ if(engine!==providerEndpoint()||body.provider!==$('custom-provider').value.trim()){await refreshed;return}
1949
+ $('provider-use').hidden=false;$('provider-use').dataset.model=result.model;$('provider-use').dataset.backend=backend;
2033
1950
  $('provider-result').textContent='已保存 '+result.model+'。当前模型选择保持原值。';
2034
- await loadProviderCatalog();
1951
+ await Promise.all([refreshed,loadProviderCatalog()]);
2035
1952
  }catch(e){$('provider-result').textContent=e.message}finally{body.api_key='';button.disabled=false}
2036
1953
  };
2037
1954
 
2038
- let providerCatalogRequest=0;
2039
- async function loadProviderCatalog(){
2040
- const provider=$('custom-provider').value.trim();if(!provider)return;
2041
- const engine=providerEndpoint(),request=++providerCatalogRequest;$('provider-model-options').innerHTML='';
2042
- $('provider-result').textContent='正在读取模型目录…';
2043
- try{
2044
- const r=await api(engine+'/provider-catalog',{provider});
2045
- if(request!==providerCatalogRequest||engine!==providerEndpoint()||provider!==$('custom-provider').value.trim())return;
2046
- $('provider-model-options').innerHTML=(r.models||[]).map(id=>`<option value="${esc(id)}"></option>`).join('');
2047
- const labels={reachable:'目录已更新',auth_failed:'认证失败',insufficient_balance:'余额不足',forbidden:'无权访问',catalog_unavailable:'目录接口不可用,可手填模型',rate_limited:'请求限流',upstream_unavailable:'服务商暂不可用',connection_failed:'连接失败,可手填模型',invalid_catalog:'响应不是可识别的模型目录',http_error:'接口返回错误'};
2048
- $('provider-result').textContent=(labels[r.status]||r.status)+' · '+(r.models||[]).length+' 个模型。未调用模型。';
2049
- }catch(e){if(request===providerCatalogRequest)$('provider-result').textContent='目录读取失败:'+e.message+';可手动输入模型 ID。'}
2050
- }
1955
+ const providerDirectory=createProviderCatalog({api,$,getEndpoint:providerEndpoint,modelDirectory});
1956
+ const loadProviderCatalog=()=>providerDirectory.load();
2051
1957
  $('provider-catalog').onclick=loadProviderCatalog;
1958
+ $('custom-model').onfocus=loadProviderCatalog;
1959
+ $('custom-provider').oninput=()=>providerDirectory.invalidate();
2052
1960
  $('provider-test-model').onclick=()=>action(async()=>{
2053
1961
  $('provider-result').textContent='正在提交短工具调用…';
2054
1962
  const r=providerEndpoint()==='native'?await api('runtime-test',{backend:'briefloop-native',model:$('custom-provider').value.trim()+'/'+$('custom-model').value.trim()}):await api('opencode/provider-test',{provider:$('custom-provider').value.trim(),model:$('custom-model').value.trim()});
@@ -2069,7 +1977,7 @@ $('custom-protocol').onchange=()=>{
2069
1977
  };
2070
1978
  $('custom-preset').onchange=()=>{
2071
1979
  const presets={deepseek:['DeepSeek','deepseek','chat-completions','https://api.deepseek.com'],openai:['OpenAI','openai-custom','responses','https://api.openai.com/v1'],anthropic:['Anthropic','anthropic-custom','anthropic-messages','https://api.anthropic.com/v1']};
2072
- const p=presets[$('custom-preset').value];if(!p)return;
1980
+ const p=presets[$('custom-preset').value];if(!p)return;providerDirectory.invalidate();
2073
1981
  ['custom-name','custom-provider','custom-protocol','custom-base-url'].forEach((id,i)=>$(id).value=p[i]);
2074
1982
  };
2075
1983
 
@@ -0,0 +1,171 @@
1
+ import {esc} from './dom.js';
2
+
3
+ const sourceNames={provider_api:'提供方 API',host:'宿主目录',host_catalog:'宿主目录',host_session:'宿主会话目录',native_config:'本机配置',local_settings:'本机配置',local_routes:'本机路由',host_default_only:'宿主未提供目录',unsupported:'不支持目录',builtin_hints:'静态建议(已停用)'};
4
+ const statusNames={ok:'目录已读取',reachable:'目录已读取',partial:'部分目录读取失败',error:'目录读取失败',failed:'目录读取失败',unsupported:'不支持列举模型',unavailable:'宿主未提供目录',configured:'已读取本机设置(非实时目录)',unconfigured:'尚未配置提供商',empty:'目录为空',auth_failed:'认证失败',insufficient_balance:'余额不足',forbidden:'无权访问',catalog_unavailable:'目录接口不可用',rate_limited:'请求限流',upstream_unavailable:'提供方暂不可用',connection_failed:'连接失败',invalid_catalog:'目录响应无法识别',http_error:'接口返回错误'};
5
+ const unavailable=new Set(['error','failed','unsupported','unconfigured','auth_failed','insufficient_balance','forbidden','catalog_unavailable','rate_limited','upstream_unavailable','connection_failed','invalid_catalog','http_error']);
6
+ export function catalogSource(source){return sourceNames[source]||source||'来源未说明'}
7
+ export function catalogStatus(catalog){
8
+ if(catalog?.loading)return '正在查询目录;上次结果尚未刷新';
9
+ if(!catalog)return '尚未读取目录';
10
+ return statusNames[catalog.status]||catalog.status||(catalog.models?.length?'目录已读取':'未读取到模型');
11
+ }
12
+ export function catalogDescription(catalog,name=''){
13
+ const parts=[name,catalogStatus(catalog)];
14
+ if(catalog){
15
+ parts.push(catalogSource(catalog.source));
16
+ if(catalog.models?.length)parts.push(`${catalog.models.length} 个模型`);
17
+ const checked=catalog.checked_at||catalog.refreshed_at;
18
+ if(checked)parts.push(`${catalog.loading?'上次查询':'查询时间'}:${checked}`);
19
+ if(catalog.diagnostic)parts.push(catalog.diagnostic);
20
+ if(catalog.note)parts.push(catalog.note);
21
+ const providers=(catalog.providers||[]).map(p=>`${p.name||p.provider||p.id}:${statusNames[p.status]||p.status||'状态未说明'}${p.diagnostic?'('+p.diagnostic+')':''}`);
22
+ if(providers.length)parts.push(providers.join(';'));
23
+ }
24
+ return parts.filter(Boolean).join(' · ')+'。可手动输入模型 ID;目录结果不代表模型调用成功。';
25
+ }
26
+
27
+ // One live source for every model selector. Settled results are only a display
28
+ // snapshot: every open/refresh queries the backend, while concurrent opens share
29
+ // the same request. A response never writes a selected model or selected backend.
30
+ export function createModelCatalog({api,$,getBackend,getChatBackend,runtimeName=id=>id,onCatalogChange=()=>{},document:doc=globalThis.document,Option:OptionClass=globalThis.Option,MutationObserver:Observer=globalThis.MutationObserver}){
31
+ const catalogs=new Map(),pending=new Map(),generations=new Map();
32
+ let pickerTarget=null,pickerRevision=0;
33
+ const targetBackend=target=>{
34
+ const backendInput=target&&$(target)?.dataset?.modelBackendInput;
35
+ return backendInput?$(backendInput)?.value||getBackend():target==='chat-model'?getChatBackend():getBackend();
36
+ };
37
+ function normalize(data,backend){
38
+ const disabled=data.source==='builtin_hints'||unavailable.has(data.status);
39
+ const models=disabled?[]:(data.models||[]).map(m=>typeof m==='string'?{id:m,name:m}:{...m,name:m.name||m.label||m.id}).filter(m=>m.id);
40
+ return {...data,backend,models,loading:false,diagnostic:data.diagnostic||data.error||'',providers:Array.isArray(data.providers)?data.providers:[]};
41
+ }
42
+ function changed(){
43
+ refreshInlineModelPickers();
44
+ const status=$('runtime-model-status');if(status)status.textContent=catalogDescription(catalogs.get(getBackend()),runtimeName(getBackend()));
45
+ const suggestions=$('model-suggestions');if(suggestions)suggestions.innerHTML=(catalogs.get(getBackend())?.models||[]).map(m=>`<option value="${esc(m.id)}" label="${esc(m.name)}"></option>`).join('');
46
+ if(pickerTarget&&$('model-picker')?.open)renderModelPicker();
47
+ onCatalogChange();
48
+ }
49
+ function fetchModelCatalog(_force=false,backend=getBackend()){
50
+ if(pending.has(backend))return pending.get(backend);
51
+ const generation=generations.get(backend)||0;
52
+ catalogs.set(backend,{...catalogs.get(backend),backend,models:catalogs.get(backend)?.models||[],loading:true});
53
+ const current=()=>generation===(generations.get(backend)||0)&&pending.get(backend)===request;
54
+ const request=Promise.resolve().then(()=>api('models?backend='+encodeURIComponent(backend)+'&refresh=1')).then(data=>{
55
+ if(!current())return [];
56
+ catalogs.set(backend,normalize(data,backend));return catalogs.get(backend).models;
57
+ }).catch(error=>{
58
+ if(!current())return [];
59
+ catalogs.set(backend,{backend,models:[],status:'error',diagnostic:error.message||'模型目录读取失败',loading:false});return [];
60
+ }).finally(()=>{if(current()){pending.delete(backend);changed()}});
61
+ pending.set(backend,request);changed();return request;
62
+ }
63
+ function invalidate(backend=getBackend()){
64
+ generations.set(backend,(generations.get(backend)||0)+1);
65
+ pending.delete(backend);catalogs.delete(backend);changed();
66
+ }
67
+ async function refreshModelSuggestions(){
68
+ await Promise.all([...new Set([getBackend(),getChatBackend()])].filter(Boolean).map(backend=>fetchModelCatalog(true,backend)));
69
+ }
70
+ async function openModelPicker(target){
71
+ pickerTarget=target;pickerRevision++;
72
+ $('model-picker-search').value='';$('model-picker').showModal();
73
+ return refreshCurrentModelPicker();
74
+ }
75
+ async function refreshCurrentModelPicker(){
76
+ const revision=++pickerRevision,backend=targetBackend(pickerTarget);
77
+ await fetchModelCatalog(true,backend);
78
+ if(revision===pickerRevision&&backend===targetBackend(pickerTarget))renderModelPicker();
79
+ }
80
+ function renderModelPicker(){
81
+ if(!pickerTarget)return;
82
+ const backend=targetBackend(pickerTarget),catalog=catalogs.get(backend),models=catalog?.models||[];
83
+ const q=$('model-picker-search').value.trim().toLowerCase();
84
+ const shown=models.filter(m=>[m.id,m.name,m.provider].some(value=>String(value||'').toLowerCase().includes(q)));
85
+ $('model-picker-status').textContent=catalogDescription(catalog,runtimeName(backend))+(q?` · 筛出 ${shown.length} 个`:'');
86
+ $('model-picker-refresh').disabled=!!catalog?.loading;
87
+ let lastProvider=null,html='';
88
+ for(const model of shown){
89
+ const provider=model.provider||runtimeName(backend);
90
+ if(provider!==lastProvider){lastProvider=provider;html+=`<h3 class="workspace-list-heading">${esc(provider)}</h3>`}
91
+ html+=`<button type="button" class="workspace-choice" data-model-pick="${esc(model.id)}"><span><strong>${esc(model.id)}</strong><small>${esc(model.name||'')}</small></span><em>选用</em></button>`;
92
+ }
93
+ const custom=$('model-picker-search').value.trim();
94
+ const customChoice=custom&&!/\s/.test(custom)&&!shown.some(m=>m.id===custom)?`<button type="button" class="workspace-choice" data-model-pick="${esc(custom)}"><span><strong>${esc(custom)}</strong><small>使用此模型 ID</small></span><em>选用</em></button>`:'';
95
+ $('model-picker-list').innerHTML=(html||`<p class="help">${esc(models.length?'没有匹配的模型。可输入完整模型 ID 后按回车选用。':catalogDescription(catalog,runtimeName(backend)))}</p>`)+customChoice;
96
+ $('model-picker-list').querySelectorAll('[data-model-pick]').forEach(button=>button.onclick=()=>pickModel(button.dataset.modelPick));
97
+ }
98
+ function pickModel(id){
99
+ const input=pickerTarget&&$(pickerTarget);$('model-picker').close();pickerRevision++;
100
+ if(!input)return;input.value=id;input.dispatchEvent(new Event('change',{bubbles:true}));
101
+ }
102
+ function refreshInlineModelPickers(){
103
+ doc.querySelectorAll('.model-picker-select').forEach(select=>{
104
+ const input=select.parentElement.querySelector('input'),backend=targetBackend(input?.id),catalog=catalogs.get(backend);
105
+ select.replaceChildren(new OptionClass('▾',''));
106
+ const status=new OptionClass(`${catalogSource(catalog?.source)} · ${catalogStatus(catalog)}${catalog?.diagnostic?':'+catalog.diagnostic:''}`,'__status__');status.disabled=true;select.add(status);
107
+ for(const model of catalog?.models||[])select.add(new OptionClass(model.name+' · '+model.id,model.id));
108
+ select.add(new OptionClass('输入其他模型 ID…','__custom__'));
109
+ select.add(new OptionClass('搜索 / 刷新模型目录…','__browse__'));
110
+ if(input?.dataset.roleModel)select.add(new OptionClass('继承主链模型','__inherit__'));
111
+ select.title=catalogDescription(catalog,runtimeName(backend));
112
+ });
113
+ }
114
+ function setupModelPickers(root=doc){
115
+ for(const input of root.querySelectorAll('input[list="model-suggestions"]')){
116
+ input.removeAttribute('list');
117
+ const wrap=doc.createElement('span');wrap.className='model-picker';input.before(wrap);wrap.append(input);
118
+ const select=doc.createElement('select');select.className='model-picker-select';select.setAttribute('aria-label',input.id==='chat-model'?'选择模型':'选择'+(input.getAttribute('aria-label')||'模型'));select.dataset.testid='model-catalog-select';
119
+ // Pointer and keyboard opens refresh equally; a focus event alone does not
120
+ // double-query the following pointer event.
121
+ select.onpointerdown=()=>{if(!input.disabled)fetchModelCatalog(true,targetBackend(input.id))};
122
+ select.onkeydown=event=>{if(['ArrowDown','ArrowUp',' ','Enter','F4'].includes(event.key)&&!input.disabled)fetchModelCatalog(true,targetBackend(input.id))};
123
+ select.onchange=()=>{
124
+ const model=select.value;select.value='';if(input.disabled)return;
125
+ if(model==='__custom__'){input.focus();input.select();return}
126
+ if(model==='__browse__'){openModelPicker(input.id);return}
127
+ if(!model||model==='__status__')return;input.value=model==='__inherit__'?'':model;
128
+ input.dispatchEvent(new Event('input',{bubbles:true}));input.dispatchEvent(new Event('change',{bubbles:true}));input.focus();
129
+ };
130
+ wrap.append(select);
131
+ if(Observer)new Observer(()=>{select.disabled=input.disabled}).observe(input,{attributes:true,attributeFilter:['disabled']});select.disabled=input.disabled;
132
+ }
133
+ refreshInlineModelPickers();
134
+ }
135
+ return {catalogs,invalidate,fetchModelCatalog,refreshModelSuggestions,openModelPicker,refreshCurrentModelPicker,renderModelPicker,pickModel,refreshInlineModelPickers,setupModelPickers,targetBackend};
136
+ }
137
+
138
+ // The Native configuration form consumes the same provider response as the
139
+ // execution selectors. OpenCode's configuration probe remains a direct provider
140
+ // API check, distinct from OpenCode's execution-host catalogue.
141
+ export function createProviderCatalog({api,$,getEndpoint,modelDirectory}){
142
+ const pending=new Map(),generations=new Map();let revision=0;
143
+ function invalidate(engine,provider){
144
+ if(engine&&provider){const key=JSON.stringify([engine,provider]);generations.set(key,(generations.get(key)||0)+1);pending.delete(key)}
145
+ if(!engine||(engine===getEndpoint()&&provider===$('custom-provider').value.trim())){revision++;$('provider-model-options').innerHTML=''}
146
+ }
147
+ async function load(){
148
+ const provider=$('custom-provider').value.trim(),engine=getEndpoint(),request=++revision;
149
+ $('provider-model-options').innerHTML='';
150
+ if(!provider){$('provider-result').textContent='先保存提供商配置,再读取目录;也可手动输入模型 ID。';return}
151
+ $('provider-result').textContent='正在查询提供方模型目录;此操作不调用模型。';
152
+ const key=JSON.stringify([engine,provider]),generation=generations.get(key)||0;
153
+ if(!pending.has(key)){
154
+ const query=engine==='native'?modelDirectory.fetchModelCatalog(true,'briefloop-native').then(()=>{
155
+ const catalog=modelDirectory.catalogs.get('briefloop-native');
156
+ const result=catalog?.providers?.find(p=>(p.provider||p.id)===provider);
157
+ return result?{...result,models:(result.models||[]).map(id=>typeof id==='string'?{id,name:id}:id)}:
158
+ {...catalog,models:[],diagnostic:catalog?.diagnostic||'此提供商未返回模型目录;请先保存配置。'};
159
+ }):Promise.resolve().then(()=>api('opencode/provider-catalog',{provider})).then(result=>({...result,source:'provider_api',models:(result.models||[]).map(id=>typeof id==='string'?{id,name:id}:id)}));
160
+ const active=query.finally(()=>{if(pending.get(key)===active)pending.delete(key)});
161
+ pending.set(key,active);
162
+ }
163
+ let result;
164
+ try{result=await pending.get(key)}catch(error){result={models:[],status:'error',source:'provider_api',diagnostic:error.message}}
165
+ if(request!==revision||generation!==(generations.get(key)||0)||engine!==getEndpoint()||provider!==$('custom-provider').value.trim())return;
166
+ const models=unavailable.has(result.status)?[]:result.models||[];
167
+ $('provider-model-options').innerHTML=models.map(model=>`<option value="${esc(model.id)}"></option>`).join('');
168
+ $('provider-result').textContent=catalogDescription({...result,models},provider);
169
+ }
170
+ return {load,invalidate};
171
+ }