briefloop 0.27.0__tar.gz → 0.28.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {briefloop-0.27.0 → briefloop-0.28.0}/PKG-INFO +4 -2
- {briefloop-0.27.0 → briefloop-0.28.0}/README.md +3 -1
- {briefloop-0.27.0 → briefloop-0.28.0}/pyproject.toml +1 -1
- briefloop-0.28.0/src/briefloop/__init__.py +1 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/bridge_harness.py +2 -2
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/chat_store.py +5 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/chat_tools.py +32 -6
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/cli.py +8 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/deliverable_spec.py +3 -1
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/execution_records.py +17 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/external_client.py +17 -4
- briefloop-0.28.0/src/briefloop/external_mcp.py +177 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/external_requests.py +3 -2
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/fast_reports.py +30 -4
- briefloop-0.28.0/src/briefloop/feedback_view.py +12 -0
- briefloop-0.28.0/src/briefloop/finding_anchors.py +56 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/industry_data.py +2 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/interactive_runtime.py +19 -6
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/learning.py +8 -4
- briefloop-0.28.0/src/briefloop/model_budget.py +56 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/models.py +56 -5
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/native_orchestrator.py +27 -5
- briefloop-0.28.0/src/briefloop/plain_isolation.py +134 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/progress.py +63 -1
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.analyst.zh.md +1 -1
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.orchestrator.zh.md +1 -1
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/report_profiles.py +1 -1
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/research_handoff.py +10 -3
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/research_plan.py +78 -7
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/review.py +42 -6
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/review_capability.py +15 -2
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/runtime.py +73 -14
- briefloop-0.28.0/src/briefloop/scout_coverage.py +210 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/scout_tools.py +9 -1
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/server.py +6 -3
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/skill_assets/briefloop-external/SKILL.md +2 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/app.js +92 -92
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/index.html +3 -3
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/style.css +6 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/store.py +75 -7
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/task_progress.py +25 -3
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop.egg-info/PKG-INFO +4 -2
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop.egg-info/SOURCES.txt +7 -433
- briefloop-0.27.0/.gitattributes +0 -5
- briefloop-0.27.0/CHANGELOG.md +0 -2481
- briefloop-0.27.0/CONTRIBUTING.md +0 -33
- briefloop-0.27.0/KNOWN_ISSUES.md +0 -24
- briefloop-0.27.0/MANIFEST.in +0 -24
- briefloop-0.27.0/SECURITY.md +0 -9
- briefloop-0.27.0/VERSION +0 -1
- briefloop-0.27.0/bootstrap.py +0 -55
- briefloop-0.27.0/desktop/electron/package-lock.json +0 -3638
- briefloop-0.27.0/desktop/electron/package.json +0 -65
- briefloop-0.27.0/docs/OpenCode/347/211/210/346/234/254/345/205/274/345/256/271.md +0 -58
- briefloop-0.27.0/docs/WorkBuddy/345/244/226/351/203/250/345/205/245/345/217/243.md +0 -32
- briefloop-0.27.0/docs/architecture.md +0 -105
- briefloop-0.27.0/docs/compose/spec/home-v2.md +0 -81
- briefloop-0.27.0/docs/draft-first.md +0 -73
- briefloop-0.27.0/docs/jev-precheck.md +0 -23
- briefloop-0.27.0/docs/native-integration.md +0 -31
- briefloop-0.27.0/docs/quality-reading-context.md +0 -15
- briefloop-0.27.0/docs/release-0.26.0.md +0 -23
- briefloop-0.27.0/docs/release-0.26.1.md +0 -19
- briefloop-0.27.0/docs/release-0.26.2.md +0 -17
- briefloop-0.27.0/docs/release-0.26.3.md +0 -30
- briefloop-0.27.0/docs/release-0.26.4.md +0 -9
- briefloop-0.27.0/docs/release-0.27.0.md +0 -13
- briefloop-0.27.0/docs/report-length.md +0 -20
- briefloop-0.27.0/docs/report-time-window.md +0 -23
- briefloop-0.27.0/docs/research-handoff.md +0 -39
- briefloop-0.27.0/docs/revision-learning.md +0 -16
- briefloop-0.27.0/docs/sqlite-benchmark.md +0 -78
- briefloop-0.27.0/docs/technical-report-0.21.0/evidence-index.md +0 -475
- briefloop-0.27.0/docs/technical-report-0.21.0/technical-report.md +0 -347
- briefloop-0.27.0/docs/windows.md +0 -96
- briefloop-0.27.0/docs/writer-input.md +0 -56
- briefloop-0.27.0/docs//344/272/247/345/223/201/345/256/232/344/275/215/344/270/216/351/252/214/350/257/201.md +0 -20
- briefloop-0.27.0/docs//344/274/232/350/256/256/347/272/252/350/246/201.md +0 -23
- briefloop-0.27.0/docs//344/275/277/347/224/250/346/214/207/345/215/227.md +0 -112
- briefloop-0.27.0/docs//345/206/205/347/275/256/345/274/225/346/223/216.md +0 -50
- briefloop-0.27.0/docs//345/215/207/347/272/247/350/257/264/346/230/216.md +0 -66
- briefloop-0.27.0/docs//345/233/276/350/241/250/344/270/216Excel.md +0 -41
- briefloop-0.27.0/docs//345/244/232Runtime/344/270/216/346/250/241/345/236/213.md +0 -85
- briefloop-0.27.0/docs//345/244/232/346/250/241/346/200/201/346/235/245/346/272/220.md +0 -32
- briefloop-0.27.0/docs//345/256/232/346/227/266/346/212/245/345/221/212.md +0 -29
- briefloop-0.27.0/docs//345/257/271/350/257/235/345/256/277/344/270/273/345/210/207/346/215/242.md +0 -11
- briefloop-0.27.0/docs//346/212/245/345/221/212/347/274/226/350/276/221/344/270/216/346/250/241/346/235/277.md +0 -64
- briefloop-0.27.0/docs//346/241/214/351/235/242/345/256/211/350/243/205/344/270/216/346/233/264/346/226/260.md +0 -64
- briefloop-0.27.0/docs//346/267/261/345/272/246/347/240/224/347/251/266/344/270/216/344/272/213/345/256/236/346/240/270/346/237/245.md +0 -44
- briefloop-0.27.0/docs//347/211/210/346/234/254/344/270/200/350/207/264/346/200/247/346/243/200/346/237/245.md +0 -35
- briefloop-0.27.0/docs//350/241/214/344/270/232/346/212/245/345/221/212.md +0 -60
- briefloop-0.27.0/docs//350/257/201/345/210/270/347/240/224/347/251/266.md +0 -15
- briefloop-0.27.0/docs//350/257/201/346/215/256/344/270/216/347/273/223/350/256/272/350/277/275/346/272/257.md +0 -30
- briefloop-0.27.0/docs//350/277/220/350/241/214/346/227/266/351/200/211/346/213/251/344/270/216/346/243/200/346/265/213.md +0 -15
- briefloop-0.27.0/docs//351/252/214/346/224/266/350/256/260/345/275/225.md +0 -395
- briefloop-0.27.0/examples/internal-weekly-report/README.md +0 -22
- briefloop-0.27.0/examples/internal-weekly-report/report.md +0 -19
- briefloop-0.27.0/examples/internal-weekly-report/source.txt +0 -7
- briefloop-0.27.0/examples/meeting-minutes/transcript.txt +0 -13
- briefloop-0.27.0/examples/stock-research/earnings-event.txt +0 -17
- briefloop-0.27.0/frontend/api.js +0 -22
- briefloop-0.27.0/frontend/app-updates.js +0 -90
- briefloop-0.27.0/frontend/app.js +0 -2420
- briefloop-0.27.0/frontend/assessment-checks.js +0 -11
- briefloop-0.27.0/frontend/assessment-panel.js +0 -211
- briefloop-0.27.0/frontend/citation-evidence.js +0 -13
- briefloop-0.27.0/frontend/clipboard.js +0 -10
- briefloop-0.27.0/frontend/composer-options.js +0 -43
- briefloop-0.27.0/frontend/connectors.js +0 -93
- briefloop-0.27.0/frontend/delivery.js +0 -82
- briefloop-0.27.0/frontend/dom.js +0 -7
- briefloop-0.27.0/frontend/excel-export.js +0 -30
- briefloop-0.27.0/frontend/fact-check-availability.js +0 -14
- briefloop-0.27.0/frontend/fact-check-grants.js +0 -33
- briefloop-0.27.0/frontend/jev-checks.js +0 -55
- briefloop-0.27.0/frontend/job-presentation.js +0 -32
- briefloop-0.27.0/frontend/learning-retry.js +0 -11
- briefloop-0.27.0/frontend/length-controls.js +0 -67
- briefloop-0.27.0/frontend/mcp-selection.js +0 -31
- briefloop-0.27.0/frontend/model-catalog.js +0 -198
- briefloop-0.27.0/frontend/native-requests.js +0 -121
- briefloop-0.27.0/frontend/notifications.js +0 -58
- briefloop-0.27.0/frontend/office-tools.js +0 -118
- briefloop-0.27.0/frontend/polling.js +0 -17
- briefloop-0.27.0/frontend/previous-report.js +0 -32
- briefloop-0.27.0/frontend/provider-capabilities.js +0 -22
- briefloop-0.27.0/frontend/quick-report.js +0 -79
- briefloop-0.27.0/frontend/readers.js +0 -52
- briefloop-0.27.0/frontend/reasoning-controls.js +0 -68
- briefloop-0.27.0/frontend/report-browsing.js +0 -113
- briefloop-0.27.0/frontend/report-export.js +0 -106
- briefloop-0.27.0/frontend/report-language.js +0 -58
- briefloop-0.27.0/frontend/report-panels.js +0 -14
- briefloop-0.27.0/frontend/report-sources.js +0 -43
- briefloop-0.27.0/frontend/review-controls.js +0 -144
- briefloop-0.27.0/frontend/review-coverage.js +0 -12
- briefloop-0.27.0/frontend/review-results.js +0 -20
- briefloop-0.27.0/frontend/review-status.js +0 -99
- briefloop-0.27.0/frontend/revision-questions.js +0 -42
- briefloop-0.27.0/frontend/rich-document.js +0 -110
- briefloop-0.27.0/frontend/runtime-cards.js +0 -55
- briefloop-0.27.0/frontend/runtime-permission-modes.js +0 -32
- briefloop-0.27.0/frontend/runtime-permission-panel.js +0 -91
- briefloop-0.27.0/frontend/schedules.js +0 -33
- briefloop-0.27.0/frontend/skill-verification.js +0 -17
- briefloop-0.27.0/frontend/source-library-search.js +0 -30
- briefloop-0.27.0/frontend/source-upload.js +0 -65
- briefloop-0.27.0/frontend/task-progress.js +0 -26
- briefloop-0.27.0/frontend/template-output.js +0 -171
- briefloop-0.27.0/frontend/templates.js +0 -91
- briefloop-0.27.0/frontend/time.js +0 -25
- briefloop-0.27.0/frontend/uploads.js +0 -46
- briefloop-0.27.0/frontend/version-diff.js +0 -43
- briefloop-0.27.0/frontend/welcome.js +0 -22
- briefloop-0.27.0/package-lock.json +0 -1092
- briefloop-0.27.0/package.json +0 -21
- briefloop-0.27.0/probes/mcp_m0/README.md +0 -92
- briefloop-0.27.0/probes/mcp_m0/probe.py +0 -273
- briefloop-0.27.0/probes/mcp_m0/requirements.txt +0 -2
- briefloop-0.27.0/probes/mcp_m0/server.py +0 -149
- briefloop-0.27.0/runtime-bridge/README.md +0 -67
- briefloop-0.27.0/runtime-bridge/bridge.test.mjs +0 -517
- briefloop-0.27.0/runtime-bridge/build.mjs +0 -6
- briefloop-0.27.0/runtime-bridge/catalog.json +0 -205
- briefloop-0.27.0/runtime-bridge/claude.ts +0 -62
- briefloop-0.27.0/runtime-bridge/main.ts +0 -344
- briefloop-0.27.0/runtime-bridge/permission-catalog.ts +0 -72
- briefloop-0.27.0/runtime-bridge/pi.ts +0 -89
- briefloop-0.27.0/runtime-bridge/reasoning.ts +0 -43
- briefloop-0.27.0/runtime-bridge/user-input.ts +0 -53
- briefloop-0.27.0/runtime-bridge/windows-command.ts +0 -22
- briefloop-0.27.0/runtime-bridge/zcode.ts +0 -123
- briefloop-0.27.0/scripts/build_frontend.mjs +0 -41
- briefloop-0.27.0/scripts/build_frontend_licenses.mjs +0 -71
- briefloop-0.27.0/scripts/check_versions.py +0 -169
- briefloop-0.27.0/scripts/sync_versions.py +0 -39
- briefloop-0.27.0/scripts/test_frontend.mjs +0 -14
- briefloop-0.27.0/src/briefloop/__init__.py +0 -1
- briefloop-0.27.0/start.ps1 +0 -6
- briefloop-0.27.0/start.sh +0 -4
- briefloop-0.27.0/tests/check_distribution.py +0 -62
- briefloop-0.27.0/tests/frontend_app_updates.mjs +0 -70
- briefloop-0.27.0/tests/frontend_assessment_checks.mjs +0 -12
- briefloop-0.27.0/tests/frontend_chat_attachments.mjs +0 -52
- briefloop-0.27.0/tests/frontend_chat_commands.mjs +0 -30
- briefloop-0.27.0/tests/frontend_chat_drafts.mjs +0 -79
- briefloop-0.27.0/tests/frontend_chat_layout.mjs +0 -116
- briefloop-0.27.0/tests/frontend_chat_polling.mjs +0 -81
- briefloop-0.27.0/tests/frontend_checkout_eol.mjs +0 -34
- briefloop-0.27.0/tests/frontend_citation_clipboard.mjs +0 -71
- briefloop-0.27.0/tests/frontend_citation_edit.mjs +0 -40
- briefloop-0.27.0/tests/frontend_citation_evidence.mjs +0 -14
- briefloop-0.27.0/tests/frontend_clipboard_fallback.mjs +0 -10
- briefloop-0.27.0/tests/frontend_excel_export.mjs +0 -111
- briefloop-0.27.0/tests/frontend_export_menu.mjs +0 -12
- briefloop-0.27.0/tests/frontend_fact_check_availability.mjs +0 -25
- briefloop-0.27.0/tests/frontend_fact_check_grants.mjs +0 -140
- briefloop-0.27.0/tests/frontend_fast_mode.mjs +0 -34
- briefloop-0.27.0/tests/frontend_home_v2.mjs +0 -95
- briefloop-0.27.0/tests/frontend_job_presentation.mjs +0 -22
- briefloop-0.27.0/tests/frontend_learning_authorization.mjs +0 -63
- briefloop-0.27.0/tests/frontend_learning_retry.mjs +0 -12
- briefloop-0.27.0/tests/frontend_length_controls.mjs +0 -62
- briefloop-0.27.0/tests/frontend_licenses.mjs +0 -41
- briefloop-0.27.0/tests/frontend_live_status.mjs +0 -24
- briefloop-0.27.0/tests/frontend_markdown_import.mjs +0 -23
- briefloop-0.27.0/tests/frontend_mcp_selection.mjs +0 -11
- briefloop-0.27.0/tests/frontend_model_catalog_refresh.mjs +0 -154
- briefloop-0.27.0/tests/frontend_model_label.mjs +0 -53
- briefloop-0.27.0/tests/frontend_model_selection.mjs +0 -65
- briefloop-0.27.0/tests/frontend_native_requests.mjs +0 -49
- briefloop-0.27.0/tests/frontend_native_runtime.mjs +0 -42
- briefloop-0.27.0/tests/frontend_office_tools.mjs +0 -289
- briefloop-0.27.0/tests/frontend_open_brief_status.mjs +0 -139
- briefloop-0.27.0/tests/frontend_pending_report.mjs +0 -19
- briefloop-0.27.0/tests/frontend_polling.mjs +0 -68
- briefloop-0.27.0/tests/frontend_previous_report.mjs +0 -23
- briefloop-0.27.0/tests/frontend_progress_race.mjs +0 -106
- briefloop-0.27.0/tests/frontend_provider_capabilities.mjs +0 -75
- briefloop-0.27.0/tests/frontend_quick_report.mjs +0 -71
- briefloop-0.27.0/tests/frontend_readers.mjs +0 -42
- briefloop-0.27.0/tests/frontend_reasoning_controls.mjs +0 -58
- briefloop-0.27.0/tests/frontend_release_controls.mjs +0 -78
- briefloop-0.27.0/tests/frontend_release_navigation.mjs +0 -94
- briefloop-0.27.0/tests/frontend_report_browsing.mjs +0 -69
- briefloop-0.27.0/tests/frontend_report_chat_drawer.mjs +0 -43
- briefloop-0.27.0/tests/frontend_report_export.mjs +0 -131
- briefloop-0.27.0/tests/frontend_report_language.mjs +0 -41
- briefloop-0.27.0/tests/frontend_report_load.mjs +0 -26
- briefloop-0.27.0/tests/frontend_report_outline.mjs +0 -68
- briefloop-0.27.0/tests/frontend_report_panels.mjs +0 -79
- briefloop-0.27.0/tests/frontend_review_capability.mjs +0 -101
- briefloop-0.27.0/tests/frontend_review_coverage.mjs +0 -27
- briefloop-0.27.0/tests/frontend_review_status.mjs +0 -112
- briefloop-0.27.0/tests/frontend_revision_questions.mjs +0 -40
- briefloop-0.27.0/tests/frontend_runtime_discovery.mjs +0 -58
- briefloop-0.27.0/tests/frontend_runtime_feedback.mjs +0 -16
- briefloop-0.27.0/tests/frontend_runtime_permission_panel.mjs +0 -112
- briefloop-0.27.0/tests/frontend_save_barrier.mjs +0 -212
- briefloop-0.27.0/tests/frontend_settings_workspaces.mjs +0 -24
- briefloop-0.27.0/tests/frontend_setup_state.mjs +0 -109
- briefloop-0.27.0/tests/frontend_skill_verification.mjs +0 -17
- briefloop-0.27.0/tests/frontend_source_library.mjs +0 -65
- briefloop-0.27.0/tests/frontend_source_search.mjs +0 -24
- briefloop-0.27.0/tests/frontend_source_upload.mjs +0 -51
- briefloop-0.27.0/tests/frontend_startup_recovery.mjs +0 -99
- briefloop-0.27.0/tests/frontend_task_progress.mjs +0 -64
- briefloop-0.27.0/tests/frontend_template_groups.mjs +0 -74
- briefloop-0.27.0/tests/frontend_template_output.mjs +0 -149
- briefloop-0.27.0/tests/frontend_update_notifications.mjs +0 -48
- briefloop-0.27.0/tests/frontend_upload_limits.mjs +0 -23
- briefloop-0.27.0/tests/frontend_version_bodies.mjs +0 -78
- briefloop-0.27.0/tests/frontend_version_diff.mjs +0 -19
- briefloop-0.27.0/tests/frontend_welcome_gate.mjs +0 -114
- briefloop-0.27.0/tests/frontend_workspace_proposal.mjs +0 -34
- briefloop-0.27.0/tests/frontend_writing_preferences.mjs +0 -45
- briefloop-0.27.0/tests/test_agent_backend.py +0 -36
- briefloop-0.27.0/tests/test_agent_commands.py +0 -197
- briefloop-0.27.0/tests/test_analyst_draft_versions.py +0 -183
- briefloop-0.27.0/tests/test_assessment_admission_recovery.py +0 -17
- briefloop-0.27.0/tests/test_assessment_followup.py +0 -103
- briefloop-0.27.0/tests/test_background_no_question.py +0 -33
- briefloop-0.27.0/tests/test_bridge_harness.py +0 -389
- briefloop-0.27.0/tests/test_builtin_templates.py +0 -110
- briefloop-0.27.0/tests/test_chat_dispatch.py +0 -82
- briefloop-0.27.0/tests/test_chat_execution.py +0 -137
- briefloop-0.27.0/tests/test_chat_model_selection.py +0 -84
- briefloop-0.27.0/tests/test_cli_doctor.py +0 -16
- briefloop-0.27.0/tests/test_codex_idle.py +0 -63
- briefloop-0.27.0/tests/test_connection_test_history.py +0 -58
- briefloop-0.27.0/tests/test_connector_authorization.py +0 -137
- briefloop-0.27.0/tests/test_connector_empty_catalog.py +0 -86
- briefloop-0.27.0/tests/test_connector_materials.py +0 -217
- briefloop-0.27.0/tests/test_connector_tasks.py +0 -23
- briefloop-0.27.0/tests/test_connectors.py +0 -191
- briefloop-0.27.0/tests/test_core.py +0 -86
- briefloop-0.27.0/tests/test_cross_module_regressions.py +0 -43
- briefloop-0.27.0/tests/test_delivery_checks.py +0 -388
- briefloop-0.27.0/tests/test_delivery_consumers.py +0 -64
- briefloop-0.27.0/tests/test_demo.py +0 -77
- briefloop-0.27.0/tests/test_desktop_lifecycle.py +0 -162
- briefloop-0.27.0/tests/test_document_workflows.py +0 -104
- briefloop-0.27.0/tests/test_draft_completion.py +0 -92
- briefloop-0.27.0/tests/test_draft_contract.py +0 -72
- briefloop-0.27.0/tests/test_english_reports.py +0 -121
- briefloop-0.27.0/tests/test_entrypoint.py +0 -22
- briefloop-0.27.0/tests/test_evidence.py +0 -175
- briefloop-0.27.0/tests/test_evidence_parse_failures.py +0 -91
- briefloop-0.27.0/tests/test_execution_records.py +0 -49
- briefloop-0.27.0/tests/test_execution_timing.py +0 -4
- briefloop-0.27.0/tests/test_export_admission.py +0 -253
- briefloop-0.27.0/tests/test_export_layout_swap.py +0 -59
- briefloop-0.27.0/tests/test_export_xlsx.py +0 -628
- briefloop-0.27.0/tests/test_external_requests.py +0 -85
- briefloop-0.27.0/tests/test_fact_check_contract.py +0 -261
- briefloop-0.27.0/tests/test_fact_check_orchestration.py +0 -309
- briefloop-0.27.0/tests/test_fact_check_phase.py +0 -124
- briefloop-0.27.0/tests/test_fact_check_review.py +0 -51
- briefloop-0.27.0/tests/test_fact_check_switch.py +0 -34
- briefloop-0.27.0/tests/test_fact_status_tool.py +0 -50
- briefloop-0.27.0/tests/test_fast_evidence.py +0 -68
- briefloop-0.27.0/tests/test_fast_mode.py +0 -59
- briefloop-0.27.0/tests/test_fast_qualifier_checks.py +0 -50
- briefloop-0.27.0/tests/test_fast_reports.py +0 -74
- briefloop-0.27.0/tests/test_fast_research.py +0 -44
- briefloop-0.27.0/tests/test_figure_exports.py +0 -85
- briefloop-0.27.0/tests/test_figure_flow.py +0 -46
- briefloop-0.27.0/tests/test_figure_text.py +0 -89
- briefloop-0.27.0/tests/test_figures.py +0 -109
- briefloop-0.27.0/tests/test_generation_schema_guidance.py +0 -60
- briefloop-0.27.0/tests/test_harness.py +0 -415
- briefloop-0.27.0/tests/test_host_bins.py +0 -95
- briefloop-0.27.0/tests/test_human_learning.py +0 -101
- briefloop-0.27.0/tests/test_industry_export.py +0 -69
- briefloop-0.27.0/tests/test_industry_flow.py +0 -72
- briefloop-0.27.0/tests/test_industry_research.py +0 -69
- briefloop-0.27.0/tests/test_interactive_runtime.py +0 -126
- briefloop-0.27.0/tests/test_jev_checks.py +0 -157
- briefloop-0.27.0/tests/test_learning_authorization.py +0 -170
- briefloop-0.27.0/tests/test_learning_integrity.py +0 -50
- briefloop-0.27.0/tests/test_length.py +0 -44
- briefloop-0.27.0/tests/test_length_policy.py +0 -94
- briefloop-0.27.0/tests/test_markdown_download.py +0 -30
- briefloop-0.27.0/tests/test_media_sources.py +0 -188
- briefloop-0.27.0/tests/test_model_catalog_defaults.py +0 -50
- briefloop-0.27.0/tests/test_multimodal_harness.py +0 -96
- briefloop-0.27.0/tests/test_multimodal_http.py +0 -32
- briefloop-0.27.0/tests/test_native_analyst.py +0 -221
- briefloop-0.27.0/tests/test_native_evaluator.py +0 -232
- briefloop-0.27.0/tests/test_native_harness.py +0 -383
- briefloop-0.27.0/tests/test_native_learning.py +0 -90
- briefloop-0.27.0/tests/test_native_orchestrator.py +0 -401
- briefloop-0.27.0/tests/test_native_provider_storage.py +0 -49
- briefloop-0.27.0/tests/test_native_providers.py +0 -71
- briefloop-0.27.0/tests/test_native_research_closeout.py +0 -38
- briefloop-0.27.0/tests/test_native_review_contract.py +0 -114
- briefloop-0.27.0/tests/test_native_scout.py +0 -343
- briefloop-0.27.0/tests/test_notifications.py +0 -45
- briefloop-0.27.0/tests/test_npm_native_shim.py +0 -34
- briefloop-0.27.0/tests/test_numeric_occurrence_review.py +0 -157
- briefloop-0.27.0/tests/test_office_cli.py +0 -699
- briefloop-0.27.0/tests/test_office_source_structure.py +0 -101
- briefloop-0.27.0/tests/test_office_surfaces.py +0 -170
- briefloop-0.27.0/tests/test_ooxml_order.py +0 -54
- briefloop-0.27.0/tests/test_opencode_harness.py +0 -895
- briefloop-0.27.0/tests/test_opencode_idle.py +0 -224
- briefloop-0.27.0/tests/test_opencode_prompt_versions.py +0 -55
- briefloop-0.27.0/tests/test_opencode_provider.py +0 -94
- briefloop-0.27.0/tests/test_opencode_questions.py +0 -187
- briefloop-0.27.0/tests/test_opencode_reasoning.py +0 -40
- briefloop-0.27.0/tests/test_opencode_review_version.py +0 -79
- briefloop-0.27.0/tests/test_opencode_search_prompt.py +0 -80
- briefloop-0.27.0/tests/test_opencode_server_stdin.py +0 -135
- briefloop-0.27.0/tests/test_opencode_v2.py +0 -303
- briefloop-0.27.0/tests/test_opencode_version_probe.py +0 -40
- briefloop-0.27.0/tests/test_posix_process_tree.py +0 -165
- briefloop-0.27.0/tests/test_pr593_roundtrip.py +0 -44
- briefloop-0.27.0/tests/test_previous_report.py +0 -140
- briefloop-0.27.0/tests/test_product_summary_consistency.py +0 -45
- briefloop-0.27.0/tests/test_progress.py +0 -50
- briefloop-0.27.0/tests/test_progress_pipeline.py +0 -18
- briefloop-0.27.0/tests/test_provider_catalog.py +0 -185
- briefloop-0.27.0/tests/test_public_research.py +0 -152
- briefloop-0.27.0/tests/test_quality_reading_context.py +0 -147
- briefloop-0.27.0/tests/test_reader_contract.py +0 -182
- briefloop-0.27.0/tests/test_reader_profiles.py +0 -133
- briefloop-0.27.0/tests/test_reader_source_export.py +0 -149
- briefloop-0.27.0/tests/test_reader_workflow.py +0 -109
- briefloop-0.27.0/tests/test_reconciliation.py +0 -183
- briefloop-0.27.0/tests/test_release.py +0 -366
- briefloop-0.27.0/tests/test_release_identity.py +0 -71
- briefloop-0.27.0/tests/test_report_browsing.py +0 -141
- briefloop-0.27.0/tests/test_report_concurrency.py +0 -20
- briefloop-0.27.0/tests/test_report_deletion.py +0 -84
- briefloop-0.27.0/tests/test_report_length_feedback.py +0 -103
- briefloop-0.27.0/tests/test_report_path_regressions.py +0 -57
- briefloop-0.27.0/tests/test_report_time.py +0 -124
- briefloop-0.27.0/tests/test_research_budget.py +0 -184
- briefloop-0.27.0/tests/test_research_gap_updates.py +0 -212
- briefloop-0.27.0/tests/test_research_handoff.py +0 -111
- briefloop-0.27.0/tests/test_research_plan.py +0 -300
- briefloop-0.27.0/tests/test_research_response_admission.py +0 -173
- briefloop-0.27.0/tests/test_resume_in_place.py +0 -20
- briefloop-0.27.0/tests/test_review.py +0 -75
- briefloop-0.27.0/tests/test_review_capability.py +0 -172
- briefloop-0.27.0/tests/test_review_finding_consistency.py +0 -251
- briefloop-0.27.0/tests/test_review_learning.py +0 -47
- briefloop-0.27.0/tests/test_review_modes.py +0 -48
- briefloop-0.27.0/tests/test_review_packet_paths.py +0 -63
- briefloop-0.27.0/tests/test_review_packet_utf8.py +0 -236
- briefloop-0.27.0/tests/test_review_schema_drift.py +0 -41
- briefloop-0.27.0/tests/test_review_snapshot.py +0 -52
- briefloop-0.27.0/tests/test_review_visual_input.py +0 -118
- briefloop-0.27.0/tests/test_revision_citations.py +0 -164
- briefloop-0.27.0/tests/test_revision_edits.py +0 -213
- briefloop-0.27.0/tests/test_revision_policy.py +0 -71
- briefloop-0.27.0/tests/test_rich_document.py +0 -245
- briefloop-0.27.0/tests/test_role_models.py +0 -26
- briefloop-0.27.0/tests/test_runtime_bridge.py +0 -79
- briefloop-0.27.0/tests/test_runtime_bridge_idle.py +0 -75
- briefloop-0.27.0/tests/test_runtime_concurrency.py +0 -6
- briefloop-0.27.0/tests/test_runtime_json_bom.py +0 -46
- briefloop-0.27.0/tests/test_runtime_liveness.py +0 -168
- briefloop-0.27.0/tests/test_runtime_names.py +0 -40
- briefloop-0.27.0/tests/test_runtime_permissions.py +0 -183
- briefloop-0.27.0/tests/test_runtime_retry.py +0 -57
- briefloop-0.27.0/tests/test_runtime_settlement.py +0 -51
- briefloop-0.27.0/tests/test_schedules.py +0 -53
- briefloop-0.27.0/tests/test_scout_experiment.py +0 -54
- briefloop-0.27.0/tests/test_search_credentials.py +0 -79
- briefloop-0.27.0/tests/test_search_policy.py +0 -56
- briefloop-0.27.0/tests/test_semantic_experiment.py +0 -348
- briefloop-0.27.0/tests/test_semantic_governance.py +0 -199
- briefloop-0.27.0/tests/test_server_boundary.py +0 -183
- briefloop-0.27.0/tests/test_settings_transactions.py +0 -188
- briefloop-0.27.0/tests/test_skill_verification.py +0 -161
- briefloop-0.27.0/tests/test_software_version.py +0 -37
- briefloop-0.27.0/tests/test_source_ingestion.py +0 -218
- briefloop-0.27.0/tests/test_source_library_search.py +0 -100
- briefloop-0.27.0/tests/test_source_recovery_regressions.py +0 -31
- briefloop-0.27.0/tests/test_source_updates.py +0 -225
- briefloop-0.27.0/tests/test_sources_provenance.py +0 -327
- briefloop-0.27.0/tests/test_store_sqlite_benchmark.py +0 -110
- briefloop-0.27.0/tests/test_table_citation_advisory.py +0 -102
- briefloop-0.27.0/tests/test_task_labels.py +0 -50
- briefloop-0.27.0/tests/test_task_notify.py +0 -75
- briefloop-0.27.0/tests/test_task_progress.py +0 -3
- briefloop-0.27.0/tests/test_tavily.py +0 -108
- briefloop-0.27.0/tests/test_template_conversion.py +0 -339
- briefloop-0.27.0/tests/test_template_conversion_http.py +0 -86
- briefloop-0.27.0/tests/test_template_saved_state.py +0 -54
- briefloop-0.27.0/tests/test_templates.py +0 -46
- briefloop-0.27.0/tests/test_user_input.py +0 -139
- briefloop-0.27.0/tests/test_user_source_refresh.py +0 -167
- briefloop-0.27.0/tests/test_version_consistency.py +0 -73
- briefloop-0.27.0/tests/test_websearch.py +0 -29
- briefloop-0.27.0/tests/test_websearch_singleflight.py +0 -56
- briefloop-0.27.0/tests/test_wikiskill_engine_windows.py +0 -48
- briefloop-0.27.0/tests/test_windows_antigravity_permissions.py +0 -19
- briefloop-0.27.0/tests/test_windows_connector_acl.py +0 -119
- briefloop-0.27.0/tests/test_windows_distribution.py +0 -27
- briefloop-0.27.0/tests/test_windows_mcp_supervisor.py +0 -54
- briefloop-0.27.0/tests/test_windows_platform.py +0 -366
- briefloop-0.27.0/tests/test_windows_release_paths.py +0 -99
- briefloop-0.27.0/tests/test_windows_review_paths.py +0 -114
- briefloop-0.27.0/tests/test_windows_runtime_bundle.py +0 -43
- briefloop-0.27.0/tests/test_windows_xlsx_paths.py +0 -98
- briefloop-0.27.0/tests/test_word_import.py +0 -53
- briefloop-0.27.0/tests/test_word_source_locators.py +0 -93
- briefloop-0.27.0/tests/test_word_toc.py +0 -78
- briefloop-0.27.0/tests/test_worker_idle.py +0 -43
- briefloop-0.27.0/tests/test_workspace_action_errors.py +0 -35
- briefloop-0.27.0/tests/test_workspace_profile.py +0 -40
- briefloop-0.27.0/tests/test_workspaces.py +0 -166
- briefloop-0.27.0/tests/test_writer_assembly.py +0 -100
- briefloop-0.27.0/tests/test_writer_cli_guidance.py +0 -86
- briefloop-0.27.0/tests/test_writer_context.py +0 -132
- briefloop-0.27.0/tests/test_writer_input.py +0 -443
- briefloop-0.27.0/tests/test_xlsx_officecli_integration.py +0 -125
- briefloop-0.27.0/tests/test_xlsx_preview.py +0 -128
- briefloop-0.27.0/third_party/open-design/LICENSE +0 -201
- briefloop-0.27.0/third_party/open-design/NOTICE.md +0 -39
- briefloop-0.27.0/third_party/open-design/acp/constants.ts +0 -60
- briefloop-0.27.0/third_party/open-design/acp/json.ts +0 -147
- briefloop-0.27.0/third_party/open-design/acp/models.ts +0 -324
- briefloop-0.27.0/third_party/open-design/acp/rpc.ts +0 -327
- briefloop-0.27.0/third_party/open-design/acp/session-params.ts +0 -107
- briefloop-0.27.0/third_party/open-design/acp/types.ts +0 -18
- briefloop-0.27.0/third_party/open-design/byok-reference/byok-opencode.ts +0 -281
- briefloop-0.27.0/third_party/open-design/byok-reference/provider-models.ts +0 -427
- briefloop-0.27.0/third_party/open-design/core/index.ts +0 -1
- briefloop-0.27.0/third_party/open-design/core/json-line-stream.ts +0 -319
- briefloop-0.27.0/third_party/open-design/runtime-models/codex-models.ts +0 -110
- briefloop-0.27.0/third_party/open-design/runtime-models/mmd-routes.ts +0 -166
- briefloop-0.27.0/third_party/open-design/runtime-models/models.ts +0 -233
- briefloop-0.27.0/third_party/open-design/runtime-models/opencode-models.ts +0 -101
- {briefloop-0.27.0 → briefloop-0.28.0}/LICENSE +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/THIRD_PARTY_NOTICES.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/setup.cfg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/__main__.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/_entrypoint.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/agent_commands.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/agent_prompts.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/analyst.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/analyst_drafts.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/app_server.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/audit_bundle.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/backends/__init__.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/backends/opencode_server.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/backends/opencode_v2.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/bocha.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/chat_dispatch.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/chat_execution.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/codex_diagnostics.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/company_context.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/comparison_contract.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/conflicts.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/MATERIALS.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/README.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/__init__.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/config.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/grants.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/materials.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/receipts.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/runtime.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/runtime_tools.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/service.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/stdio_supervisor.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/task_client.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/tasks.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/transport.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/connectors/windows_acl.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/default_fonts.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/delivery_checks.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/demo.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/document_export.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/document_model.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/document_workflows.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/docx_text.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/draft_checks.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/draft_completion.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/duckduckgo.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/evaluation_reading.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/evidence.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/evidence_context.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/execution_timing.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/export_jobs.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/exports.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/fact_check.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/fast_mode.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/fast_research.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/figure_support.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/figure_text.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/figures.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/harness.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/host_bins.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/industry_export.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/jev.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/jev_checks.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/learning_budget.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/length.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/media.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/native_engine.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/native_harness.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/native_providers.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/native_roles.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/notifications.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/office_cli.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/ooxml_order.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/opencode_harness.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/opencode_version.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/packet_views.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/parent_watch.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/platform_support.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/previous_report.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/process_host.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/projections.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/core.zh.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/mode.background.zh.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/mode.interactive.zh.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.chat.zh.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.evaluator.zh.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.fact_checker.zh.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.maintainer.zh.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.proposer.zh.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.quick_writer.zh.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.reviewer.zh.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/prompt_assets/role.scout.zh.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/provider_catalog.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/readers.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/reconciliation.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/release.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/report_browsing.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/report_time.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/report_tools.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/research_budget.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/review_learning.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/revision_edits.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/revision_metadata.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/revision_policy.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/rpc_writer.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/runtime_bridge.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/runtime_permissions.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/runtime_reasoning.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/schedules.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/scout.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/scout_evidence.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/search_credentials.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/search_policy.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/skill_assets/duckduckgo/SKILL.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/skill_assets/multi-search/SKILL.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/skill_assets/tavily/SKILL.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/skill_verification.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/skills.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/software_version.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/source_context.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/source_extraction.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/source_ingestion.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/source_library_search.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/source_search.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/source_updates.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/sources.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/frontend-licenses.txt +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/native-engine-licenses.txt +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/native-engine-models.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/native-engine.mjs +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-aider.png +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-amr.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-antigravity.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-bridge.LICENSE.txt +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-bridge.NOTICE.txt +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-bridge.mjs +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-briefloop.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-claude.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-codebuddy.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-codex.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-copilot.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-cursor-agent.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-deepseek.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-devin.png +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-grok-build.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-hermes.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-kilo.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-kimi.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-kiro.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-mimo.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-opencode.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-pi.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-qoder.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-qwen.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-reasoning.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-reasonix.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-trae-cli.png +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/runtime-vibe.svg +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/static/tokens.css +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/task_labels.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/task_notify.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/tavily.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t1.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t1.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t2.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t2.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t3.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t3.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t4.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t4.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t5.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/academic-paper-zh-t5.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t1.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t1.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t2.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t2.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t3.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t3.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t4.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t4.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t5.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/annual-report-zh-t5.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t1.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t1.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t2.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t2.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t3.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t3.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t4.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t4.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t5.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/business-report-zh-t5.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t1.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t1.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t2.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t2.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t3.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t3.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t4.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t4.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t5.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-en-t5.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t1.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t1.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t2.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t2.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t3.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t3.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t4.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t4.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t5.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/general-report-zh-t5.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/government-doc-zh-t4.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/government-doc-zh-t4.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t1.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t1.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t2.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t2.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t3.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t3.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t4.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t4.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t5.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/legal-contract-zh-t5.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t1.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t1.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t2.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t2.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t3.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t3.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t4.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t4.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t5.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/meeting-minutes-zh-t5.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t1.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t1.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t2.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t2.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t3.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t3.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t4.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t4.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t5.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-en-t5.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t1.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t1.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t2.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t2.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t3.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t3.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t4.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t4.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t5.docx +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_assets/stock-research-zh-t5.spec.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/template_conversion.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/templates.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/user_input.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/websearch.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/windows_process.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/word_import.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workbook_figures.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/business_report/evaluation.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/business_report/manifest.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/business_report/methods/decision_memo.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/business_report/methods/industry_periodic.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/business_report/methods/work_progress.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/business_report/planning.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/business_report/writing.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/general_report/evaluation.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/general_report/manifest.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/general_report/planning.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/general_report/writing.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/meeting_minutes/evaluation.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/meeting_minutes/manifest.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/meeting_minutes/planning.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/meeting_minutes/writing.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/stock_research/evaluation.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/stock_research/manifest.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/stock_research/methods/company_research.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/stock_research/methods/event_commentary.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/stock_research/methods/industry_tracking.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/stock_research/planning.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workflow_assets/stock_research/writing.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workspace_profile.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/workspaces.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/writer_assembly.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/writer_input.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/writing_guidance.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/xlsx_export.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop/zhipu.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop.egg-info/dependency_links.txt +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop.egg-info/entry_points.txt +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop.egg-info/requires.txt +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/briefloop.egg-info/top_level.txt +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/__init__.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/__main__.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/_licenses/LICENSE +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/_licenses/NOTICE.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/_licenses/third_party/acorn/LICENSE +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/_licenses/third_party/acorn/NOTICE.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/_licenses/third_party/officeqa/LICENSE-APACHE +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/_licenses/third_party/officeqa/NOTICE +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/alfworld/__init__.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/alfworld/act.sh +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/alfworld/rollout.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/alfworld/step.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/benchmarks/__init__.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/benchmarks/alfworld.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/benchmarks/livemath.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/benchmarks/sealqa.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/benchmarks/spreadsheet.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/cli.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/codex_identity.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/engine.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/feedback_loop.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/isolated/__init__.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/isolated/audit.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/isolated/runtime.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/isolated/tools_server.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/jsonl.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/k4_lock.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/livemath/__init__.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/livemath/loop.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/livemath/rollout.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/native_agents.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/officeqa/__init__.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/officeqa/dataset.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/officeqa/fetch.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/officeqa/loop.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/officeqa/retrieval.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/officeqa/reward.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/officeqa/rollout.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/officeqa/scoring.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/officeqa/wiki_agents.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/paper_alignment/__init__.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/paper_alignment/contracts.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/paper_alignment/evidence.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/product.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/product_cli.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/product_install.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/product_views.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/id_split/split_manifest.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/id_split/test.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/id_split/train.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/id_split/val.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/wiki/SKILL-s0.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/wiki/index.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/wiki/logs.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/wiki/prompts/maintainer.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/wiki/prompts/proposer.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/alfworld/wiki/skill-impact.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/isolated/model-catalog-direct.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/id_split/split_manifest.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/id_split/test.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/id_split/train.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/id_split/val.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/id_split-v2/split_manifest.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/id_split-v2/test.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/id_split-v2/train.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/id_split-v2/val.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/protocol.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/wiki/SKILL-s0.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/wiki/index.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/wiki/logs.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/wiki/prompts/maintainer.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/wiki/prompts/proposer.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/livemath/wiki/skill-impact.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/id_split/split_manifest.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/id_split/test.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/id_split/train.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/id_split/val.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/protocol.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/wiki/SKILL-s0.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/wiki/index.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/wiki/logs.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/wiki/prompts/maintainer.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/wiki/prompts/proposer.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/officeqa/wiki/skill-impact.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/paper_alignment/README.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/paper_alignment/prompts/maintainer.paper.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/paper_alignment/prompts/officeqa.paper.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/paper_alignment/prompts/proposer.paper.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/paper_alignment/prompts/spreadsheet.paper.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/agents/claude-code/wikiskill-executor.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/agents/claude-code/wikiskill-maintainer.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/agents/claude-code/wikiskill-proposer.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/agents/codex/wikiskill-executor.toml +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/agents/codex/wikiskill-maintainer.toml +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/agents/codex/wikiskill-proposer.toml +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/entry-skill/SKILL.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/entry-skill/agents/openai.yaml +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/entry-skill/references/native-subagents.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/entry-skill/references/workflow.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/roles/executor.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/roles/maintainer.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/product/roles/proposer.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/final-20260907/manifest.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/final-20260907/math-episodes.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/final-20260907/sealqa-pairs.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/final-20260907/spreadsheet-SKILL.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/final-20260907/spreadsheet-pairs.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/final-20260907/summary.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/repeatability-20260908/example-provenance.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/repeatability-20260908/installed-smoke.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/repeatability-20260908/manifest.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/repeatability-20260908/repeat1-pairs.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/repeatability-20260908/repeat2-pairs.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/repeatability-20260908/repeat3-pairs.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/repeatability-20260908/summary.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/repeatability-20260908/wiki-deliver-the-recalculated-workbook.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/skills/livemath/55.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/skills/livemath/luna.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/skills/officeqa/55.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/skills/officeqa/terra.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/skills/officeqa-retrieval/55.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/skills/officeqa-retrieval/sol.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/skills/sealqa/sol.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/skills/spreadsheet/55.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/skills/spreadsheet/sol.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/snapshot.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/snapshot.sha256 +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260906/livemath-luna-pairs.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260906/livemath-luna-skill.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260906/manifest.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260906/officeqa-luna-skill.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260906/officeqa-sol-skill.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260906/officeqa-sol-v2-pairs.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260906/studies.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260907/effort-analysis.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260907/effort-pairs.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260907/manifest.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260907/officeqa-luna-paper-tools-pairs.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260907/officeqa-luna-paper-tools-skill.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260907/spreadsheet-luna-scoped-python-pairs.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260907/spreadsheet-luna-scoped-python-skill.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/research/update-20260907/studies.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/runtime/acorn.mjs +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/runtime/audit_js.mjs +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/id_split/split_manifest.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/id_split/test.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/id_split/train.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/id_split/val.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/protocol.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/wiki/SKILL-s0.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/wiki/index.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/wiki/logs.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/wiki/prompts/maintainer.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/wiki/prompts/proposer.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/sealqa/wiki/skill-impact.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/id_split/split_manifest.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/id_split/test.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/id_split/train.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/id_split/val.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/protocol.json +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/wiki/SKILL-s0.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/wiki/index.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/wiki/logs.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/wiki/prompts/maintainer.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/wiki/prompts/proposer.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/resources/spreadsheet/wiki/skill-impact.md +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/results.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/score_rules.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/scorer_trust.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/sealqa/__init__.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/sealqa/loop.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/sealqa/rollout.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/settings.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/skill_proposer.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/spreadsheet/__init__.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/spreadsheet/loop.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/spreadsheet/rollout.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/spreadsheet/study.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/tool_audit.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/wiki.py +0 -0
- {briefloop-0.27.0 → briefloop-0.28.0}/src/wikiskill/wiki_maintainer.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: briefloop
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.28.0
|
|
4
4
|
Summary: Local multi-runtime agent workbench for sourced briefings, independent review and skill learning
|
|
5
5
|
Author: Stahl-G
|
|
6
6
|
License-Expression: MIT
|
|
@@ -286,6 +286,8 @@ briefloop external --workspace "/absolute/workspace" request --file request.json
|
|
|
286
286
|
|
|
287
287
|
详见 [外部 Agent 调用文档](docs/WorkBuddy外部入口.md)、[随包 Skill 与请求示例](src/briefloop/skill_assets/briefloop-external/SKILL.md);官网提供 [调用指南](https://briefloop.ai/docs/external-agent.html)。
|
|
288
288
|
|
|
289
|
+
下一版增加本机 stdio MCP 服务:客户端执行 `briefloop mcp --workspace "/absolute/workspace"`,即可发现与 external 相同的报告工具。启动时固定工作区路径和身份;不启动后台服务、不新增网络监听。配置示例、工具参数及异步查询方式见 [MCP 调用说明](docs/WorkBuddy外部入口.md#本机-stdio-mcp)。
|
|
290
|
+
|
|
289
291
|
会议纪要内容方法:选择内置纪要模板即可建议相应用途,输入本次会议转写或笔记,整理决议、待办和未定事项。见 [会议纪要说明与合成材料](docs/会议纪要.md)。
|
|
290
292
|
|
|
291
293
|
证券研究方法提供事件点评、公司研究和行业跟踪,按来源区分实际、预测与估值假设,使用有依据的数据生成图表。见 [证券研究说明与合成材料](docs/证券研究.md)。
|
|
@@ -327,7 +329,7 @@ npm test
|
|
|
327
329
|
|
|
328
330
|
Reviewer 使用本任务固定核查包,在独立会话中返回结构化发现及处理说明的复核结果。设置可选**普通审阅**(默认)或**严格审阅**:普通模式通过 Codex、OpenCode 1.x/2.x 或 BriefLoop Agent 的实际只读通道执行,不承诺宿主自动加载的全局/项目上下文完全隔离;严格模式额外强制包内读取,目前由 BriefLoop Agent 的专用核查工具提供。选择严格模式不会自动降级或更换执行后端。两种模式使用相同的事实、证据及交付检查,新任务冻结实际模式,历史未记录模式的审阅不被补标为严格。
|
|
329
331
|
|
|
330
|
-
|
|
332
|
+
独立审阅可在任一执行引擎上运行:Codex、OpenCode 与内置引擎强制只读;Claude、Antigravity 等 CLI 宿主无法由 BriefLoop 关闭自带工具,审阅改用其原生权限运行,记录上标明“未强制只读”并列出宿主报告的工具使用。严格审阅仍只在内置引擎上执行。工作稿Word下载保持可用。“正式交付”另行检查当前版本的独立审阅、重要主张及必答内容、核心未核验、重大未决发现和冲突;高分不能抵消阻断项。审计包单独导出,逐来源选择原件、摘录或仅定位,缺省仅定位;离线校验为结构与一致性检查,不是事实真伪自动证明。旧正式件保留,更正或后续更新另建版本。
|
|
331
333
|
|
|
332
334
|
存在受限来源时,无法逐来源归属的审阅、回应、历史与内部研究自由文本会明确省略;包中保留身份、状态、定位和获准的证据片段。正式报告本身仍随包提供。旧版受限包需重新导出以应用完整权限投影,旧版全原件包继续支持下载和离线校验。
|
|
333
335
|
|
|
@@ -246,6 +246,8 @@ briefloop external --workspace "/absolute/workspace" request --file request.json
|
|
|
246
246
|
|
|
247
247
|
详见 [外部 Agent 调用文档](docs/WorkBuddy外部入口.md)、[随包 Skill 与请求示例](src/briefloop/skill_assets/briefloop-external/SKILL.md);官网提供 [调用指南](https://briefloop.ai/docs/external-agent.html)。
|
|
248
248
|
|
|
249
|
+
下一版增加本机 stdio MCP 服务:客户端执行 `briefloop mcp --workspace "/absolute/workspace"`,即可发现与 external 相同的报告工具。启动时固定工作区路径和身份;不启动后台服务、不新增网络监听。配置示例、工具参数及异步查询方式见 [MCP 调用说明](docs/WorkBuddy外部入口.md#本机-stdio-mcp)。
|
|
250
|
+
|
|
249
251
|
会议纪要内容方法:选择内置纪要模板即可建议相应用途,输入本次会议转写或笔记,整理决议、待办和未定事项。见 [会议纪要说明与合成材料](docs/会议纪要.md)。
|
|
250
252
|
|
|
251
253
|
证券研究方法提供事件点评、公司研究和行业跟踪,按来源区分实际、预测与估值假设,使用有依据的数据生成图表。见 [证券研究说明与合成材料](docs/证券研究.md)。
|
|
@@ -287,7 +289,7 @@ npm test
|
|
|
287
289
|
|
|
288
290
|
Reviewer 使用本任务固定核查包,在独立会话中返回结构化发现及处理说明的复核结果。设置可选**普通审阅**(默认)或**严格审阅**:普通模式通过 Codex、OpenCode 1.x/2.x 或 BriefLoop Agent 的实际只读通道执行,不承诺宿主自动加载的全局/项目上下文完全隔离;严格模式额外强制包内读取,目前由 BriefLoop Agent 的专用核查工具提供。选择严格模式不会自动降级或更换执行后端。两种模式使用相同的事实、证据及交付检查,新任务冻结实际模式,历史未记录模式的审阅不被补标为严格。
|
|
289
291
|
|
|
290
|
-
|
|
292
|
+
独立审阅可在任一执行引擎上运行:Codex、OpenCode 与内置引擎强制只读;Claude、Antigravity 等 CLI 宿主无法由 BriefLoop 关闭自带工具,审阅改用其原生权限运行,记录上标明“未强制只读”并列出宿主报告的工具使用。严格审阅仍只在内置引擎上执行。工作稿Word下载保持可用。“正式交付”另行检查当前版本的独立审阅、重要主张及必答内容、核心未核验、重大未决发现和冲突;高分不能抵消阻断项。审计包单独导出,逐来源选择原件、摘录或仅定位,缺省仅定位;离线校验为结构与一致性检查,不是事实真伪自动证明。旧正式件保留,更正或后续更新另建版本。
|
|
291
293
|
|
|
292
294
|
存在受限来源时,无法逐来源归属的审阅、回应、历史与内部研究自由文本会明确省略;包中保留身份、状态、定位和获准的证据片段。正式报告本身仍随包提供。旧版受限包需重新导出以应用完整权限投影,旧版全原件包继续支持下载和离线校验。
|
|
293
295
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "briefloop"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.28.0"
|
|
8
8
|
description = "Local multi-runtime agent workbench for sourced briefings, independent review and skill learning"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.28.0"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from .execution_records import sanitize
|
|
1
|
+
from .execution_records import sanitize, public_tool_name
|
|
2
2
|
"""Native CLI transports projected into the existing ChatStore, not another agent loop."""
|
|
3
3
|
import base64
|
|
4
4
|
import hashlib
|
|
@@ -239,7 +239,7 @@ class BridgeHarness(OpencodeHarness):
|
|
|
239
239
|
elif kind=='tool':
|
|
240
240
|
key=event.get('id') or uid('tool');tools[key]={**tools.get(key,{}),**event}
|
|
241
241
|
tool=tools[key];complete=tool.get('status') in ('completed','failed','error')
|
|
242
|
-
item={'id':key,'type':'runtime_tool','tool':tool.get('name'
|
|
242
|
+
item={'id':key,'type':'runtime_tool','tool':public_tool_name(tool.get('name')),'status':tool.get('status','running'),
|
|
243
243
|
'input':sanitize(tool.get('input')), 'output':sanitize(tool.get('output'))}
|
|
244
244
|
self.chat.event(sid,'item/completed' if complete else 'item/started',{'item':item,'turnId':mid})
|
|
245
245
|
if complete:
|
|
@@ -138,6 +138,11 @@ class ChatStore:
|
|
|
138
138
|
event['data']['tokenUsage']=project_usage(event['seq'],event['data'])
|
|
139
139
|
if not private:
|
|
140
140
|
for message in messages:message.pop('prompt',None)
|
|
141
|
+
from .execution_records import public_tool_name
|
|
142
|
+
for event in events:
|
|
143
|
+
item = event['data'].get('item') if isinstance(event['data'], dict) else None
|
|
144
|
+
if isinstance(item, dict) and item.get('type') == 'runtime_tool':
|
|
145
|
+
item['tool'] = public_tool_name(item.get('tool'))
|
|
141
146
|
if not reasoning:
|
|
142
147
|
for message in messages:message.pop('reasoning',None)
|
|
143
148
|
return {'session':session,'messages':messages,'events':events,'requests':requests,'token_usage':token_usage}
|
|
@@ -13,6 +13,15 @@ def _notify_owner(request):
|
|
|
13
13
|
"""Conversation that owns a task started from chat; never guessed."""
|
|
14
14
|
return request.get('session_id') or os.environ.get('BRIEFLOOP_CHAT_SESSION') or None
|
|
15
15
|
|
|
16
|
+
def _session_backend(store, session_id):
|
|
17
|
+
if not session_id:
|
|
18
|
+
return None
|
|
19
|
+
rows = store.rows('SELECT runtime FROM chat_sessions WHERE id=?', (session_id,))
|
|
20
|
+
try:
|
|
21
|
+
return json.loads(rows[0]['runtime']).get('backend') if rows else None
|
|
22
|
+
except (TypeError, ValueError):
|
|
23
|
+
return None
|
|
24
|
+
|
|
16
25
|
WORKSPACE_ACTIONS = (
|
|
17
26
|
'capabilities','source_snapshot','source_change','source_impacts','refresh_source',
|
|
18
27
|
'set_reader_contract','conflict_create','conflict_response','review_response','review_status',
|
|
@@ -20,7 +29,7 @@ WORKSPACE_ACTIONS = (
|
|
|
20
29
|
'revise_document','templates','workflows','template_rebuild','template_import','import_word_revision',
|
|
21
30
|
'company_review_complete','company_read','company_config','company_update','company_resolve',
|
|
22
31
|
'profile_read','profile_update',
|
|
23
|
-
'freeze_research_plan','research_status','begin_research_round','finish_research_round',
|
|
32
|
+
'freeze_research_plan','research_status','begin_research_round','finish_research_round','set_scout_tasks',
|
|
24
33
|
'reconciliation_candidates','reconciliation_save','reconciliation_read',
|
|
25
34
|
'export_word','inspect','generate','assess','comment','learn',
|
|
26
35
|
)
|
|
@@ -143,6 +152,15 @@ def workspace_action(store, request):
|
|
|
143
152
|
if action=='research_status':
|
|
144
153
|
from .research_plan import status
|
|
145
154
|
return status(store,request['run_id'])
|
|
155
|
+
if action=='set_scout_tasks':
|
|
156
|
+
from .scout_coverage import declare, update
|
|
157
|
+
if 'scout_tasks' in request:
|
|
158
|
+
result=declare(store,request['run_id'],request['scout_tasks'],round_id=request.get('round_id'))
|
|
159
|
+
if 'scout_outcomes' in request:
|
|
160
|
+
result=update(store,request['run_id'],request['scout_outcomes'],round_id=request.get('round_id'))
|
|
161
|
+
if 'scout_tasks' not in request and 'scout_outcomes' not in request:
|
|
162
|
+
raise ValueError('需要 scout_tasks 或 scout_outcomes')
|
|
163
|
+
return result
|
|
146
164
|
if action=='freeze_research_plan':
|
|
147
165
|
from .research_plan import freeze
|
|
148
166
|
return freeze(store,request['run_id'],preset=request.get('preset'),structure=request.get('structure'))
|
|
@@ -151,7 +169,8 @@ def workspace_action(store, request):
|
|
|
151
169
|
return begin_round(store,request['run_id'],target_gap_ids=request.get('target_gap_ids'),tasks=request.get('tasks'),job_id=request.get('job_id'))
|
|
152
170
|
if action=='finish_research_round':
|
|
153
171
|
from .research_plan import finish_round
|
|
154
|
-
return finish_round(store,request['run_id'],round_id=request.get('round_id'),gaps=request.get('gaps'),summary=request.get('summary',''),gap_updates=request.get('gap_updates'),job_id=request.get('job_id')
|
|
172
|
+
return finish_round(store,request['run_id'],round_id=request.get('round_id'),gaps=request.get('gaps'),summary=request.get('summary',''),gap_updates=request.get('gap_updates'),job_id=request.get('job_id'),
|
|
173
|
+
continue_research=request.get('continue_research') is True,early_stop_reason=str(request.get('early_stop_reason') or ''),scout_outcomes=request.get('scout_outcomes'))
|
|
155
174
|
if action=='reconciliation_candidates':
|
|
156
175
|
from .reconciliation import candidates
|
|
157
176
|
return candidates(store,request['run_id'])
|
|
@@ -186,7 +205,12 @@ def workspace_action(store, request):
|
|
|
186
205
|
runtime_payload={}
|
|
187
206
|
if request.get('runtime'):
|
|
188
207
|
from .backends import validate_backend
|
|
189
|
-
|
|
208
|
+
# A model name only means something on its own engine. Without an explicit
|
|
209
|
+
# engine, use the engine of the conversation that sent this model, never the
|
|
210
|
+
# workspace default (a Claude chat once produced "Antigravity · opus").
|
|
211
|
+
backend=request['runtime'].get('agent_backend') or _session_backend(store,_notify_owner(request)) \
|
|
212
|
+
or store.settings().get('agent_backend','codex')
|
|
213
|
+
backend=validate_backend(backend)
|
|
190
214
|
settings=Settings.model_validate({**store.settings(),**request['runtime'],'agent_backend':backend})
|
|
191
215
|
runtime_payload={'runtime':runtime_fields(settings.model_dump(),backend),'agent_backend':backend}
|
|
192
216
|
run=store.create_run(requirements.model_dump(),source_ids,research_protocol="quality_v1",
|
|
@@ -261,8 +285,9 @@ def chat_instructions(store, runtime, *, internal=False, allow_web=False, backen
|
|
|
261
285
|
subagent_note=(OPENCODE_V2_SUBAGENT+'优先不传 model override,继承当前已冻结模型和推理档位;不要启动嵌套模型 CLI。'
|
|
262
286
|
'宿主 question 工具不可用;需要澄清时直接在聊天回复中提问,用户下一条消息会继续本任务。')
|
|
263
287
|
else:
|
|
264
|
-
request_runtime={'model':runtime['model'],'reasoning_effort':runtime.get('effort'),
|
|
288
|
+
request_runtime={'agent_backend':backend,'model':runtime['model'],'reasoning_effort':runtime.get('effort'),
|
|
265
289
|
'model_provider':runtime.get('model_provider')}
|
|
290
|
+
if backend=='codex':request_runtime['service_tier']=runtime.get('service_tier')
|
|
266
291
|
runtime_json=json.dumps(request_runtime,ensure_ascii=False)
|
|
267
292
|
runtime_label=runtime.get('effort') if runtime.get('effort') is not None else '不指定(provider 默认)'
|
|
268
293
|
provider_label=runtime.get('model_provider') or f'沿用本机 {BACKEND_LABELS[backend]} 配置'
|
|
@@ -301,9 +326,10 @@ def chat_instructions(store, runtime, *, internal=False, allow_web=False, backen
|
|
|
301
326
|
- {{"action":"profile_read"}}:读取本工作区基础设定(称呼、公司/组织、岗位等)。
|
|
302
327
|
- {{"action":"profile_update","profile":{{"name":"称呼","organization":"公司/组织","role":"岗位","location":"城市","focus":"主要工作","report_types":"常做报告"}}}}:按上文约定保存用户主动提供或任务确有必要的基础信息;只写用户明确说过的内容,不猜、不编造,也不把这些当作报告证据。
|
|
303
328
|
- {{"action":"research_status","run_id":"真实run ID"}}:读取该任务冻结的研究计划、轮次与用量。
|
|
329
|
+
- {{"action":"set_scout_tasks","run_id":"真实run ID","scout_tasks":[{{"slot_id":"scout-1","assignment":"明确研究方向","result_file":"本轮结果绝对路径"}}]}}:派发前登记完整承诺分工,与 plan.json.scout_tasks 相同;空计划明确写 []。预分配槽位不是承诺。分工不可静默删除;可追加新分工。实际派发后可用同 action 的 scout_outcomes=[{{"slot_id":"scout-1","status":"dispatched","reason":"真实子任务句柄"}}] 记录派发。join-scouts 自动接纳有效结果。
|
|
304
330
|
- {{"action":"freeze_research_plan","run_id":"真实run ID","preset":"quick|standard|deep","structure":{{"breadth":6,"depth":2,"parallel":2}}}}:在第一次受控联网前冻结研究计划。预算只读取任务已授权的额度,不能借冻结扩大额度或替换模型/搜索源;相同内容重复提交幂等,不同内容会被拒绝。
|
|
305
331
|
- {{"action":"begin_research_round","run_id":"真实run ID","target_gap_ids":["真实gap ID"],"tasks":[{{"slot_id":"scout-1"}}]}}:在当前轮已结束、且未超过 depth 上限时开始下一轮;必须引用前轮真实缺口 ID。
|
|
306
|
-
- {{"action":"finish_research_round","run_id":"真实run ID","gaps":[{{"description":"真实缺口","source_ids":[],"related_claim_ids":[],"requirement_ids":[]}}],"summary":"本轮结论"}}:结束当前轮并生成真实 gap ID
|
|
332
|
+
- {{"action":"finish_research_round","run_id":"真实run ID","gaps":[{{"description":"真实缺口","source_ids":[],"related_claim_ids":[],"requirement_ids":[]}}],"summary":"本轮结论"}}:结束当前轮并生成真实 gap ID;每个已承诺 Scout 分工须已 join,或在 scout_outcomes 中明确 slot_id、status=failed|skipped、reason,保留未检范围;不必用满槽位、预算或后续轮次。可选 gap_updates 明确变更已登记缺口状态,每项 gap_id/status(open|partial|resolved)/reason/evidence(source_id/locator/excerpt,partial/resolved 至少一条,open 可为空),partial 另填 remaining_question;covered 不会关闭缺口。还要继续检索时带 "continue_research":true;只完成第 1 轮且受控搜索额度用了不到一半就结束研究时,必须带 "early_stop_reason" 说明为何已覆盖本期重要事件,否则会被拒绝。之后才能 begin 下一轮。
|
|
307
333
|
- {{"action":"reconciliation_candidates","run_id":"真实run ID"}}:读取本任务冻结的候选清单(来源与来源陈述),用于写作前对照。
|
|
308
334
|
- {{"action":"reconciliation_save","run_id":"真实run ID","reconciliation":{{"status":"complete|partial|not_applicable|failed","examined_claim_ids":[],"unexamined_claim_ids":[],"relations":[{{"member_claim_ids":["真实claim ID","真实claim ID"],"relation":"compatible|different_scope|temporal_sequence|correction|supersession|republication|attributed_difference|contradiction|unknown","scope":"","basis_span_ids":[],"reason":"","proposed_treatment":"","affected_requirement_ids":[]}}],"open_questions":[],"coverage_notes":""}}}}:保存写作前对照快照。必须用 examined ∪ unexamined 明确覆盖候选清单全部来源陈述;关系必须引用真实来源陈述;不判定真假,只登记依据与建议写法。重复相同内容幂等。
|
|
309
335
|
- {{"action":"reconciliation_read","run_id":"真实run ID","reconciliation_id":"真实对照ID"}}:读取对照快照;输入变化时返回 stale 标记。
|
|
@@ -311,7 +337,7 @@ def chat_instructions(store, runtime, *, internal=False, allow_web=False, backen
|
|
|
311
337
|
- {{"action":"templates"}}:读取可选模板。用户要求上传材料用作主模板时用 {{"action":"template_import","source_id":"DOCX来源ID"}} 启动一次准备;准备完成后 generate.requirements.template_id 选择具体版本。需要重新准备已有模板版式时,用 {{"action":"template_rebuild","template_id":"已有模板ID"}} 从保留原件创建新模板版本;原模板和已绑定稿件保持不变,新任务选择返回的新模板ID。
|
|
312
338
|
- {{"action":"read_report","version_id":"稿件ID"}}:读取富文档 JSON、引用和已存正文的 length_stats;revise_document 回执也给出保存后的确定性计数。按 count/rule 核对原始要求、读者约定及当前反馈,不估算字数;over_limit 只比较结构化 max_words,不表示已满足全部篇幅要求。用户明确要求修改内容/章节/图表时,将修改后的 JSON 保存到工作区文件,再用 {{"action":"revise_document","base_version":"刚读取版本ID","document_file":"工作区内JSON绝对路径"}} 保存新版本,不覆盖用户并发编辑。可选 citations 完整替换引用列表(source_id/locator/excerpt,schema 见 capabilities),省略则保留;只修改引用也保存新版本,定位描述不表示已独立核验。
|
|
313
339
|
- {{"action":"import_word_revision","base_version":"用户指定基础版本","source_id":"DOCX来源ID"}}:导入用户修改的 Word。返回 needs_alignment 时先核对原件和基础版本,向用户说明对齐问题;仅按用户明确选择提供 accept_unaligned=true。用户希望更新模板时另用 template_import 并提供 parent_id。
|
|
314
|
-
- {{"action":"generate","requirements":{{"title":"标题","objective":"用户目的","audience":"读者","language":"zh|en","extent":"compact|balanced|detailed","research_tier":"quick|standard|deep","allow_web":{str(bool(allow_web)).lower()},"period":"时间范围"}},"source_ids":["真实来源ID"],"runtime":{runtime_json}}}:正式生成可在页面编辑的简报。language 是报告正文语言(默认 zh);用户要英文报告时写 en,不传 target_words 时篇幅按英文词数默认。research_tier 是研究深度档位(默认 standard):quick 单轮检索,deep 预排 4 轮迭代研究;按用户明确要求选,用户未提就不写该字段。
|
|
340
|
+
- {{"action":"generate","requirements":{{"title":"标题","objective":"用户目的","audience":"读者","language":"zh|en","extent":"compact|balanced|detailed","research_tier":"quick|standard|deep","allow_web":{str(bool(allow_web)).lower()},"period":"时间范围"}},"source_ids":["真实来源ID"],"runtime":{runtime_json}}}:正式生成可在页面编辑的简报。language 是报告正文语言(默认 zh);用户要英文报告时写 en,不传 target_words 时篇幅按英文词数默认。research_tier 是研究深度档位(默认 standard):quick 单轮检索,deep 预排 4 轮迭代研究;按用户明确要求选,用户未提就不写该字段。scout_limit 是本报告最多可同时派发的 Scout 数(1–16),在提交前按信息量决定:一周左右约 4,月报约 8,跨多个行业或市场的大型报告可到 12–16;不写时系统按期间自动设定(月报 8,其余沿用工作区设置)。
|
|
315
341
|
提交 generate 时,必须把本轮已经确认的 key_questions、writing_preferences、章节、期间和篇幅完整写进 requirements,不能只传标题摘要。用户给出的执行约束同样在提交前冻结:target_minutes 是软目标;hard_timeout_minutes=0 表示不设硬截止;research_budget 包含 search_requests、candidate_urls、source_pages;search_policy 沿用已授权设置。不得说“后台稍后配置”而遗漏已指定的额度。并行数要求写入 writing_preferences,供主 Agent 冻结研究计划时选择 structure.parallel;不改变共享预算。提交回执中的实际冻结值与用户要求不一致时明确说明,不宣称已应用。
|
|
316
342
|
- {{"action":"assess","version_id":"真实简报版本ID"}}:为已有稿件安排评分。
|
|
317
343
|
- {{"action":"comment","version_id":"真实简报版本ID","text":"用户反馈"}}:记录用户明确提出的反馈。页面自动学习开启时,保存反馈可能稍后自动触发学习,要如实告知。
|
|
@@ -51,6 +51,8 @@ def main():
|
|
|
51
51
|
er.add_argument('--file',required=True,help='UTF-8 JSON 请求文件')
|
|
52
52
|
ed=es.add_parser('download',help='下载指定已完成导出任务的Word,不覆盖不同内容的文件')
|
|
53
53
|
ed.add_argument('--job',required=True);ed.add_argument('--output',required=True)
|
|
54
|
+
mcp=sub.add_parser('mcp',help='stdio MCP 服务;只连接用户选定的现有本机工作区')
|
|
55
|
+
mcp.add_argument('--workspace',required=True,help='已选择工作区的绝对路径;不自动创建或启动服务')
|
|
54
56
|
tool=sub.add_parser('tool',help='agent 使用的来源工具')
|
|
55
57
|
tool.add_argument('--workspace',required=True)
|
|
56
58
|
ts=tool.add_subparsers(dest='tool',required=True)
|
|
@@ -136,6 +138,12 @@ def main():
|
|
|
136
138
|
print(json.dumps(result,ensure_ascii=False))
|
|
137
139
|
except (OSError,ValueError,KeyError,http.client.HTTPException) as exc:
|
|
138
140
|
p.exit(2,json.dumps({'status':'error','message':sanitize(str(exc))},ensure_ascii=False)+'\n')
|
|
141
|
+
elif a.command=='mcp':
|
|
142
|
+
from .external_mcp import serve as serve_mcp
|
|
143
|
+
try:serve_mcp(a.workspace)
|
|
144
|
+
except ValueError as exc:
|
|
145
|
+
from .execution_records import sanitize
|
|
146
|
+
p.exit(2,sanitize(str(exc))+'\n')
|
|
139
147
|
elif a.command=='serve':
|
|
140
148
|
from .server import serve
|
|
141
149
|
serve(a.workspace,a.port,paused=a.paused,backend=a.backend)
|
|
@@ -212,8 +212,10 @@ def instructions(spec, role='analyst', *, include_spec=True):
|
|
|
212
212
|
|
|
213
213
|
def research_record(store, brief):
|
|
214
214
|
detail = json.loads(brief['detail']); refs = detail.get('citations', [])
|
|
215
|
+
from .plain_isolation import public_notes
|
|
216
|
+
notes = public_notes(detail.get('research_notes', []))
|
|
215
217
|
return {'version_id': brief['id'], 'brief_hash': brief['hash'],
|
|
216
|
-
'notes':
|
|
218
|
+
'notes': notes, 'gaps': detail.get('gaps', []),
|
|
217
219
|
'citations': [{**ref, 'source_name': store.one('sources', ref['source_id'])['name']} for ref in refs],
|
|
218
220
|
'assessments': [json.loads(x['data']) for x in store.rows('SELECT data FROM assessments WHERE version_id=? ORDER BY rowid DESC', (brief['id'],))]}
|
|
219
221
|
|
|
@@ -15,6 +15,23 @@ _SECRET_HEADER=re.compile(r'''(?im)(?<![\w-])((?:proxy[-_])?authorization|(?:set
|
|
|
15
15
|
_SECRET_ENV=re.compile(r'''(?ix)(["']?\b(?:[a-z0-9]+_)*(?:authorization|cookie)["']?\s*=\s*)(?:\[credential[ ]omitted\]|"[^"\n]*"|'[^'\n]*'|[^\s,;&}\]]+)''')
|
|
16
16
|
_PRIVATE_KEY=re.compile(r'-----BEGIN (?:[A-Z ]+)?PRIVATE KEY-----.*?-----END (?:[A-Z ]+)?PRIVATE KEY-----',re.S)
|
|
17
17
|
|
|
18
|
+
# ACP "names" can be entire commands, paths or arbitrary host descriptions.
|
|
19
|
+
# Only exact known identifiers belong in compact public tool summaries.
|
|
20
|
+
_PUBLIC_TOOLS = frozenset('''Read Write Edit MultiEdit Bash Glob Grep LS NotebookEdit TodoWrite Task Agent WebFetch WebSearch
|
|
21
|
+
read write edit bash glob grep find ls task subagent shell search_web web_search webfetch websearch
|
|
22
|
+
read_file write_file edit_file list_directory read_many_files execute_command run_command
|
|
23
|
+
commandExecution command_execution fileChange mcpToolCall dynamicToolCall collabAgentToolCall
|
|
24
|
+
collab_tool_call imageView webSearch runtime_tool opencode_tool subagent_activity'''.split())
|
|
25
|
+
_OTHER_TOOL = '其他宿主工具'
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def public_tool_name(value):
|
|
29
|
+
return value if isinstance(value, str) and value in _PUBLIC_TOOLS else _OTHER_TOOL
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def public_tool_names(values):
|
|
33
|
+
return sorted({public_tool_name(value) for value in values}) if isinstance(values, list) else []
|
|
34
|
+
|
|
18
35
|
|
|
19
36
|
def _secret_field(key, value):
|
|
20
37
|
name = re.sub(r'([a-z0-9])([A-Z])', r'\1_\2', str(key)).lower()
|
|
@@ -10,6 +10,13 @@ from urllib.parse import urlsplit, urlencode
|
|
|
10
10
|
from .workspaces import _workspace_id, _validated_info, _alive, _read_api
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
class RequestError(ValueError):
|
|
14
|
+
"""HTTP status without reflecting the server's possibly input-bearing error."""
|
|
15
|
+
def __init__(self, status):
|
|
16
|
+
self.status = status
|
|
17
|
+
super().__init__(f'外部请求失败 (HTTP {status})')
|
|
18
|
+
|
|
19
|
+
|
|
13
20
|
def discover(workspace):
|
|
14
21
|
root = Path(workspace).expanduser().resolve()
|
|
15
22
|
wid = _workspace_id(root) if root.is_dir() else None
|
|
@@ -22,13 +29,19 @@ def discover(workspace):
|
|
|
22
29
|
if urlsplit(info['url']).hostname != '127.0.0.1':
|
|
23
30
|
return {**result, 'status': 'service_unavailable', 'message': '工作区未使用受支持的本地服务地址'}
|
|
24
31
|
try:
|
|
32
|
+
caps = _read_api(info['url'], '/api/external/capabilities')
|
|
33
|
+
if caps.get('protocol') != 1:
|
|
34
|
+
return {**result, 'status': 'unsupported', 'message': '此版本未提供外部任务接口'}
|
|
35
|
+
service_path = caps.get('workspace_path')
|
|
36
|
+
if (not isinstance(service_path, str) or not Path(service_path).is_absolute()
|
|
37
|
+
or Path(service_path).resolve() != root or caps.get('workspace_id') != wid):
|
|
38
|
+
return {**result, 'status': 'identity_changed', 'message': '服务与选定工作区的路径或身份不匹配,未连接'}
|
|
39
|
+
# Verify only the narrow identity response before reading runtime/task
|
|
40
|
+
# state or obtaining a session token from a possibly copied service URL.
|
|
25
41
|
runtime = _read_api(info['url'], '/api/runtime')
|
|
26
42
|
status = _read_api(info['url'], '/api/service-status')
|
|
27
|
-
caps = _read_api(info['url'], '/api/external/capabilities')
|
|
28
43
|
if runtime.get('server_pid') != info['pid'] or status.get('pid') != info['pid'] or status.get('workspace_id') != wid:
|
|
29
44
|
return {**result, 'status': 'identity_changed', 'message': '服务与工作区身份不匹配,未连接'}
|
|
30
|
-
if caps.get('protocol') != 1:
|
|
31
|
-
return {**result, 'status': 'unsupported', 'message': '此版本未提供外部任务接口'}
|
|
32
45
|
ready = bool(runtime.get('worker_alive')) and not status.get('draining')
|
|
33
46
|
return {**result, 'url': info['url'], 'pid': info['pid'], 'ready': ready,
|
|
34
47
|
'status': 'ready' if ready else 'not_ready', 'capabilities': caps}
|
|
@@ -60,7 +73,7 @@ class Client:
|
|
|
60
73
|
raise ValueError('响应过大;请通过 BriefLoop 页面读取报告')
|
|
61
74
|
value = json.loads(data)
|
|
62
75
|
if response.status != 200:
|
|
63
|
-
raise
|
|
76
|
+
raise RequestError(response.status)
|
|
64
77
|
return value
|
|
65
78
|
finally:
|
|
66
79
|
connection.close()
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"""Stdio MCP adapter to the existing, authenticated local external client.
|
|
2
|
+
|
|
3
|
+
No Store, Worker, credentials, model calls or HTTP listener live in this process.
|
|
4
|
+
The selected canonical path and durable workspace identity cannot be changed by
|
|
5
|
+
tool arguments or by replacing the workspace while a client is connected.
|
|
6
|
+
"""
|
|
7
|
+
import http.client
|
|
8
|
+
import json
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
import anyio
|
|
12
|
+
from jsonschema import Draft202012Validator
|
|
13
|
+
from mcp.server import Server
|
|
14
|
+
from mcp.server.stdio import stdio_server
|
|
15
|
+
from mcp.types import CallToolResult, ListToolsResult, TextContent, Tool, ToolAnnotations
|
|
16
|
+
|
|
17
|
+
from . import __version__
|
|
18
|
+
from .external_client import Client, RequestError, discover
|
|
19
|
+
from .external_requests import FIELDS, MUTATIONS
|
|
20
|
+
from .workspaces import _workspace_id
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
ID = {'type': 'string', 'minLength': 1}
|
|
24
|
+
REQUEST_ID = {'type': 'string', 'pattern': r'^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$'}
|
|
25
|
+
PROPERTIES = {
|
|
26
|
+
'source_id': ID, 'job_id': ID, 'version_id': ID, 'base_version': ID,
|
|
27
|
+
'requirements': {'type': 'object'}, 'editor_document': {'type': 'object'},
|
|
28
|
+
'source_ids': {'type': 'array', 'items': ID},
|
|
29
|
+
}
|
|
30
|
+
DESCRIPTIONS = {
|
|
31
|
+
'discover': '检查启动时选定工作区的现有服务和能力;不创建或启动服务。',
|
|
32
|
+
'inspect': '列出选定工作区最近 100 个来源和 20 个稿件;返回真实 ID。',
|
|
33
|
+
'source': '读取指定来源正文和出处。source_id 必须来自该工作区。',
|
|
34
|
+
'submit': '提交报告,立即返回 job_id/run_id;用 query 查进度。沿用工作区模型、企业背景与需求规则。每次新写操作使用稳定 request_id;响应丢失仅重发原 ID 和原内容。',
|
|
35
|
+
'query': '查询原 job_id 的实际状态、安全错误、版本和 Word 文件可用性;不重建失败任务。latest_version_id 可来自后续修订。',
|
|
36
|
+
'read': '读取精确 version_id 的 Markdown 和完整 editor_document。',
|
|
37
|
+
'revise': '保存 base_version 的完整 editor_document 为新版本,保留图表、引用和未修改节点;已有新版本时报冲突。用稳定 request_id 重试原内容。',
|
|
38
|
+
'export': '排队生成明确 version_id 的 Word 工作稿,立即返回 job_id;query 至 artifact_available=true 后 download。不代表正式交付审核通过。用稳定 request_id 重试原内容。',
|
|
39
|
+
'download': '将已完成导出 job_id 的 Word 保存到明确 output 文件路径;父目录须已存在。校验 SHA256、复用相同文件,不覆盖不同内容,不重新排队。',
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class WorkspaceUnavailable(ValueError):
|
|
44
|
+
pass
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def failure(code, message):
|
|
48
|
+
return {'status': 'error', 'code': code, 'message': message}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def request_failure(status):
|
|
52
|
+
if status == 409:
|
|
53
|
+
return failure('conflict', '稿件已有更新或 request_id 已用于不同内容;请核对原请求,并重新读取最新版本后合并修订')
|
|
54
|
+
if status == 400:
|
|
55
|
+
return failure('invalid_request', '请求参数或报告配置不符合要求;请检查需求、来源 ID、完整富文档及工作区设置')
|
|
56
|
+
if status == 403:
|
|
57
|
+
return failure('access_denied', '本地服务拒绝鉴权;请重新连接用户选定的工作区')
|
|
58
|
+
if status == 503:
|
|
59
|
+
return failure('service_unavailable', '本地服务尚未就绪或正在停止接收任务;请查询原任务,不自动重建')
|
|
60
|
+
return failure('request_failed', '本地服务请求失败;写操作结果可能未知,请保留原 request_id 和原内容重试')
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def tools():
|
|
64
|
+
catalog = []
|
|
65
|
+
for action, description in DESCRIPTIONS.items():
|
|
66
|
+
if action == 'download':
|
|
67
|
+
properties = {'job_id': ID, 'output': {'type': 'string', 'minLength': 1}}
|
|
68
|
+
required = list(properties)
|
|
69
|
+
else:
|
|
70
|
+
fields = FIELDS.get(action, set())
|
|
71
|
+
properties = {field: PROPERTIES[field] for field in sorted(fields)}
|
|
72
|
+
required = sorted(fields - ({'source_ids'} if action == 'submit' else set()))
|
|
73
|
+
if action in MUTATIONS:
|
|
74
|
+
properties['request_id'] = REQUEST_ID
|
|
75
|
+
required.append('request_id')
|
|
76
|
+
catalog.append(Tool(
|
|
77
|
+
name='briefloop_' + action, description=description,
|
|
78
|
+
input_schema={'type': 'object', 'properties': properties,
|
|
79
|
+
'required': required, 'additionalProperties': False},
|
|
80
|
+
annotations=ToolAnnotations(
|
|
81
|
+
read_only_hint=action not in MUTATIONS | {'download'},
|
|
82
|
+
destructive_hint=False, idempotent_hint=True,
|
|
83
|
+
# Only submit can invoke models or research outside this
|
|
84
|
+
# workspace. Revise saves as author=agent, without learning.
|
|
85
|
+
open_world_hint=action == 'submit',
|
|
86
|
+
),
|
|
87
|
+
))
|
|
88
|
+
return catalog
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class WorkspaceAdapter:
|
|
92
|
+
def __init__(self, workspace):
|
|
93
|
+
path = Path(workspace).expanduser()
|
|
94
|
+
if not path.is_absolute():
|
|
95
|
+
raise ValueError('--workspace 必须是用户选定工作区的绝对路径')
|
|
96
|
+
self.root = path.resolve()
|
|
97
|
+
self.workspace_id = _workspace_id(self.root) if self.root.is_dir() else None
|
|
98
|
+
|
|
99
|
+
def discovery(self):
|
|
100
|
+
info = discover(self.root)
|
|
101
|
+
if info.get('workspace_id') != self.workspace_id:
|
|
102
|
+
return {'path': str(self.root), 'workspace_id': self.workspace_id,
|
|
103
|
+
'ready': False, 'status': 'identity_changed',
|
|
104
|
+
'message': '工作区身份已变化;请重新启动 MCP 连接到用户选择的工作区'}
|
|
105
|
+
return info
|
|
106
|
+
|
|
107
|
+
def invoke(self, action, arguments):
|
|
108
|
+
if action == 'discover':
|
|
109
|
+
return self.discovery()
|
|
110
|
+
if not self.workspace_id:
|
|
111
|
+
raise WorkspaceUnavailable()
|
|
112
|
+
try:
|
|
113
|
+
client = Client(self.root)
|
|
114
|
+
except ValueError:
|
|
115
|
+
raise WorkspaceUnavailable() from None
|
|
116
|
+
if client.info['workspace_id'] != self.workspace_id:
|
|
117
|
+
raise WorkspaceUnavailable()
|
|
118
|
+
if action == 'download':
|
|
119
|
+
return client.download(arguments['job_id'], arguments['output'])
|
|
120
|
+
return client.request({'action': action, 'workspace_id': self.workspace_id, **arguments})
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def create_server(workspace):
|
|
124
|
+
adapter = WorkspaceAdapter(workspace)
|
|
125
|
+
catalog = tools()
|
|
126
|
+
validators = {tool.name: Draft202012Validator(tool.input_schema) for tool in catalog}
|
|
127
|
+
limiter = anyio.CapacityLimiter(4)
|
|
128
|
+
|
|
129
|
+
async def list_tools(context, params):
|
|
130
|
+
return ListToolsResult(tools=catalog)
|
|
131
|
+
|
|
132
|
+
async def call_tool(context, params):
|
|
133
|
+
arguments = params.arguments if params.arguments is not None else {}
|
|
134
|
+
validator = validators.get(params.name)
|
|
135
|
+
# Never echo invalid arguments (which may contain credential-shaped
|
|
136
|
+
# values), validation traces or internal exception details to clients.
|
|
137
|
+
if validator is None:
|
|
138
|
+
value = failure('unknown_tool', '未知 BriefLoop 工具')
|
|
139
|
+
failed = True
|
|
140
|
+
elif not validator.is_valid(arguments):
|
|
141
|
+
value = failure('invalid_arguments', '工具参数不符合公布的 schema;不得传入其他工作区或服务地址')
|
|
142
|
+
failed = True
|
|
143
|
+
else:
|
|
144
|
+
try:
|
|
145
|
+
action = params.name.removeprefix('briefloop_')
|
|
146
|
+
value = await anyio.to_thread.run_sync(adapter.invoke, action, arguments, limiter=limiter)
|
|
147
|
+
failed = False
|
|
148
|
+
except WorkspaceUnavailable:
|
|
149
|
+
value = failure('workspace_unavailable', '选定工作区服务尚未就绪,或服务路径/身份不匹配;请在 BriefLoop 打开用户选定的工作区后重新连接')
|
|
150
|
+
failed = True
|
|
151
|
+
except RequestError as exc:
|
|
152
|
+
value = request_failure(exc.status)
|
|
153
|
+
failed = True
|
|
154
|
+
except (OSError, http.client.HTTPException):
|
|
155
|
+
value = failure('local_io_failed', '本地服务通信或文件操作失败;写操作结果可能未知,请使用原 request_id 和原内容重试')
|
|
156
|
+
failed = True
|
|
157
|
+
except (ValueError, KeyError):
|
|
158
|
+
value = failure('invalid_request', '请求、完整富文档或下载目标不符合要求;请检查指定 ID、父目录及目标文件,不覆盖不同内容')
|
|
159
|
+
failed = True
|
|
160
|
+
except Exception:
|
|
161
|
+
value = failure('request_failed', '本地外部请求失败;写操作结果可能未知,请用原 request_id 和原内容重试,勿新建任务')
|
|
162
|
+
failed = True
|
|
163
|
+
return CallToolResult(content=[TextContent(type='text', text=json.dumps(value, ensure_ascii=False))],
|
|
164
|
+
structured_content=value, is_error=failed)
|
|
165
|
+
|
|
166
|
+
return Server('BriefLoop', version=__version__, on_list_tools=list_tools, on_call_tool=call_tool,
|
|
167
|
+
instructions='仅操作启动时用户选定的本机工作区。先 discover 确认 ready,再 inspect/source。写操作保留原 request_id 与完整请求;submit/export 返回 job_id 后查询,不等待模型生成。修订先读取精确版本、保留完整富文档;Word 是指定版本的工作稿。MCP 取消或断开不取消已接收的后台任务;重连后查询原任务。')
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def serve(workspace):
|
|
171
|
+
server = create_server(workspace)
|
|
172
|
+
|
|
173
|
+
async def run():
|
|
174
|
+
async with stdio_server() as (read, write):
|
|
175
|
+
await server.run(read, write, server.create_initialization_options())
|
|
176
|
+
|
|
177
|
+
anyio.run(run)
|
|
@@ -51,9 +51,10 @@ class _RequestStore(Store):
|
|
|
51
51
|
return [dict(row) for row in self.connection.execute(query, args)]
|
|
52
52
|
|
|
53
53
|
|
|
54
|
-
def capabilities():
|
|
54
|
+
def capabilities(store):
|
|
55
55
|
return {'protocol': 1, 'actions': list(FIELDS), 'request_id_required': sorted(MUTATIONS),
|
|
56
|
-
'export_kind': 'working_draft', 'starts_service': False
|
|
56
|
+
'export_kind': 'working_draft', 'starts_service': False,
|
|
57
|
+
'workspace_path': str(store.root.resolve()), 'workspace_id': store.meta('workspace_id')}
|
|
57
58
|
|
|
58
59
|
|
|
59
60
|
def _operation(store, action, body):
|
|
@@ -55,8 +55,18 @@ def _plain_turn(worker, job, folder, prompt, *, phase=None):
|
|
|
55
55
|
(folder / 'packet').mkdir(exist_ok=True)
|
|
56
56
|
task = {**job, 'allow_web': False, 'plain_output': 'response.txt', 'plain_phase':phase, 'input_source_ids': [],
|
|
57
57
|
'native_packet': {'role': 'quick_writer', 'run_id': json.loads(job['payload'])['run_id']}}
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
result = worker.runtime.execute(task, prompt, folder,
|
|
59
|
+
resume_on_complete=int(json.loads(job['payload']).get('attempt',1))>1)
|
|
60
|
+
from . import plain_isolation
|
|
61
|
+
isolation = plain_isolation.record(json.loads(job['payload']).get('agent_backend', 'codex'), folder)
|
|
62
|
+
worker.store.event(job['id'], 'plain_isolation', {'phase': phase or folder.name, **isolation,
|
|
63
|
+
'message': plain_isolation.summary(isolation)})
|
|
64
|
+
return result
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _isolation(folder):
|
|
68
|
+
path = folder / 'isolation.json'
|
|
69
|
+
return json.loads(path.read_text(encoding='utf-8')) if path.exists() else None
|
|
60
70
|
|
|
61
71
|
|
|
62
72
|
def _response(folder):
|
|
@@ -126,6 +136,10 @@ def generate(worker, job):
|
|
|
126
136
|
data = {'title': req['title'], 'editor_document': markdown_document(text),
|
|
127
137
|
'citations': [{'source_id': aliases[a]['source_id']} for a in sorted(cited)],
|
|
128
138
|
'research_notes': [{'kind': 'fast_draft', 'summary': '一轮聚焦检索后根据已读取原文写作;未做完整事实核查,依据定位与评价在后台继续。' if research else '直接依据已有材料写作;未联网补搜,依据定位与评价在后台继续。'}]}
|
|
139
|
+
isolation = _isolation(folder / 'fast-writing')
|
|
140
|
+
if isolation:
|
|
141
|
+
from .plain_isolation import summary
|
|
142
|
+
data['research_notes'].append({'kind': 'fast_isolation', 'summary': summary(isolation), **isolation})
|
|
129
143
|
if research:
|
|
130
144
|
data['research_notes'].append({'kind':'fast_web_gaps','summary':'本次搜索与读取记录','gaps':research['gaps'],'reading_notices':research.get('notices',[]),
|
|
131
145
|
'questions_before_reading':research.get('questions_before_reading',[])})
|
|
@@ -159,7 +173,8 @@ def enrich(worker, job, brief, folder):
|
|
|
159
173
|
raise Conflict('材料与快速写作时的原文不同,请使用当前材料新建任务。')
|
|
160
174
|
phase = folder / 'evidence'
|
|
161
175
|
prompt = ('核对已保存报告,为重要结论补原文定位。不要改写正文,不搜索、不调用工具、不生成新的报告。'
|
|
162
|
-
'只返回一个 JSON 对象,包含 citations
|
|
176
|
+
'只返回一个 JSON 对象,包含 citations、number_bindings 和 unsupported 三个数组;没有可定位依据时留空,不猜测。'
|
|
177
|
+
'unsupported 列出正文中在全部来源里找不到依据的重要结论,每条给 report_quote(正文连续原句)和 reason;不要因措辞概括而列入。'
|
|
163
178
|
'每条 citation 使用 source_id(下方来源别名,如 S1)、report_quote(正文连续原句)、excerpt(连续逐字原文)。'
|
|
164
179
|
'report_quote 必须能在报告正文中逐字找到;摘录应包含对应的主体、期间、单位及限定条件,不能用同来源的无关段落充数。'
|
|
165
180
|
'无需猜行号;同一摘录在来源中重复时提供更长的唯一摘录。来源标题及相邻上下文由程序从冻结原文补入。'
|
|
@@ -212,8 +227,19 @@ def enrich(worker, job, brief, folder):
|
|
|
212
227
|
details = {key:value for key,value in json.loads(brief['detail']).items() if key in BriefDraft.model_fields}
|
|
213
228
|
details['citations'] = citations + [c for c in details.get('citations', []) if c['source_id'] not in {r['source_id'] for r in citations}]
|
|
214
229
|
details['number_bindings'] = numbers
|
|
230
|
+
# Claims the materials do not cover. Mostly a slip in an enforced turn; in an
|
|
231
|
+
# observed turn it is where outside information the CLI brought in shows up.
|
|
232
|
+
unsupported = [{'report_quote': item['report_quote'], 'reason': str(item.get('reason', ''))[:500]}
|
|
233
|
+
for item in (data.get('unsupported') if isinstance(data.get('unsupported'), list) else [])[:30]
|
|
234
|
+
if isinstance(item, dict) and isinstance(item.get('report_quote'), str)
|
|
235
|
+
and item['report_quote'].strip() and item['report_quote'] in brief['markdown']]
|
|
215
236
|
details.setdefault('research_notes', []).append({'kind': 'fast_evidence', 'summary': '逐字定位已检查;支持关系仍需评价。', 'rejected': rejected})
|
|
216
|
-
|
|
237
|
+
if unsupported:
|
|
238
|
+
details['research_notes'].append({'kind': 'fast_unsupported', 'summary': '以下结论在所选材料中找不到原文依据,需核实或删除。', 'items': unsupported})
|
|
239
|
+
store.event(job['id'], 'fast_unsupported', {'version_id': brief['id'], 'count': len(unsupported),
|
|
240
|
+
'message': f'{len(unsupported)} 条结论在所选材料中找不到原文依据,已单独列出。'})
|
|
241
|
+
(phase / 'admission.json').write_text(dump({'citations': citations, 'number_bindings': numbers, 'rejected': rejected,
|
|
242
|
+
'unsupported': unsupported}), encoding='utf-8')
|
|
217
243
|
if worker.runtime.cancelled.is_set() or worker.stopping.is_set():
|
|
218
244
|
raise InterruptedError('依据补全已停止,初稿和结果保留。')
|
|
219
245
|
from .draft_completion import verify_input
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""Bounded feedback history with persisted job status and workspace-wide counts."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def snapshot(store):
|
|
5
|
+
# batch_id is the learning job's primary key, not a position in recent jobs.
|
|
6
|
+
# At most 100 indexed joins; never scan/parse job payloads per feedback item.
|
|
7
|
+
items = store.rows("SELECT f.*, j.status AS learning_status FROM feedback f "
|
|
8
|
+
"LEFT JOIN jobs j ON j.id=f.batch_id AND j.kind='learn' "
|
|
9
|
+
"ORDER BY f.rowid DESC LIMIT 100")
|
|
10
|
+
counts = store.rows("SELECT count(*) AS total, "
|
|
11
|
+
"count(CASE WHEN batch_id IS NULL THEN 1 END) AS pending FROM feedback")[0]
|
|
12
|
+
return {'feedback': items, 'feedback_summary': counts}
|