From 87fa3c54b46a8685a45e9d9aa281da6acc4aa805 Mon Sep 17 00:00:00 2001 From: huangruiteng Date: Sun, 4 Oct 2026 13:44:45 +0800 Subject: [PATCH 1/7] feat(chat): default ordinary projects to workspace write grants Signed-off-by: huangruiteng --- .../dashboard/src/data/chat-model.ts | 2 +- apps/presentation/dashboard/src/data/chat.ts | 6 ++-- .../private-conversation-panel.tsx | 22 ++++++++++--- .../native_chat/conversation_bindings.py | 11 +++++-- .../native_chat/project_context.py | 19 ++++++++++-- loopx/chat_agent.py | 31 +++++++++++++++++-- loopx/chat_runtime.py | 12 +++++-- loopx/chat_server.py | 3 +- loopx/cli_commands/support_control.py | 1 + loopx/cli_commands/support_control_chat.py | 6 ++++ .../collaboration/conversation_binding.ts | 13 +++++--- .../collaboration/conversation_scope.ts | 8 +++-- .../collaboration/project_conversation.ts | 2 +- .../lark/private_conversation_api.py | 5 +-- .../extensions/lark/private_conversations.py | 2 ++ .../project_registry_io_manifest_v1.json | 8 ++--- 16 files changed, 116 insertions(+), 35 deletions(-) diff --git a/apps/presentation/dashboard/src/data/chat-model.ts b/apps/presentation/dashboard/src/data/chat-model.ts index e39d350406..66bb18b38e 100644 --- a/apps/presentation/dashboard/src/data/chat-model.ts +++ b/apps/presentation/dashboard/src/data/chat-model.ts @@ -1,7 +1,7 @@ import type { GoalDraft } from "../../../../../loopx/control_plane/collaboration/goal_draft.js"; export type LoopXModeSettings = { agent_id: string; token_budget: number }; /** A host-granted workspace an ordinary conversation may be scoped to. */ -export type ChatProject = { project_ref: string; title: string; grant: "workspace_read" }; +export type ChatProject = { project_ref: string; title: string; grant: "workspace_read" | "workspace_write" }; export type ChatTodo = { todo_id: string | null; diff --git a/apps/presentation/dashboard/src/data/chat.ts b/apps/presentation/dashboard/src/data/chat.ts index 90967bc04c..e48c2b1452 100644 --- a/apps/presentation/dashboard/src/data/chat.ts +++ b/apps/presentation/dashboard/src/data/chat.ts @@ -2385,7 +2385,7 @@ const privateAgentTargetSchema = privateAgentSessionSchema.extend({target_ref: z const privateConversationSchema = z.object({ binding_id: z.string(), app_ref: z.string(), context_kind: z.enum(["project", "steward"]), project_ref: z.string(), project_title: z.string(), context_available: z.boolean(), executor_endpoint_id: z.string(), - grant: z.enum(["workspace_read", "portfolio_read"]), goal_count: z.number().int().default(0), listener_status: z.string(), + grant: z.enum(["workspace_read", "workspace_write", "portfolio_read"]), goal_count: z.number().int().default(0), listener_status: z.string(), pending_count: z.number().int(), recovery_count: z.number().int(), agent_candidates: z.array(privateAgentSessionSchema).default([]), agent_targets: z.array(privateAgentTargetSchema).default([]), }); @@ -2395,10 +2395,10 @@ export type PrivateConversation = z.infer; export async function fetchPrivateConversations() { return privateConversationsSchema.parse(await requestJson("/api/chat/lark/private-conversations")); } -export async function connectPrivateConversation(appRef: string, projectRef: string, executor: string, contextKind: "project" | "steward" = "project") { +export async function connectPrivateConversation(appRef: string, projectRef: string, executor: string, contextKind: "project" | "steward" = "project", projectGrant: "workspace_read" | "workspace_write" = "workspace_write") { return privateConversationsSchema.parse(await requestJson("/api/chat/lark/private-conversations", { method: "POST", headers: {"Content-Type": "application/json"}, - body: JSON.stringify({app_ref: appRef, project_ref: projectRef, executor_endpoint_id: executor, context_kind: contextKind}), + body: JSON.stringify({app_ref: appRef, project_ref: projectRef, executor_endpoint_id: executor, context_kind: contextKind, project_grant: projectGrant}), })); } export async function disconnectPrivateConversation(bindingId: string, revision: number) { diff --git a/apps/presentation/dashboard/src/features/personal-workspace/private-conversation-panel.tsx b/apps/presentation/dashboard/src/features/personal-workspace/private-conversation-panel.tsx index f98159343b..7b60b191e8 100644 --- a/apps/presentation/dashboard/src/features/personal-workspace/private-conversation-panel.tsx +++ b/apps/presentation/dashboard/src/features/personal-workspace/private-conversation-panel.tsx @@ -17,6 +17,7 @@ export function PrivateConversationPanel() { const [project, setProject] = useState(""); const [executor, setExecutor] = useState(""); const [role, setRole] = useState<"project" | "steward">("project"); + const [projectGrant, setProjectGrant] = useState<"workspace_read" | "workspace_write">("workspace_write"); const [error, setError] = useState(""); const [busy, setBusy] = useState(false); @@ -54,12 +55,20 @@ export function PrivateConversationPanel() { try {await operation(); await refresh();} catch (error) {setError(String(error));} finally {setBusy(false);} } + function selectApp(appRef: string) { + setApp(appRef); + const saved = rows.find(row => row.app_ref === appRef); + if (saved) { + setProject(saved.project_ref); setExecutor(saved.executor_endpoint_id); setRole(saved.context_kind); + setProjectGrant(saved.grant === "workspace_write" ? "workspace_write" : "workspace_read"); + } else setProjectGrant("workspace_write"); + } return

{zh ? "本人私聊 · 项目助手与管家" : "Owner private Chat · Project assistant and steward"}

-

{zh ? "每个 App 单独核验本人。项目助手只读讨论工作区,不创建隐藏 Goal。管家从空 portfolio 开始,只管理在此入口明确确认的新委托。" : "Verify the owner independently for each App. Project Chat discusses the workspace without hidden Goals. A steward starts with an empty portfolio and manages only new commissions explicitly confirmed here."}

+

{zh ? "每个 App 单独核验本人。项目助手默认支持工作区读写,按项目规则与 skills 执行编辑;可选只读。普通聊天不创建隐藏 Goal。管家从空 portfolio 开始,只管理在此入口明确确认的新委托。" : "Verify the owner independently for each App. Project Chat defaults to workspace writes under project rules and skills; read-only remains available without hidden Goals. A steward starts with an empty portfolio and manages only new commissions explicitly confirmed here."}

{rows.map(row =>
{row.app_ref} · {row.context_available ? row.project_title : (zh ? "工作区不可用" : "Workspace unavailable")} -

{row.context_kind === "steward" ? (zh ? `LoopX 管家 · ${row.goal_count === 0 ? "暂无已授权的新委托;没有继承旧目标。" : `${row.goal_count} 个已确认的新委托`}` : `LoopX steward · ${row.goal_count} new confirmed commissions; no inherited Goals.`) : (zh ? "普通项目助手 · 只读对话" : "Project assistant · Read-only Chat")}

+

{row.context_kind === "steward" ? (zh ? `LoopX 管家 · ${row.goal_count === 0 ? "暂无已授权的新委托;没有继承旧目标。" : `${row.goal_count} 个已确认的新委托`}` : `LoopX steward · ${row.goal_count} new confirmed commissions; no inherited Goals.`) : (row.grant === "workspace_write" ? (zh ? "普通项目助手 · 已授权工作区读写" : "Project assistant · Workspace writes authorized") : (zh ? "普通项目助手 · 只读对话" : "Project assistant · Read-only Chat"))}

{row.executor_endpoint_id} · {zh ? "监听状态" : "Listener"}: {listenerLabel(row.listener_status)}

{zh ? `待处理或回复:${row.pending_count}` : `Pending execution or reply: ${row.pending_count}`}

{row.recovery_count > 0 ?

{zh ? "存在尚未确认的发送回执。服务会读取原回执恢复;不要重新发送同一任务。检查 App 登录、权限和原会话后刷新状态。" : "A send receipt is unconfirmed. The service reads the original receipt to recover; avoid resending the same task. Check this App login, permissions and original Session, then refresh status."}

: null} @@ -68,7 +77,7 @@ export function PrivateConversationPanel() {
)} {rows.length === 0 ?

{zh ? "尚未连接本人私聊。" : "No owner private Chat connected."}

: null} - @@ -82,7 +91,12 @@ export function PrivateConversationPanel() { -

{zh ? "从手机发送文字开始;后续消息进入原会话队列。/status 查看工作区、角色与持久排队状态,/help 查看用法与解绑入口,/stop 停止当前聊天执行,/new 开启新会话。图片、文件会明确提示暂不支持。" : "Send text from your phone to begin; follow-ups queue in the same Session. /status shows the workspace, role and durable queue, /help explains commands and where to unbind, /stop stops the current Chat Turn, /new starts a new conversation. Images and files receive an explicit unsupported response."}

diff --git a/loopx/capabilities/native_chat/conversation_bindings.py b/loopx/capabilities/native_chat/conversation_bindings.py index 4a3100d167..d54c932999 100644 --- a/loopx/capabilities/native_chat/conversation_bindings.py +++ b/loopx/capabilities/native_chat/conversation_bindings.py @@ -42,7 +42,12 @@ def _core(operation: str, params: dict[str, Any]) -> dict[str, Any]: return result def configure(self, *, transport_ref: str, project_ref: str, - executor_endpoint_id: str, context_kind: str = "project") -> dict[str, Any]: + executor_endpoint_id: str, context_kind: str = "project", + project_grant: str | None = None) -> dict[str, Any]: + if project_grant is None: + project_grant = self.projects.workspace_grant if context_kind == "project" and executor_endpoint_id == "codex" else "workspace_read" + if project_grant not in {"workspace_read", "workspace_write"} or (context_kind != "project" and project_grant != "workspace_read"): + raise ValueError("workspace write authorization is only available for project Chat") observation = self.observe(transport_ref) candidate = { "schema_version": "loopx_chat_conversation_binding_v0", @@ -50,13 +55,13 @@ def configure(self, *, transport_ref: str, project_ref: str, "provider_ref": observation["provider_ref"], "operator_ref": observation["operator_ref"], "context_kind": context_kind, "project_ref": project_ref, "executor_endpoint_id": executor_endpoint_id, - "grant": "workspace_read" if context_kind == "project" else "portfolio_read", "enabled": True, + "grant": project_grant if context_kind == "project" else "portfolio_read", "enabled": True, **({"goal_ids": []} if context_kind == "steward" else {}), } with exclusive_file_lock(self.path, operation="configure_chat_conversation_binding"): current = self.read() previous = next((row for row in current["bindings"] if row["transport_ref"] == transport_ref), None) - if previous and all(previous.get(key) == candidate.get(key) for key in ["context_kind", "project_ref", "executor_endpoint_id", "provider_ref", "operator_ref"]): + if previous and all(previous.get(key) == candidate.get(key) for key in ["context_kind", "project_ref", "executor_endpoint_id", "provider_ref", "operator_ref", "grant"]): if previous.get("agent_targets"): candidate["agent_targets"] = previous["agent_targets"] if (context_kind == "steward" and previous and all(previous.get(key) == candidate.get(key) diff --git a/loopx/capabilities/native_chat/project_context.py b/loopx/capabilities/native_chat/project_context.py index ca9c352bcb..a0a4b7364b 100644 --- a/loopx/capabilities/native_chat/project_context.py +++ b/loopx/capabilities/native_chat/project_context.py @@ -21,9 +21,22 @@ "Do not create an implicit Goal or borrow the global manager identity." ) +PROJECT_WORK_OBJECTIVE = ( + "Carry out the owner's explicit requests in the selected workspace, preserving " + "this Session's context. The explicit workspace write grant permits bounded " + "file edits and project workflows. Read and follow the workspace AGENTS.md " + "and applicable project skills. Use existing typed owners for durable state; " + "do not bypass material authority, intake, ranking or readback gates. The grant " + "does not create a LoopX Goal, scheduling, delegation or portfolio access. " + "Do not create an implicit Goal or borrow the global manager identity." +) + class ChatProjectContexts: - def __init__(self, roots: list[Path]) -> None: + def __init__(self, roots: list[Path], *, workspace_grant: str = "workspace_write") -> None: + if workspace_grant not in {"workspace_read", "workspace_write"}: + raise ValueError("unsupported project workspace grant") + self.workspace_grant = workspace_grant # Remember the owner's spelling as well as its initial canonical target. # A later symlink retarget must not redirect an accepted Session. self.roots = [(root.expanduser().absolute(), root.expanduser().resolve()) for root in roots] @@ -37,7 +50,7 @@ def available(self) -> list[dict[str, str]]: ref = hashlib.sha256(str(canonical).encode("utf-8")).hexdigest()[:24] contexts[ref] = {"kind": "project_workspace", "project_ref": ref, "workspace_path": str(canonical), "audience": "local_owner", - "grant": "workspace_read"} + "grant": self.workspace_grant} return list(contexts.values()) def resolve(self, project_ref: str, *, session_context: dict[str, Any] | None = None) -> dict[str, Any]: @@ -72,7 +85,7 @@ def session_context(self, session: dict[str, Any]) -> dict[str, Any]: if session.get("channel_id") != selected["channel_id"]: raise ValueError("project conversation channel mismatch") return {"project": Path(selected["context"]["workspace_path"]), - "objective": PROJECT_CONVERSATION_OBJECTIVE, + "objective": PROJECT_WORK_OBJECTIVE if selected["context"]["grant"] == "workspace_write" else PROJECT_CONVERSATION_OBJECTIVE, "title": Path(selected["context"]["workspace_path"]).name} def open_bound(self, binding_id: str, source: dict[str, Any], *, executor: str, channel_id: str | None) -> dict[str, Any]: diff --git a/loopx/chat_agent.py b/loopx/chat_agent.py index bf8e5ce92f..7d7de87195 100644 --- a/loopx/chat_agent.py +++ b/loopx/chat_agent.py @@ -325,6 +325,7 @@ def _turn_prompt( context_summary: str = "", execution_mode: bool = False, runtime_profile: str = "restricted", + project_work: bool = False, ) -> str: envelope = { "schema_version": CHAT_AGENT_RESPONSE_SCHEMA_VERSION, @@ -341,6 +342,8 @@ def _turn_prompt( "Use the existing branch and worktree. Commit or push only when the operator task explicitly requests it. " "Keep changes bounded to the confirmed Task and stop at any permission, identity, or destructive-operation gate. " if execution_mode + else "You are the project assistant inside LoopX Chat. Execute the owner's explicit workspace requests using the project's AGENTS.md and applicable skills. " + if project_work else "You are the planning agent inside LoopX Chat. Work only from the project root. " ) trusted_manager_limits = ( @@ -353,9 +356,17 @@ def _turn_prompt( "Use read-only repository commands only when the operator explicitly asks for repository facts or when evidence is required to answer accurately. " "Do not use tools for ordinary conversation, exact-wording requests, or status questions that can be answered from the supplied LoopX context. " "Do not edit files, mutate LoopX state, create commits, send messages, or request elevated access. " - if not execution_mode and runtime_profile != "trusted_owner" + if not execution_mode and runtime_profile != "trusted_owner" and not project_work else "" ) + if project_work: + planning_limits = ( + "The owner explicitly authorized workspace writes for this App. Perform bounded reversible edits and validation required by the current request. " + "This is ordinary project work without a Goal: do not create a hidden Goal, schedule work, discover a portfolio, or assume manager authority. " + "Use existing typed owners for durable state and obey project material lifecycle and public/private rules. " + "Read skill instructions before using them; a missing authority or source is a concrete gap, never permission to invent a store or import history. " + "Commit, publish or send external messages only when the owner explicitly requests them. " + ) protected_action_contract = ( "For a protected operation (merge, release, deploy, delete, or payment), interpret the operator's semantic intent. " "Set protected_action only when the dominant request is to perform exactly one operation now and the operator supplied a concrete target. " @@ -474,6 +485,7 @@ def start( isolate_process_tree: bool = False, runtime_profile: str = "restricted", sandbox: str | None = None, + project_context: dict[str, str] | None = None, codex_home: Path | None = None, model: str | None = None, reasoning_effort: str | None = None, @@ -493,7 +505,18 @@ def start( root = work_dir.resolve() if runtime_profile not in {"restricted", "trusted_owner"}: raise ValueError("unsupported Codex Chat runtime profile") - if execution_mode: + if project_context is not None: + from .control_plane.effect_runtime import effect_runtime_result + + if execution_mode or goal_id is not None or runtime_profile != "restricted": + raise ValueError("ordinary project runtime cannot borrow Goal or manager authority") + policy = effect_runtime_result("collaboration.project.session_identity", {"context": project_context}) + if Path(policy["context"]["workspace_path"]).resolve() != root: + raise ValueError("project runtime workspace does not match its context") + selected_sandbox = policy["sandbox"] + if sandbox is not None and sandbox != selected_sandbox: + raise ValueError("project sandbox does not match its workspace grant") + elif execution_mode: if runtime_profile != "restricted": raise ValueError( "trusted_owner is only valid for the non-execution manager runtime" @@ -671,6 +694,7 @@ def start( isolate_process_tree=isolate_process_tree, runtime_profile=runtime_profile, sandbox=selected_sandbox, + project_context=project_context, codex_home=runtime_home, model=model, reasoning_effort=reasoning_effort, @@ -809,7 +833,7 @@ def _check_server_gate(self, message: dict[str, Any]) -> bool: raise CodexChatAgentError( "Codex app-server requested host approval", gate=_approval_gate( - "Codex requested host approval during a read-only chat turn." + "Codex requested host approval beyond this Chat session's configured grant." ), ) return False @@ -959,6 +983,7 @@ def send( context_summary=self.context_summary, execution_mode=self.execution_mode, runtime_profile=self.runtime_profile, + project_work=not self.execution_mode and self.sandbox == "workspace-write", ), } ] diff --git a/loopx/chat_runtime.py b/loopx/chat_runtime.py index 2694a636dd..276ca4d5e6 100644 --- a/loopx/chat_runtime.py +++ b/loopx/chat_runtime.py @@ -121,6 +121,7 @@ def start( execution_mode: bool = False, runtime_profile: str = "restricted", sandbox: str | None = None, + project_context: dict[str, str] | None = None, codex_home: Path | None = None, model: str | None = None, reasoning_effort: str | None = None, @@ -138,6 +139,7 @@ def start( execution_mode=execution_mode, runtime_profile=runtime_profile, sandbox=sandbox, + project_context=project_context, resume_thread_id=resume_thread_id, codex_home=codex_home, model=model, @@ -410,7 +412,10 @@ def _start_adapter( project_coordination: bool = False, loopx_tools: bool = False, executor_model: Mapping[str, str | None] | None = None, + project_context: dict[str, str] | None = None, ) -> ChatRuntimeAdapter: + if project_context is not None and project_context.get("grant") == "workspace_write" and agent_id != "codex": + raise ValueError("the selected executor cannot enforce workspace write authorization") if ( manager_runtime is not None and manager_runtime.get("runtime_profile") == "trusted_owner" @@ -439,9 +444,7 @@ def _start_adapter( else None ) if manager_profile is not None: - objective = manager_agent_objective( - str(manager_profile["runtime_profile"]) - ) + objective = manager_agent_objective(str(manager_profile["runtime_profile"])) model_config = ( executor_model or manager_model_config( endpoint=agent_id, @@ -474,6 +477,7 @@ def _start_adapter( if manager_profile is not None else None ), + project_context=project_context, model=model_config.get("model"), reasoning_effort=model_config.get("reasoning_effort"), dynamic_tools=( @@ -661,6 +665,7 @@ def open_session( execution_mode=selected_channel.startswith("task."), project_coordination=conversation_scope({"channel_id": selected_channel, "goal_id": goal_id})["kind"] == "owner_goal", manager_runtime=manager_runtime, + project_context=project_context, executor_model=alloc.manager_executor_model(manager_executor_allocation), ) persisted = self.store.create_session( @@ -912,6 +917,7 @@ def _ensure_adapter_locked( executor_model=(alloc.manager_executor_model(model_allocation) if model_allocation is not None else alloc.restored_executor_model(session)), manager_runtime=manager_runtime, + project_context=session.get("project_context"), ) if session.get("upstream_mode") == CODEX_GOAL_CHAT_MODE: try: diff --git a/loopx/chat_server.py b/loopx/chat_server.py index bec518dbe7..287d52f3cd 100644 --- a/loopx/chat_server.py +++ b/loopx/chat_server.py @@ -1556,6 +1556,7 @@ def serve_chat( open_browser: bool = False, verbose: bool = False, enable_goal_subagent_configuration: bool = False, + project_workspace_grant: str = "workspace_write", ) -> None: if not is_loopback_host(host): raise ValueError("loopx chat requires a loopback --host such as 127.0.0.1") @@ -1609,7 +1610,7 @@ def serve_chat( server.runtime_controller = ChatRuntimeController( store=server.chat_store, registry_path=resolved_registry_path, - project_contexts=ChatProjectContexts(resolved_scan_roots), + project_contexts=ChatProjectContexts(resolved_scan_roots, workspace_grant=project_workspace_grant), manager_scope_resolver=lambda session: ( server.runtime_controller.project_contexts.conversation_bindings.steward_scope(session) if isinstance(session.get("steward_context"), dict) else authorized_manager_goal_ids( diff --git a/loopx/cli_commands/support_control.py b/loopx/cli_commands/support_control.py index 8559c5758a..43852e338d 100644 --- a/loopx/cli_commands/support_control.py +++ b/loopx/cli_commands/support_control.py @@ -622,6 +622,7 @@ def handle_support_control_command( if bool(getattr(args, "replace_existing_loopx_chat", False)): replace_existing_loopx_chat(args.host, args.port) serve_chat( + project_workspace_grant=args.project_workspace_grant, registry_path=chat_registry_path, runtime_root_override=args.runtime_root, scan_roots=scan_roots, diff --git a/loopx/cli_commands/support_control_chat.py b/loopx/cli_commands/support_control_chat.py index fbbed1408a..8af58a7869 100644 --- a/loopx/cli_commands/support_control_chat.py +++ b/loopx/cli_commands/support_control_chat.py @@ -67,6 +67,12 @@ def register_chat_and_dashboard_commands( help="Specific public file or directory to scan. Repeatable.", ) chat_parser.add_argument("--limit", type=int, default=20) + chat_parser.add_argument( + "--project-workspace-grant", + choices=("workspace_read", "workspace_write"), + default="workspace_write", + help="Ordinary project Chat workspace access. Defaults to workspace_write; workspace_read prevents App write grants.", + ) chat_parser.add_argument( "--global-registry", action="store_true", diff --git a/loopx/control_plane/collaboration/conversation_binding.ts b/loopx/control_plane/collaboration/conversation_binding.ts index 7a0603851b..6743e9d380 100644 --- a/loopx/control_plane/collaboration/conversation_binding.ts +++ b/loopx/control_plane/collaboration/conversation_binding.ts @@ -87,7 +87,8 @@ function validateAgentTargetObservation(target: JsonObject, value: unknown, work function binding(value: unknown): JsonObject { const row = requireJsonObject(value, "conversation binding"); if (row.schema_version !== BINDING_SCHEMA || !["project", "steward"].includes(String(row.context_kind)) - || row.grant !== (row.context_kind === "project" ? "workspace_read" : "portfolio_read") || row.enabled !== true) { + || (row.context_kind === "project" ? !["workspace_read", "workspace_write"].includes(String(row.grant)) : row.grant !== "portfolio_read") + || (row.grant === "workspace_write" && row.executor_endpoint_id !== "codex") || row.enabled !== true) { throw new EffectRuntimeRequestError("unsupported conversation binding"); } const targets = row.agent_targets === undefined ? [] : row.agent_targets; @@ -155,8 +156,9 @@ export function planConversationBinding(params: JsonObject): JsonObject { if (params.operation === "configure") { const candidate = binding(params.binding); observed(candidate, params.observation); - if (!Array.isArray(params.available_projects) - || !params.available_projects.map(normalizeProjectContext).some(row => row.project_ref === candidate.project_ref)) { + const project = Array.isArray(params.available_projects) + ? params.available_projects.map(normalizeProjectContext).find(row => row.project_ref === candidate.project_ref) : undefined; + if (!project || (candidate.grant === "workspace_write" && project.grant !== "workspace_write")) { throw new EffectRuntimeRequestError("workspace grant is unavailable"); } const previous = current.bindings.find(row => row.transport_ref === candidate.transport_ref); @@ -228,8 +230,11 @@ export function resolveBoundConversation(params: JsonObject): JsonObject { if (!Array.isArray(params.available_projects)) throw new EffectRuntimeRequestError("workspace grants unavailable"); const projects = params.available_projects.map(normalizeProjectContext).filter(project => project.project_ref === row.project_ref); if (projects.length !== 1) throw new EffectRuntimeRequestError("workspace grant is unavailable or ambiguous"); + if (row.grant === "workspace_write" && projects[0].grant !== "workspace_write") { + throw new EffectRuntimeRequestError("workspace write grant is no longer available"); + } const context = {...projects[0], audience: "bound_owner", binding_id: id, source_ref: source, - provider_ref: row.provider_ref, operator_ref: row.operator_ref, + provider_ref: row.provider_ref, operator_ref: row.operator_ref, grant: row.grant, ...(row.context_kind === "steward" ? {kind: "bound_steward", grant: "portfolio_read", goal_ids: row.goal_ids} : {})}; if (params.session_context !== undefined) { const saved = requireJsonObject(params.session_context, "bound Session context"); diff --git a/loopx/control_plane/collaboration/conversation_scope.ts b/loopx/control_plane/collaboration/conversation_scope.ts index 00591ff04b..eb59413be9 100644 --- a/loopx/control_plane/collaboration/conversation_scope.ts +++ b/loopx/control_plane/collaboration/conversation_scope.ts @@ -6,12 +6,13 @@ export function normalizeProjectContext(value: unknown): Record const ref = context.project_ref, workspace = context.workspace_path; if (typeof ref !== "string" || !/^[a-f0-9]{24}$/.test(ref) || typeof workspace !== "string" || !workspace || context.kind !== "project_workspace" - || !["local_owner", "bound_owner"].includes(String(context.audience)) || context.grant !== "workspace_read" + || !["local_owner", "bound_owner"].includes(String(context.audience)) + || !["workspace_read", "workspace_write"].includes(String(context.grant)) || (workspace[0] !== "/" && !/^[A-Za-z]:[\\/]/.test(workspace))) { throw new Error("invalid project conversation context"); } const normalized: Record = {kind: "project_workspace", project_ref: ref, workspace_path: workspace, - audience: String(context.audience), grant: "workspace_read"}; + audience: String(context.audience), grant: String(context.grant)}; if (context.audience === "bound_owner") { for (const field of ["binding_id", "source_ref", "provider_ref", "operator_ref"]) { const value = context[field]; @@ -24,7 +25,8 @@ export function normalizeProjectContext(value: unknown): Record export function projectConversationIdentity(input: Record): Record { const context = normalizeProjectContext(input.context); - return {context, channel_id: context.audience === "local_owner" + return {context, sandbox: context.grant === "workspace_write" ? "workspace-write" : "read-only", + channel_id: context.audience === "local_owner" ? `project.${context.project_ref}` : `project.external.${context.binding_id}.${context.source_ref}`}; } diff --git a/loopx/control_plane/collaboration/project_conversation.ts b/loopx/control_plane/collaboration/project_conversation.ts index 8e20bd7fbb..3ae6c40bf8 100644 --- a/loopx/control_plane/collaboration/project_conversation.ts +++ b/loopx/control_plane/collaboration/project_conversation.ts @@ -4,7 +4,7 @@ import { requireNonEmptyString } from "../runtime_decode.ts"; import {normalizeProjectContext} from "./conversation_scope.ts"; /** A workspace observation is supplied by the host, never by a model or transport. - * Its read grant does not enroll a Goal, discover a portfolio or authorize work. + * Its workspace grant does not enroll a Goal, discover a portfolio or authorize peer work. */ function normalized(value: unknown): JsonObject { try {return normalizeProjectContext(value);} diff --git a/loopx/extensions/lark/private_conversation_api.py b/loopx/extensions/lark/private_conversation_api.py index 767d621e16..641d653312 100644 --- a/loopx/extensions/lark/private_conversation_api.py +++ b/loopx/extensions/lark/private_conversation_api.py @@ -33,7 +33,7 @@ def _private_conversation_connect(self) -> None: from ...chat_lark_api import build_lark_goal_topic_runtime_snapshot try: body = self._read_json() - if set(body) - {"context_kind"} != {"app_ref", "project_ref", "executor_endpoint_id"}: + if set(body) - {"context_kind", "project_grant"} != {"app_ref", "project_ref", "executor_endpoint_id"}: raise ValueError("select an App, authorized workspace and executor") profile = str(body["app_ref"]) existing = _active_profile_configs(build_lark_goal_topic_runtime_snapshot( @@ -51,7 +51,8 @@ def _private_conversation_connect(self) -> None: raise ValueError("the selected executor is unavailable") self.server.runtime_controller.project_contexts.conversation_bindings.configure( transport_ref=profile, project_ref=str(body["project_ref"]), executor_endpoint_id=endpoint, - context_kind=str(body.get("context_kind", "project"))) + context_kind=str(body.get("context_kind", "project")), + project_grant=str(body["project_grant"]) if "project_grant" in body else None) self.server.lark_goal_topic_runtime.refresh() except (ValueError, OSError, KeyError) as exc: self._send_error(str(exc), status=400) diff --git a/loopx/extensions/lark/private_conversations.py b/loopx/extensions/lark/private_conversations.py index 80363be9b6..f37cbb0a62 100644 --- a/loopx/extensions/lark/private_conversations.py +++ b/loopx/extensions/lark/private_conversations.py @@ -316,6 +316,8 @@ def _status_text(snapshot: dict[str, Any], *, help_requested: bool) -> str: text += ("\n\n/agents 授权 Agent · /project 返回项目 · /help 用法" if attached else "\n\n/stop 停止当前聊天 · /new 新会话 · /help 用法") if help_requested: + if not steward and not attached and snapshot.get("grant") == "workspace_write": + text += "\n按项目规则和 skills 执行当前指令;读写授权不会创建 Goal 或提高原宿主权限。" text += ("\n\n/status 查看当前状态;/help 查看用法。" "\n/agents 查看本 App 已授权的 Agent;使用列表中的完整 /agent 命令选择,/project 返回项目对话。") if not attached: diff --git a/loopx/semantics/project_registry_io_manifest_v1.json b/loopx/semantics/project_registry_io_manifest_v1.json index f9888ad4d8..0f18d8bb9e 100644 --- a/loopx/semantics/project_registry_io_manifest_v1.json +++ b/loopx/semantics/project_registry_io_manifest_v1.json @@ -271,7 +271,7 @@ }, { "site": "loopx/capabilities/native_chat/conversation_bindings.py::.ChatConversationBindings.agent_observation::codec_read:load_registry#1", - "line": 141, + "line": 146, "column": 20, "kind": "codec_read", "api": "load_registry", @@ -471,7 +471,7 @@ }, { "site": "loopx/chat_server.py::.serve_chat::codec_read:load_registry#1", - "line": 1571, + "line": 1572, "column": 16, "kind": "codec_read", "api": "load_registry", @@ -479,7 +479,7 @@ }, { "site": "loopx/chat_server.py::.serve_chat._wake_goal_context::codec_read:load_registry#1", - "line": 1676, + "line": 1677, "column": 20, "kind": "codec_read", "api": "load_registry", @@ -791,7 +791,7 @@ }, { "site": "loopx/cli_commands/quota.py::._dispatch_quota_turn_start_hooks::codec_read:load_registry#1", - "line": 310, + "line": 311, "column": 37, "kind": "codec_read", "api": "load_registry", From b2b4d0b5c3e5909fedc0a9fff62679185231f52a Mon Sep 17 00:00:00 2001 From: huangruiteng Date: Sun, 4 Oct 2026 13:44:45 +0800 Subject: [PATCH 2/7] docs(chat): record workspace write defaults and qualification boundaries Signed-off-by: huangruiteng --- .../app-conversation-and-async-inbox-v0.md | 30 +++++++++++++++++-- ...p-conversation-and-async-inbox-v0.zh-CN.md | 20 +++++++++++++ .../rfcs/loopx-overall-roadmap-v0.md | 8 +++++ 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md b/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md index ea1fd3c1c3..f6b4921730 100644 --- a/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md +++ b/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md @@ -51,8 +51,7 @@ shared request owner, and a replay retains the original Session/Turn target. A lost admission correlation cannot move a request to a newer Session. Admission feedback and final delivery use separate durable provider intents; an ambiguous write is read back without blind resend. Unsupported media receives an explicit -notice. This grant remains workspace reading, without a Goal, portfolio or peer -execution authority. +notice. The workspace grant grants neither Goal, portfolio nor peer execution authority. The packaged settings journey, source revocation/recovery, duplicate events, native queue/stop and two-App isolation have synthetic-provider regression and @@ -74,6 +73,33 @@ Synthetic product previews: [desktop](../../assets/personal-workspace/private-pr [narrow](../../assets/personal-workspace/private-project-conversations-narrow.png), [revoked workspace](../../assets/personal-workspace/private-project-workspace-revoked.png). +## Ordinary workspace writes: default and revocation checkpoint + +Ordinary project Chat defaults to `workspace_write` for host-declared roots. The +Core context owner derives the actual Codex `workspace-write` sandbox on start +and exact-thread resume; this is conversational work, without Task/Goal mode or +manager permissions. The project prompt follows workspace `AGENTS.md` and skills, +permits requested bounded edits, and keeps durable operations with their existing +owners. A write grant does not activate Material Lifecycle or certify a project +adapter's intake/ranking workflow. + +`loopx chat --project-workspace-grant workspace_read` restricts the host to +read-only, including Lark bindings. Settings → Lark defaults a Codex project App +to workspace writes within that host grant and exposes an explicit read-only +choice. Other executors remain read-only until their host policy is qualified. +The readback, `/status` and `/help` show the effective grant. Selecting an existing +App restores its persisted setting. Changing a binding's grant requires a new +identity and Session, invalidates the old Session for new work, and requires new +Agent target grants; it cannot silently elevate an attached host or another App. +Host grant removal or downgrade is rechecked before admission and resume. + +Typed Core/HTTP/native-host regressions qualify default writes, explicit read-only, +workspace identity, independent App grants, old-Session rejection and exact-thread +resume. A real Codex canary edited and read back a synthetic note under project +rules while preserving prior text and creating no Goal. It is a host/filesystem +result, not live Lark write-workflow, material intake or release qualification. +Maintainer review, installed/Lark journeys and broader IM interactions remain open. + ## Bound steward private Chat: explicit new commissions Settings → Lark can now select a steward role independently of ordinary project diff --git a/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.zh-CN.md b/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.zh-CN.md index 36c1c34752..60118829ff 100644 --- a/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.zh-CN.md +++ b/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.zh-CN.md @@ -522,3 +522,23 @@ Turn HTTP 预算包含既有附件额度的 base64 编码:最多四张图片 源码验收覆盖 HTTP 准入、会话持久化读回和合成 Codex 协议进程,以及打包后的桌面/窄屏 图片发送、历史操作卡与拒绝后的草稿恢复。该证据只证明传输和界面行为,不证明真实模型质量、 公开发布或已安装宿主验收。GQ06 的材料入口及 GQ07–09 的连续性仍须完成各自的交付与恢复验收。 + +## 普通工作区读写:默认值与撤权检查点 + +普通项目 Chat 对宿主声明的工作区默认使用 `workspace_write`。Core context owner +在启动和原线程恢复时导出真实 Codex `workspace-write` 沙箱;仍是普通对话,不借 +Task/Goal 模式或 manager 权限。项目 prompt 要求读取工作区 AGENTS.md 与适用 skills, +执行明确请求所需的有界编辑;持久状态继续走既有 owner。读写 grant 本身不激活 +Material Lifecycle,也不证明项目 adapter 的 intake/ranking 已接通。 + +`loopx chat --project-workspace-grant workspace_read` 将宿主及 Lark 项目绑定限制为 +只读。设置 → Lark 的 Codex 项目 App 默认读写,并保留只读选项;其它 executor 在 +宿主策略完成验收前保持只读。设置读回、/status 和 /help 显示实际 grant,重新选择 +已配置 App 会恢复持久配置。改变 grant 会创建新绑定及 Session,拒绝旧会话的新工作, +直连 Agent 必须重新授权;不能偷偷提高 attached 宿主或另一 App 的权限。宿主撤权或 +降为只读后,入站受理及恢复重新核验授权。 + +typed Core、HTTP 与原生宿主回归覆盖默认读写、明确只读、工作区身份、App 独立授权、 +旧会话拒绝和原线程恢复。真实 Codex canary 按项目规则编辑并读回合成笔记,保留原文、 +不创建 Goal;这只是宿主/文件系统结果,不代表真实 Lark 写入、素材 intake 或发布完成。 +维护者 review、安装与 Lark 旅程、更多 IM 交互仍未关闭。 diff --git a/docs/architecture/rfcs/loopx-overall-roadmap-v0.md b/docs/architecture/rfcs/loopx-overall-roadmap-v0.md index 4e6e7dd736..d18cb35f2f 100644 --- a/docs/architecture/rfcs/loopx-overall-roadmap-v0.md +++ b/docs/architecture/rfcs/loopx-overall-roadmap-v0.md @@ -415,6 +415,14 @@ Chat, session, collaboration and presentation owners as R2/R3 integration work. Do not call a candidate catalog, spinner or queued inbox receipt a completed worker handoff. This checkpoint does not lower R1–R3 or G1 gates. +The [ordinary workspace write checkpoint](app-conversation-and-async-inbox-v0.md#ordinary-workspace-writes-default-and-revocation-checkpoint) +adds default project writes under the host grant, explicit read-only launch/App +settings and actual Codex sandbox enforcement on start/resume. It reuses the typed +conversation owner and has no hidden Goal or manager permissions. Synthetic +Core/HTTP cases and a real host note-edit canary do not establish installed Lark +workflow readiness or activate a project's Material Lifecycle adapter. R3/S5 +still require original-audience write/readback, revoke/recovery and IM qualification. + ### Attention-cost acceptance: create, connect, collaborate, understand The [public-safe golden-query pack](../../product/use-cases/steward/golden-queries.md) From 8c80f09bed926a8a0d0c5631f5f90e8a7123acea Mon Sep 17 00:00:00 2001 From: huangruiteng Date: Sun, 4 Oct 2026 13:44:45 +0800 Subject: [PATCH 3/7] test(chat): qualify scoped writes, read-only hosts and grant revocation Signed-off-by: huangruiteng Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../conversation_binding.test.ts | 32 +++++++++- tests/test_chat_conversation_bindings.py | 64 +++++++++++++++++++ tests/test_chat_ordinary_project.py | 32 +++++++++- tests/test_lark_private_status.py | 16 +++++ 4 files changed, 142 insertions(+), 2 deletions(-) diff --git a/tests/control_plane_ts/conversation_binding.test.ts b/tests/control_plane_ts/conversation_binding.test.ts index cce439e9e7..dc5fc99862 100644 --- a/tests/control_plane_ts/conversation_binding.test.ts +++ b/tests/control_plane_ts/conversation_binding.test.ts @@ -2,7 +2,7 @@ import assert from "node:assert/strict"; import test from "node:test"; import {planConversationBinding, resolveBoundConversation, planBoundConversationRequest, stewardCommand, authorizeStewardCreation, resolveConversationAgentTarget} from "../../loopx/control_plane/collaboration/conversation_binding.ts"; -import {resolveConversationScope} from "../../loopx/control_plane/collaboration/conversation_scope.ts"; +import {resolveConversationScope, projectConversationIdentity} from "../../loopx/control_plane/collaboration/conversation_scope.ts"; const project = {kind: "project_workspace", project_ref: "a".repeat(24), workspace_path: "/authorized/notes", audience: "local_owner", grant: "workspace_read"}; @@ -16,6 +16,36 @@ const current = {schema_version: "loopx_chat_conversation_bindings_v0", revision const request = {current, expected_revision: 0, operation: "configure", binding: row, observation, available_projects: [project]}; +test("explicit project writes remain App-bound and cannot exceed the host grant, another executor or an existing Session", () => { + const original = planConversationBinding(request).state as typeof current; + const use = {current: original, binding_id: row.binding_id, source_ref: "e".repeat(24), + sender_ref: row.operator_ref, private_human_message: true, observation, available_projects: [project]}; + const read = resolveBoundConversation(use); + assert.equal(projectConversationIdentity({context: read.context}).sandbox, "read-only"); + assert.equal(projectConversationIdentity({context: {...project, grant: "workspace_write"}}).sandbox, "workspace-write"); + const writable = [{...project, grant: "workspace_write"}]; + assert.throws(() => planConversationBinding({...request, current: original, expected_revision: 1, + binding: {...row, grant: "workspace_write"}, available_projects: writable}), /new binding identity/); + const write = {...row, binding_id: "f".repeat(24), grant: "workspace_write"}; + const next = planConversationBinding({...request, current: original, expected_revision: 1, binding: write, available_projects: writable}).state; + assert.throws(() => planConversationBinding({...request, binding: write}), /workspace/); + assert.throws(() => resolveBoundConversation({...use, current: next, binding_id: write.binding_id}), /write grant/); + use.available_projects = writable; + const selected = resolveBoundConversation({...use, current: next, binding_id: write.binding_id}); + assert.equal(projectConversationIdentity({context: selected.context}).sandbox, "workspace-write"); + assert.deepEqual(resolveConversationScope({goal_id: null, channel_id: selected.channel_id, + project_context: selected.context, origin: "lark"}), {kind: "project_workspace", goal_ids: [], private_conversation: false}); + assert.throws(() => resolveBoundConversation({...use, current: next}), /no longer authorized/); + assert.throws(() => resolveBoundConversation({...use, current: next, binding_id: write.binding_id, + session_context: read.context}), /context changed/); + for (const bad of [{...write, executor_endpoint_id: "claude-code"}, + {...write, context_kind: "steward", goal_ids: []}, {...write, grant: "danger-full-access"}]) { + assert.throws(() => planConversationBinding({...request, binding: bad}), /unsupported/); + } + assert.throws(() => resolveBoundConversation({...use, current: next, binding_id: write.binding_id, + sender_ref: "c".repeat(24)}), /audience/); +}); + test("binding independently verifies the owner and does not create a Goal", () => { const result = planConversationBinding(request); assert.equal(result.changed, true); diff --git a/tests/test_chat_conversation_bindings.py b/tests/test_chat_conversation_bindings.py index 9dfcda123d..fc9c3d2106 100644 --- a/tests/test_chat_conversation_bindings.py +++ b/tests/test_chat_conversation_bindings.py @@ -1,5 +1,6 @@ """Bound external project Chat uses Core Session, queue, and exact stop.""" import time +import json import pytest @@ -7,6 +8,69 @@ from loopx.capabilities.native_chat.conversation_bindings import ChatConversationBindings +def test_explicit_project_write_reaches_native_host_and_resume_without_goal_and_revokes_old_session(ordinary): # noqa: F811 + from loopx.chat_runtime import ChatRuntimeController + from loopx.chat_store import ChatSessionStore + + store, runtime, contexts, _, capture, fake, workspace = ordinary + observations = {profile: {"transport_ref": profile, "provider_ref": provider * 24, + "operator_ref": operator * 24, "verified": True} + for profile, provider, operator in [("notes-app", "c", "d"), ("other-app", "e", "f")]} + bindings = ChatConversationBindings(root=store.root, project_contexts=contexts, observe=lambda p: observations[p]) + contexts.conversation_bindings = bindings + ref = contexts.available()[0]["project_ref"] + def configure(profile, grant="workspace_read"): + return bindings.configure(transport_ref=profile, project_ref=ref, executor_endpoint_id="codex", project_grant=grant) + def open_bound(controller, row): + return controller.open_session(goal_id=None, agent_id="codex", work_dir=workspace, objective="untrusted", + mode="resume_latest", conversation_binding_id=row["binding_id"], source_context={ + "source_ref": "a" * 24, "sender_ref": row["operator_ref"], "private_human_message": True})[0] + read = configure("notes-app") + old = open_bound(runtime, read) + other = open_bound(runtime, configure("other-app")) + contexts.workspace_grant = "workspace_write" + write = configure("notes-app", "workspace_write") + assert write["binding_id"] != read["binding_id"] + assert configure("notes-app", "workspace_write")["binding_id"] == write["binding_id"] + with pytest.raises(ValueError, match="no longer authorized"): + runtime.enqueue_turn(session_id=old["session_id"], client_turn_id="stale", message="edit", + work_dir=workspace, objective="ignored", origin="lark") + one = open_bound(runtime, write) + assert one["session_id"] != old["session_id"] and one["goal_id"] is None + assert one["project_context"]["grant"] == "workspace_write" + adapter = runtime.adapters[one["session_id"]] + assert not adapter.session.execution_mode and adapter.session.runtime_profile == "restricted" + assert adapter.session.sandbox == "workspace-write" + turn, _ = runtime.enqueue_turn(session_id=one["session_id"], client_turn_id="edit", message="整理笔记:更新明确指定的文件", + work_dir=workspace, objective="ignored", origin="lark") + assert runtime.wait_for_turn(session_id=one["session_id"], turn_id=turn["turn_id"], timeout_sec=10)["status"] == "completed" + original = one["upstream_thread_id"] + runtime.close() + restarted = ChatRuntimeController(store=ChatSessionStore(store.root.parent), codex_bin=str(fake), + project_contexts=contexts, registry_path=workspace / "no-registry.json") + try: + resumed = open_bound(restarted, write) + assert resumed["session_id"] == one["session_id"] and resumed["upstream_thread_id"] == original + requests = [json.loads(line) for line in capture.read_text().splitlines()] + starts = [r["params"] for r in requests if r.get("method") == "thread/start"] + assert [r["sandbox"] for r in starts] == ["read-only", "read-only", "workspace-write"] + resumes = [r["params"] for r in requests if r.get("method") == "thread/resume"] + assert resumes[-1]["sandbox"] == "workspace-write" and resumes[-1]["threadId"] == original + prompts = [r["params"]["input"][0]["text"] for r in requests if r.get("method") == "turn/start"] + assert "project assistant" in prompts[-1] and "Do not edit files" not in prompts[-1] + assert "AGENTS.md" in prompts[-1] and "hidden Goal" in prompts[-1] + assert other["project_context"]["grant"] == "workspace_read" + downgraded = configure("notes-app") + assert downgraded["binding_id"] != write["binding_id"] + with pytest.raises(ValueError, match="no longer authorized"): + open_bound(restarted, write) + assert open_bound(restarted, downgraded)["session_id"] != one["session_id"] + assert store.turn_for_client(old["session_id"], "stale") is None + assert not (workspace / "ACTIVE_GOAL_STATE.md").exists() + finally: + restarted.close() + + def test_two_bound_audiences_continue_independently_and_use_core_queue_and_stop(ordinary): # noqa: F811 store, runtime, contexts, _, _, _, workspace = ordinary observations = { diff --git a/tests/test_chat_ordinary_project.py b/tests/test_chat_ordinary_project.py index 7a2eec5e03..36a168dd0d 100644 --- a/tests/test_chat_ordinary_project.py +++ b/tests/test_chat_ordinary_project.py @@ -26,7 +26,7 @@ def ordinary(tmp_path, monkeypatch): fake = tmp_path / "codex" fake.write_text(source) fake.chmod(0o700) - contexts = ChatProjectContexts([workspace]) + contexts = ChatProjectContexts([workspace], workspace_grant="workspace_read") store = ChatSessionStore(tmp_path / "runtime") runtime = ChatRuntimeController(store=store, codex_bin=str(fake), project_contexts=contexts, registry_path=tmp_path / "no-registry.json") @@ -120,3 +120,33 @@ def test_retargeted_symlink_does_not_rebind_a_project_grant(tmp_path): link.symlink_to(second, target_is_directory=True) with pytest.raises(ValueError, match="outside"): contexts.resolve(ref) + + +def test_default_project_host_grant_is_write_and_read_only_launch_is_enforced(ordinary): + from loopx.capabilities.native_chat.conversation_bindings import ChatConversationBindings + + store, runtime, contexts, request, capture, _, workspace = ordinary + # The fixture intentionally launched read-only. The ordinary product default + # is write-capable, and both observed settings and actual host must agree. + assert ChatProjectContexts([workspace]).available()[0]["grant"] == "workspace_write" + contexts.workspace_grant = "workspace_write" + status, projects = request("/api/chat/projects") + assert status == 200 and projects["projects"][0]["grant"] == "workspace_write" + _, opened = request("/api/chat/sessions", {"context_kind": "project", "project_ref": projects["projects"][0]["project_ref"]}) + assert opened["goal_id"] is None + assert runtime.adapters[opened["session_id"]].session.sandbox == "workspace-write" + row = json.loads(capture.read_text().splitlines()[-1]) + assert row["method"] == "thread/start" and row["params"]["sandbox"] == "workspace-write" + proof = {"transport_ref": "notes-app", "provider_ref": "c" * 24, "operator_ref": "d" * 24, "verified": True} + bindings = ChatConversationBindings(root=store.root, project_contexts=contexts, observe=lambda _: proof) + contexts.conversation_bindings = bindings + binding = bindings.configure(transport_ref="notes-app", project_ref=projects["projects"][0]["project_ref"], executor_endpoint_id="codex") + assert binding["grant"] == "workspace_write" + contexts.workspace_grant = "workspace_read" + assert request(f"/api/chat/sessions/{opened['session_id']}/turns", {"message": "edit", "client_turn_id": "host-downgraded"})[0] == 400 + with pytest.raises(ValueError, match="write grant"): + bindings.resolve(binding_id=binding["binding_id"], source_ref="a" * 24, sender_ref=proof["operator_ref"], private_human_message=True) + with pytest.raises(ValueError, match="workspace grant"): + bindings.configure(transport_ref="notes-app", project_ref=projects["projects"][0]["project_ref"], executor_endpoint_id="codex", project_grant="workspace_write") + assert bindings.read()["bindings"][0] == binding + runtime.close() diff --git a/tests/test_lark_private_status.py b/tests/test_lark_private_status.py index 9945eed5d2..c9ed975711 100644 --- a/tests/test_lark_private_status.py +++ b/tests/test_lark_private_status.py @@ -178,3 +178,19 @@ def test_unavailable_execution_evidence_is_not_presented_as_ready(unknown): "active_turn_observation_available": unknown != "missing"} text = _status_text(snapshot, help_requested=False) assert "暂不可" in text and "可以继续对话" not in text + + +def test_explicit_write_status_matches_binding_without_opening_a_model_session(ordinary): # noqa: F811 + store, runtime, provider, transport = connect(ordinary) + try: + runtime.project_contexts.workspace_grant = "workspace_write" + transport.bindings.configure(transport_ref="notes-app", project_ref=runtime.project_contexts.available()[0]["project_ref"], + executor_endpoint_id="codex", project_grant="workspace_write") + transport.admit("notes-app", provider.event("notes-app", "write-status", "/help")) + assert transport.reconcile() == 1 + assert "当前工作区可读写" in provider.writes[-1][1] + assert "只读授权" not in provider.writes[-1][1] + assert "项目规则和 skills" in provider.writes[-1][1] + assert store.list_sessions() == [] + finally: + runtime.close() From 4e4b06b048d14445bda3bc81de0244b1b6383845 Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Mon, 5 Oct 2026 12:56:35 +0800 Subject: [PATCH 4/7] fix(chat): keep workspace grants scoped to their project context Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../dashboard/src/features/personal-workspace/i18n.tsx | 2 ++ .../personal-workspace/personal-workspace-page.tsx | 2 +- .../personal-workspace/private-conversation-panel.tsx | 9 ++++++--- loopx/canary/module_metric_baseline.json | 3 ++- loopx/chat_agent.py | 4 +++- loopx/chat_runtime.py | 4 +++- loopx/chat_server.py | 2 +- 7 files changed, 18 insertions(+), 8 deletions(-) diff --git a/apps/presentation/dashboard/src/features/personal-workspace/i18n.tsx b/apps/presentation/dashboard/src/features/personal-workspace/i18n.tsx index d5a924c4a6..5707c8a412 100644 --- a/apps/presentation/dashboard/src/features/personal-workspace/i18n.tsx +++ b/apps/presentation/dashboard/src/features/personal-workspace/i18n.tsx @@ -1155,6 +1155,7 @@ const en = { "header.scopeWorkspacesUnavailable": "Workspaces could not be read", "workspace.conversation": "Workspace conversation · {grant}", "workspace.grantRead": "read-only", + "workspace.grantWrite": "read and write", "workspace.grantRevoked": "no longer authorized", "workspace.unknownTitle": "Unavailable workspace", "workspace.unavailable": "This host no longer authorizes this workspace. The history is kept; new messages will be rejected until it is authorized again.", @@ -2445,6 +2446,7 @@ const zhCN: Record = { "header.scopeWorkspacesUnavailable": "暂时无法读取工作区", "workspace.conversation": "工作区对话 · {grant}", "workspace.grantRead": "只读", + "workspace.grantWrite": "读写", "workspace.grantRevoked": "已不再授权", "workspace.unknownTitle": "不可用的工作区", "workspace.unavailable": "此宿主已不再授权这个工作区。历史记录会保留;重新授权前,新消息会被拒绝。", diff --git a/apps/presentation/dashboard/src/features/personal-workspace/personal-workspace-page.tsx b/apps/presentation/dashboard/src/features/personal-workspace/personal-workspace-page.tsx index 109052f7b1..5c26d77e7d 100644 --- a/apps/presentation/dashboard/src/features/personal-workspace/personal-workspace-page.tsx +++ b/apps/presentation/dashboard/src/features/personal-workspace/personal-workspace-page.tsx @@ -1880,7 +1880,7 @@ export function PersonalWorkspacePage({ ], value: selectedWorkspaceRef ?? stewardScopeValue, } : null} - workspaceGrantLabel={selectedWorkspaceRef ? t(workspaceUnavailable ? "workspace.grantRevoked" : "workspace.grantRead") : null} + workspaceGrantLabel={selectedWorkspaceRef ? t(workspaceUnavailable ? "workspace.grantRevoked" : selectedWorkspaceProject?.grant === "workspace_write" ? "workspace.grantWrite" : "workspace.grantRead") : null} managerChatOpen={managerChatOpen} managerChannelBinding={managerChannelBinding} managerRuntime={managerRuntime} diff --git a/apps/presentation/dashboard/src/features/personal-workspace/private-conversation-panel.tsx b/apps/presentation/dashboard/src/features/personal-workspace/private-conversation-panel.tsx index 7b60b191e8..ecdefdcae6 100644 --- a/apps/presentation/dashboard/src/features/personal-workspace/private-conversation-panel.tsx +++ b/apps/presentation/dashboard/src/features/personal-workspace/private-conversation-panel.tsx @@ -43,6 +43,9 @@ export function PrivateConversationPanel() { return () => {active = false; clearInterval(timer);}; }, []); + const effectiveProjectGrant = executor === "codex" && projects.find(item => item.project_ref === project)?.grant === "workspace_write" + ? projectGrant : "workspace_read"; + function listenerLabel(state: string) { const labels: Record = {starting: ["启动中", "Starting"], listening: ["实时连接就绪", "Live connection ready"], standby: ["等待已有监听服务", "Waiting for the existing listener"], retrying: ["重连中", "Reconnecting"], @@ -91,12 +94,12 @@ export function PrivateConversationPanel() { - {role === "project" ? : null} - {role === "project" && executor === "codex" && projectGrant === "workspace_write" ?

{zh ? "此 App 可按你的指令编辑选定工作区;不提高已直连 Agent 的原宿主权限。更改权限会建立新绑定和新会话,旧会话不会自动提升权限,已有 Agent 直连需重新授权。" : "This App may edit the selected workspace on your instruction; attached Agents retain their original host permissions. Changing access creates a new binding and Session. Existing Chat does not gain access and Agent targets require new authorization."}

: null} -

{zh ? "从手机发送文字开始;后续消息进入原会话队列。/status 查看工作区、角色与持久排队状态,/help 查看用法与解绑入口,/stop 停止当前聊天执行,/new 开启新会话。图片、文件会明确提示暂不支持。" : "Send text from your phone to begin; follow-ups queue in the same Session. /status shows the workspace, role and durable queue, /help explains commands and where to unbind, /stop stops the current Chat Turn, /new starts a new conversation. Images and files receive an explicit unsupported response."}

diff --git a/loopx/canary/module_metric_baseline.json b/loopx/canary/module_metric_baseline.json index bcaeb848a7..f749bd5f5f 100644 --- a/loopx/canary/module_metric_baseline.json +++ b/loopx/canary/module_metric_baseline.json @@ -32,7 +32,8 @@ }, "loopx/chat_runtime.py": { "any_count": 35, - "dict_any_count": 0 + "dict_any_count": 0, + "lines": 2002 }, "loopx/chat_server.py": { "any_count": 25, diff --git a/loopx/chat_agent.py b/loopx/chat_agent.py index 7d7de87195..42d6b1435e 100644 --- a/loopx/chat_agent.py +++ b/loopx/chat_agent.py @@ -439,6 +439,7 @@ class CodexChatAgentSession: process_tree_owned: bool = False runtime_profile: str = "restricted" sandbox: str = "read-only" + project_context: dict[str, str] | None = None model: str | None = None reasoning_effort: str | None = None response_timeout_sec: float = 30.0 @@ -596,6 +597,7 @@ def start( process_tree_owned=isolate_process_tree, runtime_profile=runtime_profile, sandbox=selected_sandbox, + project_context=policy["context"] if project_context is not None else None, model=model, reasoning_effort=reasoning_effort, model_catalog_compatibility_applied=_compatibility_catalog_path is not None, @@ -983,7 +985,7 @@ def send( context_summary=self.context_summary, execution_mode=self.execution_mode, runtime_profile=self.runtime_profile, - project_work=not self.execution_mode and self.sandbox == "workspace-write", + project_work=self.project_context is not None and self.sandbox == "workspace-write", ), } ] diff --git a/loopx/chat_runtime.py b/loopx/chat_runtime.py index 276ca4d5e6..2f90272dc2 100644 --- a/loopx/chat_runtime.py +++ b/loopx/chat_runtime.py @@ -444,7 +444,9 @@ def _start_adapter( else None ) if manager_profile is not None: - objective = manager_agent_objective(str(manager_profile["runtime_profile"])) + objective = manager_agent_objective( + str(manager_profile["runtime_profile"]) + ) model_config = ( executor_model or manager_model_config( endpoint=agent_id, diff --git a/loopx/chat_server.py b/loopx/chat_server.py index 287d52f3cd..dc898da8df 100644 --- a/loopx/chat_server.py +++ b/loopx/chat_server.py @@ -1688,7 +1688,7 @@ def _wake_goal_context(session): ).start() url = f"http://{host}:{port}{DEFAULT_CHAT_PATH}" print(f"Serving LoopX Chat at {url}", flush=True) - print("Agent boundary: local adapters, read-only sandbox, approval policy never", flush=True) + print(f"Agent boundary: local adapters, project grant {project_workspace_grant}, approval policy never", flush=True) print("Todo writes: preview-locked on loopback", flush=True) if enable_goal_subagent_configuration: print("Goal sub-agent configuration: preview-locked opt-in enabled", flush=True) From 8b27d1c116de7c910627d9c9bfac0cce7470d6b6 Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Mon, 5 Oct 2026 12:56:36 +0800 Subject: [PATCH 5/7] test(chat): prove revoked claim recovery and packaged write scope Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../smoke/workspace-scope-browser-smoke.mjs | 2 +- tests/test_lark_private_agents.py | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/apps/presentation/dashboard/smoke/workspace-scope-browser-smoke.mjs b/apps/presentation/dashboard/smoke/workspace-scope-browser-smoke.mjs index 34a295e7fc..909bfc2df3 100644 --- a/apps/presentation/dashboard/smoke/workspace-scope-browser-smoke.mjs +++ b/apps/presentation/dashboard/smoke/workspace-scope-browser-smoke.mjs @@ -54,7 +54,7 @@ try { await page.getByRole("navigation", { name: "管家视图" }).getByRole("button", { name: "对话" }).click(); await scope.click(); await page.getByRole("option", { name: "notes" }).click(); - await page.getByText("工作区对话 · 只读").waitFor(); + await page.getByText("工作区对话 · 读写").waitFor(); const workspaceUrl = page.url(); assert.match(workspaceUrl, /[?&]workspace=[0-9a-f]{24}(?:&|$)/u); const question = "整理一下最近的素材"; diff --git a/tests/test_lark_private_agents.py b/tests/test_lark_private_agents.py index 3410275ad8..8afab03a6c 100644 --- a/tests/test_lark_private_agents.py +++ b/tests/test_lark_private_agents.py @@ -121,9 +121,13 @@ def test_committed_host_claim_replays_after_audience_revocation(ordinary): # no send(provider, transport, "select", f"/agent {grant['target_ref']}") send(provider, transport, "ask", "committed private question") row = next(row for row in transport.core.pending() if row["message"] == "committed private question") - committed = claim(store, runtime, sid, "stable-claim") - assert committed["claimed"] and committed["turn"]["turn_id"] == row["turn_id"] - assert committed["turn"]["claim_id"] == "stable-claim" + send(provider, transport, "queued", "not yet claimed") + queued = next(row for row in transport.core.pending() if row["message"] == "not yet claimed") + with pytest.raises(ConnectionError, match="response lost"): + committed = claim(store, runtime, sid, "stable-claim") + assert committed["claimed"] and committed["turn"]["turn_id"] == row["turn_id"] + assert committed["turn"]["claim_id"] == "stable-claim" + raise ConnectionError("synthetic response lost after the durable claim") bindings = transport.bindings bindings.change_agent_target(binding_id=bid, expected_revision=bindings.read()["revision"], target_ref=grant["target_ref"]) # A different claim id still cannot take over the committed Turn. @@ -143,6 +147,10 @@ def test_committed_host_claim_replays_after_audience_revocation(ordinary): # no transport.reconcile() # Revocation still withholds the private result from the original App. assert not any("Recovered answer" in text for _, text in provider.writes) + # The recovery exception grants no authority to start queued or new work. + assert not claim(store, runtime, sid, "fresh-claim")["claimed"] + assert store.load_turn(sid, queued["turn_id"])["status"] == "failed" + assert send(provider, transport, "new-after-revoke", "new private work")[0]["status"] == "command_rejected" finally: runtime.close() From f432fbd5cb2cd4b3e9a65fe1b0609131ed88e984 Mon Sep 17 00:00:00 2001 From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Date: Mon, 5 Oct 2026 12:56:36 +0800 Subject: [PATCH 6/7] docs(chat): reconcile workspace grants and recovery evidence Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../app-conversation-and-async-inbox-v0.md | 22 +++++--- ...p-conversation-and-async-inbox-v0.zh-CN.md | 52 ++++++++++-------- ...ordinary-workspace-conversation-narrow.png | Bin 23081 -> 23073 bytes .../ordinary-workspace-conversation.png | Bin 45851 -> 45865 bytes .../ordinary-workspace-grant-rejection.png | Bin 51100 -> 51094 bytes 5 files changed, 42 insertions(+), 32 deletions(-) diff --git a/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md b/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md index f6b4921730..cd1cf58edc 100644 --- a/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md +++ b/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md @@ -30,9 +30,9 @@ the TypeScript owner decides context identity and scope. Native Codex resume ret the original upstream thread and workspace. HTTP/protocol fixtures qualify that continuity and denial behavior; they do not establish real model adoption. -The App grant is workspace reading for the local owner. The App scope alone does -not qualify Lark private-message admission, installed or mobile journeys, or -authorize edits. A revoked grant keeps the history readable and blocks new +The local App grant covers the selected owner workspace under its current host +permissions. Scope selection alone does not qualify Lark private-message +admission, installed or mobile journeys. A revoked grant keeps history readable and blocks new messages until the host grants it again. The independent Lark checkpoint below qualifies its source implementation separately. @@ -51,7 +51,7 @@ shared request owner, and a replay retains the original Session/Turn target. A lost admission correlation cannot move a request to a newer Session. Admission feedback and final delivery use separate durable provider intents; an ambiguous write is read back without blind resend. Unsupported media receives an explicit -notice. The workspace grant grants neither Goal, portfolio nor peer execution authority. +notice. The workspace grant conveys no Goal, portfolio or peer execution authority. The packaged settings journey, source revocation/recovery, duplicate events, native queue/stop and two-App isolation have synthetic-provider regression and @@ -95,10 +95,16 @@ Host grant removal or downgrade is rechecked before admission and resume. Typed Core/HTTP/native-host regressions qualify default writes, explicit read-only, workspace identity, independent App grants, old-Session rejection and exact-thread -resume. A real Codex canary edited and read back a synthetic note under project -rules while preserving prior text and creating no Goal. It is a host/filesystem -result, not live Lark write-workflow, material intake or release qualification. -Maintainer review, installed/Lark journeys and broader IM interactions remain open. +resume. Earlier source evidence records a Codex canary editing and reading back a +synthetic note while preserving prior text and creating no Goal. This historical +host/filesystem evidence is separate from current synthetic-protocol regression +checks and does not qualify live Lark, material intake or a release. +Committed same-claim replay is separate from new admission: after a lost response +and target revocation, the original host can recover its committed receipt; new +claims and external result publication remain denied. Current validation uses real +Core HTTP, file storage and the claim broker with synthetic Codex/provider +transport; it does not rerun a live-model edit or phone journey. Installed/Lark +journeys and broader IM interactions remain open. ## Bound steward private Chat: explicit new commissions diff --git a/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.zh-CN.md b/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.zh-CN.md index 60118829ff..fd03b2e284 100644 --- a/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.zh-CN.md +++ b/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.zh-CN.md @@ -25,11 +25,11 @@ grant 授权 peer delegation。 store,TypeScript 负责上下文身份及范围。原生 Codex 恢复保留原 upstream thread 和工作区;HTTP/协议 fixture 验证连续性与拒绝行为,不证明真实模型采用了上下文。 -App grant 仅面向本机 owner 的工作区读取。App 范围入口本身不证明 Lark 私聊 -admission、安装或手机旅程已通过,也不授权修改文件;grant 撤销后历史仍可读, +App grant 仅面向本机 owner 明确授权的工作区操作。App 范围入口本身不证明 Lark 私聊 +admission、安装或手机旅程已通过;grant 撤销后历史仍可读, 新消息在宿主重新授权前被阻止。下方独立检查点说明 Lark 的源码实现资格。 -本机 owner 的只读工作区入口现已接入独立核验的 Lark App 私聊绑定。既有设置 → +本机 owner 的工作区入口现已接入独立核验的 Lark App 私聊绑定。既有设置 → Lark 页面选择一个非默认 App、当前可用工作区和宿主 executor,读回监听状态、待回复 数量及恢复缺口;重新绑定不会把旧 Session 移到其它工作区。 @@ -42,7 +42,7 @@ provider 读回确认回复;发生没有 receipt 的不确定写入时不盲 后续消息持久排队、exact stop,以及重启后原会话恢复和已确认回复不重复发送。 这些是合成 provider/协议验收;真实原生 Codex 另行验证独立线程与上下文隔离。 真实 Lark 收发、安装候选、手机旅程、注册 Agent 选择、媒体/增量/权限回调,以及 -更广的长期协调仍未验收。这一普通项目绑定保持只读,新增管家入口见下一检查点。 +更广的长期协调仍未验收。普通项目权限以当前 workspace grant 为准,新增管家入口保持独立授权。 私聊配置复用设置 → Lark;App 范围仍是本机普通对话的唯一入口。未存储 App 身份 的旧群聊 profile 保留原 profile-hash 监听锁键。没有私聊绑定时不增加鉴权;有绑定 @@ -53,6 +53,30 @@ extension,typed binding owner 继续保持 provider-neutral。 ![窄屏私聊设置](../../assets/personal-workspace/private-project-conversations-narrow.png) ![工作区撤权读回](../../assets/personal-workspace/private-project-workspace-revoked.png) +## 普通工作区读写:默认值与撤权检查点 + +普通项目 Chat 对宿主声明的工作区默认使用 `workspace_write`。Core context owner +在启动和原线程恢复时导出真实 Codex `workspace-write` 沙箱;仍是普通对话,不借 +Task/Goal 模式或 manager 权限。项目 prompt 要求读取工作区 AGENTS.md 与适用 skills, +执行明确请求所需的有界编辑;持久状态继续走既有 owner。读写 grant 本身不激活 +Material Lifecycle,也不证明项目 adapter 的 intake/ranking 已接通。 + +`loopx chat --project-workspace-grant workspace_read` 将宿主及 Lark 项目绑定限制为 +只读。设置 → Lark 的 Codex 项目 App 默认读写,并保留只读选项;其它 executor 在 +宿主策略完成验收前保持只读。设置读回、/status 和 /help 显示实际 grant,重新选择 +已配置 App 会恢复持久配置。改变 grant 会创建新绑定及 Session,拒绝旧会话的新工作, +直连 Agent 必须重新授权;不能偷偷提高 attached 宿主或另一 App 的权限。宿主撤权或 +降为只读后,入站受理及恢复重新核验授权。 + +typed Core、HTTP 与原生宿主回归覆盖默认读写、明确只读、工作区身份、App 独立授权、 +旧会话拒绝和原线程恢复。既有源码证据记录了 Codex canary 编辑并读回合成笔记、 +保留原文且不创建 Goal;这项历史宿主/文件系统证据与本次合成协议回归分开, +不代表真实 Lark 写入、素材 intake 或发布完成。 +同 claim 已领取回执恢复与新任务准入分开:响应丢失后撤权,原宿主可读回已提交回执; +新领取及外部结果发送仍拒绝。验证使用真实 Core HTTP、文件存储、领取 broker 与 +合成 Codex/provider;不声称本次运行真实模型编辑或手机旅程。安装与真实 Lark 旅程、 +更多 IM 交互仍未关闭。 + ## 本人私聊管家:明确的新委托 设置 → Lark 可为独立 App 选择管家角色。既有 typed conversation binding @@ -522,23 +546,3 @@ Turn HTTP 预算包含既有附件额度的 base64 编码:最多四张图片 源码验收覆盖 HTTP 准入、会话持久化读回和合成 Codex 协议进程,以及打包后的桌面/窄屏 图片发送、历史操作卡与拒绝后的草稿恢复。该证据只证明传输和界面行为,不证明真实模型质量、 公开发布或已安装宿主验收。GQ06 的材料入口及 GQ07–09 的连续性仍须完成各自的交付与恢复验收。 - -## 普通工作区读写:默认值与撤权检查点 - -普通项目 Chat 对宿主声明的工作区默认使用 `workspace_write`。Core context owner -在启动和原线程恢复时导出真实 Codex `workspace-write` 沙箱;仍是普通对话,不借 -Task/Goal 模式或 manager 权限。项目 prompt 要求读取工作区 AGENTS.md 与适用 skills, -执行明确请求所需的有界编辑;持久状态继续走既有 owner。读写 grant 本身不激活 -Material Lifecycle,也不证明项目 adapter 的 intake/ranking 已接通。 - -`loopx chat --project-workspace-grant workspace_read` 将宿主及 Lark 项目绑定限制为 -只读。设置 → Lark 的 Codex 项目 App 默认读写,并保留只读选项;其它 executor 在 -宿主策略完成验收前保持只读。设置读回、/status 和 /help 显示实际 grant,重新选择 -已配置 App 会恢复持久配置。改变 grant 会创建新绑定及 Session,拒绝旧会话的新工作, -直连 Agent 必须重新授权;不能偷偷提高 attached 宿主或另一 App 的权限。宿主撤权或 -降为只读后,入站受理及恢复重新核验授权。 - -typed Core、HTTP 与原生宿主回归覆盖默认读写、明确只读、工作区身份、App 独立授权、 -旧会话拒绝和原线程恢复。真实 Codex canary 按项目规则编辑并读回合成笔记,保留原文、 -不创建 Goal;这只是宿主/文件系统结果,不代表真实 Lark 写入、素材 intake 或发布完成。 -维护者 review、安装与 Lark 旅程、更多 IM 交互仍未关闭。 diff --git a/docs/assets/personal-workspace/ordinary-workspace-conversation-narrow.png b/docs/assets/personal-workspace/ordinary-workspace-conversation-narrow.png index 31b468eddea92ce7f2ecf67baa6dc23714681019..9f4378841987428a773d358aac9afc895681d5a8 100644 GIT binary patch literal 23073 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 Ife%dj4;g?!tpET3 diff --git a/docs/assets/personal-workspace/ordinary-workspace-conversation.png b/docs/assets/personal-workspace/ordinary-workspace-conversation.png index 2dbc91ee58f76275cf8cd8018d6db632e6e9699e..29b78c6847fe6f987d5b22bb5b236457e9a70c9a 100644 GIT binary patch literal 45865 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

G0g=MqBcx0%-oR{=URjcWG!*U1B`jA4O>-0Q(t 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

(Mk_Fx!dODZtO7IJpD)lHq9XH7 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 diff --git a/docs/assets/personal-workspace/ordinary-workspace-grant-rejection.png b/docs/assets/personal-workspace/ordinary-workspace-grant-rejection.png index c4911c3714ed70eb365db8f01e324dffd483c959..28adb373f7e27b1942568317d3b5fffd239c35bf 100644 GIT binary patch delta 25752 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 delta 25721 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 Date: Mon, 5 Oct 2026 13:20:05 +0800 Subject: [PATCH 7/7] fix(chat): reopen ordinary scope when host project grants change Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> --- .../smoke/workspace-scope-browser-smoke.mjs | 33 +++++++++++++---- .../app-conversation-and-async-inbox-v0.md | 5 ++- ...p-conversation-and-async-inbox-v0.zh-CN.md | 3 +- loopx/canary/module_metric_baseline.json | 2 +- loopx/chat_runtime.py | 4 +++ tests/test_chat_ordinary_project.py | 35 +++++++++++++++++++ 6 files changed, 73 insertions(+), 9 deletions(-) diff --git a/apps/presentation/dashboard/smoke/workspace-scope-browser-smoke.mjs b/apps/presentation/dashboard/smoke/workspace-scope-browser-smoke.mjs index 909bfc2df3..f5f745b114 100644 --- a/apps/presentation/dashboard/smoke/workspace-scope-browser-smoke.mjs +++ b/apps/presentation/dashboard/smoke/workspace-scope-browser-smoke.mjs @@ -25,11 +25,22 @@ const written = spawnSync(python, ["-c", [ ].join("\n"), codex], { cwd: repoRoot, encoding: "utf8" }); assert.equal(written.status, 0, written.stderr); -const server = spawn(python, ["-c", "import sys; from loopx.entrypoint import main; sys.exit(main())", - "chat", "--no-open", "--port", String(port), "--codex-bin", codex, "--scan-root", workspace, "--global-registry"], -{ cwd: root, env: { ...process.env, HOME: join(root, "home"), PYTHONPATH: repoRoot }, stdio: ["ignore", "pipe", "pipe"] }); let serverError = ""; -for (const stream of [server.stdout, server.stderr]) stream.on("data", (chunk) => { serverError += String(chunk); }); +function startServer(grant) { + const child = spawn(python, ["-c", "import sys; from loopx.entrypoint import main; sys.exit(main())", + "chat", "--no-open", "--port", String(port), "--codex-bin", codex, "--scan-root", workspace, + "--global-registry", "--project-workspace-grant", grant], + { cwd: root, env: { ...process.env, HOME: join(root, "home"), PYTHONPATH: repoRoot, LOOPX_USAGE_PING: "0" }, stdio: ["ignore", "pipe", "pipe"] }); + for (const stream of [child.stdout, child.stderr]) stream.on("data", (chunk) => { serverError += String(chunk); }); + return child; +} +let server = startServer("workspace_read"); +async function stopServer() { + if (server.exitCode !== null) return; + const exited = new Promise((resolveExit) => server.once("exit", resolveExit)); + server.kill(); + await exited; +} // The first-run usage notice is unrelated to this journey; keep evidence focused. async function capture(target, name) { if (!screenshots) return; @@ -54,13 +65,23 @@ try { await page.getByRole("navigation", { name: "管家视图" }).getByRole("button", { name: "对话" }).click(); await scope.click(); await page.getByRole("option", { name: "notes" }).click(); - await page.getByText("工作区对话 · 读写").waitFor(); + await page.getByText("工作区对话 · 只读").waitFor(); const workspaceUrl = page.url(); assert.match(workspaceUrl, /[?&]workspace=[0-9a-f]{24}(?:&|$)/u); const question = "整理一下最近的素材"; await page.getByLabel("发送消息").fill(question); await page.keyboard.press("Enter"); await page.getByText("Runtime response.").first().waitFor({ timeout: 15_000 }); + // Upgrade a persisted read-only workspace through the same ordinary Scope entry. + await stopServer(); + server = startServer("workspace_write"); + await waitForHttp(url).catch((error) => { throw new Error(`${error.message}\n${serverError}`); }); + await page.reload({ waitUntil: "networkidle" }); + await page.getByText("工作区对话 · 读写").waitFor({ timeout: 15_000 }); + await page.getByText(question).first().waitFor({ timeout: 15_000 }); + await page.getByLabel("发送消息").fill("继续整理素材"); + await page.keyboard.press("Enter"); + await page.getByText("Runtime response.").nth(1).waitFor({ timeout: 15_000 }); await capture(page, "ordinary-workspace-conversation.png"); const projectRequests = sessionRequests.filter((body) => body.context_kind === "project"); @@ -98,6 +119,6 @@ try { console.log("workspace scope browser smoke ok"); } finally { await browser?.close(); - server.kill(); + await stopServer(); await rm(root, { force: true, recursive: true }); } diff --git a/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md b/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md index cd1cf58edc..4ecb31bd2a 100644 --- a/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md +++ b/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md @@ -91,7 +91,10 @@ The readback, `/status` and `/help` show the effective grant. Selecting an exist App restores its persisted setting. Changing a binding's grant requires a new identity and Session, invalidates the old Session for new work, and requires new Agent target grants; it cannot silently elevate an attached host or another App. -Host grant removal or downgrade is rechecked before admission and resume. +Host grant removal or downgrade is rechecked before admission and resume. Ordinary +local Scope reuses only the same typed project context; a host grant change opens +a new Session while retaining old history and rejecting new work on the old +Session. Typed Core/HTTP/native-host regressions qualify default writes, explicit read-only, workspace identity, independent App grants, old-Session rejection and exact-thread diff --git a/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.zh-CN.md b/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.zh-CN.md index fd03b2e284..92fba2707c 100644 --- a/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.zh-CN.md +++ b/docs/architecture/rfcs/app-conversation-and-async-inbox-v0.zh-CN.md @@ -66,7 +66,8 @@ Material Lifecycle,也不证明项目 adapter 的 intake/ranking 已接通。 宿主策略完成验收前保持只读。设置读回、/status 和 /help 显示实际 grant,重新选择 已配置 App 会恢复持久配置。改变 grant 会创建新绑定及 Session,拒绝旧会话的新工作, 直连 Agent 必须重新授权;不能偷偷提高 attached 宿主或另一 App 的权限。宿主撤权或 -降为只读后,入站受理及恢复重新核验授权。 +降为只读后,入站受理及恢复重新核验授权。本机 Scope 只复用相同 typed 项目上下文; +宿主授权变化时创建新会话,保留旧历史,拒绝在旧会话上执行新工作。 typed Core、HTTP 与原生宿主回归覆盖默认读写、明确只读、工作区身份、App 独立授权、 旧会话拒绝和原线程恢复。既有源码证据记录了 Codex canary 编辑并读回合成笔记、 diff --git a/loopx/canary/module_metric_baseline.json b/loopx/canary/module_metric_baseline.json index f749bd5f5f..467b089e9b 100644 --- a/loopx/canary/module_metric_baseline.json +++ b/loopx/canary/module_metric_baseline.json @@ -33,7 +33,7 @@ "loopx/chat_runtime.py": { "any_count": 35, "dict_any_count": 0, - "lines": 2002 + "lines": 2006 }, "loopx/chat_server.py": { "any_count": 25, diff --git a/loopx/chat_runtime.py b/loopx/chat_runtime.py index 2f90272dc2..2fc330457a 100644 --- a/loopx/chat_runtime.py +++ b/loopx/chat_runtime.py @@ -647,6 +647,10 @@ def open_session( agent_id=agent_id, channel_id=selected_channel, ) + # Reuse only the same typed project identity. A changed host grant + # starts a new Session while the old context and history remain intact. + if latest is not None and project_context is not None and latest.get("project_context") != project_context: + latest = None if latest is not None and latest.get("session_mode") == CHAT_SESSION_MODE_ATTACHED: return latest, True if capability is None: diff --git a/tests/test_chat_ordinary_project.py b/tests/test_chat_ordinary_project.py index 36a168dd0d..6f1bf5a247 100644 --- a/tests/test_chat_ordinary_project.py +++ b/tests/test_chat_ordinary_project.py @@ -150,3 +150,38 @@ def test_default_project_host_grant_is_write_and_read_only_launch_is_enforced(or bindings.configure(transport_ref="notes-app", project_ref=projects["projects"][0]["project_ref"], executor_endpoint_id="codex", project_grant="workspace_write") assert bindings.read()["bindings"][0] == binding runtime.close() + + +def test_local_scope_opens_new_session_after_host_grant_changes(ordinary): + store, runtime, contexts, request, capture, _, _ = ordinary + ref = contexts.available()[0]["project_ref"] + body = {"context_kind": "project", "project_ref": ref} + status, original = request("/api/chat/sessions", body) + assert status == 201 + sessions = [original["session_id"]] + try: + for grant, sandbox in [("workspace_write", "workspace-write"), ("workspace_read", "read-only")]: + contexts.workspace_grant = grant + status, opened = request("/api/chat/sessions", body) + assert status == 201, opened + sid = opened["session_id"] + assert sid not in sessions and opened["goal_id"] is None + assert runtime.adapters[sid].session.sandbox == sandbox + assert store.load_session(sessions[-1])["project_context"]["grant"] != grant + status, denied = request(f"/api/chat/sessions/{sessions[-1]}/turns", + {"message": "old permission", "client_turn_id": "stale-grant"}) + assert status == 400 and "grant changed" in denied["error"] + assert store.turn_for_client(sessions[-1], "stale-grant") is None + assert request("/api/chat/sessions", body)[1]["session_id"] == sid + status, accepted = request(f"/api/chat/sessions/{sid}/turns", + {"message": "Continue under current permission", "client_turn_id": f"current-{grant}"}) + assert status == 202, accepted + assert runtime.wait_for_turn(session_id=sid, turn_id=accepted["turn_id"], timeout_sec=10)["status"] == "completed" + sessions.append(sid) + requests = [json.loads(line) for line in capture.read_text().splitlines()] + assert len([row for row in requests if row.get("method") == "thread/start"]) == 3 + assert not any(row.get("method") == "thread/resume" for row in requests) + assert len(store.list_sessions()) == 3 + assert store.messages(sessions[1]) and store.messages(sessions[2]) + finally: + runtime.close()