Retire Convex paths and standardize local-first Pi runtime

This commit is contained in:
Agent Board
2026-07-29 01:49:53 +08:00
parent 26ff1a9c9a
commit a40fa25ae6
85 changed files with 1653 additions and 3971 deletions
+32 -32
View File
@@ -589,7 +589,7 @@ pub fn plan_page_title(
) -> CliResult<CliJsonOutput> {
let bridge = build_bridge_context(ctx, workspace_id, "page", "title", page_id);
let command = CommandEnvelope {
name: "documents.title.update".into(),
name: "tree.node.rename".into(),
command_id: build_command_id("page", "title", page_id),
idempotency_key: bridge.idempotency_key.clone(),
actor: build_actor_payload(ctx),
@@ -644,7 +644,7 @@ pub fn plan_page_save(
let content_value = parse_json_value(content_json, "content_json")?;
let bridge = build_bridge_context(ctx, workspace_id, "page", "save", page_id);
let command = CommandEnvelope {
name: "documents.save".into(),
name: "page.body.save".into(),
command_id: build_command_id("page", "save", page_id),
idempotency_key: bridge.idempotency_key.clone(),
actor: build_actor_payload(ctx),
@@ -699,7 +699,7 @@ pub fn plan_page_create(ctx: &CliContext, args: &PageCreateArgs<'_>) -> CliResul
let content_value = parse_json_value(args.content_json, "content_json")?;
let bridge = build_bridge_context(ctx, Some(args.workspace_id), "page", "create", args.page_id);
let command = CommandEnvelope {
name: "documents.create".into(),
name: "tree.node.create".into(),
command_id: build_command_id("page", "create", args.page_id),
idempotency_key: bridge.idempotency_key.clone(),
actor: build_actor_payload(ctx),
@@ -755,7 +755,7 @@ pub fn plan_page_create(ctx: &CliContext, args: &PageCreateArgs<'_>) -> CliResul
pub fn plan_page_move(ctx: &CliContext, args: &PageMoveArgs<'_>) -> CliResult<CliJsonOutput> {
let bridge = build_bridge_context(ctx, args.workspace_id, "page", "move", args.page_id);
let command = CommandEnvelope {
name: "documents.move".into(),
name: "tree.subtree.move".into(),
command_id: build_command_id("page", "move", args.page_id),
idempotency_key: bridge.idempotency_key.clone(),
actor: build_actor_payload(ctx),
@@ -805,7 +805,7 @@ pub fn plan_page_move(ctx: &CliContext, args: &PageMoveArgs<'_>) -> CliResult<Cl
pub fn plan_page_delete(ctx: &CliContext, args: &PageDeleteArgs<'_>) -> CliResult<CliJsonOutput> {
let bridge = build_bridge_context(ctx, args.workspace_id, "page", "delete", args.page_id);
let command = CommandEnvelope {
name: "documents.delete".into(),
name: "tree.node.archive".into(),
command_id: build_command_id("page", "delete", args.page_id),
idempotency_key: bridge.idempotency_key.clone(),
actor: build_actor_payload(ctx),
@@ -849,7 +849,7 @@ pub fn plan_page_delete(ctx: &CliContext, args: &PageDeleteArgs<'_>) -> CliResul
pub fn plan_page_restore(ctx: &CliContext, args: &PageRestoreArgs<'_>) -> CliResult<CliJsonOutput> {
let bridge = build_bridge_context(ctx, args.workspace_id, "page", "restore", args.page_id);
let command = CommandEnvelope {
name: "documents.restore".into(),
name: "tree.node.restore".into(),
command_id: build_command_id("page", "restore", args.page_id),
idempotency_key: bridge.idempotency_key.clone(),
actor: build_actor_payload(ctx),
@@ -1551,7 +1551,7 @@ fn execute_query(
"documents.content.get"
| "documents.meta.get"
| "mindmaps.get"
| "sidebar.dataset.list" => execute_retired_cloud_transport(name),
| "sidebar.dataset.list" => reject_non_local_cli_transport(name),
"search.documents" => execute_search_documents(transport, context, cli_ctx),
other => Err(CliError::validation(format!("暂不支持执行 query: {other}"))),
}
@@ -1565,13 +1565,13 @@ fn execute_command(
cli_ctx: &CliContext,
) -> CliResult<Value> {
match name {
"documents.create"
| "documents.move"
| "documents.delete"
| "documents.restore"
| "documents.title.update"
| "documents.save"
| "mindmaps.put" => execute_retired_cloud_transport(name),
"tree.node.create"
| "tree.subtree.move"
| "tree.node.archive"
| "tree.node.restore"
| "tree.node.rename"
| "page.body.save"
| "mindmaps.put" => reject_non_local_cli_transport(name),
"insert_block" => execute_block_insert(normalized_input, context, cli_ctx),
"blocks.patch" => execute_block_patch(normalized_input, transport, cli_ctx),
"blocks.move" => execute_block_move(normalized_input, cli_ctx),
@@ -1650,7 +1650,7 @@ fn execute_search_documents(
_context: &CliOutputContext,
_cli_ctx: &CliContext,
) -> CliResult<Value> {
execute_retired_cloud_transport("search.documents")
reject_non_local_cli_transport("search.documents")
}
fn execute_block_insert(
@@ -1658,7 +1658,7 @@ fn execute_block_insert(
_context: &CliOutputContext,
_cli_ctx: &CliContext,
) -> CliResult<Value> {
execute_retired_cloud_transport("insert_block")
reject_non_local_cli_transport("insert_block")
}
fn execute_block_patch(
@@ -1666,15 +1666,15 @@ fn execute_block_patch(
_transport: &CliTransportPlan,
_cli_ctx: &CliContext,
) -> CliResult<Value> {
execute_retired_cloud_transport("blocks.patch")
reject_non_local_cli_transport("blocks.patch")
}
fn execute_block_move(_normalized_input: &Value, _cli_ctx: &CliContext) -> CliResult<Value> {
execute_retired_cloud_transport("blocks.move")
reject_non_local_cli_transport("blocks.move")
}
fn execute_block_embed(_normalized_input: &Value, _cli_ctx: &CliContext) -> CliResult<Value> {
execute_retired_cloud_transport("blocks.embed")
reject_non_local_cli_transport("blocks.embed")
}
fn build_tool_target(
@@ -1735,7 +1735,7 @@ fn load_tool_data(
"image_read" => Ok(json!({ "source": "cli", "asset": Value::Null })),
"doc_get" | "doc_find" | "doc_insert_blocks" | "doc_replace_range" => {
let _ = read_doc_target(args, target)?;
Err(retired_cloud_transport_error(tool_name))
Err(non_local_cli_transport_error(tool_name))
}
"mindmap_get" | "mindmap_get_subtree" | "mindmap_apply_ops" | "mindmap_put" => {
let document_id = read_doc_target(args, target)?;
@@ -1745,7 +1745,7 @@ fn load_tool_data(
.or_else(|| target.and_then(|value| value.block_id.as_deref()))
.ok_or_else(|| CliError::validation("mindmap 工具缺少 mindmapId"))?;
let _ = (document_id, mindmap_id);
Err(retired_cloud_transport_error(tool_name))
Err(non_local_cli_transport_error(tool_name))
}
other => Err(CliError::validation(format!(
"暂不支持 tool 数据加载: {other}"
@@ -1753,13 +1753,13 @@ fn load_tool_data(
}
}
fn execute_retired_cloud_transport(operation: &str) -> CliResult<Value> {
Err(retired_cloud_transport_error(operation))
fn reject_non_local_cli_transport(operation: &str) -> CliResult<Value> {
Err(non_local_cli_transport_error(operation))
}
fn retired_cloud_transport_error(operation: &str) -> CliError {
fn non_local_cli_transport_error(operation: &str) -> CliError {
CliError::validation(format!(
"旧 Convex CLI 执行链已退役: {operation};请用 local-first Rust/SQLite control-plane 路径"
"非 local_folder 的 CLI 执行链已移除: {operation};请使用 local-first local_folder 路径"
))
}
@@ -2100,10 +2100,10 @@ mod tests {
transport,
..
} => {
assert_eq!(name, "documents.save");
assert_eq!(name, "page.body.save");
assert_eq!(command_id, "cmd_page_save_page_1");
assert_eq!(transport.kind, "runtime_command_plan");
assert_eq!(transport.function_name, "documents.save");
assert_eq!(transport.function_name, "page.body.save");
assert_eq!(
transport.args_json,
json!({
@@ -2149,9 +2149,9 @@ mod tests {
CliOperationOutput::Command {
name, transport, ..
} => {
assert_eq!(name, "documents.create");
assert_eq!(name, "tree.node.create");
assert_eq!(transport.kind, "runtime_command_plan");
assert_eq!(transport.function_name, "documents.create");
assert_eq!(transport.function_name, "tree.node.create");
assert_eq!(transport.args_json["workspaceId"], json!("ws_1"));
assert_eq!(transport.args_json["parentId"], json!("parent_1"));
}
@@ -2160,7 +2160,7 @@ mod tests {
}
#[test]
fn page_move_json_contract_uses_documents_move() {
fn page_move_json_contract_uses_tree_subtree_move() {
let output = plan_page_move(
&CliContext::default(),
&PageMoveArgs {
@@ -2176,9 +2176,9 @@ mod tests {
CliOperationOutput::Command {
name, transport, ..
} => {
assert_eq!(name, "documents.move");
assert_eq!(name, "tree.subtree.move");
assert_eq!(transport.kind, "runtime_command_plan");
assert_eq!(transport.function_name, "documents.move");
assert_eq!(transport.function_name, "tree.subtree.move");
assert_eq!(transport.args_json["sortOrder"], json!(3));
}
_ => panic!("expected command output"),