Files
Genarrative/server-rs/crates/spacetime-module/src/active.rs
T
k88936 422c8931d6
Project CI / Repository checks (push) Successful in 2m45s
Project CI / Frontend tests (push) Successful in 3m22s
Project CI / Backend tests (push) Successful in 5m53s
Project CI / Native shell tests (push) Successful in 16m45s
Feat/AGC错误报告 (#240)
实现:
在rust内存里维护错误事件队列, webview调用tauri command传入, 后台任务agent工具等直接插入
把rust , webview console的日志统一写到AppData文件夹下的(滚动保存的)日志文件.
rust对传入的错误进行筛选,脱敏, 防抖,后通知前端提醒用户.
用户提醒是一个不阻塞的小UI, 展开后可以选择错误上报, 可以附加文字描述
上传时附带最近日志, 错误堆栈等信息

元数据存在数据库, 考虑到字符串信息很难查询, 所以在api server打包成zip存在OSS.
管理页面新增错误报告的查看页面

![shotmd-1788328504.jpg](/attachments/641b43c8-deed-47d8-8c78-36adb9a2548f)
![shotmd-1788328495.jpg](/attachments/33c6ada3-dd4d-44b6-9859-f18f944eb653)
![shotmd-1788328222.jpg](/attachments/59267df9-f624-4e47-bb9b-b69d77f595c4)
![shotmd-1788328230.jpg](/attachments/63ea6a86-9a51-412b-a98c-dce454bcc968)

---------

Co-authored-by: 段舒康 <kdletters@qq.com>
Reviewed-on: http://192.168.35.82/git/GenarrativeAI/Genarrative/pulls/240
Co-authored-by: 王德宇 <kvtodev@outlook.com>
Co-committed-by: 王德宇 <kvtodev@outlook.com>
2026-09-03 10:02:05 +08:00

267 lines
6.7 KiB
Rust

// 中文注释:SpacetimeDB 绑定生成依赖根模块继续公开 re-export 各领域类型;
// 少数领域 helper 同名只影响 value namespace 导出,不影响 table / reducer 类型。
#![allow(ambiguous_glob_reexports)]
pub use module_ai::*;
pub use module_assets::*;
pub use module_runtime::*;
pub(crate) use serde_json::{Map as JsonMap, Value as JsonValue, json};
pub use spacetimedb::{
Identity, ProcedureContext, ReducerContext, ScheduleAt, SpacetimeType, Table, Timestamp,
};
mod admin_account_storage;
mod admin_dashboard;
mod ai;
mod asset_metadata;
mod auth;
#[path = "legacy_schema/bark_battle.rs"]
mod bark_battle;
#[path = "legacy_schema/big_fish.rs"]
mod big_fish;
#[path = "legacy_schema/custom_world.rs"]
mod custom_world;
mod editor_agent_storage;
mod editor_project_storage;
#[path = "error_report.rs"]
mod error_reports_schema;
mod external_api_key_storage;
mod external_generation;
#[path = "legacy_schema/gameplay.rs"]
mod gameplay;
#[path = "legacy_schema/jump_hop.rs"]
mod jump_hop;
#[path = "legacy_schema/match3d.rs"]
mod match3d;
mod migration;
#[path = "legacy_schema/puzzle.rs"]
mod puzzle;
#[path = "legacy_schema/puzzle_clear.rs"]
mod puzzle_clear;
mod runtime;
#[path = "legacy_schema/square_hole.rs"]
mod square_hole;
#[path = "legacy_schema/visual_novel.rs"]
mod visual_novel;
#[path = "legacy_schema/wooden_fish.rs"]
mod wooden_fish;
pub use admin_account_storage::*;
pub use admin_dashboard::*;
pub use ai::*;
pub use asset_metadata::*;
pub use auth::*;
pub use bark_battle::*;
pub use big_fish::*;
pub use custom_world::*;
pub use editor_agent_storage::*;
pub use editor_project_storage::*;
pub use error_reports_schema::*;
pub use external_api_key_storage::*;
pub use external_generation::*;
pub use gameplay::*;
pub use jump_hop::*;
pub use match3d::*;
pub use migration::*;
pub use puzzle_clear::*;
pub use runtime::*;
pub use square_hole::*;
pub use visual_novel::*;
pub use wooden_fish::*;
// Host-side unit tests need to link the module crate as a normal test binary.
// SpacetimeDB's raw ABI imports only exist in the WASM host, so provide
// deterministic error-returning symbols for tests that exercise pure helpers.
// Reducer/procedure integration tests must use a real SpacetimeDB runtime.
#[cfg(all(test, not(target_arch = "wasm32")))]
mod host_test_imports {
type TableId = u32;
type IndexId = u32;
type ColId = u16;
type BytesSource = u32;
type BytesSink = u32;
type RowIter = u32;
const HOST_TEST_UNSUPPORTED: u16 = 1;
#[unsafe(no_mangle)]
pub extern "C" fn table_id_from_name(_: *const u8, _: usize, _: *mut TableId) -> u16 {
HOST_TEST_UNSUPPORTED
}
#[unsafe(no_mangle)]
pub extern "C" fn index_id_from_name(_: *const u8, _: usize, _: *mut IndexId) -> u16 {
HOST_TEST_UNSUPPORTED
}
#[unsafe(no_mangle)]
pub extern "C" fn datastore_table_row_count(_: TableId, _: *mut u64) -> u16 {
HOST_TEST_UNSUPPORTED
}
#[unsafe(no_mangle)]
pub extern "C" fn datastore_table_scan_bsatn(_: TableId, _: *mut RowIter) -> u16 {
HOST_TEST_UNSUPPORTED
}
#[unsafe(no_mangle)]
pub extern "C" fn datastore_index_scan_range_bsatn(
_: IndexId,
_: *const u8,
_: usize,
_: ColId,
_: *const u8,
_: usize,
_: *const u8,
_: usize,
_: *mut RowIter,
) -> u16 {
HOST_TEST_UNSUPPORTED
}
#[unsafe(no_mangle)]
pub extern "C" fn datastore_delete_by_index_scan_range_bsatn(
_: IndexId,
_: *const u8,
_: usize,
_: ColId,
_: *const u8,
_: usize,
_: *const u8,
_: usize,
_: *mut u32,
) -> u16 {
HOST_TEST_UNSUPPORTED
}
#[unsafe(no_mangle)]
pub extern "C" fn datastore_delete_all_by_eq_bsatn(
_: TableId,
_: *const u8,
_: usize,
_: *mut u32,
) -> u16 {
HOST_TEST_UNSUPPORTED
}
#[unsafe(no_mangle)]
pub extern "C" fn row_iter_bsatn_advance(_: RowIter, _: *mut u8, _: *mut usize) -> i16 {
-1
}
#[unsafe(no_mangle)]
pub extern "C" fn row_iter_bsatn_close(_: RowIter) -> u16 {
HOST_TEST_UNSUPPORTED
}
#[unsafe(no_mangle)]
pub extern "C" fn datastore_insert_bsatn(_: TableId, _: *mut u8, _: *mut usize) -> u16 {
HOST_TEST_UNSUPPORTED
}
#[unsafe(no_mangle)]
pub extern "C" fn datastore_update_bsatn(
_: TableId,
_: IndexId,
_: *mut u8,
_: *mut usize,
) -> u16 {
HOST_TEST_UNSUPPORTED
}
#[unsafe(no_mangle)]
pub extern "C" fn bytes_sink_write(_: BytesSink, _: *const u8, _: *mut usize) -> u16 {
HOST_TEST_UNSUPPORTED
}
#[unsafe(no_mangle)]
pub extern "C" fn bytes_source_read(_: BytesSource, _: *mut u8, _: *mut usize) -> i16 {
-1
}
#[unsafe(no_mangle)]
pub extern "C" fn console_log(
_: u8,
_: *const u8,
_: usize,
_: *const u8,
_: usize,
_: u32,
_: *const u8,
_: usize,
) {
}
#[unsafe(no_mangle)]
pub extern "C" fn console_timer_start(_: *const u8, _: usize) -> u32 {
0
}
#[unsafe(no_mangle)]
pub extern "C" fn console_timer_end(_: u32) -> u16 {
HOST_TEST_UNSUPPORTED
}
#[unsafe(no_mangle)]
pub extern "C" fn identity(out: *mut u8) {
if !out.is_null() {
unsafe { std::ptr::write_bytes(out, 0, 32) };
}
}
#[unsafe(no_mangle)]
pub extern "C" fn bytes_source_remaining_length(_: BytesSource, _: *mut u32) -> i16 {
HOST_TEST_UNSUPPORTED as i16
}
#[unsafe(no_mangle)]
pub extern "C" fn get_jwt(_: *const u8, _: *mut BytesSource) -> u16 {
HOST_TEST_UNSUPPORTED
}
#[unsafe(no_mangle)]
pub extern "C" fn procedure_sleep_until(wake_at: i64) -> i64 {
wake_at
}
#[unsafe(no_mangle)]
pub extern "C" fn procedure_start_mut_tx(_: *mut i64) -> u16 {
HOST_TEST_UNSUPPORTED
}
#[unsafe(no_mangle)]
pub extern "C" fn procedure_commit_mut_tx() -> u16 {
HOST_TEST_UNSUPPORTED
}
#[unsafe(no_mangle)]
pub extern "C" fn procedure_abort_mut_tx() -> u16 {
HOST_TEST_UNSUPPORTED
}
#[unsafe(no_mangle)]
pub extern "C" fn datastore_index_scan_point_bsatn(
_: IndexId,
_: *const u8,
_: usize,
_: *mut RowIter,
) -> u16 {
HOST_TEST_UNSUPPORTED
}
#[unsafe(no_mangle)]
pub extern "C" fn datastore_delete_by_index_scan_point_bsatn(
_: IndexId,
_: *const u8,
_: usize,
_: *mut u32,
) -> u16 {
HOST_TEST_UNSUPPORTED
}
#[unsafe(no_mangle)]
pub extern "C" fn datastore_clear(_: TableId, _: *mut u64) -> u16 {
HOST_TEST_UNSUPPORTED
}
}