from __future__ import annotations from typing import Any try: import lark_oapi HAS_LARK_SDK = True except ImportError: HAS_LARK_SDK = False lark_oapi = None # type: ignore async def list_wiki_spaces(client: Any, page_size: int = 50) -> list[dict[str, Any]]: if not HAS_LARK_SDK or not client: return [] spaces: list[dict[str, Any]] = [] page_token = "" try: while True: request = ( lark_oapi.api.wiki.v2.ListSpaceRequest.builder().page_size(page_size).page_token(page_token).build() ) resp = await client.wiki.v2.space.list(request) if not resp.success(): break data = resp.data if hasattr(resp, "data") else {} items = data.get("items", []) for item in items: spaces.append( { "space_id": item.get("space_id", ""), "name": item.get("name", ""), "description": item.get("description", ""), "owner_id": item.get("owner_id", ""), } ) page_token = data.get("page_token", "") if not page_token or not items: break except Exception as e: raise RuntimeError(f"获取知识库列表失败: {e}") from e return spaces async def get_space_node_tree(client: Any, space_id: str) -> list[dict[str, Any]]: if not HAS_LARK_SDK or not client: return [] nodes: list[dict[str, Any]] = [] page_token = "" try: while True: request = ( lark_oapi.api.wiki.v2.ListSpaceNodeRequest.builder() .space_id(space_id) .page_size(50) .page_token(page_token) .build() ) resp = await client.wiki.v2.space_node.list(request) if not resp.success(): break data = resp.data if hasattr(resp, "data") else {} items = data.get("items", []) for item in items: nodes.append( { "node_token": item.get("node_token", ""), "obj_token": item.get("obj_token", ""), "parent_node_token": item.get("parent_node_token", ""), "title": item.get("title", ""), "obj_type": item.get("obj_type", ""), "has_child": item.get("has_child", False), } ) page_token = data.get("page_token", "") if not page_token or not items: break except Exception as e: raise RuntimeError(f"获取知识库目录失败: {e}") from e return nodes async def get_node_detail(client: Any, node_token: str) -> dict[str, Any]: if not HAS_LARK_SDK or not client: raise RuntimeError("SDK 不可用") try: request = lark_oapi.api.wiki.v2.GetNodeSpaceRequest.builder().token(node_token).build() resp = await client.wiki.v2.space.get_node(request) if not resp.success(): raise RuntimeError(f"获取节点详情失败: {resp.msg}") data = resp.data if hasattr(resp, "data") else {} node = data.get("node", {}) or data return { "node_token": node.get("node_token", ""), "title": node.get("title", ""), "obj_type": node.get("obj_type", ""), "obj_token": node.get("obj_token", ""), "parent_node_token": node.get("parent_node_token", ""), "has_child": node.get("has_child", False), "url": node.get("url", ""), } except Exception as e: raise RuntimeError(f"获取节点详情失败: {e}") from e