From ea6d67390a02c3f33581ebf4b3a42654d03bd9fb Mon Sep 17 00:00:00 2001 From: jinye Date: Sat, 17 Oct 2026 10:35:25 +0800 Subject: [PATCH] feat(managed-agent): Improve workspace selection and tool progress (#14405) * feat(managed-agent): Improve workspace selection and tool progress Allow selecting existing authorized Linux project directories, expose safe tool lifecycle progress, honor the configured model-round limit, and reuse daemon WebShell presentation. Co-authored-by: Qwen-Coder * fix(managed): Allow late model rounds to persist and recover Remove obsolete round ceilings from persistence and continuation validation. Cover late rounds with recovery regressions and complete real-model prompt evidence. Co-authored-by: Qwen-Coder * test(managed-agent): Order workspace contract imports Co-authored-by: Qwen-Coder * fix(managed-agent): Correct directory truncation reporting Count an omitted eligible directory before marking the page truncated while preserving the raw-entry scan bound. Pin the unsafe-selection refusal codes and add directory limit regression coverage. Co-authored-by: Qwen-Coder --------- Co-authored-by: Qwen-Coder --- .../complete-prompt-blocked.png | Bin 0 -> 81686 bytes .../complete-prompt-completed.png | Bin 0 -> 104238 bytes .../directory-selected.png | Bin 0 -> 29515 bytes .../progress-completed.png | Bin 0 -> 93653 bytes .../progress-running.png | Bin 0 -> 96100 bytes .../2026-09-27-hosted-workspace-tool-turn.md | 2 +- ...-09-27-hosted-workspace-tool-turn.zh-CN.md | 2 +- .../2026-10-16-managed-webshell-progress.md | 59 ++++ ...6-10-16-managed-webshell-progress.zh-CN.md | 59 ++++ ...6-managed-workspace-directory-selection.md | 59 ++++ ...ged-workspace-directory-selection.zh-CN.md | 59 ++++ .../hosted-approval-continuation.test.ts | 12 +- .../src/serve/hosted-approval-continuation.ts | 1 - .../src/serve/hosted-harness-model.test.ts | 82 +++++- .../cli/src/serve/hosted-harness-model.ts | 17 +- ...hosted-harness-session.issue-13328.test.ts | 3 +- .../src/serve/hosted-harness-session.test.ts | 158 ++++++----- .../cli/src/serve/hosted-harness-session.ts | 36 ++- .../cli/src/serve/hosted-model-recovery.ts | 1 - .../cli/src/serve/hosted-recovery.test.ts | 15 +- .../src/serve/hosted-tool-progress.test.ts | 215 +++++++++++++++ .../cli/src/serve/hosted-tool-progress.ts | 165 +++++++++++ packages/managed-agent-server/README.md | 17 +- .../api/WorkspaceDiscoveryController.java | 26 +- .../service/HarnessEventProjector.java | 16 +- .../store/ManagedHostedRecoveryRecords.java | 2 +- .../store/ManagedWorkspaceRegistry.java | 55 +++- .../store/WorkspaceCreationRoots.java | 17 +- .../store/WorkspaceCreationStore.java | 167 ++++++++++-- .../store/WorkspaceStorageGuard.java | 9 + .../managed-agent-public-api.openapi.json | 125 ++++++++- .../HarnessEventProjectorTest.java | 31 +++ .../ManagedAgentApiContractTest.java | 6 + .../SurfaceAdmissionAcceptanceTest.java | 1 + .../managedagent/api/SurfaceRegistry.java | 7 +- .../ManagedHostedRecoveryRecordsTest.java | 19 ++ .../store/WorkspaceCreationStoreTest.java | 159 +++++++++++ .../WorkspaceDirectorySelectionMySqlIT.java | 22 ++ packages/web-shell/client/App.tsx | 38 +-- .../components/dialogs/AddWorkspaceDialog.tsx | 8 +- .../managed/ManagedSessionProgress.tsx | 45 ++- .../managed/ManagedSessionsPage.tsx | 3 +- .../managed/WorkspaceBindingCreator.test.tsx | 256 +++++++++++++++++- .../managed/WorkspaceBindingCreator.tsx | 256 ++++++++++++++++-- .../managed/generated/managed-agent-api.ts | 69 ++++- .../managed/java-managed-agent-client.ts | 7 + .../managed/java-managed-agent-provider.ts | 4 + .../managed/managed-agent-provider.ts | 13 +- .../managed/managed-session-messages.test.ts | 50 ++++ .../managed/managed-session-messages.ts | 7 +- .../components/messages/ToolGroup.test.tsx | 10 + .../client/components/messages/ToolGroup.tsx | 17 +- packages/web-shell/client/i18n.tsx | 21 +- 53 files changed, 2195 insertions(+), 233 deletions(-) create mode 100644 docs/assets/managed-agent-local-debugging/complete-prompt-blocked.png create mode 100644 docs/assets/managed-agent-local-debugging/complete-prompt-completed.png create mode 100644 docs/assets/managed-agent-local-debugging/directory-selected.png create mode 100644 docs/assets/managed-agent-local-debugging/progress-completed.png create mode 100644 docs/assets/managed-agent-local-debugging/progress-running.png create mode 100644 docs/design/2026-10-16-managed-webshell-progress.md create mode 100644 docs/design/2026-10-16-managed-webshell-progress.zh-CN.md create mode 100644 docs/design/2026-10-16-managed-workspace-directory-selection.md create mode 100644 docs/design/2026-10-16-managed-workspace-directory-selection.zh-CN.md create mode 100644 packages/cli/src/serve/hosted-tool-progress.test.ts create mode 100644 packages/cli/src/serve/hosted-tool-progress.ts create mode 100644 packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceDirectorySelectionMySqlIT.java diff --git a/docs/assets/managed-agent-local-debugging/complete-prompt-blocked.png b/docs/assets/managed-agent-local-debugging/complete-prompt-blocked.png new file mode 100644 index 0000000000000000000000000000000000000000..8fc38c5497edf904be5aec607c1d2c993354f0b1 GIT binary patch literal 81686 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%0Dh>uGU6@G_*(pk%hK`W_(c0^ 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 z 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 LU+34x|DpX4>IgDZ literal 0 HcmV?d00001 diff --git a/docs/assets/managed-agent-local-debugging/complete-prompt-completed.png b/docs/assets/managed-agent-local-debugging/complete-prompt-completed.png new file mode 100644 index 0000000000000000000000000000000000000000..09688c50203559ba03ce81b76a60223d79a0daea GIT binary patch literal 104238 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 literal 0 HcmV?d00001 diff --git a/docs/assets/managed-agent-local-debugging/progress-running.png b/docs/assets/managed-agent-local-debugging/progress-running.png new file mode 100644 index 0000000000000000000000000000000000000000..6d000f7143cc0a5a4343483dd638662fd068675b GIT binary patch literal 96100 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

}RzDN&euj3KiPSf%?^#X~L8cKJEGSEkqeQQw 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 E0N>kKAOHXW literal 0 HcmV?d00001 diff --git a/docs/design/2026-09-27-hosted-workspace-tool-turn.md b/docs/design/2026-09-27-hosted-workspace-tool-turn.md index 4e64022844..ce6a9e5a1e 100644 --- a/docs/design/2026-09-27-hosted-workspace-tool-turn.md +++ b/docs/design/2026-09-27-hosted-workspace-tool-turn.md @@ -61,7 +61,7 @@ An invalid `file_path` for Read/Write/Edit is a model-correctable refusal before Cancellation aborts inference and requests cancellation of every reserved or started original invocation. A cancellation request is not stop evidence. Only a terminal Runtime result permits result settlement and release. If observation cannot determine the outcome, retain ownership and block. A failed release also blocks further tools rather than clearing ownership locally. An unknown outcome retains the Workspace storage holder, so other Sessions in the same Workspace receive a recoverable busy error until W0e recovery clears that holder. -The private loop is bounded to 16 model rounds. Broker payloads are limited to 256 KiB, but each argument, result and history resource must also fit the existing 64 KiB inline Session Store limit. Oversized arguments and assistant records are refused before acquisition. For a known terminal execution, check both its serialized outcome and complete tool_result record, including UTF-8, JSON escaping and metadata. If either exceeds the limit, persist a small function error with the original executionStatus and outputOmitted=true instead of the output; read_file responses ask the model to request a smaller offset/limit range. This receipt does not mean the tool failed to execute. It must be committed and consumed before normal settlement and release; unknown outcomes and failed durable writes remain recovery-blocked. Each Broker HTTP request has a 30-second timeout and execution observation is bounded to two minutes plus the current request. These limits are internal to this private profile, not new user settings. +The private loop follows the existing `model.maxSessionTurns` setting (default `-1`), including the saved round after recovery; there is no separate 16-round ceiling. Tool intent/receipt metadata is visible without publication, while raw arguments and output retain their publication policy. See the [progress repair](2026-10-16-managed-webshell-progress.md). Broker payloads are limited to 256 KiB, but each argument, result and history resource must also fit the existing 64 KiB inline Session Store limit. Oversized arguments and assistant records are refused before acquisition. For a known terminal execution, check both its serialized outcome and complete tool_result record, including UTF-8, JSON escaping and metadata. If either exceeds the limit, persist a small function error with the original executionStatus and outputOmitted=true instead of the output; read_file responses ask the model to request a smaller offset/limit range. This receipt does not mean the tool failed to execute. It must be committed and consumed before normal settlement and release; unknown outcomes and failed durable writes remain recovery-blocked. Each Broker HTTP request has a 30-second timeout and execution observation is bounded to two minutes plus the current request. These limits are internal to this private profile, not new user settings. Cold load keeps the existing refusal of unsettled input. Automatic continuation after process loss, adoption of orphan workers and retired-generation reconciliation remain W0e/#12766/#12670. This slice records enough original identities to support that later work but does not claim it. diff --git a/docs/design/2026-09-27-hosted-workspace-tool-turn.zh-CN.md b/docs/design/2026-09-27-hosted-workspace-tool-turn.zh-CN.md index 17d76b8822..02c6aa605c 100644 --- a/docs/design/2026-09-27-hosted-workspace-tool-turn.zh-CN.md +++ b/docs/design/2026-09-27-hosted-workspace-tool-turn.zh-CN.md @@ -61,7 +61,7 @@ Read/Write/Edit 的无效 `file_path` 在该批次获取 Workspace 或派发工 取消会中止推理,并按原始身份请求取消每个已预留或已启动调用。取消请求不等于停止证据;只有 Runtime 终态结果允许结算和释放。无法观察出结果时保留所有权并阻塞。释放失败也阻塞后续工具,不在本地清除所有权。结果未知时仍持有 Workspace 存储,因此同一 Workspace 的其它 Session 会收到可恢复的 busy 错误,直到 W0e 恢复清除原持有者。 -私有循环最多运行 16 轮模型请求。Broker payload 上限为 256 KiB,但每个参数、结果和历史资源也必须满足现有 Session Store 的 64 KiB 内联限制。过大的参数和 assistant 记录在获取所有权前拒绝。对已知终态执行,同时检查序列化 outcome 和完整 tool_result 记录,包括 UTF-8、JSON 转义和元数据;任一超限时,持久化保留原 executionStatus、标记 outputOmitted=true 的小型函数错误,替代原输出,read_file 响应提示模型缩小 offset/limit 范围。这份回执不表示工具未执行。仍须提交并消费回执后才能正常结算和释放;未知结果和持久化失败仍要求恢复并保持阻塞。每个 Broker HTTP 请求超时为 30 秒,执行观察最多两分钟加上当前请求。这些是私有 profile 内部限制,不是新用户设置。 +私有循环遵循已有的 `model.maxSessionTurns` 设置(默认 `-1`),包括恢复时保存的轮数,不再额外限制为 16 轮。工具 intent/receipt 元数据无需开启发布即可展示,原始参数和输出仍遵循既有发布策略。参见[进度修复](2026-10-16-managed-webshell-progress.zh-CN.md)。Broker payload 上限为 256 KiB,但每个参数、结果和历史资源也必须满足现有 Session Store 的 64 KiB 内联限制。过大的参数和 assistant 记录在获取所有权前拒绝。对已知终态执行,同时检查序列化 outcome 和完整 tool_result 记录,包括 UTF-8、JSON 转义和元数据;任一超限时,持久化保留原 executionStatus、标记 outputOmitted=true 的小型函数错误,替代原输出,read_file 响应提示模型缩小 offset/limit 范围。这份回执不表示工具未执行。仍须提交并消费回执后才能正常结算和释放;未知结果和持久化失败仍要求恢复并保持阻塞。每个 Broker HTTP 请求超时为 30 秒,执行观察最多两分钟加上当前请求。这些是私有 profile 内部限制,不是新用户设置。 冷 load 保留现有对未结算输入的拒绝。进程丢失后的自动接续、孤儿 worker 接管与旧代执行对账属于 W0e/#12766/#12670。本片记录后续所需的原始身份,但不宣称完成这些能力。 diff --git a/docs/design/2026-10-16-managed-webshell-progress.md b/docs/design/2026-10-16-managed-webshell-progress.md new file mode 100644 index 0000000000..57da722520 --- /dev/null +++ b/docs/design/2026-10-16-managed-webshell-progress.md @@ -0,0 +1,59 @@ +# Managed WebShell progress and daemon appearance + +[English](2026-10-16-managed-webshell-progress.md) | [简体中文](2026-10-16-managed-webshell-progress.zh-CN.md) + +Status: implemented and accepted in the local Lima deployment. + +## Problem and scope + +An observed Managed Turn executed 18 tools but exposed no tool events. A silent archive download timed out after 300 seconds, then the private model loop stopped at its hardcoded 16 rounds. WebShell showed only concatenated assistant text and a generic failure. Managed already uses the daemon's MessageList, but does not inherit its customization and adds a large progress box and extra layout gaps. + +This change restores observable tool lifecycle metadata, removes the separate 16-round ceiling in favor of the existing model.maxSessionTurns setting, and aligns the presentation with ordinary daemon WebShell. It does not change execution placement, permissions, tool-result publication policy, or replay tools. + +## Event projection + +The Hosted Harness derives a tool's public identity and name from its committed assistant batch and ordinal. A committed tool.intent produces an in-progress tool_call update; its matching tool.receipt produces the terminal update from the durable execution status. Committed single-call tool_result history also projects a terminal update, covering legacy file execution without a receipt; duplicate status updates converge on the same Item. The model call ID is retained so O3 result projections join the same Item. Both live SSE and transcript replay use the same derivation and original journal sequence. Parallel calls retain separate identities. + +Lifecycle updates contain only the tool ID, name and status. Raw arguments, paths, command contents, output, private references and credentials remain outside this projection. Original content and previews continue through the existing publication and artifact policy. A silent command therefore shows an active tool and elapsed time without inventing output. Missing or unrelated source records do not invent a tool or a terminal status. + +## Model continuation and errors + +The Hosted loop reads the existing model.maxSessionTurns configuration. Its default -1 allows continuation beyond 16 rounds. A positive setting bounds the Turn's model rounds, including the saved round on recovery. The existing cancellation signal, deadline, model token budget and durable recovery barriers remain in force. Limit exhaustion receives a named stop reason and public error code with a fixed, safe message; arbitrary provider errors remain redacted. No new configuration option is introduced. + +Java persistence validation and the CLI's persisted approval and model-request readers accept nonnegative safe-integer round numbers without a separate 16-round ceiling. They preserve the original identity, source activation, digest and authorization checks; the configured limit is enforced by the model loop after restoration. Replacement-owner tests cover both the initial round and the first round beyond the former ceiling. Java tests cover admission beyond that ceiling and rejection of negative, fractional, coerced and unsafe counters. + +## Presentation + +Managed continues using the shared MessageList, MessageItem and ToolGroup. It receives the same presentation customization, without ordinary-daemon ownership callbacks. Its layout removes extra section gaps and passes the Managed Turn's start time to MessageList. The footer uses the daemon StreamingStatus stylesheet with Managed state, rather than reading ordinary daemon stores. Repeated tool progress preserves the first start time. Tools separate consecutive assistant commentary through the existing message adapter. On completion, the final assistant message receives the terminal timestamp so the shared summary retains total duration after replaying snapshot text parts that share their Item's creation time. + +## Affected components and boundaries + +CLI changes affect Hosted event envelopes, metadata derivation, the model loop and continuation validation. Java changes classify the safe limit error and accept late continuation rounds without weakening the existing field allowlist. WebShell changes affect the Managed message adapter, page layout and progress presentation, plus the App customization boundary. There is no schema migration or new API route. Workspace directory selection remains an independent part of this delivery. + +## Validation and acceptance + +Focused tests cover parallel identities, exact receipt association, successful/failed/cancelled outcomes, absence of raw content, live/replay parity, more than 16 model rounds, positive configured limits and recovery round counting. Consumer tests cover tool timing, message separation, progress presentation and shared customization. Run root build/typecheck/bundle and the affected Java verification gates. Verify the deployed local stack with a disposable real-model Session, a silent Shell, refresh, terminal status and a browser screenshot. Test that publication results still join the metadata Item when publication is enabled; a fixture result alone does not establish live storage acceptance. + +Local acceptance on 2026-10-17 used the existing DeepSeek/deepseek-v4.1-flash configuration. A disposable Session exposed an environment-Hook refusal, a successful 50-second silent Shell and a completed file read as three distinct tool Items, with ordered assistant commentary, terminal state and identical transcript readback. The browser showed Running/elapsed/Waiting for output, then Completed and the final file marker; refresh retained a total duration of 4m36s. A pre-restart disposable Session also continued on the same Runtime worker PID/start identity. The original user Session remained at sequence 148 and was never resubmitted. That initial deployment used controlled tests for more-than-16-round and configured-cap acceptance; live publication storage acceptance remains outside this deployment's metadata-only policy. + +Subsequent isolated acceptance completed 11 Turns across five Sessions using the same model. Independent checks confirmed diagnosis without edits, a rounding repair with nine passing tests and 40 additional arithmetic vectors, and three incremental requirements with preserved history. The first long-chain Turn exposed Java's remaining 0–15 persistence guard after 16 reads and completed after the guards were repaired and the isolated services restarted. A fresh Session then completed without a restart, persisting 25 model requests with rounds 0–24 and Shell approvals at rounds 21 and 23. Its 24 tools read all 20 dependent files, wrote the proof, observed a real verifier failure, corrected the proof and passed verification without another user message. Refresh retained Completed, tool steps and 51s total duration. The original user services and Session were untouched. + +The interrupted task used the existing Runtime tool-result recovery route, which does not emit fresh main-model request metadata. Its completion is recovery evidence; the fresh Session independently establishes uninterrupted continuation beyond 16 rounds. Repeated crashes and a positive configured quota across that legacy route were not tested. Some earlier prompts used extra, individually approved read-only inspection commands despite their narrower Shell list; final model self-reports are not evidence of instruction compliance. + +## Local UI evidence + +The silent command remains visible while running, and the completed transcript retains tool steps and elapsed time after refresh. + +![Silent tool running in Managed WebShell](../assets/managed-agent-local-debugging/progress-running.png) + +![Completed Managed transcript after refresh](../assets/managed-agent-local-debugging/progress-completed.png) + +The follow-up screenshots show separate Sessions: the first task blocked after 16 reads, and a fresh task completing 24 tools after the repair. The first test Session also completed after recovery. + +![Long-chain task blocked after 16 reads](../assets/managed-agent-local-debugging/complete-prompt-blocked.png) + +![Fresh long-chain task completed after refresh](../assets/managed-agent-local-debugging/complete-prompt-completed.png) + +## Risks and open questions + +Historical public projections are not rewritten, and an already failed Turn is not resumed automatically. Metadata projection must not turn a private result into public content or confuse a Broker execution ID with a model call ID. The existing unlimited default can run longer than the former hardcoded cap; operators can use the existing model limit and Turn deadline. No open product decision blocks this scoped repair. diff --git a/docs/design/2026-10-16-managed-webshell-progress.zh-CN.md b/docs/design/2026-10-16-managed-webshell-progress.zh-CN.md new file mode 100644 index 0000000000..a00d978b0a --- /dev/null +++ b/docs/design/2026-10-16-managed-webshell-progress.zh-CN.md @@ -0,0 +1,59 @@ +# Managed WebShell 进度与 daemon 外观对齐 + +[English](2026-10-16-managed-webshell-progress.md) | [简体中文](2026-10-16-managed-webshell-progress.zh-CN.md) + +状态:已实现,并通过本地 Lima 部署验收。 + +## 问题与范围 + +一次实际 Managed Turn 执行了 18 次工具调用,但没有公开任何工具事件。静默下载压缩包的命令在 300 秒后超时,随后私有模型循环在写死的 16 轮处停止。WebShell 只展示拼接的助手文本和通用错误。Managed 已使用 daemon 的 MessageList,但没有继承其展示定制,还额外添加了大的进度框和布局间距。 + +本次恢复可观察的工具生命周期元数据,使用已有的 model.maxSessionTurns 设置替代单独的 16 轮上限,并将界面与普通 daemon WebShell 对齐。不改变执行位置、权限和工具结果发布策略,也不重放工具。 + +## 事件投影 + +Hosted Harness 根据已提交的助手批次与 ordinal 派生工具公开身份和名称。已提交的 tool.intent 生成进行中的 tool_call 更新,匹配的 tool.receipt 根据持久化执行状态生成终态更新。已提交的单调用 tool_result 历史也投影终态更新,覆盖不写 receipt 的旧文件执行路径;重复状态更新合并到同一 Item。保留模型调用 ID,使 O3 结果投影合并到同一个 Item。实时 SSE 和 transcript 回放使用相同派生逻辑及原始日志序号。并行调用保留各自身份。 + +生命周期更新只包含工具 ID、名称和状态。原始参数、路径、命令内容、输出、私有引用和凭据均不进入此投影。原始内容与预览仍通过已有发布和产物策略提供。因此静默命令可以显示活动工具及耗时,而不会编造输出。缺少来源或来源不匹配时不编造工具或终态。 + +## 模型继续执行与错误 + +Hosted 循环读取已有的 model.maxSessionTurns 配置。默认值 -1 允许超过 16 轮继续执行;正数限制单次 Turn 的模型轮数,包括恢复时保存的轮数。现有取消信号、截止时间、模型 token 预算和持久化恢复屏障继续生效。达到配置上限时提供明确的停止原因、公开错误码及固定的安全提示,其他任意模型错误继续脱敏。不增加配置项。 + +Java 持久化校验和 CLI 持久化审批、模型请求的读取校验接受非负安全整数轮数,不再单独限制为 16 轮。原有身份、来源 activation、摘要和授权校验全部保留;恢复后的模型循环继续执行配置的上限。替换所有者的测试覆盖初始轮和首次超过旧上限的轮数。Java 测试覆盖超过旧上限后的写入,以及对负数、小数、强制转换类型和不安全计数器的拒绝。 + +## 展示 + +Managed 继续使用共享的 MessageList、MessageItem 和 ToolGroup。它接收相同的展示定制,但不接入普通 daemon 的所有权回调。布局移除额外的分段间距,并将 Managed Turn 开始时间传给 MessageList。底部状态使用 daemon 的 StreamingStatus 样式表和 Managed 自己的状态,不读取普通 daemon 的 store。重复工具进度保留首次开始时间。工具通过现有消息适配器分隔连续的助手说明。完成时为最后一条助手消息设置终态时间,使共享摘要在回放共用 Item 创建时间的快照文本片段后仍保留总耗时。 + +## 影响组件与边界 + +CLI 修改涉及 Hosted 事件封装、元数据派生、模型循环和续接校验。Java 修改识别安全的上限错误,并接受后续轮数的续接,不放宽现有字段白名单。WebShell 修改涉及 Managed 消息适配器、页面布局、进度展示以及 App 的展示定制边界。没有数据库迁移或新 API 路由。Workspace 目录选择是本次交付中的独立部分。 + +## 验证与验收 + +定向测试覆盖并行身份、精确的 receipt 关联、成功/失败/取消结果、原始内容不外泄、实时与回放一致、超过 16 轮、正数配置上限和恢复轮数计数。消费端测试覆盖工具计时、消息分隔、进度展示及共享定制。执行根目录 build/typecheck/bundle 和受影响的 Java 验证门禁。部署到本地后,用一次性真实模型 Session 验证静默 Shell、刷新、终态,并保存浏览器截图。发布开启时验证结果仍合并到元数据 Item;仅有 fixture 结果不能证明真实存储验收。 + +2026-10-17 的本地验收沿用已有 DeepSeek/deepseek-v4.1-flash 配置。一次性 Session 将环境 Hook 拒绝、成功运行 50 秒的静默 Shell 和完成的文件读取显示为三个独立工具 Item,助手说明顺序正确,终态和两次 transcript 读取一致。浏览器显示 Running、耗时和 Waiting for output,随后为 Completed 及最终文件 marker;刷新后保留 4m36s 总耗时。重启前的一次性 Session 也在同一 Runtime worker PID/启动身份上继续成功。原用户 Session 仍停留在 sequence 148,从未重提。该初次部署通过受控测试验收超过 16 轮及配置上限;本次部署只发布元数据,未验证真实发布存储。 + +后续隔离验收沿用相同模型,五个 Session 共完成 11 个 Turn。独立检查确认:只诊断不改文件;金额舍入修复通过九个测试和额外 40 组金额校验;三轮追加与纠正需求保留历史。首次长链 Turn 在 16 次读取后暴露 Java 遗留的 0–15 轮持久化校验,修复校验并重启隔离服务后继续完成。随后全新 Session 不经重启完成任务,持久化 25 个模型请求,轮数为 0–24,Shell 审批分别位于第 21 和 23 轮。其 24 次工具调用读取全部 20 个依赖文件、写入证明文件、观察真实验证失败、自行修正并通过验证,没有额外用户消息纠偏。刷新后保留 Completed、工具步骤和 51s 总耗时。原用户服务和 Session 均未改动。 + +中断任务使用既有 Runtime 工具结果恢复路径,该路径不会产生新的主模型请求元数据。因此它的完成只能证明恢复结果;全新 Session 独立证明不间断执行超过 16 轮。本次没有测试该旧恢复路径上的再次崩溃或正数配置额度。部分前序 prompt 使用了超出其 Shell 白名单的额外只读检查命令,每条均单独审查并单次批准;模型最终自报不能作为遵循指令的证据。 + +## 本地界面证据 + +静默命令运行时保持可见,已完成的 transcript 在刷新后保留工具步骤和耗时。 + +![Managed WebShell 中运行的静默工具](../assets/managed-agent-local-debugging/progress-running.png) + +![刷新后已完成的 Managed transcript](../assets/managed-agent-local-debugging/progress-completed.png) + +后续截图来自不同 Session:首次任务在 16 次读取后阻塞,修复后全新任务完成 24 次工具调用。首次测试 Session 也已在恢复后完成。 + +![读取 16 次后阻塞的长链任务](../assets/managed-agent-local-debugging/complete-prompt-blocked.png) + +![刷新后全新长链任务已完成](../assets/managed-agent-local-debugging/complete-prompt-completed.png) + +## 风险与待确认事项 + +不重写历史公开投影,也不自动恢复已经失败的 Turn。元数据投影不能将私有结果变成公开内容,也不能混淆 Broker execution ID 与模型调用 ID。已有的默认不限轮数可能比原先固定上限运行更久;运维仍可通过现有模型上限和 Turn 截止时间约束。本次有限修复没有阻塞实施的产品待定事项。 diff --git a/docs/design/2026-10-16-managed-workspace-directory-selection.md b/docs/design/2026-10-16-managed-workspace-directory-selection.md new file mode 100644 index 0000000000..6cdb9ef45b --- /dev/null +++ b/docs/design/2026-10-16-managed-workspace-directory-selection.md @@ -0,0 +1,59 @@ +# Select an existing Managed Workspace directory + +[English](2026-10-16-managed-workspace-directory-selection.md) | [简体中文](2026-10-16-managed-workspace-directory-selection.zh-CN.md) + +Status: Implemented and verified locally on Lima Linux. Production acceptance is outside this change. + +## Problem and current state + +Before this change, New workspace accepted only a name and creates an empty server-owned directory. A user cannot select an existing Linux project. The local debug deployment runs Java and its `local-process` tool workers in Lima Linux, so directory discovery must run there as well. + +## Proposed behavior + +New workspace offers an existing-directory mode alongside empty-directory creation. The user selects an authorized root, browses its real subdirectories, and creates a named Workspace at the chosen project directory. The project stays in place. The selection persists across page reloads and becomes the default directory for new Sessions in that Workspace. + +The selectable roots are existing ACTIVE ROOT Workspaces backed by local storage on which the authenticated actor has OWNER access. An administrator registers a projects parent directory once and grants that root to its owner. The local deployment exposes its Linux projects parent this way. The chosen directory is a working directory, not a new permission boundary: Workspaces within the same storage retain the existing shared file access and physical-owner lease semantics. + +## API and authority + +The WebShell-only `workspaces/directories/query` route accepts `workspaceId` and `cwdRelative`. It returns the canonical authorized root and directory, a bounded list of immediate real child directories, and a truncation flag. The route is persisted-workspace scoped; tenant, actor, ACTIVE ROOT state, OWNER grant, configured mount, native identity, and marker verification all apply before filesystem discovery. Paths are normalized with the existing relative-path contract. Traversal, symlinks, reserved maintenance directories, inaccessible directories, and unsupported storage fail closed. Discovery never falls back to the ordinary daemon. SSH and CSI storage are excluded from local directory candidates and refused before local filesystem resolution; SSH registration keeps its separate node/path check and operation APIs. OpenAPI v1.56 names the local browse request separately from the v1.52 SSH directory-check request. + +The existing create request gains optional `sourceWorkspaceId` and `cwdRelative` fields. Both must be supplied together. Without them, existing empty-directory creation is unchanged. With them, creation verifies the source and directory and publishes a new logical Workspace using that source's storage, configuration, and policy. It neither creates nor registers another physical root. Source identity and generation are pinned in the receipt and checked again before publication. A changed or revoked source cannot complete a pending request. + +The existing actor-scoped WORKSPACE_CREATE receipt persists the selected source, generation, storage, and directory. Its digest covers the normalized request, including source generation when selected. Same-key retries compare with the pinned generation rather than silently rebinding after source changes. Completed replay checks the new Workspace's current access and never restores a grant. No schema or native marker change is needed. Receipt data supplies an optional `defaultCwdRelative` in WebShell summaries; legacy and static Workspaces default to `.`. Public Session-selection semantics remain unchanged. + +## Browser integration + +Reuse the shared directory-browser dialog and its stale-response protection. Directory requests use the Java Managed provider. The browser preserves the pending name, source, directory, and idempotency key before submission. An uncertain operation remains retryable with the exact same request. An explicit abandon-local-confirmation action removes only the persisted browser record and unlocks directory/name editing, including after reload. It warns that a Workspace may already exist and is not deleted; a new creation uses a new key. A browser storage failure preserves the frozen request. Selecting, refreshing, or newly creating a Workspace initializes the composer directory from its persisted default without changing its prompt or model. + +## Affected areas + +| Area | Change | +| --------------------------------- | ------------------------------------------------------------------------------- | +| Java Workspace store and registry | Authorized directory discovery, selected-directory creation, receipt projection | +| WebShell API contract | Directory query, optional create fields and default directory, surface gate | +| WebShell provider and creator | Directory dialog, pending request persistence, default directory | +| Deployment and validation | Register a Linux projects parent; scoped API, UI, and real tool checks | + +## Boundaries and risks + +This change covers the existing trusted Linux local-process deployment. It does not select Mac paths, import arbitrary ungranted server paths, create new machine transports, copy projects, or alter runtime recovery. The storage root remains outside Git worktrees; repositories remain child directories, preserving marker and child-Git lifecycle rules. Administrators must choose a parent whose entire file-access scope is appropriate for its owner. Directory discovery is bounded; it does not recursively scan the filesystem. Receipt and grant transactions must remain correct under concurrent retries and source revocation. + +## Validation and acceptance + +1. Baseline New workspace has no directory choice; the new API is absent. +2. An owner can browse real Linux child directories and create a Workspace that reads the existing project's files with a real model/tool call. +3. Refresh, reselect, and a Java-only restart preserve the default project directory and native registration. +4. Reader, operator, other actor, other tenant, inactive source, traversal, symlink, maintenance directory, and unconfigured storage requests are refused without disclosing directory contents. +5. Same-key and concurrent retries create one Workspace; changed requests conflict; pending source changes fail; completed replay does not regrant access or register held storage. +6. Empty creation, model selection, prompt preservation, ordinary daemon behavior, and original Workspace recovery continue to work. + +## Local UI evidence + +The selected Linux project remains the Workspace's default directory after creation and refresh. + +![Selected Linux directory in the Managed composer](../assets/managed-agent-local-debugging/directory-selected.png) + +## Open questions + +None for this scope. Additional selectable project parents are administrator configuration, not inferred from browser-provided paths. diff --git a/docs/design/2026-10-16-managed-workspace-directory-selection.zh-CN.md b/docs/design/2026-10-16-managed-workspace-directory-selection.zh-CN.md new file mode 100644 index 0000000000..3afe488327 --- /dev/null +++ b/docs/design/2026-10-16-managed-workspace-directory-selection.zh-CN.md @@ -0,0 +1,59 @@ +# 选择已有的 Managed Workspace 目录 + +[English](2026-10-16-managed-workspace-directory-selection.md) | [简体中文](2026-10-16-managed-workspace-directory-selection.zh-CN.md) + +状态:已在本地实现并通过 Lima Linux 验证,生产验收不属于本次范围。 + +## 问题与现状 + +本次改动之前,New workspace 只接受名称,并创建由服务端管理的空目录。用户无法选择已有的 Linux 项目。本地调试部署中的 Java 和 `local-process` 工具 worker 都在 Lima Linux 中运行,因此目录发现也必须在该机器上执行。 + +## 预期行为 + +New workspace 在创建空目录之外增加已有目录模式。用户选择已授权的根目录,浏览其中的真实子目录,再为选中的项目目录创建命名 Workspace。项目保留在原位置。页面刷新后仍保留选择,并将其作为该 Workspace 新 Session 的默认工作目录。 + +可选择的根目录是使用本地存储、且当前认证 actor 拥有 OWNER 权限的 ACTIVE ROOT Workspace。管理员先注册项目父目录并向其所有者授权;本地部署也以此方式提供 Linux 项目父目录。所选目录是工作目录,并非新的权限边界:同一 storage 中的 Workspace 继续使用现有的共享文件访问范围和 physical-owner lease 语义。 + +## API 与权限 + +仅限 WebShell 的 `workspaces/directories/query` 接口接受 `workspaceId` 和 `cwdRelative`,返回已授权的 canonical 根目录和当前目录、有界的直接真实子目录列表,以及截断标志。该接口属于持久 Workspace 范围;读取文件系统前必须检查 tenant、actor、ACTIVE ROOT 状态、OWNER 授权、已配置 mount、native identity 和 marker。路径通过现有相对路径契约规范化。路径穿越、软链接、保留维护目录、不可访问目录和不支持的 storage 均关闭准入。目录发现不会回退到普通 daemon。SSH 和 CSI storage 不会出现在本地目录候选中,并在解析本地文件系统之前被拒绝;SSH 注册继续使用独立的 node/path 检查及操作接口。OpenAPI v1.56 为本地浏览请求使用单独名称,与 v1.52 的 SSH 目录检查请求区分。 + +现有创建请求增加可选的 `sourceWorkspaceId` 和 `cwdRelative` 字段,二者必须同时提供。缺省时保持创建空目录的行为。提供时验证源 Workspace 和目录,使用源 storage、配置和策略发布新的逻辑 Workspace,不再创建或注册 physical root。receipt 固定源身份及 generation,并在发布前再次检查。源身份发生变化或权限被撤销后,待完成请求不能继续成功。 + +现有 actor 范围的 WORKSPACE_CREATE receipt 持久化所选源、generation、storage 和目录。digest 覆盖规范化请求,选择已有目录时也包括源 generation。同 key 重试与已固定的 generation 比较,不会在源变化后悄悄重新绑定。完成后的重放检查新 Workspace 的当前权限,不会恢复授权。无需修改 schema 或 native marker。WebShell summary 从 receipt 投影可选的 `defaultCwdRelative`;历史和静态 Workspace 默认为 `.`。公开 API 的 Session 选择语义保持不变。 + +## 浏览器集成 + +复用共享目录浏览对话框及其过期响应保护。目录请求走 Java Managed provider。浏览器在提交前保留待完成请求的名称、源、目录和幂等 key;结果不确定时,用完全相同的请求重试。显式“放弃本地确认”操作仅删除浏览器持久化记录,并恢复目录和名称编辑,刷新后同样可用。界面说明工作区可能已存在,放弃不会删除它;新的创建使用新的 key。浏览器存储操作失败时,保留冻结请求。选择、刷新或新建 Workspace 时,从持久化默认目录初始化输入框,不改变草稿或模型。 + +## 涉及范围 + +| 层次 | 改动 | +| -------------------------------- | -------------------------------------------------- | +| Java Workspace store 和 registry | 已授权目录发现、选择目录创建、receipt 投影 | +| WebShell API 契约 | 目录查询、可选创建字段和默认目录、surface gate | +| WebShell provider 和创建界面 | 目录对话框、待完成请求持久化、默认目录 | +| 部署与验证 | 注册 Linux 项目父目录;范围 API、UI 和真实工具验证 | + +## 边界与风险 + +本次覆盖已有的可信 Linux local-process 部署,不选择 Mac 路径、不导入任意未授权服务端路径、不增加机器传输、不复制项目,也不修改运行时恢复。storage root 仍位于 Git worktree 之外,仓库位于子目录中,保留 marker 和 child-Git 生命周期规则。管理员必须选择文件访问范围整体适合其所有者的项目父目录。目录发现有界,不递归扫描文件系统。receipt 和授权事务必须在并发重试及源权限撤销时保持正确。 + +## 验证与验收 + +1. 基线 New workspace 没有目录选择,新 API 不存在。 +2. OWNER 能浏览真实 Linux 子目录,并创建可以通过真实模型和工具读取已有项目文件的 Workspace。 +3. 刷新、重新选择和仅重启 Java 后,默认项目目录及 native registration 保持不变。 +4. READER、OPERATOR、其他 actor、其他 tenant、非 ACTIVE 源、路径穿越、软链接、维护目录和未配置 storage 请求均被拒绝,且不泄露目录内容。 +5. 相同 key 和并发重试只创建一个 Workspace;请求变化产生冲突;待完成请求遇到源变化失败;完成后的重放不会重新授权或注册正在持有的 storage。 +6. 创建空目录、模型选择、草稿保留、普通 daemon 行为和原 Workspace 恢复继续正常工作。 + +## 本地界面证据 + +选择的 Linux 项目在创建和刷新后仍是 Workspace 的默认目录。 + +![Managed 编辑器中选中的 Linux 目录](../assets/managed-agent-local-debugging/directory-selected.png) + +## 待定事项 + +此范围内无待定事项。新增可选项目父目录属于管理员配置,不从浏览器提供的路径推断权限。 diff --git a/packages/cli/src/serve/hosted-approval-continuation.test.ts b/packages/cli/src/serve/hosted-approval-continuation.test.ts index 97bac4efb8..00305714d7 100644 --- a/packages/cli/src/serve/hosted-approval-continuation.test.ts +++ b/packages/cli/src/serve/hosted-approval-continuation.test.ts @@ -29,13 +29,15 @@ afterEach(() => vi.restoreAllMocks()); it.each( ['allow', 'deny', 'cancelled', 'expired'].flatMap((decision) => - [randomUUID(), 'mon_1:notify:3', `arun_${'a'.repeat(32)}:input`].map( - (promptId) => ({ decision, promptId }), + [0, 16].flatMap((round) => + [randomUUID(), 'mon_1:notify:3', `arun_${'a'.repeat(32)}:input`].map( + (promptId) => ({ decision, promptId, round }), + ), ), ), )( - 'restores the original native batch and final Action under a replacement owner ($decision, $promptId)', - async ({ decision, promptId }) => { + 'restores the original native batch and final Action under a replacement owner ($decision, $promptId, round=$round)', + async ({ decision, promptId, round }) => { const root = await mkdtemp(path.join(tmpdir(), 'g3-step3-baseline-')); const sessionKey = { tenantId: 'tenant', @@ -160,6 +162,7 @@ it.each( isClientInitiated: false, prompt_id: promptId, }; + turn.setModelRound(round); running = turn .execute( [call], @@ -232,6 +235,7 @@ it.each( ); expect(saved?.plan).toMatchObject({ promptId, + round, batchId: first.authority .eventsInSequenceRange(1, first.authority.committedSequence) .find( diff --git a/packages/cli/src/serve/hosted-approval-continuation.ts b/packages/cli/src/serve/hosted-approval-continuation.ts index f85667be7c..52e8bcf169 100644 --- a/packages/cli/src/serve/hosted-approval-continuation.ts +++ b/packages/cli/src/serve/hosted-approval-continuation.ts @@ -103,7 +103,6 @@ export async function readHostedApprovalContinuation( !isDeepStrictEqual(plan.rootSnapshotRef, header.rootSnapshotRef) || !Number.isSafeInteger(plan.round) || plan.round < 0 || - plan.round >= 16 || !Array.isArray(plan.calls) || plan.calls.length < 1 || !Number.isSafeInteger(plan.approvalOrdinal) || diff --git a/packages/cli/src/serve/hosted-harness-model.test.ts b/packages/cli/src/serve/hosted-harness-model.test.ts index cdaadfa3fa..d7b5b4eb4e 100644 --- a/packages/cli/src/serve/hosted-harness-model.test.ts +++ b/packages/cli/src/serve/hosted-harness-model.test.ts @@ -23,7 +23,10 @@ import { HostedHookRecoveryRequiredError } from './hosted-hook-session.js'; import { SendMessageType } from '@qwen-code/qwen-code-core/core/client.js'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { loadCliConfig } from '../config/config.js'; -import { runHostedHarnessTextTurn } from './hosted-harness-model.js'; +import { + HostedModelRoundLimitError, + runHostedHarnessTextTurn, +} from './hosted-harness-model.js'; import { HostedModelUnavailableError } from './hosted-agent-definition.js'; import { HostedSkillCatalog } from './hosted-skill-catalog.js'; import type { ChatRecord } from '@qwen-code/qwen-code-core/services/chatRecordingService.js'; @@ -110,6 +113,7 @@ function config( sendMessageStream, }), getModel: () => 'test-model', + getMaxSessionTurns: () => -1, getContentGeneratorConfig: () => undefined, setUserMemory, setPromptToolSnapshot, @@ -163,6 +167,76 @@ function nativeInput(event: HookEventName): HookInput { describe('Hosted Harness model boundary', () => { beforeEach(() => vi.clearAllMocks()); + it.each([-1, 18])( + 'continues beyond sixteen rounds with limit %s', + async (limit) => { + const model = config([]); + state.config['getMaxSessionTurns'] = () => limit; + let round = 0; + let output: Content = { role: 'model', parts: [] }; + const client = state.config.getLlmClient(); + state.config.getLlmClient = () => ({ + ...client, + getHistory: () => [output], + async *sendMessageStream() { + round++; + if (round <= 17) { + output = { + role: 'model', + parts: [{ functionCall: { name: 'read_file' } }], + }; + yield { + type: LlmEventType.ToolCallRequest, + value: { + callId: `call-${round}`, + name: 'read_file', + args: {}, + isClientInitiated: false, + prompt_id: input.promptId, + }, + }; + } else { + output = { role: 'model', parts: [{ text: 'done' }] }; + yield { type: LlmEventType.Content, value: 'done' }; + } + yield { type: LlmEventType.Finished }; + }, + }); + const execute = vi.fn(async () => [{ text: 'file contents' }]); + const result = await runHostedHarnessTextTurn({ + ...input, + toolTurn: { + declarations: async () => [{ name: 'read_file' }], + consumeResults: async () => undefined, + setPromptHookRunner: () => undefined, + execute, + }, + }); + expect(result.text).toBe('done'); + expect(round).toBe(18); + expect(execute).toHaveBeenCalledTimes(17); + expect(model.shutdown).toHaveBeenCalledOnce(); + }, + ); + + it('honors the configured limit at a recovered model round before sending again', async () => { + const model = config([]); + state.config['getMaxSessionTurns'] = () => 20; + await expect( + runHostedHarnessTextTurn({ ...input, initialRound: 20 }), + ).rejects.toBeInstanceOf(HostedModelRoundLimitError); + expect(model.sendMessageStream).not.toHaveBeenCalled(); + expect(model.shutdown).toHaveBeenCalledOnce(); + }); + + it('classifies the native configured session limit without a generic failure', async () => { + const model = config([{ type: LlmEventType.MaxSessionTurns }]); + await expect(runHostedHarnessTextTurn(input)).rejects.toBeInstanceOf( + HostedModelRoundLimitError, + ); + expect(model.shutdown).toHaveBeenCalledOnce(); + }); + it('removes local tools before a text model request', async () => { const hooks = config([ { type: LlmEventType.Content, value: 'hello back' }, @@ -1358,6 +1432,7 @@ describe('Hosted Harness model boundary', () => { async (resume) => { const hooks = hostedHooks(); const model = config([]); + state.config['getMaxSessionTurns'] = () => 1; const responses: Part[] = [ { functionResponse: { @@ -1401,7 +1476,9 @@ describe('Hosted Harness model boundary', () => { ...input, hooks: hooks.session, toolTurn, - ...(resume ? { resumeFromToolResults: responses } : {}), + ...(resume + ? { resumeFromToolResults: responses, initialRound: 1 } + : {}), }), ).resolves.toEqual({ text: 'Stopped after tools.', @@ -1599,6 +1676,7 @@ describe('Hosted Harness resume and retraction', () => { }, }), getModel: () => 'test-model', + getMaxSessionTurns: () => -1, getContentGeneratorConfig: () => undefined, setUserMemory: vi.fn(), setPromptToolSnapshot: vi.fn(), diff --git a/packages/cli/src/serve/hosted-harness-model.ts b/packages/cli/src/serve/hosted-harness-model.ts index 72b60ba014..55f9d44d7d 100644 --- a/packages/cli/src/serve/hosted-harness-model.ts +++ b/packages/cli/src/serve/hosted-harness-model.ts @@ -68,6 +68,12 @@ export interface HostedHarnessModelResult { model: string; } +export class HostedModelRoundLimitError extends Error { + constructor() { + super('The Hosted Harness Turn reached its configured model round limit.'); + } +} + export interface HostedHarnessTextDeltas { delta(text: string): Promise; /** @@ -456,19 +462,22 @@ export async function runHostedHarnessTextTurn(input: { let preparedRecovery = input.resumeModel?.prepared; let stopHookActive = (await input.hooks?.wasStopBlocked(input.promptId)) ?? false; + const maxRounds = config.getMaxSessionTurns(); for ( let round = input.resumeModel?.round ?? input.initialRound ?? 0; - round < 16; + ; round++ ) { - input.toolTurn?.setModelRound?.(round); input.signal.throwIfAborted(); + input.toolTurn?.setModelRound?.(round); if (input.hooks?.hasPendingOperations) throw new HostedHookRecoveryRequiredError(); if (input.toolTurn?.hookStopReason) { const text = input.toolTurn.hookStopReason; return { text, parts: [{ text }], model: config.getModel() }; } + if (maxRounds > 0 && round >= maxRounds) + throw new HostedModelRoundLimitError(); const declarations = (await input.toolTurn?.declarations(input.signal)) ?? []; client @@ -640,6 +649,9 @@ export async function runHostedHarnessTextTurn(input: { } else if (event.type === LlmEventType.UserCancelled) { modelFailure = false; throw new Error('Hosted Harness turn was cancelled.'); + } else if (event.type === LlmEventType.MaxSessionTurns) { + modelFailure = false; + throw new HostedModelRoundLimitError(); } else if ( event.type !== LlmEventType.ChatCompressed && event.type !== LlmEventType.Thought && @@ -737,7 +749,6 @@ export async function runHostedHarnessTextTurn(input: { ); pendingToolResults = true; } - throw new Error('Hosted tool turn exceeded 16 model rounds.'); } finally { input.hooks?.setMessagesProvider(undefined); try { diff --git a/packages/cli/src/serve/hosted-harness-session.issue-13328.test.ts b/packages/cli/src/serve/hosted-harness-session.issue-13328.test.ts index 5ba31e77ab..15ce7079a6 100644 --- a/packages/cli/src/serve/hosted-harness-session.issue-13328.test.ts +++ b/packages/cli/src/serve/hosted-harness-session.issue-13328.test.ts @@ -107,7 +107,8 @@ vi.mock( }, }), ); -vi.mock('./hosted-harness-model.js', () => ({ +vi.mock('./hosted-harness-model.js', async (importOriginal) => ({ + ...(await importOriginal()), runHostedHarnessTextTurn: state.model, })); diff --git a/packages/cli/src/serve/hosted-harness-session.test.ts b/packages/cli/src/serve/hosted-harness-session.test.ts index 3f184185a8..0a566d8b5a 100644 --- a/packages/cli/src/serve/hosted-harness-session.test.ts +++ b/packages/cli/src/serve/hosted-harness-session.test.ts @@ -141,6 +141,7 @@ import { teamMemberPreamble } from './hosted-member-chain.js'; const wakeDeps = vi.hoisted(() => ({ last: undefined as unknown, + runTurnGate: undefined as Promise | undefined, })); const domainEnablement = vi.hoisted(() => ({ @@ -203,7 +204,14 @@ vi.mock('./hosted-monitor-wake-turn.js', async (importOriginal) => { ...actual, createMonitorWakeRunTurn: (params: never) => { wakeDeps.last = params; - return actual.createMonitorWakeRunTurn(params as never); + const runTurn = actual.createMonitorWakeRunTurn(params as never); + const gate = wakeDeps.runTurnGate; + return gate + ? async (...args: Parameters) => { + await gate; + return runTurn(...args); + } + : runTurn; }, }; }); @@ -337,7 +345,8 @@ vi.mock( }, }), ); -vi.mock('./hosted-harness-model.js', () => ({ +vi.mock('./hosted-harness-model.js', async (importOriginal) => ({ + ...(await importOriginal()), runHostedHarnessTextTurn: state.model, })); @@ -418,6 +427,7 @@ function expectFullStreamedAnswer( const listeners = new Set(); beforeEach(() => { + wakeDeps.runTurnGate = undefined; vi.spyOn( HostedWorkspaceBroker.prototype, 'capabilityDigest', @@ -5058,25 +5068,14 @@ describe('Hosted Harness no-tool session', () => { await prewriteAutomationParkedWakeSession(); const repair = mockRepairBroker(); repair.unlatch(); - // The pump's first post-load classification hangs at its projection - // read: the prompt route's checkpoint probe must run first, while - // the Session is still unblocked. - const originalProject = ManagedSessionRecordSink.prototype.project; + // Hold the pump itself before load: its first projection can otherwise + // run before the load response reaches the test, leaving the wrong + // consumer suspended at the probe below. let afterLoad = false; - let classificationHung = false; - let releaseClassify!: () => void; - const classifyGate = new Promise((resolve) => { - releaseClassify = resolve; + let releaseRun!: () => void; + wakeDeps.runTurnGate = new Promise((resolve) => { + releaseRun = resolve; }); - vi.spyOn(ManagedSessionRecordSink.prototype, 'project').mockImplementation( - function (this: ManagedSessionRecordSink) { - if (afterLoad && !classificationHung) { - classificationHung = true; - return classifyGate.then(() => originalProject.call(this)); - } - return originalProject.call(this); - }, - ); // The route probe's checkpoint read hangs next, so the block lands // strictly between the probe's start and its answer. const originalAuthorization = @@ -5126,62 +5125,73 @@ describe('Hosted Harness no-tool session', () => { }, ); const server = await app(true); - const loaded = await headers( - supertest(server).post(`/session/${SESSION_ID}/load`), - ).send({ managedSessionStore: store() }); - expect(loaded.status).toBe(200); - afterLoad = true; - const authorize = (request: supertest.Test) => - headers(request).set('X-Qwen-Client-Id', loaded.body.clientId as string); - const prompt = [{ type: 'text', text: 'hello' }]; - const payloadDigest = `sha256:${createHash('sha256').update(JSON.stringify(prompt)).digest('hex')}`; - // Promise.resolve dispatches the supertest thenable at once (its - // request only leaves on .then), so the probe is in flight while - // the test drives the pump below. - const prompted = Promise.resolve( - authorize(supertest(server).post(`/session/${SESSION_ID}/prompt`)).send({ - prompt, - promptId: randomUUID(), - payloadDigest, - }), - ); - // The probe is in flight; the pump now classifies the same park, - // and its aftermath stops, commits the cancelled results and parks - // at the held release — the block the probe started before. - await probed; - releaseClassify(); - await releasing; - releaseProbe(); - const refused = await prompted; - // The post-probe re-read, not the probe, held the line: the durable - // session-scope code, while the transient-window one belongs to the - // probe's own finding (the sibling pin above). - expect(refused.status).toBe(409); - expect(refused.body.code).toBe('hosted_turn_recovery_required'); - expect(refused.body.reason).toBe('turn_blocked'); - // Nothing was admitted. - const journal = await LocalJsonlManagedSessionJournalStore.read( - path.join(state.root, `${SESSION_ID}.jsonl`), - { tenantId: 'tenant', workspaceId: 'workspace', sessionId: SESSION_ID }, - ); - expect( - journal.events.some( - (event) => - event.kind === 'input.accepted' && - event.payload['source'] === 'hosted-harness', - ), - ).toBe(false); - releaseRelease(); - await vi.waitFor( - async () => { - const status = await authorize( - supertest(server).get(`/session/${SESSION_ID}/status`), + try { + const loaded = await headers( + supertest(server).post(`/session/${SESSION_ID}/load`), + ).send({ managedSessionStore: store() }); + expect(loaded.status).toBe(200); + afterLoad = true; + const authorize = (request: supertest.Test) => + headers(request).set( + 'X-Qwen-Client-Id', + loaded.body.clientId as string, ); - expect(status.body.recoveryBlocked).toBe(false); - }, - { timeout: 15_000 }, - ); - await headers(supertest(server).delete(`/session/${SESSION_ID}`)); + const prompt = [{ type: 'text', text: 'hello' }]; + const payloadDigest = `sha256:${createHash('sha256').update(JSON.stringify(prompt)).digest('hex')}`; + // Promise.resolve dispatches the supertest thenable at once (its + // request only leaves on .then), so the probe is in flight while + // the test drives the pump below. + const prompted = Promise.resolve( + authorize(supertest(server).post(`/session/${SESSION_ID}/prompt`)).send( + { + prompt, + promptId: randomUUID(), + payloadDigest, + }, + ), + ); + // The probe is in flight; the pump now classifies the same park, + // and its aftermath stops, commits the cancelled results and parks + // at the held release — the block the probe started before. + await probed; + releaseRun(); + await releasing; + releaseProbe(); + const refused = await prompted; + // The post-probe re-read, not the probe, held the line: the durable + // session-scope code, while the transient-window one belongs to the + // probe's own finding (the sibling pin above). + expect(refused.status).toBe(409); + expect(refused.body.code).toBe('hosted_turn_recovery_required'); + expect(refused.body.reason).toBe('turn_blocked'); + // Nothing was admitted. + const journal = await LocalJsonlManagedSessionJournalStore.read( + path.join(state.root, `${SESSION_ID}.jsonl`), + { tenantId: 'tenant', workspaceId: 'workspace', sessionId: SESSION_ID }, + ); + expect( + journal.events.some( + (event) => + event.kind === 'input.accepted' && + event.payload['source'] === 'hosted-harness', + ), + ).toBe(false); + releaseRelease(); + await vi.waitFor( + async () => { + const status = await authorize( + supertest(server).get(`/session/${SESSION_ID}/status`), + ); + expect(status.body.recoveryBlocked).toBe(false); + }, + { timeout: 15_000 }, + ); + await headers(supertest(server).delete(`/session/${SESSION_ID}`)); + } finally { + releaseRun(); + releaseProbe(); + releaseRelease(); + } }, 45_000); it('reopens over a queued automation input as idle and runs it', async () => { diff --git a/packages/cli/src/serve/hosted-harness-session.ts b/packages/cli/src/serve/hosted-harness-session.ts index 9534973ff9..7b29286446 100644 --- a/packages/cli/src/serve/hosted-harness-session.ts +++ b/packages/cli/src/serve/hosted-harness-session.ts @@ -135,7 +135,11 @@ import { readHostedAgentInstructions, type HostedAgentDefinition, } from './hosted-agent-definition.js'; -import { runHostedHarnessTextTurn } from './hosted-harness-model.js'; +import { + HostedModelRoundLimitError, + runHostedHarnessTextTurn, +} from './hosted-harness-model.js'; +import { hostedToolProgress } from './hosted-tool-progress.js'; import { HostedSkillCatalog, readHostedSkills, @@ -2643,6 +2647,16 @@ async function eventEnvelope( }> { const sessionId = session.managed.authority.sessionHeader.sessionKey.sessionId; + const progress = await hostedToolProgress(session.managed, event); + if (progress && event.kind !== 'message.committed') { + return { + v: 1, + id: event.sequence, + type: 'session_update', + promptId: progress.promptId, + data: { sessionId, update: progress.update }, + }; + } if (event.kind === 'message.delta') { const text = event.payload['text']; const turnId = event.payload['turnId']; @@ -2725,7 +2739,11 @@ async function eventEnvelope( ...(message.daemonPromptId ? { promptId: message.daemonPromptId } : {}), - data: { sessionId, record: message }, + data: { + sessionId, + record: message, + ...(progress ? { update: progress.update } : {}), + }, }; } return { @@ -2767,6 +2785,7 @@ async function eventEnvelope( event.payload['stopReason'] === 'model_unavailable'; const storeUnavailable = event.payload['stopReason'] === 'managed_session_store_unavailable'; + const roundLimit = event.payload['stopReason'] === 'model_round_limit'; return { v: 1, id: event.sequence, @@ -2781,10 +2800,14 @@ async function eventEnvelope( ? 'model_unavailable' : storeUnavailable ? 'managed_session_store_unavailable' - : 'hosted_turn_failed', + : roundLimit + ? 'hosted_turn_limit_exceeded' + : 'hosted_turn_failed', message: expired ? 'The Hosted Harness Turn exceeded its deadline.' - : 'Hosted Harness turn failed.', + : roundLimit + ? 'The Hosted Harness Turn reached its configured model round limit.' + : 'Hosted Harness turn failed.', }, }; } @@ -3317,6 +3340,11 @@ async function executeHostedTurn( cause instanceof HostedModelUnavailableError ) stopReason = 'model_unavailable'; + if ( + stopReason === 'error' && + cause instanceof HostedModelRoundLimitError + ) + stopReason = 'model_round_limit'; if ( stopReason === 'error' && cause instanceof WorkflowStartCancelledError diff --git a/packages/cli/src/serve/hosted-model-recovery.ts b/packages/cli/src/serve/hosted-model-recovery.ts index c689a6cff7..7cdcc482a7 100644 --- a/packages/cli/src/serve/hosted-model-recovery.ts +++ b/packages/cli/src/serve/hosted-model-recovery.ts @@ -115,7 +115,6 @@ async function readHostedModelRequest( ) || !Number.isSafeInteger(saved.round) || saved.round < 0 || - saved.round >= 16 || !Number.isSafeInteger(saved.throughSequence) || saved.throughSequence < 1 || saved.throughSequence >= attempt.sequence || diff --git a/packages/cli/src/serve/hosted-recovery.test.ts b/packages/cli/src/serve/hosted-recovery.test.ts index ea2b79a75c..2f8afdea19 100644 --- a/packages/cli/src/serve/hosted-recovery.test.ts +++ b/packages/cli/src/serve/hosted-recovery.test.ts @@ -741,14 +741,17 @@ const prepared: LlmPreparedRequest = { it.each( [false, true].flatMap((finished) => - [undefined, false, true].map((allowPersistentRetry) => ({ - finished, - allowPersistentRetry, - })), + [0, 16].flatMap((round) => + [undefined, false, true].map((allowPersistentRetry) => ({ + finished, + allowPersistentRetry, + round, + })), + ), ), )( 'restores an unfinished request even when stream Finished was recorded (%s)', - async ({ finished, allowPersistentRetry }) => { + async ({ finished, allowPersistentRetry, round }) => { const f = await fixture(); const request = createHostedModelRequest( f.session, @@ -757,7 +760,7 @@ it.each( ...prepared, ...(allowPersistentRetry === undefined ? {} : { allowPersistentRetry }), }, - 0, + round, false, undefined, { bootId: 'source-boot', eventEpoch: 'source-epoch' }, diff --git a/packages/cli/src/serve/hosted-tool-progress.test.ts b/packages/cli/src/serve/hosted-tool-progress.test.ts new file mode 100644 index 0000000000..494d1cc559 --- /dev/null +++ b/packages/cli/src/serve/hosted-tool-progress.test.ts @@ -0,0 +1,215 @@ +/** + * @license + * Copyright 2026 Qwen Team + * SPDX-License-Identifier: Apache-2.0 + */ + +import { createHash } from 'node:crypto'; +import { describe, expect, it, vi } from 'vitest'; +import type { ManagedSession } from '@qwen-code/qwen-code-core/managed-runtime/managed-session-assembly.js'; +import type { + ManagedSessionDurableRef, + ManagedSessionEvent, +} from '@qwen-code/qwen-code-core/managed-runtime/managed-session-records.js'; +import { hostedToolProgress } from './hosted-tool-progress.js'; + +function fixture( + outcome: unknown = { envelope: { executionStatus: 'success' } }, +) { + const bodies = new Map(); + const resource = (id: string, body: unknown) => { + const bytes = Buffer.from(JSON.stringify(body)); + bodies.set(id, bytes); + return { + resourceId: id, + kind: 'managed-message', + schemaVersion: 1, + byteLength: bytes.length, + digest: createHash('sha256').update(bytes).digest('hex'), + }; + }; + const batchRef = resource('batch-body', { + uuid: 'batch', + type: 'assistant', + daemonPromptId: 'prompt', + message: { + parts: [ + { text: 'Checking the workspace' }, + { + functionCall: { + id: 'model-call-1', + name: 'run_shell_command', + args: { command: 'secret command' }, + }, + }, + { + functionCall: { + id: 'model-call-2', + name: 'read_file', + args: { path: '/private/file' }, + }, + }, + ], + }, + }); + const outcomeRef = resource('outcome-body', { + ...Object(outcome), + secret: 'private output', + }); + const resultRef = resource('result-body', { + type: 'tool_result', + daemonPromptId: 'prompt', + message: { + parts: [ + { + functionResponse: { + id: 'model-call-2', + name: 'read_file', + response: { output: 'private file contents' }, + }, + }, + ], + }, + }); + const events = [ + { + kind: 'message.committed', + sequence: 1, + payload: { messageId: 'batch', role: 'assistant', contentRef: batchRef }, + }, + { + kind: 'tool.intent', + sequence: 2, + payload: { + executionCallId: 'broker-execution-1', + batchId: 'batch', + ordinal: 0, + }, + }, + { + kind: 'tool.intent', + sequence: 3, + payload: { + executionCallId: 'broker-execution-2', + batchId: 'batch', + ordinal: 1, + }, + }, + { + kind: 'tool.receipt', + sequence: 4, + payload: { + executionCallId: 'broker-execution-2', + toolOutcomeRef: outcomeRef, + }, + }, + { + kind: 'message.committed', + sequence: 5, + payload: { role: 'tool_result', contentRef: resultRef }, + }, + ] as unknown as ManagedSessionEvent[]; + const read = vi.fn( + async (ref: ManagedSessionDurableRef) => bodies.get(ref.resourceId)!, + ); + const session = { + authority: { + eventsInSequenceRange: (from: number, through: number) => + events.filter( + (event) => event.sequence >= from && event.sequence <= through, + ), + }, + resources: { read }, + } as unknown as Pick; + return { session, events, read }; +} + +describe('Hosted tool lifecycle metadata', () => { + it('finishes file tools from committed history when the legacy path has no receipt', async () => { + const { session, events } = fixture(); + const progress = await hostedToolProgress(session, events[4]); + expect(progress).toEqual({ + promptId: 'prompt', + update: { + sessionUpdate: 'tool_call_update', + toolCallId: 'model-call-2', + name: 'read_file', + status: 'completed', + }, + }); + expect(JSON.stringify(progress)).not.toMatch(/private|contents/); + }); + it('names parallel calls by model IDs and never exposes their arguments or output', async () => { + const { session, events } = fixture(); + const first = await hostedToolProgress(session, events[1]); + const second = await hostedToolProgress(session, events[2]); + expect(first).toEqual({ + promptId: 'prompt', + update: { + sessionUpdate: 'tool_call', + toolCallId: 'model-call-1', + name: 'run_shell_command', + status: 'in_progress', + }, + }); + expect(second?.update).toMatchObject({ + toolCallId: 'model-call-2', + name: 'read_file', + }); + const receipt = await hostedToolProgress(session, events[3]); + expect(receipt?.update).toEqual({ + sessionUpdate: 'tool_call_update', + toolCallId: 'model-call-2', + name: 'read_file', + status: 'completed', + }); + expect(JSON.stringify([first, second, receipt])).not.toMatch( + /secret|private|broker-execution/, + ); + expect(await hostedToolProgress(session, events[1])).toEqual(first); + }); + + it.each([ + [{ envelope: { executionStatus: 'error' } }, 'failed'], + [{ envelope: { executionStatus: 'cancelled' } }, 'cancelled'], + [ + { functionResponse: { response: { executionStatus: 'not_started' } } }, + 'failed', + ], + [{ executionStatus: 'success' }, 'completed'], + [ + { functionResponse: { response: { error: 'redacted failure' } } }, + 'failed', + ], + ])('uses durable terminal status for %j', async (outcome, status) => { + const { session, events } = fixture(outcome); + expect((await hostedToolProgress(session, events[3]))?.update.status).toBe( + status, + ); + }); + + it('does not invent completion for unknown outcomes or unmatched receipts', async () => { + const { session, events } = fixture({ + envelope: { executionStatus: 'unknown' }, + }); + expect(await hostedToolProgress(session, events[3])).toBeUndefined(); + expect( + await hostedToolProgress(session, { + ...events[3], + payload: { ...events[3].payload, executionCallId: 'another-execution' }, + }), + ).toBeUndefined(); + expect( + await hostedToolProgress(session, { + ...events[1], + payload: { ...events[1].payload, ordinal: 9 }, + }), + ).toBeUndefined(); + }); + + it('ignores unrelated events without reading resources', async () => { + const { session, events, read } = fixture(); + expect(await hostedToolProgress(session, events[0])).toBeUndefined(); + expect(read).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/cli/src/serve/hosted-tool-progress.ts b/packages/cli/src/serve/hosted-tool-progress.ts new file mode 100644 index 0000000000..1c17e82e4e --- /dev/null +++ b/packages/cli/src/serve/hosted-tool-progress.ts @@ -0,0 +1,165 @@ +/** + * @license + * Copyright 2026 Qwen Team + * SPDX-License-Identifier: Apache-2.0 + */ + +import type { ChatRecord } from '@qwen-code/qwen-code-core/services/chatRecordingService.js'; +import type { ManagedSession } from '@qwen-code/qwen-code-core/managed-runtime/managed-session-assembly.js'; +import { + assertManagedSessionDurableRef, + type ManagedSessionEvent, +} from '@qwen-code/qwen-code-core/managed-runtime/managed-session-records.js'; +import { readManagedMessageBody } from '@qwen-code/qwen-code-core/managed-runtime/managed-message-chunks.js'; + +export async function hostedToolProgress( + session: Pick, + event: ManagedSessionEvent, +): Promise< + | { + promptId: string; + update: { + sessionUpdate: 'tool_call' | 'tool_call_update'; + toolCallId: string; + name: string; + status: 'in_progress' | 'completed' | 'failed' | 'cancelled'; + }; + } + | undefined +> { + if ( + event.kind === 'message.committed' && + event.payload['role'] === 'tool_result' + ) { + const message = JSON.parse( + ( + await readManagedMessageBody( + (ref) => session.resources.read(ref), + assertManagedSessionDurableRef( + event.payload['contentRef'], + 'tool result', + ), + ) + ).toString('utf8'), + ) as ChatRecord; + const responses = + message.message?.parts?.flatMap((part) => + part.functionResponse ? [part.functionResponse] : [], + ) ?? []; + const response = responses[0]; + if ( + responses.length !== 1 || + !response?.id || + !response.name || + !response.response || + !message.daemonPromptId + ) + return; + const status = terminalToolStatus( + response.response?.['executionStatus'], + response.response?.['error'], + ); + if (!status) return; + return { + promptId: message.daemonPromptId, + update: { + sessionUpdate: 'tool_call_update', + toolCallId: response.id, + name: response.name, + status, + }, + }; + } + if (event.kind !== 'tool.intent' && event.kind !== 'tool.receipt') return; + const events = session.authority.eventsInSequenceRange(1, event.sequence); + const intent = + event.kind === 'tool.intent' + ? event + : events.findLast( + (entry) => + entry.kind === 'tool.intent' && + entry.sequence < event.sequence && + entry.payload['executionCallId'] === + event.payload['executionCallId'], + ); + if (!intent) return; + const batch = events.find( + (entry) => + entry.kind === 'message.committed' && + entry.sequence < intent.sequence && + entry.payload['role'] === 'assistant' && + entry.payload['messageId'] === intent.payload['batchId'], + ); + const ordinal = intent.payload['ordinal']; + if ( + !batch || + typeof ordinal !== 'number' || + !Number.isSafeInteger(ordinal) || + ordinal < 0 + ) + return; + const message = JSON.parse( + ( + await readManagedMessageBody( + (ref) => session.resources.read(ref), + assertManagedSessionDurableRef( + batch.payload['contentRef'], + 'tool batch', + ), + ) + ).toString('utf8'), + ) as ChatRecord; + const call = message.message?.parts?.filter((part) => part.functionCall)[ + ordinal + ]?.functionCall; + if (!call?.id || !call.name || !message.daemonPromptId) return; + let status: 'in_progress' | 'completed' | 'failed' | 'cancelled' = + 'in_progress'; + if (event.kind === 'tool.receipt') { + const outcome = JSON.parse( + ( + await session.resources.read( + assertManagedSessionDurableRef( + event.payload['toolOutcomeRef'], + 'tool outcome', + ), + ) + ).toString('utf8'), + ) as { + envelope?: { executionStatus?: string }; + executionStatus?: string; + functionResponse?: { + response?: { executionStatus?: string; error?: unknown }; + }; + }; + const response = outcome.functionResponse?.response; + const executionStatus = + outcome.envelope?.executionStatus ?? + outcome.executionStatus ?? + response?.executionStatus; + if (executionStatus === undefined && !response) return; + const terminal = terminalToolStatus(executionStatus, response?.error); + if (!terminal) return; + status = terminal; + } + // Arguments and output remain behind the tool-publication policy. This + // lifecycle feed only names the call and its durable execution state. + return { + promptId: message.daemonPromptId, + update: { + sessionUpdate: + event.kind === 'tool.intent' ? 'tool_call' : 'tool_call_update', + toolCallId: call.id, + name: call.name, + status, + }, + }; +} + +function terminalToolStatus(status: unknown, error: unknown) { + if (status === 'cancelled') return 'cancelled'; + if (status === 'success') return 'completed'; + if (status === 'error' || status === 'not_started') return 'failed'; + if (status === undefined) return error ? 'failed' : 'completed'; + return undefined; +} diff --git a/packages/managed-agent-server/README.md b/packages/managed-agent-server/README.md index edad192ede..ae60ca63ed 100644 --- a/packages/managed-agent-server/README.md +++ b/packages/managed-agent-server/README.md @@ -623,6 +623,12 @@ Set `QWEN_MANAGED_AGENT_WORKSPACE_CREATION_ROOT` to an existing canonical, serve An uncertain response must be retried with the same key and name. The page preserves that pending operation across refresh and selects the result without clearing the prompt or model. Completed replay never restores revoked access, recreates missing registry rows, or registers held storage again. Pending registration resumes in place after a process restart; failed attempts retain their owned directory for retry. There is no automatic storage deletion or arbitrary host-path import. Workspace persistence does not imply recovery of a resident Harness Session whose writer lease expired during control-plane downtime; that existing Session recovery boundary is separate from creating or reusing a Workspace. Keep the configured root and SQL database durable together. Schema V4 extends the receipt namespace after the published V3 Session-list migration while retaining all published migration resources and existing data. +### Select an existing Linux project directory + +With verified LOCAL storage enabled, **New workspace → Choose existing directory** browses the Linux execution host through Java. Select an ACTIVE ROOT Workspace you own, then choose an existing project beneath its authorized root. Administrators can register and grant a projects parent directory once; the root must remain outside all Git worktrees. The selected project stays in place and becomes the new Workspace's persistent default working directory. Other Workspaces on that storage retain the same shared file-access scope and physical-owner lease; selecting a subdirectory does not create filesystem isolation. + +`POST /api/agent/web-shell/v1/workspaces/directories/query` accepts `workspaceId` and `cwdRelative`, rechecks OWNER access and native storage, and returns at most 100 real immediate child directories (scanning at most 1024 entries). Only this authorized route discloses its Linux root path. The existing create route accepts `sourceWorkspaceId` and `cwdRelative` together to bind a new logical Workspace to the verified source storage, configuration, and policy. It does not create directories or re-register storage. The creation receipt pins source generation and directory; pending retries refuse source changes or revoked ownership. Completed replay checks the new Workspace's current access. WebShell summaries expose `defaultCwdRelative` and `canSelectDirectory`; missing values mean `.` and unsupported, respectively. The page advertises `workspaceDirectorySelection` separately from empty creation and preserves the selected directory across retries, refresh, and reselect. See the [bilingual design](../../docs/design/2026-10-16-managed-workspace-directory-selection.md). + `QWEN_MANAGED_AGENT_APPROVAL_MODE` defaults to `yolo`. In `default` and `auto-edit`, any caller with a read grant on the bound Workspace can list and inspect pending permission Actions through the public API or WebShell; @@ -1242,9 +1248,14 @@ separate worker bundle exists. The G0 integration test The real-model run below creates its Session through the public route as a Workspace-bound G0 Session, and proves the physical tool execution through -the durable `qwen_tool_execution` record (exactly one `SETTLED` row) rather -than a public `item.tool_call.*` event — Broker-worker tool calls are not -published without O2 tool publication. The run needs live model credentials, +the durable `ma_tool_execution` record (exactly one `SETTLED` row). Hosted +tool intent and receipt events also expose tool names and lifecycle status +through public `item.tool_call.updated` events without O2 publication. Raw +arguments and output remain behind the existing publication policy. The +Hosted model loop follows `model.maxSessionTurns` (default `-1`); it no +longer imposes a separate 16-round limit. See the +[progress design](../../docs/design/2026-10-16-managed-webshell-progress.md). +The run needs live model credentials, so no CI job executes it; it has been run locally as evidence (macOS, qwen3.8-max), and a green CI run therefore says nothing about this mode. The script also needs `java`, `mysqld`, `mysql` and `mysqladmin` on `PATH`; it diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/WorkspaceDiscoveryController.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/WorkspaceDiscoveryController.java index 306dc5c6bc..daaabcbb6f 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/WorkspaceDiscoveryController.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/WorkspaceDiscoveryController.java @@ -61,7 +61,8 @@ public class WorkspaceDiscoveryController { .map(WorkspaceDiscoveryController::webShellItem).toList(), page.defaultWorkspace() == null ? null : webShellItem(page.defaultWorkspace()), page.hasMore(), - page.nextCursor(), new WebShellCapabilities(true, false, creation.enabled(), true))); + page.nextCursor(), new WebShellCapabilities(true, false, creation.enabled(), true, + creation.directorySelectionEnabled()))); } @PostMapping("/api/agent/web-shell/v1/workspaces/get") @@ -75,16 +76,26 @@ public class WorkspaceDiscoveryController { public ResponseEntity webShellCreate(TenantContext tenant, @Valid @RequestBody CreateRequest request) { return noStore(webShellItem(creation.create(tenant.tenantId(), tenant.requireActorId(), - request.displayName(), request.idempotencyKey()))); + request.displayName(), request.idempotencyKey(), request.sourceWorkspaceId(), request.cwdRelative()))); } - public record CreateRequest(@NotBlank String displayName, @NotBlank String idempotencyKey) { + @PostMapping("/api/agent/web-shell/v1/workspaces/directories/query") + public ResponseEntity webShellDirectories(TenantContext tenant, + @Valid @RequestBody DirectoryRequest request) { + return noStore(creation.directories(tenant.tenantId(), tenant.requireActorId(), + request.workspaceId(), request.cwdRelative())); + } + + public record CreateRequest(@NotBlank String displayName, @NotBlank String idempotencyKey, + String sourceWorkspaceId, String cwdRelative) { @JsonAnySetter public void rejectUnknown(String name, JsonNode value) { throw new IllegalArgumentException("Unknown Workspace creation field"); } } + public record DirectoryRequest(@NotBlank String workspaceId, @NotBlank String cwdRelative) {} + private static PublicItem publicItem(WorkspaceSummary item) { return new PublicItem(item.workspaceId(), "agent.workspace", item.displayName(), @@ -95,7 +106,7 @@ public class WorkspaceDiscoveryController { private static WorkspaceSummary webShellItem(WorkspaceSummary item) { return new WorkspaceSummary(item.workspaceId(), item.displayName(), item.state().toLowerCase(Locale.ROOT), - item.canCreateSession()); + item.canCreateSession(), item.defaultCwdRelative(), item.canSelectDirectory()); } private static ResponseEntity noStore(T body) { @@ -110,7 +121,12 @@ public class WorkspaceDiscoveryController { } public record WebShellCapabilities(boolean workspaceBinding, - boolean workspaceContext, boolean workspaceCreation, boolean approvalModeSelection) { + boolean workspaceContext, boolean workspaceCreation, boolean approvalModeSelection, + boolean workspaceDirectorySelection) { + public WebShellCapabilities(boolean workspaceBinding, + boolean workspaceContext, boolean workspaceCreation, boolean approvalModeSelection) { + this(workspaceBinding, workspaceContext, workspaceCreation, approvalModeSelection, false); + } public WebShellCapabilities(boolean workspaceBinding, boolean workspaceContext, boolean workspaceCreation) { this(workspaceBinding, workspaceContext, workspaceCreation, false); diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/HarnessEventProjector.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/HarnessEventProjector.java index dae8b7602f..06f24057df 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/HarnessEventProjector.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/HarnessEventProjector.java @@ -35,17 +35,25 @@ public class HarnessEventProjector { String code = sourceCode != null && SAFE_ERROR_CODE.matcher(sourceCode).matches() ? sourceCode : "hosted_harness_error"; - String message = "The Hosted Harness Turn failed."; + String message = switch (code) { + case "hosted_turn_limit_exceeded" -> + "The Hosted Harness Turn reached its configured model round limit."; + case "hosted_turn_deadline_exceeded" -> + "The Hosted Harness Turn exceeded its deadline."; + default -> "The Hosted Harness Turn failed."; + }; return new ProjectedEvent("turn.failed", Map.of( "code", code, "message", message), true, "FAILED", code, message); } - if (!"session_update".equals(event.type())) { - return null; - } Map data = object(event.data()); Map update = object(data.get("update")); String kind = string(update.get("sessionUpdate")); + if (!"session_update".equals(event.type()) + && !("managed_journal_event".equals(event.type()) + && "tool_call_update".equals(kind))) { + return null; + } if ("agent_message_chunk".equals(kind)) { return textEvent("item.output_text.delta", "output_text", update, turnId); diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedHostedRecoveryRecords.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedHostedRecoveryRecords.java index fb29e99fe2..8017a811e8 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedHostedRecoveryRecords.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedHostedRecoveryRecords.java @@ -226,7 +226,7 @@ public final class ManagedHostedRecoveryRecords { ManagedExtensionRecords.closed(source, Set.of("activationId", "epoch"), "source activation"); ManagedExtensionRecords.id(source.get("activationId"), "activationId"); ManagedExtensionRecords.count(source.get("epoch"), 1, ManagedSessionStoreModels.MAX_SAFE_COUNTER, "source epoch"); - ManagedExtensionRecords.count(body.get("round"), 0, 15, "round"); + ManagedExtensionRecords.count(body.get("round"), 0, ManagedSessionStoreModels.MAX_SAFE_COUNTER, "round"); for (String field : List.of("definitionRef", "rootSnapshotRef")) { ManagedExtensionRecords.durableRef(body.get(field), field); } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedWorkspaceRegistry.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedWorkspaceRegistry.java index 7ce04072f5..f6e57f57f7 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedWorkspaceRegistry.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedWorkspaceRegistry.java @@ -17,7 +17,9 @@ import org.springframework.transaction.support.TransactionSynchronizationManager import java.nio.charset.StandardCharsets; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Repository public class ManagedWorkspaceRegistry { @@ -123,11 +125,13 @@ public class ManagedWorkspaceRegistry { String actorId, String afterId, int limit) { byte[] key = actorKey(tenantId, actorId); byte[] after = com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys.identity(afterId == null ? "" : afterId); - return jdbc.query("SELECT r.workspace_id, r.display_name, r.state, a.role FROM ma_workspace r" + List rows = jdbc.query("SELECT r.workspace_id, r.display_name, r.state, r.workspace_kind, s.storage_kind, a.role FROM ma_workspace r" + " JOIN ma_workspace_access a ON a.tenant_id = r.tenant_id AND a.workspace_id = r.workspace_id" + + " LEFT JOIN ma_storage s ON s.tenant_id = r.tenant_id AND s.storage_id = r.storage_id" + " WHERE r.tenant_id = ? AND a.actor_id = ? AND a.role IN ('READER', 'OPERATOR', 'OWNER')" + " AND r.workspace_id > ? ORDER BY r.workspace_id LIMIT ?", (result, row) -> summary(result), tenantId, key, after, limit); + return withDefaults(tenantId, rows); } public WorkspaceSummary findReadable(String tenantId, String actorId, @@ -135,15 +139,16 @@ public class ManagedWorkspaceRegistry { byte[] key = actorKey(tenantId, actorId); List rows = jdbc.query( "SELECT r.workspace_id, r.display_name, r.state," - + " a.role FROM ma_workspace r" + + " r.workspace_kind, s.storage_kind, a.role FROM ma_workspace r" + " JOIN ma_workspace_access a ON" + " a.tenant_id = r.tenant_id" + " AND a.workspace_id = r.workspace_id" + + " LEFT JOIN ma_storage s ON s.tenant_id = r.tenant_id AND s.storage_id = r.storage_id" + " WHERE r.tenant_id = ? AND r.workspace_id = ?" + " AND a.actor_id = ? AND a.role IN ('READER'," + " 'OPERATOR', 'OWNER')", (result, row) -> summary(result), tenantId, workspaceId, key); - return rows.isEmpty() ? null : rows.getFirst(); + return rows.isEmpty() ? null : withDefaults(tenantId, rows).getFirst(); } /** @@ -207,7 +212,34 @@ public class ManagedWorkspaceRegistry { result.getString("display_name"), state, WorkspaceAccess.valueOf(result.getString("role")) .atLeast(WorkspaceAccess.OPERATOR) - && "ACTIVE".equals(state)); + && "ACTIVE".equals(state), ".", + "OWNER".equals(result.getString("role")) && "ACTIVE".equals(state) + && "ROOT".equals(result.getString("workspace_kind")) + && !"SSH_LOCAL".equals(result.getString("storage_kind")) + && !"CSI".equals(result.getString("storage_kind"))); + } + + private List withDefaults(String tenantId, List items) { + List keys = items.stream().map(WorkspaceSummary::workspaceId) + .filter(id -> id.matches("workspace-[a-f0-9]{64}")) + .map(id -> id.substring("workspace-".length())).toList(); + if (keys.isEmpty()) { + return items; + } + List arguments = new java.util.ArrayList<>(); + arguments.add(tenantId); + arguments.addAll(keys); + Map defaults = new HashMap<>(); + jdbc.query("SELECT receipt_key, result_json FROM ma_request_receipt WHERE tenant_id = ?" + + " AND namespace = 'WORKSPACE_CREATE' AND state = 'COMPLETED' AND receipt_key IN (" + + String.join(",", java.util.Collections.nCopies(keys.size(), "?")) + ")", + row -> { + var details = WorkspaceCreationRoots.details(row.getString("result_json"), row.getString("receipt_key")); + defaults.put(details.workspaceId(), details.cwdRelative() == null ? "." : details.cwdRelative()); + }, arguments.toArray()); + return items.stream().map(item -> new WorkspaceSummary(item.workspaceId(), item.displayName(), + item.state(), item.canCreateSession(), defaults.getOrDefault(item.workspaceId(), "."), + item.canSelectDirectory())).toList(); } private static ReadableGrant readableGrant(ResultSet result) @@ -235,7 +267,10 @@ public class ManagedWorkspaceRegistry { } public record WorkspaceSummary(String workspaceId, String displayName, - String state, boolean canCreateSession) { + String state, boolean canCreateSession, String defaultCwdRelative, boolean canSelectDirectory) { + public WorkspaceSummary(String workspaceId, String displayName, String state, boolean canCreateSession) { + this(workspaceId, displayName, state, canCreateSession, ".", false); + } } /** @@ -345,6 +380,16 @@ public class ManagedWorkspaceRegistry { record.getPolicyRef()); } + ResolvedBinding resolveOwnedDirectory(String tenant, String actor, String workspace, String cwd) { + ResolvedBinding resolved = resolveForCreation(tenant, actor, new WorkspaceSelection(workspace, cwd)); + if (accessOf(tenant, actor, workspace) != WorkspaceAccess.OWNER + || jdbc.queryForList("SELECT 1 FROM ma_workspace WHERE tenant_id = ? AND workspace_id = ?" + + " AND workspace_kind = 'ROOT'", Integer.class, tenant, workspace).isEmpty()) { + throw new ApiException(HttpStatus.NOT_FOUND, "workspace_not_found", "Workspace not found."); + } + return resolved; + } + public static byte[] actorKey(String tenantId, String actorId) { return new WorkspaceActor(tenantId, actorId).getActorId() .getBytes(StandardCharsets.UTF_8); diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCreationRoots.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCreationRoots.java index 639aa9be3f..cf8a67db2d 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCreationRoots.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCreationRoots.java @@ -126,7 +126,7 @@ final class WorkspaceCreationRoots { } } - Details details(String resultJson, String receiptKey) { + static Details details(String resultJson, String receiptKey) { try { Details value = JSON.readValue(resultJson, Details.class); UUID.fromString(value.registrationId()); @@ -134,7 +134,13 @@ final class WorkspaceCreationRoots { || value.displayName().length() > 128 || value.displayName().codePoints().anyMatch(Character::isISOControl) || !("workspace-" + receiptKey).equals(value.workspaceId()) - || !("created-" + receiptKey).equals(value.storageId())) { + || value.sourceWorkspaceId() == null && (!("created-" + receiptKey).equals(value.storageId()) + || value.sourceGeneration() != null || value.cwdRelative() != null) + || value.sourceWorkspaceId() != null && (StringUtils.isBlank(value.sourceWorkspaceId()) + || value.sourceGeneration() == null || value.sourceGeneration() < 1 + || StringUtils.isBlank(value.storageId()) || value.cwdRelative() == null + || !value.cwdRelative().equals(com.alibaba.qwen.code.runtimebroker.managedworkspace + .WorkspaceRelativePath.normalize(value.cwdRelative())))) { throw new IllegalArgumentException(); } return value; @@ -168,5 +174,10 @@ final class WorkspaceCreationRoots { } } - record Details(String workspaceId, String storageId, String displayName, String registrationId) {} + record Details(String workspaceId, String storageId, String displayName, String registrationId, + String sourceWorkspaceId, Long sourceGeneration, String cwdRelative) { + Details(String workspaceId, String storageId, String displayName, String registrationId) { + this(workspaceId, storageId, displayName, registrationId, null, null, null); + } + } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCreationStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCreationStore.java index 087fed3cbc..0aa0d74127 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCreationStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCreationStore.java @@ -1,6 +1,7 @@ package com.alibaba.qwen.code.managedagent.store; import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry.WorkspaceSummary; import com.alibaba.qwen.code.managedagent.store.WorkspaceCreationRoots.Details; @@ -8,6 +9,7 @@ import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.ReceiptNamespace; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.ReceiptScope; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; +import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.dao.DuplicateKeyException; @@ -17,7 +19,14 @@ import org.springframework.stereotype.Repository; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.support.TransactionTemplate; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.LinkOption; +import java.nio.file.Path; import java.time.Clock; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; import java.util.Objects; import java.util.UUID; @@ -48,7 +57,23 @@ public class WorkspaceCreationStore { } public WorkspaceSummary create(String tenant, String actor, String displayName, String key) { - if (!enabled()) { + return create(tenant, actor, displayName, key, null, null); + } + + public boolean directorySelectionEnabled() { + return guard.enabled(); + } + + public WorkspaceSummary create(String tenant, String actor, String displayName, String key, + String sourceWorkspaceId, String cwdRelative) { + if (sourceWorkspaceId == null && cwdRelative != null + || sourceWorkspaceId != null && cwdRelative == null) { + throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_request", + "Source Workspace and directory must be supplied together."); + } + WorkspaceSelection selected = sourceWorkspaceId == null ? null + : new WorkspaceSelection(sourceWorkspaceId, cwdRelative); + if (selected == null ? !enabled() : !directorySelectionEnabled()) { throw new ApiException(HttpStatus.CONFLICT, "workspace_creation_unavailable", "Workspace creation is not enabled."); } @@ -67,28 +92,35 @@ public class WorkspaceCreationStore { String scope = ManagedReceipts.actorScope(actorKey); String receiptKey = ManagedSchemaKeys.receiptKey(ReceiptNamespace.WORKSPACE_CREATE, tenant, ReceiptScope.ACTOR, scope, key); - String digest = ManagedSchemaKeys.key(name); - ManagedReceipts.Receipt receipt; - try { - receipt = transaction.execute(status -> { - long now = clock.millis(); - ManagedReceipts.insert(jdbc, ReceiptNamespace.WORKSPACE_CREATE, tenant, - ReceiptScope.ACTOR, scope, key, digest, "CREATE_WORKSPACE", actorKey, - null, null, "PENDING", null, null, now); - Details details = new Details("workspace-" + receiptKey, "created-" + receiptKey, - name, UUID.randomUUID().toString()); - jdbc.update("UPDATE ma_request_receipt SET result_json = ? WHERE receipt_key = ?", - encode(details), receiptKey); - return find(tenant, scope, key, true); - }); - } catch (DuplicateKeyException race) { - receipt = find(tenant, scope, key, false); - if (receipt == null) { - throw race; + ManagedReceipts.Receipt receipt = find(tenant, scope, key, false); + if (receipt == null) { + try { + receipt = transaction.execute(status -> { + long now = clock.millis(); + ManagedReceipts.insert(jdbc, ReceiptNamespace.WORKSPACE_CREATE, tenant, + ReceiptScope.ACTOR, scope, key, ManagedSchemaKeys.key(name), "CREATE_WORKSPACE", actorKey, + null, null, "PENDING", null, null, now); + var source = selected == null ? null : ownedSource(tenant, actor, selected); + Details details = source == null + ? new Details("workspace-" + receiptKey, "created-" + receiptKey, + name, UUID.randomUUID().toString()) + : new Details("workspace-" + receiptKey, source.binding().getStorageId(), name, + UUID.randomUUID().toString(), selected.workspaceId(), + source.binding().getWorkspaceGeneration(), selected.cwdRelative()); + jdbc.update("UPDATE ma_request_receipt SET result_json = ?, request_digest = ? WHERE receipt_key = ?", + encode(details), digest(name, selected, details.sourceGeneration()), receiptKey); + return find(tenant, scope, key, true); + }); + } catch (DuplicateKeyException race) { + receipt = find(tenant, scope, key, false); + if (receipt == null) { + throw race; + } } - requireDigest(receipt, digest); } - Details details = roots.details(Objects.requireNonNull(receipt).resultJson(), receiptKey); + Details details = WorkspaceCreationRoots.details(Objects.requireNonNull(receipt).resultJson(), receiptKey); + String digest = digest(name, selected, details.sourceGeneration()); + requireDigest(receipt, digest); if ("COMPLETED".equals(receipt.state())) { return replay(tenant, actor, details); } @@ -96,13 +128,17 @@ public class WorkspaceCreationStore { throw WorkspaceExecutionStore.unavailable(); } try { - roots.prepare(tenant, receiptKey); - guard.registerCreated(tenant, details.storageId(), details.registrationId()); + if (selected == null) { + roots.prepare(tenant, receiptKey); + guard.registerCreated(tenant, details.storageId(), details.registrationId()); + } else { + transaction.executeWithoutResult(status -> verifySource(tenant, actor, details)); + } } catch (RuntimeException error) { ManagedReceipts.Receipt current = find(tenant, scope, key, false); if (current != null && "COMPLETED".equals(current.state())) { requireDigest(current, digest); - return replay(tenant, actor, roots.details(current.resultJson(), receiptKey)); + return replay(tenant, actor, WorkspaceCreationRoots.details(current.resultJson(), receiptKey)); } throw error; } @@ -116,11 +152,13 @@ public class WorkspaceCreationStore { throw WorkspaceExecutionStore.unavailable(); } long now = clock.millis(); + var source = selected == null ? null : verifySource(tenant, actor, details); jdbc.update("INSERT INTO ma_workspace (tenant_id, workspace_id, workspace_generation," + " storage_id, display_name, config_ref, policy_ref, state, gmt_create, gmt_modified)" + " VALUES (?, ?, 1, ?, ?, ?, ?, 'ACTIVE', ?, ?)", tenant, details.workspaceId(), details.storageId(), details.displayName(), - WorkspaceExecutionProfile.CONFIG_REF, WorkspaceExecutionProfile.POLICY_REF, now, now); + source == null ? WorkspaceExecutionProfile.CONFIG_REF : source.configRef(), + source == null ? WorkspaceExecutionProfile.POLICY_REF : source.policyRef(), now, now); jdbc.update("INSERT INTO ma_workspace_access (tenant_id, workspace_id, actor_id, role)" + " VALUES (?, ?, ?, 'OWNER')", tenant, details.workspaceId(), actorKey); jdbc.update("UPDATE ma_request_receipt SET state = 'COMPLETED', gmt_modified = ?" @@ -129,6 +167,83 @@ public class WorkspaceCreationStore { return replay(tenant, actor, details); } + public DirectoryPage directories(String tenant, String actor, String workspace, String cwd) { + if (!directorySelectionEnabled()) { + throw new ApiException(HttpStatus.CONFLICT, "workspace_creation_unavailable", + "Directory selection is not enabled."); + } + WorkspaceSelection selected = new WorkspaceSelection(workspace, cwd); + var source = transaction.execute(status -> ownedSource(tenant, actor, selected)); + ContextBinding binding = Objects.requireNonNull(source).binding(); + Path root = guard.verifiedRoot(binding); + Path directory = root.resolve(selected.cwdRelative()).normalize(); + List children = new ArrayList<>(); + boolean truncated = false; + try (var entries = Files.newDirectoryStream(directory)) { + int scanned = 0; + for (Path child : entries) { + if (++scanned > 1024) { + truncated = true; + break; + } + String name = child.getFileName().toString(); + if (!reserved(name) && Files.isDirectory(child, LinkOption.NOFOLLOW_LINKS) + && child.equals(child.toRealPath()) && Files.isReadable(child) && Files.isExecutable(child) + && name.codePoints().noneMatch(Character::isISOControl)) { + if (children.size() == 100) { + truncated = true; + break; + } + children.add(new Directory(name, root.relativize(child).toString())); + } + } + } catch (IOException error) { + throw WorkspaceExecutionStore.unavailable(error); + } + guard.verify(binding); + children.sort(Comparator.comparing(Directory::name)); + return new DirectoryPage(root.toString(), selected.cwdRelative(), children, truncated); + } + + private ManagedWorkspaceRegistry.ResolvedBinding ownedSource(String tenant, String actor, + WorkspaceSelection selected) { + for (String segment : selected.cwdRelative().split("/")) { + if (reserved(segment)) { + throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_cwd", "Select a project directory."); + } + } + var source = registry.resolveOwnedDirectory(tenant, actor, selected.workspaceId(), selected.cwdRelative()); + Path root = guard.verifiedRoot(source.binding()); + Path directory = root.resolve(selected.cwdRelative()).normalize(); + if (!Files.isReadable(directory) || !Files.isExecutable(directory)) { + throw WorkspaceExecutionStore.unavailable(); + } + return source; + } + + private ManagedWorkspaceRegistry.ResolvedBinding verifySource(String tenant, String actor, Details details) { + var source = ownedSource(tenant, actor, + new WorkspaceSelection(details.sourceWorkspaceId(), details.cwdRelative())); + if (source.binding().getWorkspaceGeneration() != details.sourceGeneration() + || !source.binding().getStorageId().equals(details.storageId())) { + throw WorkspaceExecutionStore.unavailable(); + } + return source; + } + + private static boolean reserved(String name) { + return ".git".equals(name) || ".qwen-child-workspaces".equals(name); + } + + private static String digest(String name, WorkspaceSelection selected, Long generation) { + return selected == null ? ManagedSchemaKeys.key(name) + : ManagedSchemaKeys.key(name, selected.workspaceId(), selected.cwdRelative(), String.valueOf(generation)); + } + + public record Directory(String name, String cwdRelative) {} + + public record DirectoryPage(String root, String cwdRelative, List directories, boolean truncated) {} + private WorkspaceSummary replay(String tenant, String actor, Details details) { WorkspaceSummary found = registry.findReadable(tenant, actor, details.workspaceId()); if (found == null) { @@ -145,7 +260,7 @@ public class WorkspaceCreationStore { private static void requireDigest(ManagedReceipts.Receipt receipt, String digest) { if (!digest.equals(receipt.requestDigest())) { throw new ApiException(HttpStatus.CONFLICT, "idempotency_conflict", - "Idempotency key was already used for another Workspace name."); + "Idempotency key was already used for another Workspace request."); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceStorageGuard.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceStorageGuard.java index 86b25efab7..8654e2e7fc 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceStorageGuard.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceStorageGuard.java @@ -219,6 +219,15 @@ public class WorkspaceStorageGuard { return createdRoots.resolve(tenantId, storageId, false); } + Path verifiedRoot(ContextBinding binding) { + if (!enabled) { + throw WorkspaceExecutionStore.unavailable(); + } + WorkspaceStorageKindGuard.requireLocalAlias(jdbc, binding.getTenantId(), binding.getStorageId()); + verify(binding); + return root(binding.getTenantId(), binding.getStorageId()); + } + void registerCreated(String tenantId, String storageId, String operationId) { Path path = createdRoots.resolve(tenantId, storageId, true); if (path == null) { diff --git a/packages/managed-agent-server/src/main/resources/openapi/managed-agent-public-api.openapi.json b/packages/managed-agent-server/src/main/resources/openapi/managed-agent-public-api.openapi.json index 0b35621b2a..1ad1301b4e 100644 --- a/packages/managed-agent-server/src/main/resources/openapi/managed-agent-public-api.openapi.json +++ b/packages/managed-agent-server/src/main/resources/openapi/managed-agent-public-api.openapi.json @@ -2,8 +2,8 @@ "openapi": "3.1.0", "info": { "title": "Qwen Managed Agent Public and WebShell API", - "version": "1.55.0", - "description": "Canonical contract for the public Managed Agent resources and the WebShell adapter. partial means that the route exists but generated types and full contract tests are pending; planned means that the route or field is not implemented. Workspace context and cwd operations are v1.9 target contracts, not current server capabilities. v1.10 adds planned command admission, Actions, lifecycle and actor authorization. v1.12 refines planned W0 creation discovery, actor-specific create hints and explicit default selection. Filter planned fields as well as routes from production SDKs. v1.13 moves this contract into the Qwen Code repository as its single source and records the shipped rename, archive, unarchive and delete routes as partial. v1.14 integrates W0d workspace discovery, the WebShell workspace lookup, and empty-session binding as partial; workspace_binding/workspaceBinding advertises this narrow flow without enabling workspace execution or context switching. v1.15 adds the archived, archiving and deleting Session statuses and the cancelling Turn status, requires request_id in error envelopes, declares the error responses that the server returns, and marks Session create, list and get on both surfaces implemented. v1.16 adds the planned Stage H task contract (SessionTaskView as PublicTask, task list, detail, events and cancel) and names the MCP catalog, hook catalog, automation and channel resources as planned; their shapes arrive with Stages H1 to H6. v1.17 implements event replay: events carry their schema and projection versions and a top-level Item and Part identity, JSON event pages return has_more and next_cursor and accept limits up to 1000, and a persisted replay floor answers expired cursors with 409 cursor_expired in JSON and one agent.session.resync_required frame over SSE; it marks the public event query and stream, the WebShell event stream and the WebShell transcript implemented. v1.18 implements the durable Session lifecycle (Stage D4): close, archive and delete answer 202 with a command operation on both surfaces, an archive requires a closed Session, a deleted Session leaves a tombstone whose operations stay readable, and the operation query serves them; unarchive restores a closed Session, and Session capabilities advertise session_lifecycle. v1.19 serves the task list and detail on both surfaces as partial (Stage H0c): the Session store projects them from the Stage H records the Session authority commits, a task.updated Session event announces each change of a task's view, and Session capabilities advertise tasks. Task events and cancel stay planned until a slice's tasks produce output and accept a cancel. v1.20 implements the Turn read model (Stage D5): the public Turn list and detail read a Session's Turns without their input, newest first by creation time in milliseconds and then Turn ID, with an opaque cursor; a deleted Session's Turns are not readable, and the durable admission fields of a Turn stay planned until D7. v1.21 declares on the task list, detail and event routes of both surfaces the 403 actor_scope_mismatch that the tenant filter answers on every /v1/agents/ and WebShell route, as the Session and Turn reads already do, and the shared Forbidden response names it; a caller that cannot read a task still gets 404. v1.22 adds deployment-opted-in creation with an initial Workspace file-tool Turn (G0) on the public and WebShell surfaces; the fixed server-owned profile does not enable later Workspace operations. v1.23 settles the planned task event and cancel semantics: a durable retention floor, committed-prefix publication, stable cursors, Artifact visibility before expiry, bounded backlog under archival failure, ordered idempotent cancellation and command outcomes. Clients tolerate unknown optional event fields across minor versions. Task events and cancel remain planned. v1.24 serves the read-only Session MCP catalog as partial (Stage H1), projecting display metadata and schemas from committed records without Runtime identities, credentials or production profile enablement. v1.25 implements permission Actions (Stage D6b) on both surfaces: list, get and respond, projected from the Session's action.changed records; a WebShell permission Action carries inputRevision, policyRevision, functionCallId, toolName and expiresAt, its option ids allow and deny are stable, a Turn has at most one requested approval at a time, and a response is a durable command operation carrying requestId. v1.26 declares the tenant filter's 403 actor_scope_mismatch on every covered public and WebShell route, including planned routes, and pins the refusal code in contract traffic. v1.27 adds O3 durable tool-result projection, artifact metadata, immutable range/streaming content and WebShell result reads. Artifact capability requires a configured O3 reader and a Workspace-bound Session; execution admission remains independent. v1.28 admits later Turns of a Workspace-bound Session for the Session's creator under the deployment's Workspace files opt-in, including cancel and rename; WebShell Session capabilities advertise the per-caller workspaceTurns flag. v1.29 implements the AgentDefinition routes (Stage D8a): create, get and update store tenant-scoped, immutable revisions with a content digest, and an unchanged update adds no revision. Sessions still pin qwen-code and the configured revision, and no definition field changes execution yet. v1.30 adds the qwenSignature security scheme for gateway-free deployments: in signed authentication mode the broker authenticates the X-Qwen-Tenant-Id and X-Qwen-Actor-Id header pair itself with an HMAC signature over method, path, query, tenant, actor, timestamp, body digest and Idempotency-Key, carried in X-Qwen-Signature and X-Qwen-Signature-Timestamp, and answers 401 authentication_required or invalid_signature, 400 invalid_request on a repeated Idempotency-Key header, and 413 payload_too_large beyond the signed-body limit; a Session now records its creator so approval responses are owned without a Workspace creation record; a Session with no recorded creator and no recorded create command answers approvals to any caller in its tenant. v1.31 serves the task events routes as partial (Stage H3): a bounded per-task event journal in SQL commits each task view change with its record revision, the durable retention floor survives an empty retained set under the Artifact visibility barrier, output cursors lift with the routes, and the cancel routes stay planned. v1.32 implements the W2 controlled same-Workspace cwd change on both surfaces: the creator changes the bound Session's relative directory under an idle, opt-in deployment through a durable operation with revision CAS and busy barriers; completion emits the session.context.changed Session event and bumps context_revision, while WorkspaceContext.state stays ready and its other values remain reserved for the read-model follow-up, and bound later-turn submission answers 409 session_context_busy while a context-changing operation is open (the cross-slice busy-barrier handshake; permission-action responses and pending mutation commands are excluded from that barrier, so they can never wedge Turn admission). v1.33 shapes the planned Stage H5 channel resources: a channel connection lists its route bindings, a channel lists its outbound deliveries with per-segment states and a stable cursor, and a delivery detail query is named as planned; all mutations stay Idempotency-Key based with 202 plus operation id. v1.35 serves the three channel resources as partial (Stage H5b/H5c): connections and their route bindings, and the delivery list and detail, are read over the registered connections, the committed ingress rows and the delivery ledger; the email reference adapter routes inbound events into bound Sessions and sends replies through the receipted outbox, where unknown is a terminal outcome that is never resent automatically and an explicit resend opens a new delivery id. v1.36 conditions replay-floor expiry on the Snapshot backing the floor (replay_floor_sequence <= snapshot_through_sequence), serves a below-floor cursor from the retained events while a stream reconciliation rebuilds the Snapshot, and adds the opt-in scheduled replay-floor pass. v1.37 enforces the Workspace actor roles on the bound-Session surface: grants are a single role column ordered reader < operator < owner; Turn submit, rename and cwd change now admit any caller holding OPERATOR, but only while the Session's creator-keyed execution facts hold — the Workspace registry still backs the binding and stays ACTIVE, and the actor recorded by the Workspace create command keeps OPERATOR or above, because the admitted work executes under the creator's grants; Turn cancel admits on the OPERATOR role and the Session's executable shape alone, because its delivery reuses the admitted attachment and re-checks no grants; Action respond admits any caller holding OPERATOR or the Session's recorded owner under no shape gate, with every bound response certifying the same creator-keyed execution facts at admission, so a second operator can unblock a Turn waiting on an approval while the creator still backs execution; close, archive, unarchive and delete admit the Session's recorded owner (the owner_actor_key column, with the pre-V40 creator fallback); the submitter family's readable-but-below-OPERATOR refusal normalizes from 409 workspace_unavailable to 403 session_operation_forbidden; and the WebShell workspaceTurns capability advertises the caller's OPERATOR role under the same creator-keyed facts rather than creator identity; a cwd change's settlement persistently re-checks both the recorded create-command actor and the V56-persisted initiator, so demoting either actor after admission fails the operation with workspace_unavailable. v1.38 serves the automation resources as partial (Stage H6b/H6c): a definition is created, revised, read and retired under its target Session, a manual run and the scanner's occurrences share one derived run identity, definitions and occurrences page separately, and every mutation takes an Idempotency-Key and answers 202 with the committed resource; the per_run target and the delivery policy stay refused until their slices land. v1.40 serves task cancel as partial (Stage H4f): the public and WebShell cancel routes admit a durable task_cancel operation in the A6 order, carrying task_id/taskId; the operation completes once the task's committed record holds the stop request, fails with task_already_settled when the run ended first, and parks as recovery_blocked (not an open operation) when delivery stays unproven; only child_agent tasks whose run has not ended advertise cancel, and only in an active Session; a Workspace-bound Session under a storage migration fence refuses a new cancel with 409 workspace_unavailable; the child is then stopped by its result relay and settles cancelled unless a natural completion or failure won; the WebShell cancel request gains a trace-only requestId. v1.41 pins stored AgentDefinition revisions on Session creation (D8b) and compiles permission_policy and tools into the per-Session approval mode and tool profile (D8c-1): an omitted agent_revision resolves the latest revision at admission and pins it, an unknown agent or revision answers 404 agent_not_found, and definition content that cannot take effect yet answers 409 agent_definition_unsupported naming the refused field in error.field; PublicSession gains the optional agent_digest. D8c-2 applies the pinned model and instructions; a missing, ambiguous or unauthenticated configured model route fails the Turn before inference with turn.failed code model_unavailable. v1.42 implements the per-caller WebShell cwdChange capability, independently of workspaceTurns; admission still owns idle checks and public cwd_change remains planned. v1.43 adds deployment-opted-in public foreground Shell/1 creation for the built-in qwen-code agent with mandatory default/auto-edit approval. Fresh Shell Turns require the Shell opt-in, valid persisted approval and foregroundShell=true; workspaceTurns remains the OPERATOR submit/rename capability and does not by itself admit a Shell Turn. The public Shell tool list does not include the child agent tool. Public Shell close, archive, unarchive and delete stay unavailable, including protocol-0; an internal child Session close is not a public lifecycle request. Shell Action responses admit only the Session's recorded owner, not every Workspace operator, because the answer runs a command. Enable the Shell flag only after the Harness understands suppressChildAgents; an older Harness ignores that field and advertises the child agent tool. Stored AgentDefinition Sessions retain their compiled profile and approval mode independently of the built-in default selection; every Shell Session still requires deployment Shell admission for fresh execution.v1.44 names the input admission budget on each command's input array: every block adds to a 4,000,000-character aggregate per command under the per-block 1,000,000-character cap, and a command whose serialized prompt or durable Session-store record exceeds the Hosted Harness's 64 KiB durable-record limit is accepted and then fails the Turn with hosted_harness_rejected; opens WebShellMetadata to arbitrary caller metadata that Phase 1 accepts and ignores, the Session title travelling in WebShellCreateRequest's own title field; and drops the WebShellTurn usage field the server never returns. v1.45 preserves durable event floors across projection rebuilds and keeps immutable snapshot pagination for 30 minutes. Item next_cursor positions bind tenant, Session, snapshot version and expiry; numeric after remains a first-page sequence filter, while an opaque after or cursor continues that fixed snapshot. v1.46 extends public task cancel to workflow tasks (the H4f follow-up of the workflow runtime): a workflow task in pending, running, waiting or degraded, in an active Session, advertises cancel; its cancel rides the same durable task_cancel operation as a child agent's, and the result relay stops the workflow child through its own Turn's abort. v1.47 unifies the Session title policy at 256 UTF-16 code units (the Harness client's own cap), counted as Java String.length() does — an astral character occupies two units — plus a control-character rejection, now enforced on create and metadata as well as rename (a row written before the unification may hold a longer title; echoing that stored title back through rename is a no-op that answers 200, while any other over-bound title still answers 400 invalid_title), and pagination orders Sessions by the immutable created_at key; replayed rename and unarchive answer the recorded outcome with Session status as last visible rather than 404 after a delete; a create replay after delete answers 404 on the public create route, which re-reads the Session before responding, and the recorded 202 admission carrying the tombstoned sessionId on the WebShell create route. A recorded Turn submit, cancel or rename outcome answers to the actor who recorded it (the actor recorded on the command receipt) as well as to the Session creator; any other authorized actor is still refused. A key recorded before v1.47 named no recorder and keeps its earlier replay for every actor the role gates admit. v1.48 connects explicit static AgentDefinition skills and Runtime MCP/Hook definition pins to Hosted execution. Skills require a Workspace profile, use immutable bounded content resources, and grant no permissions; MCP pins require hosted-workspace-mcp/1 in the deployment allowlist. Existing Session revisions and resources remain pinned across replacement. v1.49 pins the durable retry terminal failure codes: an action response whose delivery exhausted its retry budget fails action_response_delivery_failed, and an answered delivery whose Action expired before its decision projected fails action_response_decision_expired; a lifecycle operation that exhausted its retry budget carries the settle's failure (session_lifecycle_delivery_failed or the workspace close refusal) and certifies no cleanup — its Session keeps its pending status and no session completion event is appended — and one whose settle reached the Harness but stayed unsettled past the larger settled budget carries session_close_completion_unsettled; a Workspace close recovery_blocked also reports session_close_writer_live while a Harness still holds the journal writer or hosted_harness_generation_mismatch while this replica's view of the Harness boot is stale. v1.50 adds WebShell empty Workspace creation, supported approval selection at Session creation, safe model/context observations, and host-catalog next-Turn model selection within idle bound Sessions; model choices are immutable per admitted Turn and do not replace AgentDefinition identity or policy. v1.51 adds owner-authorized idle approval changes and explicit built-in Shell Full Access with immutable per-Turn approval snapshots. v1.53 enumerates on failure_code the codes a lifecycle operation can end with once its retry budget runs out — including managed_capability_mismatch, hosted_harness_protocol_error and the Runtime Broker's own refusal codes, with runtime_broker_recovery_blocked reported as workspace_close_identity_unverified — and states that session_close_writer_live is also reported while the journal-writer check itself fails. v1.54 extends public task cancel to background_shell and monitor tasks (the H3 kinds, H4f-c): such a task in pending, running, waiting or degraded, in an active Session, advertises cancel; its cancel rides the same durable task_cancel operation, whose delivery stops the task's process through its Runtime and completes once the task's committed record shows the stop (the stop request on a background Shell, the stop_requested settlement on a Monitor, whose record carries no request); an end the process reached first keeps its outcome and fails the operation with task_already_settled. v1.55 links a child task to its child Session (Stage H4f, #13746 F2): a child_agent or workflow task carries child_session_id/childSessionId once its run's committed record names the child Session; the child is a Session in the parent's Workspace, readable by exactly the callers that can read the task, so a caller reads the child's output through the existing Session, Turn, item and event routes; every other kind, and a child task before its child is known, omits the field." + "version": "1.56.0", + "description": "Canonical contract for the public Managed Agent resources and the WebShell adapter. partial means that the route exists but generated types and full contract tests are pending; planned means that the route or field is not implemented. Workspace context and cwd operations are v1.9 target contracts, not current server capabilities. v1.10 adds planned command admission, Actions, lifecycle and actor authorization. v1.12 refines planned W0 creation discovery, actor-specific create hints and explicit default selection. Filter planned fields as well as routes from production SDKs. v1.13 moves this contract into the Qwen Code repository as its single source and records the shipped rename, archive, unarchive and delete routes as partial. v1.14 integrates W0d workspace discovery, the WebShell workspace lookup, and empty-session binding as partial; workspace_binding/workspaceBinding advertises this narrow flow without enabling workspace execution or context switching. v1.15 adds the archived, archiving and deleting Session statuses and the cancelling Turn status, requires request_id in error envelopes, declares the error responses that the server returns, and marks Session create, list and get on both surfaces implemented. v1.16 adds the planned Stage H task contract (SessionTaskView as PublicTask, task list, detail, events and cancel) and names the MCP catalog, hook catalog, automation and channel resources as planned; their shapes arrive with Stages H1 to H6. v1.17 implements event replay: events carry their schema and projection versions and a top-level Item and Part identity, JSON event pages return has_more and next_cursor and accept limits up to 1000, and a persisted replay floor answers expired cursors with 409 cursor_expired in JSON and one agent.session.resync_required frame over SSE; it marks the public event query and stream, the WebShell event stream and the WebShell transcript implemented. v1.18 implements the durable Session lifecycle (Stage D4): close, archive and delete answer 202 with a command operation on both surfaces, an archive requires a closed Session, a deleted Session leaves a tombstone whose operations stay readable, and the operation query serves them; unarchive restores a closed Session, and Session capabilities advertise session_lifecycle. v1.19 serves the task list and detail on both surfaces as partial (Stage H0c): the Session store projects them from the Stage H records the Session authority commits, a task.updated Session event announces each change of a task's view, and Session capabilities advertise tasks. Task events and cancel stay planned until a slice's tasks produce output and accept a cancel. v1.20 implements the Turn read model (Stage D5): the public Turn list and detail read a Session's Turns without their input, newest first by creation time in milliseconds and then Turn ID, with an opaque cursor; a deleted Session's Turns are not readable, and the durable admission fields of a Turn stay planned until D7. v1.21 declares on the task list, detail and event routes of both surfaces the 403 actor_scope_mismatch that the tenant filter answers on every /v1/agents/ and WebShell route, as the Session and Turn reads already do, and the shared Forbidden response names it; a caller that cannot read a task still gets 404. v1.22 adds deployment-opted-in creation with an initial Workspace file-tool Turn (G0) on the public and WebShell surfaces; the fixed server-owned profile does not enable later Workspace operations. v1.23 settles the planned task event and cancel semantics: a durable retention floor, committed-prefix publication, stable cursors, Artifact visibility before expiry, bounded backlog under archival failure, ordered idempotent cancellation and command outcomes. Clients tolerate unknown optional event fields across minor versions. Task events and cancel remain planned. v1.24 serves the read-only Session MCP catalog as partial (Stage H1), projecting display metadata and schemas from committed records without Runtime identities, credentials or production profile enablement. v1.25 implements permission Actions (Stage D6b) on both surfaces: list, get and respond, projected from the Session's action.changed records; a WebShell permission Action carries inputRevision, policyRevision, functionCallId, toolName and expiresAt, its option ids allow and deny are stable, a Turn has at most one requested approval at a time, and a response is a durable command operation carrying requestId. v1.26 declares the tenant filter's 403 actor_scope_mismatch on every covered public and WebShell route, including planned routes, and pins the refusal code in contract traffic. v1.27 adds O3 durable tool-result projection, artifact metadata, immutable range/streaming content and WebShell result reads. Artifact capability requires a configured O3 reader and a Workspace-bound Session; execution admission remains independent. v1.28 admits later Turns of a Workspace-bound Session for the Session's creator under the deployment's Workspace files opt-in, including cancel and rename; WebShell Session capabilities advertise the per-caller workspaceTurns flag. v1.29 implements the AgentDefinition routes (Stage D8a): create, get and update store tenant-scoped, immutable revisions with a content digest, and an unchanged update adds no revision. Sessions still pin qwen-code and the configured revision, and no definition field changes execution yet. v1.30 adds the qwenSignature security scheme for gateway-free deployments: in signed authentication mode the broker authenticates the X-Qwen-Tenant-Id and X-Qwen-Actor-Id header pair itself with an HMAC signature over method, path, query, tenant, actor, timestamp, body digest and Idempotency-Key, carried in X-Qwen-Signature and X-Qwen-Signature-Timestamp, and answers 401 authentication_required or invalid_signature, 400 invalid_request on a repeated Idempotency-Key header, and 413 payload_too_large beyond the signed-body limit; a Session now records its creator so approval responses are owned without a Workspace creation record; a Session with no recorded creator and no recorded create command answers approvals to any caller in its tenant. v1.31 serves the task events routes as partial (Stage H3): a bounded per-task event journal in SQL commits each task view change with its record revision, the durable retention floor survives an empty retained set under the Artifact visibility barrier, output cursors lift with the routes, and the cancel routes stay planned. v1.32 implements the W2 controlled same-Workspace cwd change on both surfaces: the creator changes the bound Session's relative directory under an idle, opt-in deployment through a durable operation with revision CAS and busy barriers; completion emits the session.context.changed Session event and bumps context_revision, while WorkspaceContext.state stays ready and its other values remain reserved for the read-model follow-up, and bound later-turn submission answers 409 session_context_busy while a context-changing operation is open (the cross-slice busy-barrier handshake; permission-action responses and pending mutation commands are excluded from that barrier, so they can never wedge Turn admission). v1.33 shapes the planned Stage H5 channel resources: a channel connection lists its route bindings, a channel lists its outbound deliveries with per-segment states and a stable cursor, and a delivery detail query is named as planned; all mutations stay Idempotency-Key based with 202 plus operation id. v1.35 serves the three channel resources as partial (Stage H5b/H5c): connections and their route bindings, and the delivery list and detail, are read over the registered connections, the committed ingress rows and the delivery ledger; the email reference adapter routes inbound events into bound Sessions and sends replies through the receipted outbox, where unknown is a terminal outcome that is never resent automatically and an explicit resend opens a new delivery id. v1.36 conditions replay-floor expiry on the Snapshot backing the floor (replay_floor_sequence <= snapshot_through_sequence), serves a below-floor cursor from the retained events while a stream reconciliation rebuilds the Snapshot, and adds the opt-in scheduled replay-floor pass. v1.37 enforces the Workspace actor roles on the bound-Session surface: grants are a single role column ordered reader < operator < owner; Turn submit, rename and cwd change now admit any caller holding OPERATOR, but only while the Session's creator-keyed execution facts hold — the Workspace registry still backs the binding and stays ACTIVE, and the actor recorded by the Workspace create command keeps OPERATOR or above, because the admitted work executes under the creator's grants; Turn cancel admits on the OPERATOR role and the Session's executable shape alone, because its delivery reuses the admitted attachment and re-checks no grants; Action respond admits any caller holding OPERATOR or the Session's recorded owner under no shape gate, with every bound response certifying the same creator-keyed execution facts at admission, so a second operator can unblock a Turn waiting on an approval while the creator still backs execution; close, archive, unarchive and delete admit the Session's recorded owner (the owner_actor_key column, with the pre-V40 creator fallback); the submitter family's readable-but-below-OPERATOR refusal normalizes from 409 workspace_unavailable to 403 session_operation_forbidden; and the WebShell workspaceTurns capability advertises the caller's OPERATOR role under the same creator-keyed facts rather than creator identity; a cwd change's settlement persistently re-checks both the recorded create-command actor and the V56-persisted initiator, so demoting either actor after admission fails the operation with workspace_unavailable. v1.38 serves the automation resources as partial (Stage H6b/H6c): a definition is created, revised, read and retired under its target Session, a manual run and the scanner's occurrences share one derived run identity, definitions and occurrences page separately, and every mutation takes an Idempotency-Key and answers 202 with the committed resource; the per_run target and the delivery policy stay refused until their slices land. v1.40 serves task cancel as partial (Stage H4f): the public and WebShell cancel routes admit a durable task_cancel operation in the A6 order, carrying task_id/taskId; the operation completes once the task's committed record holds the stop request, fails with task_already_settled when the run ended first, and parks as recovery_blocked (not an open operation) when delivery stays unproven; only child_agent tasks whose run has not ended advertise cancel, and only in an active Session; a Workspace-bound Session under a storage migration fence refuses a new cancel with 409 workspace_unavailable; the child is then stopped by its result relay and settles cancelled unless a natural completion or failure won; the WebShell cancel request gains a trace-only requestId. v1.41 pins stored AgentDefinition revisions on Session creation (D8b) and compiles permission_policy and tools into the per-Session approval mode and tool profile (D8c-1): an omitted agent_revision resolves the latest revision at admission and pins it, an unknown agent or revision answers 404 agent_not_found, and definition content that cannot take effect yet answers 409 agent_definition_unsupported naming the refused field in error.field; PublicSession gains the optional agent_digest. D8c-2 applies the pinned model and instructions; a missing, ambiguous or unauthenticated configured model route fails the Turn before inference with turn.failed code model_unavailable. v1.42 implements the per-caller WebShell cwdChange capability, independently of workspaceTurns; admission still owns idle checks and public cwd_change remains planned. v1.43 adds deployment-opted-in public foreground Shell/1 creation for the built-in qwen-code agent with mandatory default/auto-edit approval. Fresh Shell Turns require the Shell opt-in, valid persisted approval and foregroundShell=true; workspaceTurns remains the OPERATOR submit/rename capability and does not by itself admit a Shell Turn. The public Shell tool list does not include the child agent tool. Public Shell close, archive, unarchive and delete stay unavailable, including protocol-0; an internal child Session close is not a public lifecycle request. Shell Action responses admit only the Session's recorded owner, not every Workspace operator, because the answer runs a command. Enable the Shell flag only after the Harness understands suppressChildAgents; an older Harness ignores that field and advertises the child agent tool. Stored AgentDefinition Sessions retain their compiled profile and approval mode independently of the built-in default selection; every Shell Session still requires deployment Shell admission for fresh execution.v1.44 names the input admission budget on each command's input array: every block adds to a 4,000,000-character aggregate per command under the per-block 1,000,000-character cap, and a command whose serialized prompt or durable Session-store record exceeds the Hosted Harness's 64 KiB durable-record limit is accepted and then fails the Turn with hosted_harness_rejected; opens WebShellMetadata to arbitrary caller metadata that Phase 1 accepts and ignores, the Session title travelling in WebShellCreateRequest's own title field; and drops the WebShellTurn usage field the server never returns. v1.45 preserves durable event floors across projection rebuilds and keeps immutable snapshot pagination for 30 minutes. Item next_cursor positions bind tenant, Session, snapshot version and expiry; numeric after remains a first-page sequence filter, while an opaque after or cursor continues that fixed snapshot. v1.46 extends public task cancel to workflow tasks (the H4f follow-up of the workflow runtime): a workflow task in pending, running, waiting or degraded, in an active Session, advertises cancel; its cancel rides the same durable task_cancel operation as a child agent's, and the result relay stops the workflow child through its own Turn's abort. v1.47 unifies the Session title policy at 256 UTF-16 code units (the Harness client's own cap), counted as Java String.length() does — an astral character occupies two units — plus a control-character rejection, now enforced on create and metadata as well as rename (a row written before the unification may hold a longer title; echoing that stored title back through rename is a no-op that answers 200, while any other over-bound title still answers 400 invalid_title), and pagination orders Sessions by the immutable created_at key; replayed rename and unarchive answer the recorded outcome with Session status as last visible rather than 404 after a delete; a create replay after delete answers 404 on the public create route, which re-reads the Session before responding, and the recorded 202 admission carrying the tombstoned sessionId on the WebShell create route. A recorded Turn submit, cancel or rename outcome answers to the actor who recorded it (the actor recorded on the command receipt) as well as to the Session creator; any other authorized actor is still refused. A key recorded before v1.47 named no recorder and keeps its earlier replay for every actor the role gates admit. v1.48 connects explicit static AgentDefinition skills and Runtime MCP/Hook definition pins to Hosted execution. Skills require a Workspace profile, use immutable bounded content resources, and grant no permissions; MCP pins require hosted-workspace-mcp/1 in the deployment allowlist. Existing Session revisions and resources remain pinned across replacement. v1.49 pins the durable retry terminal failure codes: an action response whose delivery exhausted its retry budget fails action_response_delivery_failed, and an answered delivery whose Action expired before its decision projected fails action_response_decision_expired; a lifecycle operation that exhausted its retry budget carries the settle's failure (session_lifecycle_delivery_failed or the workspace close refusal) and certifies no cleanup — its Session keeps its pending status and no session completion event is appended — and one whose settle reached the Harness but stayed unsettled past the larger settled budget carries session_close_completion_unsettled; a Workspace close recovery_blocked also reports session_close_writer_live while a Harness still holds the journal writer or hosted_harness_generation_mismatch while this replica's view of the Harness boot is stale. v1.50 adds WebShell empty Workspace creation, supported approval selection at Session creation, safe model/context observations, and host-catalog next-Turn model selection within idle bound Sessions; model choices are immutable per admitted Turn and do not replace AgentDefinition identity or policy. v1.51 adds owner-authorized idle approval changes and explicit built-in Shell Full Access with immutable per-Turn approval snapshots. v1.52 adds opt-in SSH Runtime node discovery, remote directory checks, and durable existing-directory registration. v1.53 enumerates on failure_code the codes a lifecycle operation can end with once its retry budget runs out — including managed_capability_mismatch, hosted_harness_protocol_error and the Runtime Broker's own refusal codes, with runtime_broker_recovery_blocked reported as workspace_close_identity_unverified — and states that session_close_writer_live is also reported while the journal-writer check itself fails. v1.54 extends public task cancel to background_shell and monitor tasks (the H3 kinds, H4f-c): such a task in pending, running, waiting or degraded, in an active Session, advertises cancel; its cancel rides the same durable task_cancel operation, whose delivery stops the task's process through its Runtime and completes once the task's committed record shows the stop (the stop request on a background Shell, the stop_requested settlement on a Monitor, whose record carries no request); an end the process reached first keeps its outcome and fails the operation with task_already_settled. v1.55 links a child task to its child Session (Stage H4f, #13746 F2): a child_agent or workflow task carries child_session_id/childSessionId once its run's committed record names the child Session; the child is a Session in the parent's Workspace, readable by exactly the callers that can read the task, so a caller reads the child's output through the existing Session, Turn, item and event routes; every other kind, and a child task before its child is known, omits the field. v1.56 adds owner-authorized Linux directory discovery, existing-directory Workspace creation with pinned source identity, and persisted WebShell default working directories." }, "servers": [ { @@ -3747,7 +3747,7 @@ "tags": ["WebShell"], "operationId": "webShellCreateWorkspace", "x-qwen-implementation-status": "implemented", - "description": "Create an independent empty Workspace under the operator-controlled creation root and grant its authenticated creator OWNER access. Disabled deployments reject creation. The actor-scoped idempotency key freezes the normalized name and storage registration; retry the same request after an uncertain response. Completed replay checks current access and does not restore removed Workspaces or revoked grants. No host path is accepted or returned.", + "description": "Create an empty Workspace under the operator-controlled root, or supply sourceWorkspaceId and cwdRelative together to select an existing directory under an ACTIVE ROOT Workspace owned by the actor. Existing-directory creation shares its verified storage, config and policy and persists a default working directory. The actor-scoped idempotency key pins the normalized request and source generation. Completed replay checks current access and never restores grants.", "requestBody": { "required": true, "content": { @@ -4256,6 +4256,51 @@ } } } + }, + "/api/agent/web-shell/v1/workspaces/directories/query": { + "post": { + "tags": ["WebShell"], + "operationId": "queryWebShellWorkspaceDirectories", + "x-qwen-implementation-status": "implemented", + "description": "List bounded immediate real directories on the selected Workspace storage host. Requires an authenticated OWNER of the ACTIVE ROOT Workspace and verified LOCAL storage. Refuses traversal, symlinks and reserved maintenance directories; never uses the ordinary daemon filesystem. Root paths are disclosed only within this authorized scope.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WebShellWorkspaceDirectoryQueryRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Authorized existing directories.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WebShellWorkspaceDirectoryPage" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } } }, "components": { @@ -6644,6 +6689,16 @@ "state": { "type": "string", "enum": ["active", "draining", "removed"] + }, + "defaultCwdRelative": { + "type": "string", + "minLength": 1, + "maxLength": 2048, + "description": "Persisted default working directory for new WebShell Sessions; absent means dot." + }, + "canSelectDirectory": { + "type": "boolean", + "description": "Current actor owns this active root Workspace; directory discovery rechecks authorization and native storage." } }, "x-qwen-implementation-status": "partial" @@ -6686,6 +6741,10 @@ "approvalModeSelection": { "type": "boolean", "description": "Supports effective Session policy options and explicit Workspace-bound creation policy. Missing or false means unsupported." + }, + "workspaceDirectorySelection": { + "type": "boolean", + "description": "Supports browsing and selecting existing directories on authorized Linux storage; absent means unsupported." } }, "x-qwen-implementation-status": "partial" @@ -10542,6 +10601,16 @@ "type": "string", "minLength": 1, "maxLength": 128 + }, + "sourceWorkspaceId": { + "type": "string", + "minLength": 1, + "maxLength": 128 + }, + "cwdRelative": { + "type": "string", + "minLength": 1, + "maxLength": 2048 } }, "x-qwen-implementation-status": "implemented" @@ -11026,6 +11095,56 @@ } }, "x-qwen-implementation-status": "implemented" + }, + "WebShellWorkspaceDirectoryPage": { + "type": "object", + "additionalProperties": false, + "required": ["root", "cwdRelative", "directories", "truncated"], + "properties": { + "root": { + "type": "string" + }, + "cwdRelative": { + "type": "string" + }, + "truncated": { + "type": "boolean" + }, + "directories": { + "type": "array", + "maxItems": 100, + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name", "cwdRelative"], + "properties": { + "name": { + "type": "string" + }, + "cwdRelative": { + "type": "string" + } + } + } + } + } + }, + "WebShellWorkspaceDirectoryQueryRequest": { + "type": "object", + "additionalProperties": false, + "required": ["workspaceId", "cwdRelative"], + "properties": { + "workspaceId": { + "type": "string", + "minLength": 1, + "maxLength": 128 + }, + "cwdRelative": { + "type": "string", + "minLength": 1, + "maxLength": 2048 + } + } } } } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HarnessEventProjectorTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HarnessEventProjectorTest.java index e9153732be..505fd6e207 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HarnessEventProjectorTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HarnessEventProjectorTest.java @@ -145,6 +145,37 @@ class HarnessEventProjectorTest { assertThat(atBound.errorCode()).isEqualTo("b".repeat(128)); } + @Test + void projectsToolResultLifecycleWithoutPublishingThePrivateRecord() { + ProjectedEvent event = projector.project(new SourceEvent(6L, + "managed_journal_event", Map.of( + "record", Map.of("text", "private output"), + "update", Map.of("sessionUpdate", "tool_call_update", + "toolCallId", "model-call", "name", "read_file", + "status", "completed")), + "prompt", Map.of()), "turn-1"); + + assertThat(event.type()).isEqualTo("item.tool_call.updated"); + assertThat(event.data()).containsEntry("toolCallId", "model-call") + .containsEntry("status", "completed"); + assertThat(event.data().toString()).doesNotContain("private output") + .doesNotContain("record"); + } + + @Test + void projectsConfiguredRoundLimitWithASafeActionableMessage() { + ProjectedEvent event = projector.project(new SourceEvent(4L, + "turn_error", Map.of("code", "hosted_turn_limit_exceeded", + "message", "token=secret path=/private/workspace"), + "prompt", Map.of()), "turn-1"); + + assertThat(event.errorCode()).isEqualTo("hosted_turn_limit_exceeded"); + assertThat(event.errorMessage()).isEqualTo( + "The Hosted Harness Turn reached its configured model round limit."); + assertThat(event.data().toString()).doesNotContain("secret") + .doesNotContain("/private/workspace"); + } + @Test void projectsDeadlineExpiryAsAClassifiedFailure() { ProjectedEvent event = projector.project(new SourceEvent(4L, diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentApiContractTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentApiContractTest.java index d2a69b56bb..b009466e9c 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentApiContractTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentApiContractTest.java @@ -57,6 +57,7 @@ import com.alibaba.qwen.code.managedagent.api.RequestIdFilter; import com.alibaba.qwen.code.managedagent.api.SshWorkspaceController; import com.alibaba.qwen.code.managedagent.api.TenantContextArgumentResolver; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; +import com.alibaba.qwen.code.managedagent.api.WorkspaceDiscoveryController; import com.alibaba.qwen.code.managedagent.service.SessionRenameCoordinator; import com.alibaba.qwen.code.managedagent.service.SshWorkspaceService; import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; @@ -166,6 +167,7 @@ class ManagedAgentApiContractTest { entry(ApiModels.WebShellArtifactRequest.class, List.of("WebShellArtifactRequest")), entry(ApiModels.WebShellToolResultRequest.class, List.of("WebShellToolResultRequest")), entry(SshWorkspaceController.DirectoryRequest.class, List.of("WebShellWorkspaceDirectoryRequest")), + entry(WorkspaceDiscoveryController.DirectoryRequest.class, List.of("WebShellWorkspaceDirectoryQueryRequest")), entry(SshWorkspaceController.CreateRequest.class, List.of("WebShellWorkspaceRegisterRequest")), entry(SshWorkspaceController.OperationRequest.class, List.of("WebShellWorkspaceOperationRequest")), entry(SshWorkspaceService.NodeSummary.class, List.of("WebShellRuntimeNode")), @@ -1189,6 +1191,10 @@ class ManagedAgentApiContractTest { post(WEB_SHELL + "/workspaces/create") .header(TENANT, workspaceTenant).principal(actor), "{\"displayName\":\"New workspace\",\"idempotencyKey\":\"workspace-create\"}"); + exchange(drift, "queryWebShellWorkspaceDirectories", 409, + post(WEB_SHELL + "/workspaces/directories/query") + .header(TENANT, workspaceTenant).principal(actor), + "{\"workspaceId\":\"ws-default\",\"cwdRelative\":\".\"}"); String publicBoundId = json(exchange(drift, "createSession", 202, post("/v1/agents/sessions").header(TENANT, workspaceTenant) .principal(actor).header(IDEMPOTENCY_KEY, "bound-public"), diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/SurfaceAdmissionAcceptanceTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/SurfaceAdmissionAcceptanceTest.java index d9f4fad3d8..85c4c28e24 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/SurfaceAdmissionAcceptanceTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/SurfaceAdmissionAcceptanceTest.java @@ -1608,6 +1608,7 @@ class SurfaceAdmissionAcceptanceTest { + "\",\"artifactId\":\"" + artifactId + "\"}"; case ARTIFACT_LIST -> "{\"sessionId\":\"" + session + "\"}"; case WORKSPACE_CREATE -> "{\"displayName\":\"New workspace\",\"idempotencyKey\":\"create-key\"}"; + case WORKSPACE_DIRECTORIES -> "{\"workspaceId\":\"workspace\",\"cwdRelative\":\".\"}"; case SESSION_OPTIONS -> "{\"agentId\":\"qwen-code\"}"; case SESSION_APPROVAL, SESSION_MODELS -> "{\"sessionId\":\"" + session + "\"}"; case SESSION_APPROVAL_CHANGE -> "{\"sessionId\":\"" + session diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/SurfaceRegistry.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/SurfaceRegistry.java index d22296fdf2..d81d598801 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/SurfaceRegistry.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/SurfaceRegistry.java @@ -297,6 +297,10 @@ public enum SurfaceRegistry { "/api/agent/web-shell/v1/workspaces/create", Surface.WEBSHELL, RuleClass.WORKSPACE_ALLOCATION, EnumSet.of(Capability.WORKSPACE_CREATE)), + WEBSHELL_WORKSPACE_DIRECTORIES(Method.POST, + "/api/agent/web-shell/v1/workspaces/directories/query", + Surface.WEBSHELL, RuleClass.WORKSPACE_ALLOCATION, + EnumSet.of(Capability.WORKSPACE_DIRECTORIES)), WEBSHELL_SESSION_OPTIONS(Method.POST, "/api/agent/web-shell/v1/session-options/query", Surface.WEBSHELL, RuleClass.SESSION_OPTIONS, @@ -558,6 +562,7 @@ public enum SurfaceRegistry { ARTIFACT_GET, ARTIFACT_CONTENT, WORKSPACE_CREATE, + WORKSPACE_DIRECTORIES, SESSION_OPTIONS, SESSION_APPROVAL, SESSION_APPROVAL_CHANGE, @@ -712,7 +717,7 @@ public enum SurfaceRegistry { * Workspace is invisible. */ WORKSPACE_DISCOVERY, - /** A trusted tenant actor allocates a new root only when operator configuration enables it. */ + /** A trusted actor allocates an empty root, or selects an existing directory with source ROOT ownership. */ WORKSPACE_ALLOCATION, /** A trusted tenant actor may inspect effective creation policy for a tenant Agent. */ SESSION_OPTIONS, diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedHostedRecoveryRecordsTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedHostedRecoveryRecordsTest.java index 422af0d0f7..9979cb2cb3 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedHostedRecoveryRecordsTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedHostedRecoveryRecordsTest.java @@ -3,6 +3,8 @@ package com.alibaba.qwen.code.managedagent.store; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import java.nio.charset.StandardCharsets; @@ -167,6 +169,23 @@ class ManagedHostedRecoveryRecordsTest { } } + @ParameterizedTest + @ValueSource(longs = {0, 15, 16, 20, ManagedSessionStoreModels.MAX_SAFE_COUNTER}) + void acceptsNonnegativeSafeModelRoundCounters(long round) { + assertThatCode(() -> validateModel(modelRequest().put("round", round))).doesNotThrowAnyException(); + } + + @Test + void rejectsInvalidModelRoundCounters() { + for (var value : java.util.List.of(json.getNodeFactory().numberNode(-1), + json.getNodeFactory().numberNode(1.5), json.getNodeFactory().textNode("16"), + json.getNodeFactory().numberNode(ManagedSessionStoreModels.MAX_SAFE_COUNTER + 1))) { + ObjectNode body = modelRequest(); + body.set("round", value); + assertThatThrownBy(() -> validateModel(body)).hasMessageContaining("round"); + } + } + @Test void rejectsInvalidPreparedRetryTypesAndUnknownFields() { for (var value : java.util.List.of(json.getNodeFactory().nullNode(), json.getNodeFactory().textNode("true"), diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCreationStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCreationStoreTest.java index 7bf3aa8884..5a9ca300ed 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCreationStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCreationStoreTest.java @@ -3,6 +3,7 @@ package com.alibaba.qwen.code.managedagent.store; import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import com.fasterxml.jackson.databind.ObjectMapper; @@ -206,6 +207,164 @@ class WorkspaceCreationStoreTest { return jdbc.queryForObject("SELECT storage_id FROM ma_workspace WHERE workspace_id = ?", String.class, workspace); } + @Test + void selectsExistingProjectAndPersistsItsDefaultWithoutRegisteringStorageAgain() throws Exception { + var parent = store(guard).create("tenant", "actor", "Projects", "projects"); + Path root = guard.createdStorageRoot("tenant", storage(parent.workspaceId())); + Path project = Files.createDirectory(root.resolve("existing-project")); + Files.writeString(project.resolve("README.md"), "existing project"); + var before = jdbc.queryForMap("SELECT * FROM ma_storage_owner"); + jdbc.update("UPDATE ma_storage_owner SET holder_key = 'existing-runtime'"); + var created = store(guard).create("tenant", "actor", "Project", "selected", + parent.workspaceId(), "./existing-project/"); + assertThat(created.defaultCwdRelative()).isEqualTo("existing-project"); + assertThat(storage(created.workspaceId())).isEqualTo(storage(parent.workspaceId())); + assertThat(Files.readString(project.resolve("README.md"))).isEqualTo("existing project"); + assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_storage_owner", Integer.class)).isEqualTo(1); + assertThat(jdbc.queryForMap("SELECT * FROM ma_storage_owner")).containsEntry("holder_key", "existing-runtime") + .containsEntry("mount_registration_id", before.get("mount_registration_id")); + assertThat(new ManagedWorkspaceRegistry(jdbc).findReadable("tenant", "actor", created.workspaceId()) + .defaultCwdRelative()).isEqualTo("existing-project"); + assertThat(store(guard).create("tenant", "actor", "Project", "selected", parent.workspaceId(), + "existing-project")).isEqualTo(created); + assertThatThrownBy(() -> store(guard).create("tenant", "actor", "Project", "selected", + parent.workspaceId(), ".")).isInstanceOfSatisfying(ApiException.class, + error -> assertThat(error.getCode()).isEqualTo("idempotency_conflict")); + jdbc.update("DELETE FROM ma_workspace_access WHERE workspace_id = ?", parent.workspaceId()); + assertThat(store(guard).create("tenant", "actor", "Project", "selected", parent.workspaceId(), + "existing-project")).isEqualTo(created); + jdbc.update("DELETE FROM ma_workspace_access WHERE workspace_id = ?", created.workspaceId()); + assertThatThrownBy(() -> store(guard).create("tenant", "actor", "Project", "selected", + parent.workspaceId(), "existing-project")).isInstanceOf(ApiException.class); + } + + @Test + void browsesOnlyOwnedRealDirectoriesAndRefusesUnsafeSelections() throws Exception { + var parent = store(guard).create("tenant", "actor", "Projects", "browse"); + Path root = guard.createdStorageRoot("tenant", storage(parent.workspaceId())); + Files.createDirectory(root.resolve("project")); + Files.createDirectory(root.resolve(".git")); + Files.createDirectory(root.resolve(".qwen-child-workspaces")); + Files.createSymbolicLink(root.resolve("outside"), temp); + var page = store(guard).directories("tenant", "actor", parent.workspaceId(), "."); + assertThat(page.root()).isEqualTo(root.toString()); + assertThat(page.directories()).extracting(WorkspaceCreationStore.Directory::name).containsExactly("project"); + for (String path : List.of("../", "outside", ".git", ".qwen-child-workspaces")) { + String code = "outside".equals(path) ? "workspace_unavailable" : "invalid_cwd"; + assertThatThrownBy(() -> store(guard).directories("tenant", "actor", parent.workspaceId(), path)) + .isInstanceOfAny(ApiException.class, RuntimeBrokerException.class) + .hasFieldOrPropertyWithValue("code", code); + assertThatThrownBy(() -> store(guard).create("tenant", "actor", "Unsafe", "unsafe-" + path, + parent.workspaceId(), path)).isInstanceOfAny(ApiException.class, RuntimeBrokerException.class) + .hasFieldOrPropertyWithValue("code", code); + } + assertThatThrownBy(() -> store(guard).directories("other", "actor", parent.workspaceId(), ".")) + .isInstanceOf(ApiException.class); + assertThatThrownBy(() -> store(guard).directories("tenant", "other", parent.workspaceId(), ".")) + .isInstanceOf(ApiException.class); + for (String role : List.of("READER", "OPERATOR")) { + jdbc.update("UPDATE ma_workspace_access SET role = ?", role); + assertThatThrownBy(() -> store(guard).directories("tenant", "actor", parent.workspaceId(), ".")) + .isInstanceOf(ApiException.class); + assertThatThrownBy(() -> store(guard).create("tenant", "actor", "Refused", "role-" + role, + parent.workspaceId(), "project")).isInstanceOf(ApiException.class); + } + assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_workspace", Integer.class)).isEqualTo(1); + } + + @Test + void truncatesOnlyWhenAnotherEligibleDirectoryRemains() throws Exception { + var parent = store(guard).create("tenant", "actor", "Projects", "directory-limit"); + Path root = guard.createdStorageRoot("tenant", storage(parent.workspaceId())); + for (int index = 0; index < 100; index++) { + Files.createDirectory(root.resolve("project-" + index)); + Files.writeString(root.resolve("ignored-" + index), "not a directory"); + } + var complete = store(guard).directories("tenant", "actor", parent.workspaceId(), "."); + assertThat(complete.directories()).hasSize(100); + assertThat(complete.truncated()).isFalse(); + Files.createDirectory(root.resolve("one-more-project")); + var limited = store(guard).directories("tenant", "actor", parent.workspaceId(), "."); + assertThat(limited.directories()).hasSize(100); + assertThat(limited.truncated()).isTrue(); + } + + @Test + void preservesTheRawEntryScanBudgetWhenEntriesAreFilteredOut() throws Exception { + var parent = store(guard).create("tenant", "actor", "Projects", "directory-scan-limit"); + Path root = guard.createdStorageRoot("tenant", storage(parent.workspaceId())); + for (int index = 0; index < 1025; index++) { + Files.writeString(root.resolve("ignored-" + index), "not a directory"); + } + var page = store(guard).directories("tenant", "actor", parent.workspaceId(), "."); + assertThat(page.directories()).isEmpty(); + assertThat(page.truncated()).isTrue(); + } + + @Test + void localDirectorySelectionRefusesRemoteStorageEvenIfGeneralVerificationSucceeds() { + var parent = store(guard).create("tenant", "actor", "Projects", "remote-parent"); + assertThat(parent.canSelectDirectory()).isTrue(); + jdbc.update("UPDATE ma_storage SET storage_kind = 'SSH_LOCAL' WHERE alias_key = ?", + WorkspaceCsiRegistration.aliasKey("tenant", storage(parent.workspaceId()))); + assertThat(registry.findReadable("tenant", "actor", parent.workspaceId()).canSelectDirectory()).isFalse(); + assertThat(registry.listReadable("tenant", "actor", null, 10)) + .allSatisfy(item -> assertThat(item.canSelectDirectory()).isFalse()); + var remoteAware = spy(guard); + org.mockito.Mockito.doNothing().when(remoteAware).verify(org.mockito.ArgumentMatchers.any()); + assertThatThrownBy(() -> remoteAware.verifiedRoot(binding(parent.workspaceId()))) + .isInstanceOfSatisfying(RuntimeBrokerException.class, + error -> assertThat(error.getCode()).isEqualTo("workspace_unavailable")); + assertThatThrownBy(() -> store(guard).directories("tenant", "actor", parent.workspaceId(), ".")) + .isInstanceOf(ApiException.class); + assertThatThrownBy(() -> store(guard).create("tenant", "actor", "Remote", "remote-selection", + parent.workspaceId(), ".")).isInstanceOf(ApiException.class); + assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_workspace", Integer.class)).isEqualTo(1); + } + + @Test + void pendingSelectionCannotRebindAfterSourceGenerationChanges() throws Exception { + var parent = store(guard).create("tenant", "actor", "Projects", "pending-parent"); + Path root = guard.createdStorageRoot("tenant", storage(parent.workspaceId())); + Files.createDirectory(root.resolve("project")); + var interrupted = spy(guard); + var count = new java.util.concurrent.atomic.AtomicInteger(); + doAnswer(invocation -> { + if (count.incrementAndGet() == 2) { + throw new IllegalStateException("interrupted after receipt"); + } + return invocation.callRealMethod(); + }).when(interrupted).verifiedRoot(org.mockito.ArgumentMatchers.any()); + assertThatThrownBy(() -> store(interrupted).create("tenant", "actor", "Project", "pending-selection", + parent.workspaceId(), "project")).isInstanceOf(IllegalStateException.class); + assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_request_receipt WHERE state = 'PENDING'", Integer.class)) + .isEqualTo(1); + jdbc.update("UPDATE ma_workspace SET workspace_generation = 2 WHERE workspace_id = ?", parent.workspaceId()); + assertThatThrownBy(() -> store(guard).create("tenant", "actor", "Project", "pending-selection", + parent.workspaceId(), "project")).isInstanceOf(RuntimeException.class); + assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_workspace", Integer.class)).isEqualTo(1); + } + + @Test + void concurrentSelectionPublishesOneWorkspace() throws Exception { + var parent = store(guard).create("tenant", "actor", "Projects", "concurrent-parent"); + Path root = guard.createdStorageRoot("tenant", storage(parent.workspaceId())); + Files.createDirectory(root.resolve("project")); + var barrier = new CyclicBarrier(2); + try (var pool = Executors.newFixedThreadPool(2)) { + java.util.concurrent.Callable action = () -> { + barrier.await(); + return store(guard).create("tenant", "actor", "Project", "concurrent-project", + parent.workspaceId(), "project"); + }; + var first = pool.submit(action); + var second = pool.submit(action); + assertThat(first.get(20, TimeUnit.SECONDS)).isEqualTo(second.get(20, TimeUnit.SECONDS)); + } + assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_workspace", Integer.class)).isEqualTo(2); + assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_storage_owner", Integer.class)).isEqualTo(1); + } + private ContextBinding binding(String workspace) { return new ContextBinding("tenant", workspace, 1, storage(workspace), ".", "config", 1); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceDirectorySelectionMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceDirectorySelectionMySqlIT.java new file mode 100644 index 0000000000..5c16333aca --- /dev/null +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceDirectorySelectionMySqlIT.java @@ -0,0 +1,22 @@ +package com.alibaba.qwen.code.managedagent.store; + +import org.junit.jupiter.api.AfterEach; + +import javax.sql.DataSource; + +class WorkspaceDirectorySelectionMySqlIT extends WorkspaceCreationStoreTest { + private IsolatedManagedSchemaMySqlTestDatabase database; + + @Override + protected DataSource dataSource() { + database = new IsolatedManagedSchemaMySqlTestDatabase(); + return database.source(); + } + + @AfterEach + void closeDatabase() { + if (database != null) { + database.close(); + } + } +} diff --git a/packages/web-shell/client/App.tsx b/packages/web-shell/client/App.tsx index 0fdca87069..fb4f1e9829 100644 --- a/packages/web-shell/client/App.tsx +++ b/packages/web-shell/client/App.tsx @@ -22710,25 +22710,27 @@ export function App({ aria-hidden={!managedChatVisible || undefined} data-testid="managed-home" > - { - setManagedSessionId(id); - if (managedModeRef.current) { - closeMobileDrawer(); - returnToChat(); + + { + setManagedSessionId(id); + if (managedModeRef.current) { + closeMobileDrawer(); + returnToChat(); + } + }} + workspaceCwd={lockedWorkspaceCwd} + managedAgentProvider={managedAgentProvider} + interactive={managedChatVisible} + navigationTarget={ + sidebarOptions.enabled + ? managedNavigationTarget + : undefined } - }} - workspaceCwd={lockedWorkspaceCwd} - managedAgentProvider={managedAgentProvider} - interactive={managedChatVisible} - navigationTarget={ - sidebarOptions.enabled - ? managedNavigationTarget - : undefined - } - /> + /> + )}
void; onAdd: (cwd: string, persist: boolean, displayName?: string) => Promise; displayNameEnabled?: boolean; @@ -80,6 +82,8 @@ function isAbsoluteLike(value: string): boolean { export function AddWorkspaceDialog({ browseDirectories = false, initialPath = '', + pathHint, + pathPlaceholder = '/absolute/path or ssh://user@host/project', onClose, onAdd, displayNameEnabled = false, @@ -441,7 +445,7 @@ export function AddWorkspaceDialog({ ref={inputRef} id="add-workspace-path" type="text" - placeholder="/absolute/path or ssh://user@host/project" + placeholder={pathPlaceholder} value={path} onChange={(e) => { setPath(e.target.value); @@ -585,7 +589,7 @@ export function AddWorkspaceDialog({ )}
- {t('sidebar.addWorkspaceHint')} + {pathHint ?? t('sidebar.addWorkspaceHint')} {error && {error}} diff --git a/packages/web-shell/client/components/managed/ManagedSessionProgress.tsx b/packages/web-shell/client/components/managed/ManagedSessionProgress.tsx index 770b1869a3..0953443c4e 100644 --- a/packages/web-shell/client/components/managed/ManagedSessionProgress.tsx +++ b/packages/web-shell/client/components/managed/ManagedSessionProgress.tsx @@ -2,6 +2,7 @@ import type { ManagedAgentSessionSummary } from './managed-agent-provider'; import { useSharedNow } from '../../hooks/useSharedNow'; import { useI18n } from '../../i18n'; import { Spinner } from '../ui/spinner'; +import styles from '../StreamingStatus.module.css'; export function ManagedSessionProgress({ summary, @@ -20,34 +21,24 @@ export function ManagedSessionProgress({ if (!submitting && !loading && !active) return null; return ( -
-
-
+
+
); diff --git a/packages/web-shell/client/components/managed/ManagedSessionsPage.tsx b/packages/web-shell/client/components/managed/ManagedSessionsPage.tsx index 099c46ce70..98ce42440f 100644 --- a/packages/web-shell/client/components/managed/ManagedSessionsPage.tsx +++ b/packages/web-shell/client/components/managed/ManagedSessionsPage.tsx @@ -725,7 +725,7 @@ function ManagedSessionsContent({ : null : navigation}
@@ -918,6 +918,7 @@ function ManagedSessionsContent({ sessionKey={`managed:${provider.storageKey}:${sessionId ?? 'new'}`} loadingTranscript={detail.loading} isResponding={Boolean(active)} + activeTurnStartedAt={active ? summary?.admittedAt : undefined} hasOlderHistory={Boolean(detail.olderCursor)} loadingOlderHistory={detail.loadingOlder} onLoadOlderHistory={detail.loadOlder} diff --git a/packages/web-shell/client/components/managed/WorkspaceBindingCreator.test.tsx b/packages/web-shell/client/components/managed/WorkspaceBindingCreator.test.tsx index 798e6aec74..112e50890c 100644 --- a/packages/web-shell/client/components/managed/WorkspaceBindingCreator.test.tsx +++ b/packages/web-shell/client/components/managed/WorkspaceBindingCreator.test.tsx @@ -244,7 +244,12 @@ describe('WorkspaceBindingCreator', () => { it('registers and selects a remote Workspace without creating a Session', async () => { const registration = enableRegistration(); const createSession = directCreation(); + vi.mocked(provider.workspaceBinding!.get).mockResolvedValue({ + ...remoteWorkspace, + defaultCwdRelative: 'remote-project', + }); await render(); + await typeInput('managed-workspace-cwd', 'local-project'); expect(editorMocks.props!.existingFolderWorkspaceSupported).toBe(true); await openRegistration(true); expect(registration.checkDirectory).toHaveBeenCalledWith( @@ -265,6 +270,10 @@ describe('WorkspaceBindingCreator', () => { expect.objectContaining({ clientId: 'client-a' }), ); expect(editorMocks.props!.selectedWorkspaceCwd).toBe('ws-remote'); + expect( + (document.getElementById('managed-workspace-cwd') as HTMLInputElement) + .value, + ).toBe('remote-project'); expect(document.querySelector('[role="dialog"]')).toBeNull(); expect(createSession).not.toHaveBeenCalled(); expect(createEmpty).not.toHaveBeenCalled(); @@ -415,7 +424,10 @@ describe('WorkspaceBindingCreator', () => { expect(sessionStorage.getItem(storageKey)).toBeNull(); expect(registration.create).toHaveBeenCalledOnce(); expect(registration.query).toHaveBeenCalledOnce(); - expect(provider.workspaceBinding!.get).not.toHaveBeenCalled(); + expect(provider.workspaceBinding!.get).not.toHaveBeenCalledWith( + 'ws-remote', + expect.anything(), + ); expect( (document.getElementById('managed-runtime-directory') as HTMLInputElement) .disabled, @@ -547,6 +559,28 @@ describe('WorkspaceBindingCreator', () => { }); } + async function submitDirectory(path: string) { + await click('Choose existing directory'); + await act(async () => { + const input = document.querySelector( + '#add-workspace-path', + )!; + Object.getOwnPropertyDescriptor( + HTMLInputElement.prototype, + 'value', + )!.set!.call(input, path); + input.dispatchEvent(new Event('input', { bubbles: true })); + }); + await act(async () => { + document + .querySelector('[role="dialog"] form')! + .dispatchEvent( + new Event('submit', { bubbles: true, cancelable: true }), + ); + await flush(); + }); + } + function approvalSelection() { const createSession = directCreation(); const getSessionOptions = vi.fn().mockResolvedValue({ @@ -992,6 +1026,202 @@ describe('WorkspaceBindingCreator', () => { ).toBeNull(); }); + it('selects an existing Linux project and restores its directory after reload', async () => { + const created = { + ...workspace, + workspaceId: 'ws-project', + displayName: 'Project', + defaultCwdRelative: 'project', + }; + const createWorkspace = workspaceCreation().mockResolvedValue(created); + provider.workspaceBinding = { + ...provider.workspaceBinding!, + directories: vi.fn().mockResolvedValue({ + root: '/linux/projects', + cwdRelative: '.', + directories: [{ name: 'project', cwdRelative: 'project' }], + truncated: false, + }), + list: vi.fn().mockResolvedValue({ + data: [{ ...workspace, canSelectDirectory: true }], + defaultWorkspace: { ...workspace, canSelectDirectory: true }, + supported: true, + canCreateWorkspace: true, + canSelectDirectory: true, + }), + get: vi.fn().mockResolvedValue(created), + }; + await render(); + await openWorkspaceCreation(); + await click('Choose existing directory'); + await act(async () => { + const input = document.querySelector( + '#add-workspace-path', + )!; + expect(input).not.toBeNull(); + Object.getOwnPropertyDescriptor( + HTMLInputElement.prototype, + 'value', + )!.set!.call(input, '/linux/projects/project'); + input.dispatchEvent(new Event('input', { bubbles: true })); + }); + await act(async () => { + document + .querySelector('[role="dialog"] form')! + .dispatchEvent( + new Event('submit', { bubbles: true, cancelable: true }), + ); + await flush(); + }); + expect(createWorkspace).toHaveBeenCalledWith( + { + displayName: 'project', + sourceWorkspaceId: 'ws-a', + cwdRelative: 'project', + }, + expect.objectContaining({ idempotencyKey: expect.any(String) }), + ); + expect( + container.querySelector('#managed-workspace-cwd') + ?.value, + ).toBe('project'); + expect(editorMocks.clearText).not.toHaveBeenCalled(); + await act(async () => root.render(null)); + await render(); + expect(provider.workspaceBinding.get).toHaveBeenCalledWith( + 'ws-project', + expect.any(Object), + ); + expect( + container.querySelector('#managed-workspace-cwd') + ?.value, + ).toBe('project'); + }); + + it('retries a persisted existing-directory creation without changing source or path', async () => { + const createWorkspace = workspaceCreation().mockResolvedValue({ + ...workspace, + workspaceId: 'ws-project', + defaultCwdRelative: 'old/project', + }); + vi.mocked(provider.workspaceBinding!.list).mockResolvedValue({ + data: [workspace], + supported: true, + canSelectDirectory: true, + }); + sessionStorage.setItem( + `qwen-managed-workspace-registration:${provider.storageKey}`, + JSON.stringify({ + displayName: 'Project', + sourceWorkspaceId: 'ws-a', + cwdRelative: 'old/project', + idempotencyKey: 'frozen-directory-key', + }), + ); + await render(); + await click('Retry the same request'); + expect(createWorkspace).toHaveBeenCalledWith( + { + displayName: 'Project', + sourceWorkspaceId: 'ws-a', + cwdRelative: 'old/project', + }, + expect.objectContaining({ idempotencyKey: 'frozen-directory-key' }), + ); + expect( + container.querySelector('#managed-workspace-cwd') + ?.value, + ).toBe('old/project'); + }); + + it.each([false, true])( + 'allows correcting a refused directory after abandoning local confirmation (refresh %s)', + async (refresh) => { + const createWorkspace = workspaceCreation() + .mockRejectedValueOnce( + new JavaManagedAgentHttpError( + 409, + 'workspace_unavailable', + 'Missing directory', + ), + ) + .mockResolvedValueOnce({ + ...workspace, + workspaceId: 'ws-project', + defaultCwdRelative: 'project', + }); + provider.workspaceBinding = { + ...provider.workspaceBinding!, + directories: vi.fn().mockResolvedValue({ + root: '/linux/projects', + cwdRelative: '.', + directories: [{ name: 'project', cwdRelative: 'project' }], + truncated: false, + }), + list: vi.fn().mockResolvedValue({ + data: [{ ...workspace, canSelectDirectory: true }], + supported: true, + canCreateWorkspace: true, + canSelectDirectory: true, + }), + }; + await render(); + await openWorkspaceCreation(); + await submitDirectory('/linux/projects/missing'); + const key = `qwen-managed-workspace-registration:${provider.storageKey}`; + const original = JSON.parse(sessionStorage.getItem(key)!); + if (refresh) { + await act(async () => root.render(null)); + await render(); + } + expect( + document.querySelector('#managed-new-workspace-name') + ?.disabled, + ).toBe(true); + await click('Abandon local confirmation'); + expect(sessionStorage.getItem(key)).toBeNull(); + expect( + document.querySelector('#managed-new-workspace-name') + ?.disabled, + ).toBe(false); + await submitDirectory('/linux/projects/project'); + expect(createWorkspace).toHaveBeenCalledTimes(2); + expect(createWorkspace.mock.calls[1][0]).toMatchObject({ + sourceWorkspaceId: 'ws-a', + cwdRelative: 'project', + }); + expect(createWorkspace.mock.calls[1][1].idempotencyKey).not.toBe( + original.idempotencyKey, + ); + expect(editorMocks.clearText).not.toHaveBeenCalled(); + }, + ); + + it('allows empty Workspace creation after abandoning a persisted directory selection', async () => { + const createWorkspace = workspaceCreation(); + sessionStorage.setItem( + `qwen-managed-workspace-registration:${provider.storageKey}`, + JSON.stringify({ + displayName: 'Missing', + sourceWorkspaceId: 'ws-a', + cwdRelative: 'missing', + idempotencyKey: 'refused-directory', + }), + ); + await render(); + await click('Abandon local confirmation'); + expect(createWorkspace).not.toHaveBeenCalled(); + await nameWorkspace('New empty'); + await click('Create workspace'); + expect(createWorkspace).toHaveBeenCalledWith( + { displayName: 'New empty' }, + expect.objectContaining({ idempotencyKey: expect.any(String) }), + ); + expect(createWorkspace.mock.calls[0][1].idempotencyKey).not.toBe( + 'refused-directory', + ); + }); + it('freezes an uncertain creation across close and retry without issuing another operation', async () => { const createWorkspace = workspaceCreation() .mockRejectedValueOnce(new Error('response lost')) @@ -1468,7 +1698,11 @@ describe('WorkspaceBindingCreator', () => { expect(createEmpty).toHaveBeenCalledTimes(1); expect(getSession).toHaveBeenCalledTimes(1); expect(onCreated).toHaveBeenCalledExactlyOnceWith('session-a'); - expect(sessionStorage.length).toBe(0); + expect( + sessionStorage.getItem( + `qwen-managed-workspace-create:${provider.storageKey}`, + ), + ).toBeNull(); }, ); @@ -1499,7 +1733,11 @@ describe('WorkspaceBindingCreator', () => { createEmpty.mock.calls[0][1].idempotencyKey, ); expect(onCreated).toHaveBeenCalledWith('session-a'); - expect(sessionStorage.length).toBe(0); + expect( + sessionStorage.getItem( + `qwen-managed-workspace-create:${provider.storageKey}`, + ), + ).toBeNull(); }); it.each([ @@ -1571,7 +1809,11 @@ describe('WorkspaceBindingCreator', () => { }); await render(); await click('Create session'); - expect(sessionStorage.length).toBe(1); + expect( + sessionStorage.getItem( + `qwen-managed-workspace-create:${provider.storageKey}`, + ), + ).not.toBeNull(); await click('Retry the same request'); expect(createEmpty).toHaveBeenCalledTimes(2); expect(createEmpty.mock.calls[1]).toEqual(createEmpty.mock.calls[0]); @@ -1694,7 +1936,11 @@ describe('WorkspaceBindingCreator', () => { ); await render(); await click('Create session'); - expect(sessionStorage.length).toBe(0); + expect( + sessionStorage.getItem( + `qwen-managed-workspace-create:${provider.storageKey}`, + ), + ).toBeNull(); expect(container.querySelector('#managed-workspace-cwd')).not.toBeNull(); expect(container.textContent).toContain('invalid directory'); }); diff --git a/packages/web-shell/client/components/managed/WorkspaceBindingCreator.tsx b/packages/web-shell/client/components/managed/WorkspaceBindingCreator.tsx index 4e8fb63dca..fa3ff66e66 100644 --- a/packages/web-shell/client/components/managed/WorkspaceBindingCreator.tsx +++ b/packages/web-shell/client/components/managed/WorkspaceBindingCreator.tsx @@ -3,6 +3,7 @@ import shellStyles from '../../App.module.css'; import { useI18n } from '../../i18n'; import { ChatEditor } from '../ChatEditor'; import { WelcomeHeader } from '../WelcomeHeader'; +import { AddWorkspaceDialog } from '../dialogs/AddWorkspaceDialog'; import type { ComposerSubmitCommit, EditorHandle, @@ -59,6 +60,8 @@ interface PendingCreation { interface PendingWorkspace { displayName: string; idempotencyKey: string; + sourceWorkspaceId?: string; + cwdRelative?: string; } function validWorkspaceName(value: string): boolean { @@ -77,6 +80,10 @@ function readPendingWorkspace(key: string): PendingWorkspace | undefined { typeof item['idempotencyKey'] === 'string' && item['idempotencyKey'].length > 0 && item['idempotencyKey'].length <= 128 && + ((item['sourceWorkspaceId'] === undefined && + item['cwdRelative'] === undefined) || + (typeof item['sourceWorkspaceId'] === 'string' && + typeof item['cwdRelative'] === 'string')) && !('nodeId' in item) && !('path' in item) && !('operationId' in item) @@ -84,6 +91,8 @@ function readPendingWorkspace(key: string): PendingWorkspace | undefined { return { displayName: item['displayName'], idempotencyKey: item['idempotencyKey'], + sourceWorkspaceId: item['sourceWorkspaceId'] as string | undefined, + cwdRelative: item['cwdRelative'] as string | undefined, }; } } catch { @@ -170,6 +179,12 @@ export function WorkspaceBindingCreator({ const workspaceCreatingRef = useRef(false); const [workspaceError, setWorkspaceError] = useState(); const [canCreateWorkspace, setCanCreateWorkspace] = useState(false); + const [canSelectDirectory, setCanSelectDirectory] = useState(false); + const [directorySource, setDirectorySource] = useState(''); + const [directoryPicker, setDirectoryPicker] = useState<{ + workspaceId: string; + root: string; + }>(); const [supportsApprovalModeSelection, setSupportsApprovalModeSelection] = useState(false); const [sessionOptions, setSessionOptions] = useState< @@ -179,10 +194,18 @@ export function WorkspaceBindingCreator({ const [optionsError, setOptionsError] = useState(); const [optionsRevision, setOptionsRevision] = useState(0); const [items, setItems] = useState([]); - const [selected, setSelected] = useState(''); + const selectionKey = `qwen-managed-workspace-selection:${provider.storageKey}`; + const [selected, setSelected] = useState(() => { + try { + return sessionStorage.getItem(selectionKey) ?? ''; + } catch { + return ''; + } + }); const selectedRef = useRef(selected); selectedRef.current = selected; const [cwdRelative, setCwdRelative] = useState('.'); + const cwdEdited = useRef(false); const [agentId, setAgentId] = useState(binding.agentId); const modelPresets = binding.modelPresets ?? []; const availableModels = [ @@ -213,6 +236,14 @@ export function WorkspaceBindingCreator({ return () => abort.abort(); }, [pendingKey]); + useEffect(() => { + try { + sessionStorage.setItem(selectionKey, selected); + } catch { + /* Selection is advisory. */ + } + }, [selectionKey, selected]); + function updatePending(value?: PendingCreation) { pendingRef.current = value; setPending(value); @@ -235,6 +266,7 @@ export function WorkspaceBindingCreator({ if (abort.signal.aborted) return; setSupported(page.supported); setCanCreateWorkspace(page.canCreateWorkspace === true); + setCanSelectDirectory(page.canSelectDirectory === true); setSupportsApprovalModeSelection( page.supportsApprovalModeSelection === true, ); @@ -255,6 +287,8 @@ export function WorkspaceBindingCreator({ signal: abort.signal, }); if (abort.signal.aborted) return; + if (!cwdEdited.current) + setCwdRelative(retained.defaultCwdRelative ?? '.'); setItems((current) => [ ...new Map( [...current, retained].map((item) => [item.workspaceId, item]), @@ -266,7 +300,7 @@ export function WorkspaceBindingCreator({ ? (page.defaultWorkspace?.workspaceId ?? '') : '', ); - setCwdRelative('.'); + setCwdRelative(page.defaultWorkspace?.defaultCwdRelative ?? '.'); } } catch (failure) { if (abort.signal.aborted) return; @@ -282,7 +316,7 @@ export function WorkspaceBindingCreator({ ? (page.defaultWorkspace?.workspaceId ?? '') : '', ); - setCwdRelative('.'); + setCwdRelative(page.defaultWorkspace?.defaultCwdRelative ?? '.'); } else { setError( `${t('managed.workspaceLoadFailed')} ${message(failure)}`, @@ -291,11 +325,13 @@ export function WorkspaceBindingCreator({ } } else { setSelected(page.defaultWorkspace?.workspaceId ?? ''); + setCwdRelative(page.defaultWorkspace?.defaultCwdRelative ?? '.'); } } catch (failure) { if (abort.signal.aborted) return; setSupported(false); setCanCreateWorkspace(false); + setCanSelectDirectory(false); setSupportsApprovalModeSelection(false); setError( failure instanceof JavaManagedAgentHttpError && failure.status === 404 @@ -548,18 +584,37 @@ export function WorkspaceBindingCreator({ if (!workspaceId) return; if (workspaceId === selected) return; setError(undefined); - if (cwdRelative !== '.') setSwitchTo(workspaceId); - else setSelected(workspaceId); + if ( + cwdRelative !== + (items.find((item) => item.workspaceId === selected) + ?.defaultCwdRelative ?? '.') + ) + setSwitchTo(workspaceId); + else selectWorkspace(workspaceId); } - async function createWorkspace() { + function selectWorkspace(workspaceId: string) { + setSelected(workspaceId); + setCwdRelative( + items.find((item) => item.workspaceId === workspaceId) + ?.defaultCwdRelative ?? '.', + ); + cwdEdited.current = false; + } + + async function createWorkspace( + directory?: Omit, + ) { const abort = commandLifetime.current; if ( !interactive || !abort || abort.signal.aborted || !binding.createWorkspace || - !canCreateWorkspace || + !(directory?.sourceWorkspaceId || + pendingWorkspaceRef.current?.sourceWorkspaceId + ? canSelectDirectory + : canCreateWorkspace) || busy || pendingRef.current || workspaceCreatingRef.current @@ -568,16 +623,23 @@ export function WorkspaceBindingCreator({ let attempt = pendingWorkspaceRef.current; const firstSubmission = !attempt; if (!attempt) { - const displayName = workspaceName.trim(); + const displayName = (directory?.displayName ?? workspaceName).trim(); if (!validWorkspaceName(displayName)) { setWorkspaceError(t('managed.newWorkspaceNameInvalid')); + if (directory) throw new Error(t('managed.newWorkspaceNameInvalid')); return; } - attempt = { displayName, idempotencyKey: managedRequestId() }; + attempt = { + ...directory, + displayName, + idempotencyKey: managedRequestId(), + }; try { sessionStorage.setItem(workspacePendingKey, JSON.stringify(attempt)); } catch { setWorkspaceError(t('managed.workspaceStorageUnavailable')); + if (directory) + throw new Error(t('managed.workspaceStorageUnavailable')); return; } pendingWorkspaceRef.current = attempt; @@ -589,7 +651,15 @@ export function WorkspaceBindingCreator({ setWorkspaceError(undefined); try { const created = await binding.createWorkspace( - { displayName: attempt.displayName }, + { + displayName: attempt.displayName, + ...(attempt.sourceWorkspaceId + ? { + sourceWorkspaceId: attempt.sourceWorkspaceId, + cwdRelative: attempt.cwdRelative, + } + : {}), + }, { clientId, idempotencyKey: attempt.idempotencyKey, @@ -603,7 +673,8 @@ export function WorkspaceBindingCreator({ ).values(), ]); setSelected(created.workspaceId); - setCwdRelative('.'); + setCwdRelative(created.defaultCwdRelative ?? '.'); + cwdEdited.current = false; pendingWorkspaceRef.current = undefined; setPendingWorkspace(undefined); try { @@ -620,6 +691,8 @@ export function WorkspaceBindingCreator({ failure instanceof JavaManagedAgentHttpError && [ 'invalid_workspace_name', + 'invalid_cwd', + 'invalid_request', 'invalid_idempotency_key', 'workspace_creation_unavailable', ].includes(failure.code) @@ -633,6 +706,7 @@ export function WorkspaceBindingCreator({ } } setWorkspaceError(message(failure)); + if (directory) setWorkspaceDialogOpen(true); } finally { workspaceCreatingRef.current = false; if (!abort.signal.aborted) setWorkspaceCreating(false); @@ -641,9 +715,28 @@ export function WorkspaceBindingCreator({ const directInput = Boolean(binding.createSession); const workspaceCreationSupported = Boolean( - canCreateWorkspace && binding.createWorkspace, + (canCreateWorkspace || canSelectDirectory) && binding.createWorkspace, ); + async function browseDirectories() { + const workspaceId = + directorySource || + items.find((item) => item.canSelectDirectory)?.workspaceId; + if (!workspaceId || !binding.directories) return; + setWorkspaceError(undefined); + try { + const result = await binding.directories( + { workspaceId, cwdRelative: '.' }, + { clientId, signal: commandLifetime.current?.signal }, + ); + if (commandLifetime.current?.signal.aborted) return; + setDirectoryPicker({ workspaceId, root: result.root }); + setWorkspaceDialogOpen(false); + } catch (failure) { + setWorkspaceError(message(failure)); + } + } + return (
{ + cwdEdited.current = true; setCwdRelative(event.target.value); setPathError(undefined); }} @@ -1038,7 +1132,10 @@ export function WorkspaceBindingCreator({ !approvalReady } dialogOpen={ - !interactive || workspaceDialogOpen || registrationOpen + !interactive || + workspaceDialogOpen || + Boolean(directoryPicker) || + registrationOpen } isPreparing={busy || loading || optionsLoading} placeholderText={t('managed.prompt')} @@ -1061,6 +1158,7 @@ export function WorkspaceBindingCreator({ disabled={busy || Boolean(pending)} aria-invalid={Boolean(pathError)} onChange={(event) => { + cwdEdited.current = true; setCwdRelative(event.target.value); setPathError(undefined); }} @@ -1088,6 +1186,54 @@ export function WorkspaceBindingCreator({
)} + {interactive && directoryPicker && binding.directories && ( + setDirectoryPicker(undefined)} + onSuggest={async (prefix) => { + const root = directoryPicker.root; + const clean = prefix.replace(/\/+$/, ''); + if (clean !== root && !clean.startsWith(`${root}/`)) + throw new Error(t('managed.workspaceDirectoryScope')); + const result = await binding.directories!( + { + workspaceId: directoryPicker.workspaceId, + cwdRelative: clean.slice(root.length + 1) || '.', + }, + { clientId, signal: commandLifetime.current?.signal }, + ); + return { + dir: clean, + sep: '/', + truncated: result.truncated, + suggestions: result.directories.map((item) => ({ + name: item.name, + path: `${root}/${item.cwdRelative}`, + })), + }; + }} + onAdd={async (path, _persist, displayName) => { + const root = directoryPicker.root; + const clean = path.replace(/\/+$/, ''); + if (clean !== root && !clean.startsWith(`${root}/`)) + throw new Error(t('managed.workspaceDirectoryScope')); + await createWorkspace({ + displayName: + displayName || + workspaceName || + clean.split('/').pop() || + 'Workspace', + sourceWorkspaceId: directoryPicker.workspaceId, + cwdRelative: clean.slice(root.length + 1) || '.', + }); + }} + /> + )} {interactive && binding.registration && ( - + { + if (directoryPicker) event.preventDefault(); + }} + >
{ @@ -1128,6 +1279,55 @@ export function WorkspaceBindingCreator({ {t('managed.newWorkspaceDescription')} + {canSelectDirectory && binding.directories && !pendingWorkspace && ( +
+ + + +
+ )} + {pendingWorkspace?.sourceWorkspaceId && ( +

+ {t('managed.workspaceDirectory')}:{' '} + {pendingWorkspace.cwdRelative} +

+ )}
)} - {tool.toolResult && ( - - )} + {tool.toolResult && + (expanded || + tool.toolResult.execution_status !== 'success' || + tool.toolResult.capture_status === 'partial' || + tool.toolResult.capture_status === 'unavailable' || + tool.toolResult.delivery_status !== 'committed') && ( + + )} ); }, areToolLinePropsEqual); diff --git a/packages/web-shell/client/i18n.tsx b/packages/web-shell/client/i18n.tsx index b7c49b8cba..42e902c8ff 100644 --- a/packages/web-shell/client/i18n.tsx +++ b/packages/web-shell/client/i18n.tsx @@ -298,14 +298,20 @@ const EN: Messages = { 'managed.approvalFixed': 'Approval mode is fixed for this task. Start a new task to choose another mode.', 'managed.newWorkspaceDescription': - 'Create an empty workspace for Managed tasks.', + 'Choose an existing project directory, or name a new empty workspace.', + 'managed.workspaceDirectoryRoot': 'Authorized Linux directories', + 'managed.workspaceDirectoryHint': + 'Choose an existing project on the Linux execution host within this authorized root.', + 'managed.workspaceChooseDirectory': 'Choose existing directory', + 'managed.workspaceDirectoryScope': + 'Choose a directory inside the selected root.', 'managed.newWorkspaceName': 'Workspace name', 'managed.newWorkspaceNameInvalid': 'Use a name of 1–128 characters without control characters.', 'managed.newWorkspaceCreate': 'Create workspace', 'managed.newWorkspaceCreating': 'Creating workspace…', 'managed.newWorkspaceUncertain': - 'The creation is not yet confirmed. Retry to check the same workspace.', + 'The creation is not yet confirmed. Retry to check the same workspace, or abandon local confirmation to start again. Abandoning does not delete a workspace that may already exist.', 'managed.newWorkspaceResume': 'Resume workspace creation', 'managed.newWorkspaceClose': 'Close', 'managed.workspaceUnsupported': @@ -4669,13 +4675,20 @@ const ZH: Messages = { 'managed.approvalOptionsLoadFailed': '加载审批策略失败。', 'managed.approvalOptionsInvalid': '服务返回了不支持的审批策略。', 'managed.approvalFixed': '当前任务的审批策略已固定;如需更换,请新建任务。', - 'managed.newWorkspaceDescription': '为托管任务创建一个空工作区。', + 'managed.newWorkspaceDescription': + '选择已有项目目录,或输入名称创建空工作区。', + 'managed.workspaceDirectoryRoot': '已授权的 Linux 目录', + 'managed.workspaceDirectoryHint': + '选择此授权根目录内、位于 Linux 执行机器上的已有项目。', + 'managed.workspaceChooseDirectory': '选择已有目录', + 'managed.workspaceDirectoryScope': '请选择已选根目录中的目录。', 'managed.newWorkspaceName': '工作区名称', 'managed.newWorkspaceNameInvalid': '名称需为 1–128 个字符,不能包含控制字符。', 'managed.newWorkspaceCreate': '创建工作区', 'managed.newWorkspaceCreating': '正在创建工作区…', - 'managed.newWorkspaceUncertain': '创建结果尚未确认,重试将查询同一个工作区。', + 'managed.newWorkspaceUncertain': + '创建结果尚未确认。重试将查询同一个工作区,也可放弃本地确认后重新开始。放弃不会删除可能已经创建的工作区。', 'managed.newWorkspaceResume': '继续确认工作区创建', 'managed.newWorkspaceClose': '关闭', 'managed.workspaceUnsupported': '当前服务不支持工作区绑定。',