feat: advance local-first workspace checklist

- add admin access-policy UI and local access control surfaces

- add local markdown conflict resolution UI and smoke coverage

- add ACP local agent changed-files audit scaffold and read-only write guard

- document current P0-P2 checklist progress and verification evidence
This commit is contained in:
lix-2026
2026-05-19 08:07:17 +08:00
parent a2cb1338c8
commit 68d321e297
36 changed files with 8643 additions and 235 deletions
+38
View File
@@ -29,6 +29,11 @@ mod tree;
pub(crate) mod web_shell;
mod ws;
pub(crate) use local_folder_source::{
ensure_local_path_read_access, ensure_local_workspace_access, update_local_markdown_title,
update_local_page_options, write_local_markdown_page_body,
};
use crate::app::AppState;
use axum::routing::{any, delete, get, post, put};
use axum::Router;
@@ -42,6 +47,10 @@ pub fn build_router(state: AppState) -> Router {
.route("/", get(gateway::root_entry))
.route("/trash", get(gateway::trash_entry))
.route("/favicon.ico", get(gateway::favicon))
.route(
"/admin/access-policy",
get(gateway::admin_access_policy_entry),
)
.route("/auth", get(gateway::auth_entry).post(gateway::auth_entry))
.route("/search", get(search::shell))
.route(
@@ -88,6 +97,22 @@ pub fn build_router(state: AppState) -> Router {
.route("/api/auth/whoami", get(session::session))
.route("/api/auth/mnote-web-token", get(session::session))
.route("/api/auth/session/refresh", post(session::refresh_session))
.route(
"/api/admin/access-policy",
get(local_folder_source::get_local_access_policy),
)
.route(
"/api/admin/access-policy/validate-root",
post(local_folder_source::validate_local_access_root),
)
.route(
"/api/admin/access-policy/grants",
post(local_folder_source::create_local_access_grant),
)
.route(
"/api/admin/access-policy/grants/{grant_id}",
delete(local_folder_source::delete_local_access_grant),
)
.route("/api/ai-agent/run", post(compat::next_ai_agent_run))
.route(
"/api/page-ai/block-edit-workflow",
@@ -134,6 +159,7 @@ pub fn build_router(state: AppState) -> Router {
.route("/api/documents/title", post(documents::title))
.route("/api/documents/options", post(documents::options))
.route("/api/documents/save", post(documents::save))
.route("/api/page-body/write", post(documents::page_body_write))
.route(
"/api/documents/runtime/transform",
post(editor::transform_runtime_snapshot),
@@ -160,6 +186,18 @@ pub fn build_router(state: AppState) -> Router {
"/api/local-folder/events",
get(local_folder_events::local_folder_events),
)
.route(
"/api/local-folder/workspaces/default",
post(local_folder_source::create_default_local_workspace),
)
.route(
"/api/local-folder/assets/upload",
post(local_folder_source::upload_local_markdown_asset),
)
.route(
"/api/local-folder/files/open",
get(local_folder_source::open_local_file),
)
.route(
"/api/tree/runtime/reduce",
post(tree::reduce_tree_shell_runtime),