diff --git a/deploy/k2-resident/README.md b/deploy/k2-resident/README.md index 60a41dce260..227711565ff 100644 --- a/deploy/k2-resident/README.md +++ b/deploy/k2-resident/README.md @@ -33,7 +33,7 @@ does not contact the cluster or database. From the server package, invoke the built operator with: ```bash -java -Dloader.main=com.alibaba.qwen.code.managedagent.service.WorkspaceCsiProtectionMain \ +java -Dloader.main=com.alibaba.qwen.code.managedagent.workspace.runtime.WorkspaceCsiProtectionMain \ -cp target/qwen-managed-agent-server-0.1.0-alpha-csi-runtime.jar \ org.springframework.boot.loader.launch.PropertiesLauncher \ /absolute/path/registration.json resident-protection resident-binding diff --git a/deploy/k2-resident/README.zh-CN.md b/deploy/k2-resident/README.zh-CN.md index 5713ce288e8..3fbc9b1e1e1 100644 --- a/deploy/k2-resident/README.zh-CN.md +++ b/deploy/k2-resident/README.zh-CN.md @@ -26,7 +26,7 @@ Kubernetes JSON List,不访问集群或数据库。在 server 包目录中调 operator: ```bash -java -Dloader.main=com.alibaba.qwen.code.managedagent.service.WorkspaceCsiProtectionMain \ +java -Dloader.main=com.alibaba.qwen.code.managedagent.workspace.runtime.WorkspaceCsiProtectionMain \ -cp target/qwen-managed-agent-server-0.1.0-alpha-csi-runtime.jar \ org.springframework.boot.loader.launch.PropertiesLauncher \ /absolute/path/registration.json resident-protection resident-binding diff --git a/docs/design/2026-10-12-csi-session-authority-block.md b/docs/design/2026-10-12-csi-session-authority-block.md index 99ffe57123f..e380e43dec2 100644 --- a/docs/design/2026-10-12-csi-session-authority-block.md +++ b/docs/design/2026-10-12-csi-session-authority-block.md @@ -97,7 +97,7 @@ MQ wake claims use the same durable legacy-mutation guard before inserting or ad Ordinary publication refuses private Sessions when allocating a read lease or PUT attempt. Session profile and request pin are fixed at creation; supported APIs never convert an ordinary Session into a private Session. Admitted leases continue checking expiration and retirement, and close only removes that lease. Admitted PUTs must record RETURNED or UNKNOWN without losing physical-write evidence to another admission check. These settlement operations do not need another journal-head lock. Collector guards and lock order remain intact. Main's budget assertions are unchanged: 4 statements for an empty materialization tick, 35 for a full batch and 17 for its tail, and 6 locked head reads in the exercised publication path. -Broker and Server share the identity implementation. The former `com.alibaba.qwen.code.managedagent.service.WorkspaceCsiRuntimeIdentity` retains its public static `verify`, `boot` and `expectedPod` methods, delegating to Broker. The former entry point is deprecated without duplicating validation logic. The added Broker API and feature still require maintainer review. +Broker and Server share the identity implementation. The Spring adapter `com.alibaba.qwen.code.managedagent.workspace.runtime.WorkspaceCsiRuntimeIdentity` retains its public static `verify`, `boot` and `expectedPod` methods, delegating to Broker. The adapter is deprecated without duplicating validation logic. The added Broker API and feature still require maintainer review. Integration with main retains ordinary Monitor control classification, exact watch ownership, exit-evidence settlement and hold-row fencing. Private CSI history dispatch still requires the original READY owner and its own control fence. Every generic control, including Monitor, refuses a private CSI Runtime before transport. These are separate existing paths; the integration adds no private Monitor or Hosted entry point. diff --git a/docs/design/2026-10-12-csi-session-authority-block.zh-CN.md b/docs/design/2026-10-12-csi-session-authority-block.zh-CN.md index 5f4abade31f..2e9da3cabdf 100644 --- a/docs/design/2026-10-12-csi-session-authority-block.zh-CN.md +++ b/docs/design/2026-10-12-csi-session-authority-block.zh-CN.md @@ -84,7 +84,7 @@ MQ wake claim 在插入或推进 `journal_wake` 进度、调度 Hosted activatio 普通 publication 在分配读取租约和 PUT attempt 时拒绝私有 Session。Session 的 profile 与请求 pin 在创建时确定,支持的 API 不会将普通 Session 转换为私有 Session。已准入租约继续检查到期与退役,close 只清除该租约;已准入 PUT 必须记录 RETURNED 或 UNKNOWN,不能因再次准入而丢失物理写入证据。这些收尾操作无需再次锁 journal head。collector 的私有检查和锁顺序继续保留。主干的预算断言不变:空 materialize tick 为 4 条语句,完整批次为 35 条、末批为 17 条,受测 publish 路径为 6 次 head 加锁读取。 -身份实现由 Broker 与 Server 共享;旧 `com.alibaba.qwen.code.managedagent.service.WorkspaceCsiRuntimeIdentity` 保留已公开的 `verify`、`boot` 与 `expectedPod` 静态方法,并委托给 Broker 实现。旧入口标记为 deprecated,不复制身份验证逻辑。新增的 Broker API 与本 feature 仍需 maintainer 评审。 +身份实现由 Broker 与 Server 共享;Spring 适配器 `com.alibaba.qwen.code.managedagent.workspace.runtime.WorkspaceCsiRuntimeIdentity` 保留已公开的 `verify`、`boot` 与 `expectedPod` 静态方法,并委托给 Broker 实现。该适配器标记为 deprecated,不复制身份验证逻辑。新增的 Broker API 与本 feature 仍需 maintainer 评审。 与主干整合时保留普通 Monitor control 分类、准确 watch ownership、exit-evidence 收尾与 hold-row 栅栏。私有 CSI history dispatch 继续要求原 READY owner 及独立 control 栅栏。所有通用 control(包括 Monitor)在 transport 前拒绝私有 CSI Runtime。这是两条既有路径,整合不新增私有 Monitor 或 Hosted 入口。 diff --git a/docs/design/2026-10-19-managed-agent-package-boundaries.md b/docs/design/2026-10-19-managed-agent-package-boundaries.md new file mode 100644 index 00000000000..98d1da15955 --- /dev/null +++ b/docs/design/2026-10-19-managed-agent-package-boundaries.md @@ -0,0 +1,84 @@ +# Managed Agent Server package boundaries + +[English](2026-10-19-managed-agent-package-boundaries.md) | [简体中文](2026-10-19-managed-agent-package-boundaries.zh-CN.md) + +Status: implemented and verified locally on main base `f37e003d9450`. Remote CI and formal review are tracked on [PR #14710](https://github.com/QwenLM/qwen-code/pull/14710). The optional MySQL, Hosted and Linux fault profiles were not run locally for this package reorganization. + +## Problem and current state + +Managed Agent Server is one Spring Boot application and Maven module. Before this change, its `service` and `store` packages contained unrelated business capabilities, while application and persistence code imported request models, tenant context, Workspace selection and exceptions from `api`. Runtime Broker combined its orchestration, providers and HTTP adapters in one package. This made responsibility and dependency direction difficult to see. + +The existing [source-layout decision](2026-10-15-managed-agent-server-layout.md) remains valid: the Broker does not need a separately published artifact for its single production consumer. This change organizes Java packages inside that application. + +## Goals and scope + +- Keep one Maven module and one service deployment. +- Remove application and persistence dependencies on the HTTP controller package. +- Group Session, Workspace, Artifact, Channel, Automation, catalog and event components by responsibility. +- Separate Broker provisioning, transport and credential protection from its execution and repository core. +- Preserve HTTP contracts, authentication, SQL bytes, transaction boundaries, persisted identities and recovery behavior. + +This is a source organization change. It does not redesign persistence, introduce new service interfaces, split the deployment, or change the maintenance application's component-scan boundary. + +## Proposed structure + +```text +com.alibaba.qwen.code +├── managedagent +│ ├── api HTTP controllers, filters and response mapping +│ ├── model Shared request/response and stored value types +│ ├── exception Shared application errors +│ ├── security Writer credentials and route policy +│ ├── session Session and command orchestration +│ ├── workspace Workspace services and selection +│ │ └── runtime Workspace runtime integration and recovery commands +│ ├── artifact Artifact access and object-storage contracts +│ ├── channel Channel service and adapter models +│ ├── automation Scheduling and automation service +│ ├── catalog Agent definitions, skills, hooks and MCP catalogs +│ ├── event Committed event publication and delivery +│ ├── persistence Shared SQL aggregate and transaction implementation +│ ├── harness Hosted Harness integration +│ ├── config Spring configuration +│ └── preflight Startup checks +├── runtimebroker +│ ├── provisioning Physical runtime providers and provider protocols +│ ├── transport Runtime HTTP transport and wire protocols +│ ├── security Credential encryption +│ ├── managedschema Shared database schema +│ └── managedworkspace Workspace contracts +└── maintenance Independently configured maintenance application +``` + +## Decisions and constraints + +Request/response records and validation annotations move together without changing JSON names, deserializers or validation. The shared application exception keeps its existing status, code, details and cause semantics; only its name and ownership change. HTTP error-envelope translation remains in `api`. + +Session, Workspace and publication persistence share package-private transaction operations. Keep that aggregate in one `persistence` package rather than exposing its locks and mutation helpers to divide it by business labels. Independent object-storage contracts and event interfaces move to their owning capability. Move canonical request digests out of the former service package so persistence can use the same digest implementation. + +Broker providers and transports use existing protocol validators and value operations. Expose only the existing members consumed across the new package boundaries. Keep local-process state and SQL implementation helpers package-private. Update tests to follow the package whose internals they exercise; avoid making production internals public solely for a test. Two test-only access fixtures forward existing Broker-core and HTTP-transport seams across packages without exposing those production internals. + +Broker-core repositories use `transport.ManagedHoldFamily` to classify stored dispatch modes. Its dispatch-mode lookup is public for that core consumer, and `ToolHoldRow` stays in the core with the inventory repositories. Rebase validation compiles the updated core and transport consumers together. + +Keep the server's Spring Boot application at its existing root and the maintenance configuration outside that root. Update imports, fully qualified names, launcher configuration, current documentation links and any source-file references together. Preserve resource paths, Maven test profiles, fault gates and the Broker's separate Checkstyle execution. + +## Risks and validation + +The principal risks are implicit same-package references, accidental Spring component discovery changes, stale command entry points, test helpers that rely on package access and incomplete documentation links. Inventory all production and test classes before and after the move, compile all sources, run affected tests and full Maven verification with JDK 21, and inspect the packaged application. Build the Java SDK from this checkout and prepare Core/CLI outputs for native conformance tests. + +Compare source bodies after normalizing package names, imports and required visibility changes. Check that application and persistence packages no longer import `managedagent.api`, Broker remains independent of Spring and control-plane classes, and SQL/OpenAPI resources are unchanged. Run formatting, reference checks and two clean self-audit passes. Report skipped environment-specific profiles separately; ordinary Java tests do not establish MySQL or Linux recovery acceptance. + +Local verification with JDK 21 passed: + +- `mvn clean verify`: 4,796 tests, zero failures/errors and 18 existing skips; both Checkstyle executions and SpotBugs reported zero findings. All existing Maven verification gates remain enabled. +- Root `npm run build` and `npm run typecheck`, all 39 affected script tests, targeted ESLint, and Javadoc reference checks passed. +- All 322 production source bodies are unchanged after namespace/import/visibility normalization. All 877 compiled classes and 16,860 declaration signatures are retained, with no reduction of existing public access. +- All seven executable JARs contain the expected entry points and unchanged resources. Four maintenance entry points reject empty arguments before file, database or cloud access. + +## Acceptance criteria + +All original classes and resources remain present under their new ownership, existing routes and wire contracts pass their regression tests, and standard Maven verification passes without disabling a gate. Shared SQL transaction helpers retain their package access. Application and persistence code have no imports from the controller package. Both design documents and current build/maintenance instructions reflect the final structure. + +## Open questions + +None for this package reorganization. A later independent consumer or a concrete need for compilation isolation can justify Maven modules. diff --git a/docs/design/2026-10-19-managed-agent-package-boundaries.zh-CN.md b/docs/design/2026-10-19-managed-agent-package-boundaries.zh-CN.md new file mode 100644 index 00000000000..4e9667c95da --- /dev/null +++ b/docs/design/2026-10-19-managed-agent-package-boundaries.zh-CN.md @@ -0,0 +1,84 @@ +# Managed Agent Server 包边界 + +[English](2026-10-19-managed-agent-package-boundaries.md) | [简体中文](2026-10-19-managed-agent-package-boundaries.zh-CN.md) + +状态:已在主干基点 `f37e003d9450` 上实现并完成本地验证。远端 CI 与正式评审状态见 [PR #14710](https://github.com/QwenLM/qwen-code/pull/14710)。本次包调整未在本地运行可选的 MySQL、Hosted 和 Linux 故障专项 profile。 + +## 问题与现状 + +Managed Agent Server 是一个 Spring Boot 应用和 Maven 模块。调整前,`service` 和 `store` 包混合了多个业务能力,应用与持久化代码还从 `api` 引用请求模型、租户上下文、Workspace 选择及异常。Runtime Broker 则将编排、供应器和 HTTP 适配器放在同一个包中,难以直接看出职责和依赖方向。 + +既有[源码布局决策](2026-10-15-managed-agent-server-layout.zh-CN.md)仍然适用:Broker 只有一个生产消费方,无需为此单独发布产物。本次调整应用内部的 Java 包组织。 + +## 目标与范围 + +- 保留一个 Maven 模块和一个服务部署。 +- 消除应用与持久化代码对 HTTP 控制器包的依赖。 +- 按职责组织 Session、Workspace、Artifact、Channel、Automation、目录和事件组件。 +- 将 Broker 的供应、传输和凭据保护与执行及仓储核心分开。 +- 保留 HTTP 契约、认证、SQL 字节、事务边界、持久化身份和恢复行为。 + +本次仅调整源码组织,不重新设计持久化,不引入新的服务接口,不拆分部署,也不改变维护应用的组件扫描边界。 + +## 目标结构 + +```text +com.alibaba.qwen.code +├── managedagent +│ ├── api HTTP 控制器、过滤器与响应映射 +│ ├── model 共享请求响应与存储值类型 +│ ├── exception 共享应用异常 +│ ├── security Writer 凭据与路由策略 +│ ├── session Session 与命令编排 +│ ├── workspace Workspace 服务与选择 +│ │ └── runtime Workspace Runtime 集成与恢复命令 +│ ├── artifact 产物访问与对象存储契约 +│ ├── channel Channel 服务与适配器模型 +│ ├── automation 调度与自动化服务 +│ ├── catalog Agent 定义、Skill、Hook 和 MCP 目录 +│ ├── event 已提交事件的发布与投递 +│ ├── persistence 共享 SQL 聚合与事务实现 +│ ├── harness Hosted Harness 接入 +│ ├── config Spring 配置 +│ └── preflight 启动检查 +├── runtimebroker +│ ├── provisioning 物理 Runtime 供应器及供应协议 +│ ├── transport Runtime HTTP 传输与线上协议 +│ ├── security 凭据加密 +│ ├── managedschema 共享数据库结构 +│ └── managedworkspace Workspace 契约 +└── maintenance 独立配置的维护应用 +``` + +## 决策与约束 + +请求响应记录与校验注解一起迁移,不改变 JSON 名称、反序列化器或校验规则。共享应用异常保留现有状态、错误码、详情和 cause 语义,只调整名称与归属。HTTP 错误信封映射仍放在 `api`。 + +Session、Workspace 和发布持久化共享包内事务操作。将该聚合保留在同一个 `persistence` 包中,不为按业务名称拆包而公开锁及变更辅助方法。独立的对象存储契约和事件接口归入对应能力。将规范请求摘要移出原服务包,让持久化继续复用同一份摘要实现。 + +Broker 供应器和传输组件复用现有协议校验及值操作,只公开新包边界实际需要访问的既有成员。本地进程状态与 SQL 实现辅助类保留包内可见性。测试跟随其实际验证的内部实现所在包,不仅为了测试而公开生产代码内部成员。两个仅供测试使用的访问夹具跨包转发现有 Broker 核心与 HTTP 传输访问点,避免公开对应的生产代码内部成员。 + +Broker 核心仓储通过 `transport.ManagedHoldFamily` 识别已存储的 dispatch mode。该查询对跨包的核心消费方公开;`ToolHoldRow` 与相关仓储保留在核心包。变基验证需要一起编译更新后的核心与传输层消费方。 + +保留服务端 Spring Boot 应用原有根包,维护配置继续位于该根包之外。同时更新 import、完整类名、启动配置、当前文档链接和源码文件引用。保留资源路径、Maven 测试 profile、故障门禁及 Broker 单独的 Checkstyle 执行。 + +## 风险与验证 + +主要风险是隐式同包引用、Spring 组件发现意外变化、命令入口残留旧名称、测试辅助代码依赖包内访问,以及文档链接更新不完整。迁移前后核对全部生产与测试类清单,编译所有源码,使用 JDK 21 运行相关测试和完整 Maven 验证,并检查打包应用。Java SDK 使用当前检出源码构建,同时准备原生一致性测试所需的 Core/CLI 输出。 + +规范化包名、import 和必要可见性变化后,对比源码主体。检查应用与持久化包不再引用 `managedagent.api`,Broker 继续独立于 Spring 和控制面类,SQL/OpenAPI 资源保持不变。执行格式、引用检查及两遍干净自审。单独报告未运行的环境专用 profile,普通 Java 测试不代表 MySQL 或 Linux 恢复验收。 + +JDK 21 本地验证通过: + +- `mvn clean verify`:4,796 项测试,零失败、零错误,18 项既有跳过;两项 Checkstyle 执行和 SpotBugs 均为零问题。全部既有 Maven 验证门禁保持开启。 +- 根目录 `npm run build`、`npm run typecheck`、全部 39 项相关脚本测试、针对性 ESLint 和 Javadoc 引用检查均通过。 +- 规范化包名、import 和可见性后,全部 322 个生产源码主体保持不变。全部 877 个编译类及 16,860 个声明签名完整保留,既有公开访问权限没有收窄。 +- 7 个可执行 JAR 均包含预期入口和未变的资源。4 个维护入口在访问文件、数据库或云服务之前正确拒绝空参数。 + +## 验收标准 + +所有原有类和资源按新归属完整保留,既有路由与线上契约通过回归测试,标准 Maven 验证通过且未关闭门禁。共享 SQL 事务辅助代码保留包内可见性。应用与持久化代码不从控制器包导入类型。两份设计文档及当前构建、维护说明反映最终结构。 + +## 待定问题 + +本次包调整没有待定问题。后续出现独立消费方或明确的编译隔离需求时,再评估 Maven 多模块。 diff --git a/docs/verification/13532-linux-h3/README.md b/docs/verification/13532-linux-h3/README.md index ae252219815..56991464bc4 100644 --- a/docs/verification/13532-linux-h3/README.md +++ b/docs/verification/13532-linux-h3/README.md @@ -26,7 +26,7 @@ The probe exited 0 because its refusal/control assertions passed. This is not a ## Publication prerequisite -Production [publication configuration](../../../packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ToolPublicationConfiguration.java) is disabled by default. Enabling it requires explicit capacity/deadline budgets and a real regional HTTPS OSS endpoint, region, private bucket without versioning and configured credentials. The [OSS object store constructor](../../../packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/AliyunToolPublicationObjectStore.java) validates bucket versioning and ACL even before a small inline-output control can run. +Production [publication configuration](../../../packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ToolPublicationConfiguration.java) is disabled by default. Enabling it requires explicit capacity/deadline budgets and a real regional HTTPS OSS endpoint, region, private bucket without versioning and configured credentials. The [OSS object store constructor](../../../packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/AliyunToolPublicationObjectStore.java) validates bucket versioning and ACL even before a small inline-output control can run. No explicit Managed Agent test bucket/namespace or publication configuration was found in the bounded acceptance configuration search. General cloud login profiles are not evidence of an approved test bucket. No cloud credentials were copied to the VM or used for this probe. @@ -91,7 +91,7 @@ Broker、Spring SQL Store、打包 CLI 与 Runtime worker 均为真实进程; ## Publication 前置条件 -生产 [publication 配置](../../../packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ToolPublicationConfiguration.java)默认关闭。启用要求显式容量/时限预算、真实区域 HTTPS OSS endpoint、region、私有且未开启版本控制的 bucket,以及配置好的凭据。[OSS 对象存储构造器](../../../packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/AliyunToolPublicationObjectStore.java)会先校验 bucket 版本控制与 ACL,即使只想跑小型 inline-output 控制也一样。 +生产 [publication 配置](../../../packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ToolPublicationConfiguration.java)默认关闭。启用要求显式容量/时限预算、真实区域 HTTPS OSS endpoint、region、私有且未开启版本控制的 bucket,以及配置好的凭据。[OSS 对象存储构造器](../../../packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/AliyunToolPublicationObjectStore.java)会先校验 bucket 版本控制与 ACL,即使只想跑小型 inline-output 控制也一样。 限定范围的验收配置搜索未找到明确的 Managed Agent 测试 bucket/namespace 或 publication 配置。一般云登录 profile 不能证明某 bucket 已指定用于测试。本次没有向 VM 复制或使用云凭据。 diff --git a/packages/managed-agent-server/README.md b/packages/managed-agent-server/README.md index 317f0542b18..85d3a862401 100644 --- a/packages/managed-agent-server/README.md +++ b/packages/managed-agent-server/README.md @@ -16,6 +16,21 @@ authentication and writer credentials" below. 设计说明:[English](../../docs/design/2026-09-19-managed-agent-spring-server.md) | [简体中文](../../docs/design/2026-09-19-managed-agent-spring-server.zh-CN.md) +## Java package layout + +Business components live in `managedagent.session`, `workspace`, `artifact`, +`channel`, `automation`, `catalog` and `event`. Controllers and HTTP filters +remain in `managedagent.api`; shared contracts and application errors live in +`managedagent.model` and `exception`. The shared SQL aggregate remains in +`managedagent.persistence` so its transaction and locking helpers stay +package-private. Broker providers, HTTP adapters and credential protection live +in `runtimebroker.provisioning`, `transport` and `security` respectively. The +separate `maintenance` configuration remains outside the server's component scan. + +These are packages in one Maven module. See the package-boundary design: +[English](../../docs/design/2026-10-19-managed-agent-package-boundaries.md) | +[简体中文](../../docs/design/2026-10-19-managed-agent-package-boundaries.zh-CN.md). + ## Integration status The Hosted path supports durable no-tool Sessions and private Workspace tool @@ -1195,7 +1210,7 @@ crash. Database credentials come from `W1_JDBC_URL`, `W1_JDBC_USER` and ```bash mvn -q -DskipTests compile exec:java \ - -Dexec.mainClass=com.alibaba.qwen.code.managedagent.store.WorkspaceStorageRegistrationMain \ + -Dexec.mainClass=com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageRegistrationMain \ -Dexec.args='register tenant-a storage-a /absolute/canonical/workspace-a --offline-confirmed' ``` @@ -1203,7 +1218,7 @@ The same entry is available from a shipped Spring Boot fat jar, without the sour ```bash java -cp /path/to/app.jar \ - -Dloader.main=com.alibaba.qwen.code.managedagent.store.WorkspaceStorageRegistrationMain \ + -Dloader.main=com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageRegistrationMain \ org.springframework.boot.loader.launch.PropertiesLauncher \ register tenant-a storage-a /absolute/canonical/workspace-a '' --offline-confirmed ``` diff --git a/packages/managed-agent-server/docs/runtime-broker.md b/packages/managed-agent-server/docs/runtime-broker.md index 821f64bd71a..159c7fe9de2 100644 --- a/packages/managed-agent-server/docs/runtime-broker.md +++ b/packages/managed-agent-server/docs/runtime-broker.md @@ -7,6 +7,11 @@ and JDBC implementations; and a framework-neutral service that composes authoritative scope resolution, Runtime provisioning, and Runtime transport adapters. +Runtime providers and their deployment protocols are in `runtimebroker.provisioning`, +HTTP adapters and wire protocols in `runtimebroker.transport`, and credential +encryption in `runtimebroker.security`. The execution and repository core stays +in the parent package; the application still builds all of them in one Maven module. + The service acquires operation and dispatch leases, renews them while external work is in flight, converges idempotent Tool execution, records cancellation intent, and fails ambiguous dispatch outcomes as `UNKNOWN`. diff --git a/packages/managed-agent-server/pom.xml b/packages/managed-agent-server/pom.xml index 1bcafd09514..cc7ca1120bf 100644 --- a/packages/managed-agent-server/pom.xml +++ b/packages/managed-agent-server/pom.xml @@ -144,7 +144,7 @@ repackage workspace-bundle - com.alibaba.qwen.code.managedagent.store.WorkspaceRecoveryMain + com.alibaba.qwen.code.managedagent.persistence.WorkspaceRecoveryMain @@ -152,7 +152,7 @@ repackage workspace-migration - com.alibaba.qwen.code.managedagent.service.WorkspaceMigrationMain + com.alibaba.qwen.code.managedagent.workspace.runtime.WorkspaceMigrationMain @@ -160,7 +160,7 @@ repackage workspace-maintenance-recovery - com.alibaba.qwen.code.managedagent.store.WorkspaceMaintenanceRecoveryMain + com.alibaba.qwen.code.managedagent.persistence.WorkspaceMaintenanceRecoveryMain @@ -168,7 +168,7 @@ repackage csi-session - com.alibaba.qwen.code.managedagent.store.WorkspaceCsiSessionMain + com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiSessionMain @@ -176,7 +176,7 @@ repackage csi-runtime - com.alibaba.qwen.code.managedagent.store.WorkspaceCsiRuntimeMain + com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiRuntimeMain @@ -184,7 +184,7 @@ repackage operator-recovery - com.alibaba.qwen.code.managedagent.service.WorkspaceRecoveryCommand + com.alibaba.qwen.code.managedagent.workspace.runtime.WorkspaceRecoveryCommand diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/AgentDefinitionController.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/AgentDefinitionController.java index 9da44dad64b..7d1110a1777 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/AgentDefinitionController.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/AgentDefinitionController.java @@ -1,9 +1,10 @@ package com.alibaba.qwen.code.managedagent.api; -import com.alibaba.qwen.code.managedagent.api.ApiModels.AgentDefinition; -import com.alibaba.qwen.code.managedagent.api.ApiModels.AgentDefinitionRequest; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentDefinitionService; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentDefinitionService.Result; +import com.alibaba.qwen.code.managedagent.catalog.ManagedAgentDefinitionService; +import com.alibaba.qwen.code.managedagent.catalog.ManagedAgentDefinitionService.Result; +import com.alibaba.qwen.code.managedagent.model.ApiModels.AgentDefinition; +import com.alibaba.qwen.code.managedagent.model.ApiModels.AgentDefinitionRequest; +import com.alibaba.qwen.code.managedagent.model.TenantContext; import jakarta.validation.Valid; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ApiExceptionHandler.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ApiExceptionHandler.java index 9a9f16c0957..3df4075d5c1 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ApiExceptionHandler.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ApiExceptionHandler.java @@ -1,6 +1,8 @@ package com.alibaba.qwen.code.managedagent.api; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationStorageException; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationStorageException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.security.PublicSurface; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -38,8 +40,8 @@ public class ApiExceptionHandler { private static final int LOGGED_FRAMES = 6; private static final int LOGGED_URI_CHARS = 256; - @ExceptionHandler(ApiException.class) - public ResponseEntity> api(ApiException error, + @ExceptionHandler(ManagedAgentException.class) + public ResponseEntity> api(ManagedAgentException error, HttpServletRequest request, HttpServletResponse response) { return response(request, response, error.getStatus(), error.getCode(), error.getMessage(), error.getDetails()); diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedActionController.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedActionController.java index 3a80650d14a..4ecb4579ed4 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedActionController.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedActionController.java @@ -1,14 +1,15 @@ package com.alibaba.qwen.code.managedagent.api; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PermissionResponse; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicActionList; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicCommandOperation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellActionGetRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellActionQueryRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellActionRespondRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellCommandOperation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellPage; -import com.alibaba.qwen.code.managedagent.service.ManagedActionService; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PermissionResponse; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicActionList; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicCommandOperation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellActionGetRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellActionQueryRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellActionRespondRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellCommandOperation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellPage; +import com.alibaba.qwen.code.managedagent.model.TenantContext; +import com.alibaba.qwen.code.managedagent.session.ManagedActionService; import com.fasterxml.jackson.databind.JsonNode; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedArtifactController.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedArtifactController.java index d8defaa818b..da90d31a121 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedArtifactController.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedArtifactController.java @@ -1,13 +1,14 @@ package com.alibaba.qwen.code.managedagent.api; -import com.alibaba.qwen.code.managedagent.api.ApiModels.ArtifactResponse; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicList; -import com.alibaba.qwen.code.managedagent.api.ApiModels.ToolResultResponse; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellArtifactQueryRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellArtifactRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellPage; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellToolResultRequest; -import com.alibaba.qwen.code.managedagent.service.ManagedArtifactService; +import com.alibaba.qwen.code.managedagent.artifact.ManagedArtifactService; +import com.alibaba.qwen.code.managedagent.model.ApiModels.ArtifactResponse; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicList; +import com.alibaba.qwen.code.managedagent.model.ApiModels.ToolResultResponse; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellArtifactQueryRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellArtifactRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellPage; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellToolResultRequest; +import com.alibaba.qwen.code.managedagent.model.TenantContext; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import org.springframework.http.ResponseEntity; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedAutomationController.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedAutomationController.java index f53165eed69..bc4e6cff4ed 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedAutomationController.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedAutomationController.java @@ -1,11 +1,12 @@ package com.alibaba.qwen.code.managedagent.api; -import com.alibaba.qwen.code.managedagent.api.ApiModels.AutomationDefinitionRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicAutomation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicAutomationRun; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicList; -import com.alibaba.qwen.code.managedagent.service.ManagedAutomationService; -import com.alibaba.qwen.code.managedagent.service.ManagedAutomationService.Result; +import com.alibaba.qwen.code.managedagent.automation.ManagedAutomationService; +import com.alibaba.qwen.code.managedagent.automation.ManagedAutomationService.Result; +import com.alibaba.qwen.code.managedagent.model.ApiModels.AutomationDefinitionRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicAutomation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicAutomationRun; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicList; +import com.alibaba.qwen.code.managedagent.model.TenantContext; import org.springframework.http.CacheControl; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedChannelAdapterController.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedChannelAdapterController.java index 1f191bd7a2b..c99d71252b1 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedChannelAdapterController.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedChannelAdapterController.java @@ -1,15 +1,16 @@ package com.alibaba.qwen.code.managedagent.api; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.ChannelInstanceView; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.ClaimRequest; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.ClaimResponse; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.DeliveryView; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.InboundAdmission; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.InboundEventRequest; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.ReceiptRequest; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.RegisterChannelRequest; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.ResendResponse; -import com.alibaba.qwen.code.managedagent.service.ManagedChannelService; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.ChannelInstanceView; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.ClaimRequest; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.ClaimResponse; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.DeliveryView; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.InboundAdmission; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.InboundEventRequest; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.ReceiptRequest; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.RegisterChannelRequest; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.ResendResponse; +import com.alibaba.qwen.code.managedagent.channel.ManagedChannelService; +import com.alibaba.qwen.code.managedagent.model.TenantContext; import jakarta.validation.Valid; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.web.bind.annotation.PathVariable; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedChannelController.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedChannelController.java index 0b861666587..daa6beedc49 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedChannelController.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedChannelController.java @@ -1,9 +1,10 @@ package com.alibaba.qwen.code.managedagent.api; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicChannel; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicChannelDelivery; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicList; -import com.alibaba.qwen.code.managedagent.service.ManagedChannelService; +import com.alibaba.qwen.code.managedagent.channel.ManagedChannelService; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicChannel; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicChannelDelivery; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicList; +import com.alibaba.qwen.code.managedagent.model.TenantContext; import org.springframework.http.CacheControl; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedHookController.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedHookController.java index 407406269b5..646aaf9ee40 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedHookController.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedHookController.java @@ -1,6 +1,7 @@ package com.alibaba.qwen.code.managedagent.api; -import com.alibaba.qwen.code.managedagent.service.ManagedHookCatalogService; +import com.alibaba.qwen.code.managedagent.catalog.ManagedHookCatalogService; +import com.alibaba.qwen.code.managedagent.model.TenantContext; import com.fasterxml.jackson.databind.JsonNode; import org.springframework.http.CacheControl; import org.springframework.http.ResponseEntity; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedMcpController.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedMcpController.java index 6ea358dbe72..4c65cfeda56 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedMcpController.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedMcpController.java @@ -1,6 +1,7 @@ package com.alibaba.qwen.code.managedagent.api; -import com.alibaba.qwen.code.managedagent.service.ManagedMcpCatalogService; +import com.alibaba.qwen.code.managedagent.catalog.ManagedMcpCatalogService; +import com.alibaba.qwen.code.managedagent.model.TenantContext; import com.fasterxml.jackson.databind.JsonNode; import org.springframework.http.CacheControl; import org.springframework.http.ResponseEntity; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedSessionStoreController.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedSessionStoreController.java index 96447297fea..f35523edbbb 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedSessionStoreController.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedSessionStoreController.java @@ -1,21 +1,23 @@ package com.alibaba.qwen.code.managedagent.api; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.AcquireWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.BlockRecoveryRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitReceipt; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitTransactionRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.PublishToolResultRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.RecoveryStateReceipt; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.RenewWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.RestoreHead; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.SealReceipt; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.SealWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.StoredResource; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.ToolResultResourceRef; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.TransactionPage; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.WriterGrant; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.TenantContext; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.AcquireWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.BlockRecoveryRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitReceipt; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitTransactionRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.PublishToolResultRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.RecoveryStateReceipt; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.RenewWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.RestoreHead; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.SealReceipt; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.SealWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.StoredResource; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.ToolResultResourceRef; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.TransactionPage; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.WriterGrant; import jakarta.validation.Valid; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.http.HttpHeaders; @@ -50,7 +52,7 @@ public class ManagedSessionStoreController { try { return new com.alibaba.qwen.code.runtimebroker.RuntimeLifecycleAuthority(operation, Long.parseLong(generation)); } catch (RuntimeException error) { - throw new ApiException(org.springframework.http.HttpStatus.BAD_REQUEST, "invalid_lifecycle_authority", "Invalid lifecycle authority."); + throw new ManagedAgentException(org.springframework.http.HttpStatus.BAD_REQUEST, "invalid_lifecycle_authority", "Invalid lifecycle authority."); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedToolDetailsController.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedToolDetailsController.java index f21d37482bb..f6252d8ded5 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedToolDetailsController.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ManagedToolDetailsController.java @@ -1,8 +1,9 @@ package com.alibaba.qwen.code.managedagent.api; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellToolDetails; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellToolResultRequest; -import com.alibaba.qwen.code.managedagent.service.ManagedToolDetailsService; +import com.alibaba.qwen.code.managedagent.artifact.ManagedToolDetailsService; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellToolDetails; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellToolResultRequest; +import com.alibaba.qwen.code.managedagent.model.TenantContext; import jakarta.validation.Valid; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/PublicAgentController.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/PublicAgentController.java index 22b2e265ca5..c3113cab42a 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/PublicAgentController.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/PublicAgentController.java @@ -1,25 +1,28 @@ package com.alibaba.qwen.code.managedagent.api; -import com.alibaba.qwen.code.managedagent.api.ApiModels.ChangeCwdRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.CommandAdmission; -import com.alibaba.qwen.code.managedagent.api.ApiModels.CreateSessionRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicCommandOperation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicCwdOperation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicItemList; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicList; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicSession; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicTask; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicTaskEvent; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicTurn; -import com.alibaba.qwen.code.managedagent.api.ApiModels.SessionEventRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.UpdateSessionRequest; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentService; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentService.SessionMutationResult; -import com.alibaba.qwen.code.managedagent.service.ManagedEventStreamService; -import com.alibaba.qwen.code.managedagent.service.ManagedTaskCancelService; -import com.alibaba.qwen.code.managedagent.service.ManagedTaskService; -import com.alibaba.qwen.code.managedagent.service.SessionLifecycleService; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.ApiModels.ChangeCwdRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.CommandAdmission; +import com.alibaba.qwen.code.managedagent.model.ApiModels.CreateSessionRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicCommandOperation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicCwdOperation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicItemList; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicList; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicSession; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicTask; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicTaskEvent; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicTurn; +import com.alibaba.qwen.code.managedagent.model.ApiModels.SessionEventRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.UpdateSessionRequest; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.TenantContext; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService.SessionMutationResult; +import com.alibaba.qwen.code.managedagent.session.ManagedEventStreamService; +import com.alibaba.qwen.code.managedagent.session.ManagedTaskCancelService; +import com.alibaba.qwen.code.managedagent.session.ManagedTaskService; +import com.alibaba.qwen.code.managedagent.session.SessionLifecycleService; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import jakarta.validation.Valid; import org.apache.commons.lang3.StringUtils; import org.springframework.http.HttpHeaders; @@ -64,14 +67,14 @@ public class PublicAgentController { WorkspaceSelection selection = null; if (request.workspace() != null) { if (request.workspace().isNull()) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_request", "Workspace cannot be null."); } selection = WorkspaceSelection.parse(request.workspace(), false); tenant.requireActorId(); } if (Boolean.TRUE.equals(request.stream())) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "unsupported_feature", "Phase 1 streams through the Session events route."); } @@ -179,7 +182,7 @@ public class PublicAgentController { request.admissionProfile()); } else if ("agent.session.cancel".equals(request.type())) { if (request.turnId() == null || request.turnId().isBlank()) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "turn_id_required", "Cancellation requires turn_id."); } @@ -187,7 +190,7 @@ public class PublicAgentController { idempotencyKey, sessionId, request.turnId(), request.admissionProfile()); } else { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "unsupported_event", "Phase 1 accepts input message and cancellation events."); } @@ -228,7 +231,7 @@ public class PublicAgentController { try { sequence = Long.parseLong(after); } catch (NumberFormatException error) { - throw new ApiException( + throw new ManagedAgentException( org.springframework.http.HttpStatus.BAD_REQUEST, "invalid_event_cursor", "Item sequence is invalid."); @@ -301,7 +304,7 @@ public class PublicAgentController { } return value; } catch (NumberFormatException error) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_event_cursor", "Last-Event-ID is invalid."); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/SignatureAuthFilter.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/SignatureAuthFilter.java index c67b0e4b4b0..85ef7807ccb 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/SignatureAuthFilter.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/SignatureAuthFilter.java @@ -1,6 +1,7 @@ package com.alibaba.qwen.code.managedagent.api; import com.alibaba.qwen.code.managedagent.config.BrokerSecurity; +import com.alibaba.qwen.code.managedagent.security.PublicSurface; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/SshWorkspaceController.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/SshWorkspaceController.java index af7a70c69d2..e33bb0a7144 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/SshWorkspaceController.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/SshWorkspaceController.java @@ -1,9 +1,10 @@ package com.alibaba.qwen.code.managedagent.api; -import com.alibaba.qwen.code.managedagent.service.SshWorkspaceService; -import com.alibaba.qwen.code.managedagent.service.SshWorkspaceService.Directory; -import com.alibaba.qwen.code.managedagent.service.SshWorkspaceService.NodePage; -import com.alibaba.qwen.code.managedagent.store.SshWorkspaceStore.Operation; +import com.alibaba.qwen.code.managedagent.model.TenantContext; +import com.alibaba.qwen.code.managedagent.persistence.SshWorkspaceStore.Operation; +import com.alibaba.qwen.code.managedagent.workspace.SshWorkspaceService; +import com.alibaba.qwen.code.managedagent.workspace.SshWorkspaceService.Directory; +import com.alibaba.qwen.code.managedagent.workspace.SshWorkspaceService.NodePage; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/TenantContextArgumentResolver.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/TenantContextArgumentResolver.java index 6b2f914dde8..d4e28c9959d 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/TenantContextArgumentResolver.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/TenantContextArgumentResolver.java @@ -1,5 +1,6 @@ package com.alibaba.qwen.code.managedagent.api; +import com.alibaba.qwen.code.managedagent.model.TenantContext; import jakarta.servlet.http.HttpServletRequest; import org.springframework.core.MethodParameter; import org.springframework.stereotype.Component; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/TenantContextFilter.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/TenantContextFilter.java index f6c7aad1353..fca16fbd2ec 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/TenantContextFilter.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/TenantContextFilter.java @@ -1,5 +1,7 @@ package com.alibaba.qwen.code.managedagent.api; +import com.alibaba.qwen.code.managedagent.model.TenantContext; +import com.alibaba.qwen.code.managedagent.security.PublicSurface; import com.alibaba.qwen.code.runtimebroker.managedworkspace.WorkspaceActor; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.FilterChain; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ToolPublicationController.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ToolPublicationController.java index 2b0027a0f31..6d10f403f07 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ToolPublicationController.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ToolPublicationController.java @@ -1,12 +1,14 @@ package com.alibaba.qwen.code.managedagent.api; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitTransactionRequest; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationAdmissionStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationContract; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationDataStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationStore; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.TenantContext; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitTransactionRequest; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationAdmissionStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationContract; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationDataStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationStore; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletRequest; @@ -244,7 +246,7 @@ public class ToolPublicationController { private T limited(Supplier operation) { if (!entries.tryAcquire()) { - throw new ApiException(HttpStatus.TOO_MANY_REQUESTS, + throw new ManagedAgentException(HttpStatus.TOO_MANY_REQUESTS, "managed_tool_publication_busy", "Tool publication entry capacity is exhausted"); } try { @@ -258,7 +260,7 @@ public class ToolPublicationController { try { byte[] body = request.getInputStream().readNBytes(maximum + 1); if (body.length > maximum) { - throw new ApiException(HttpStatus.PAYLOAD_TOO_LARGE, + throw new ManagedAgentException(HttpStatus.PAYLOAD_TOO_LARGE, "managed_tool_publication_too_large", "Tool publication body exceeds its limit"); } return body; @@ -275,7 +277,7 @@ public class ToolPublicationController { private static void requireScope(TenantContext tenant, String sessionId, JsonNode key) { if (!tenant.tenantId().equals(key.path("tenantId").asText()) || !sessionId.equals(key.path("sessionId").asText())) { - throw new ApiException(HttpStatus.NOT_FOUND, + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "managed_tool_publication_scope", "Publication Session scope conflicts"); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/WebShellAgentController.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/WebShellAgentController.java index 677731cfa74..f5c06722290 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/WebShellAgentController.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/WebShellAgentController.java @@ -1,40 +1,44 @@ package com.alibaba.qwen.code.managedagent.api; -import com.alibaba.qwen.code.managedagent.api.ApiModels.CommandAdmission; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellAdmission; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellCancelRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellChangeCwdRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellChangeModelRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellCommandOperation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellCreateRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellCwdOperation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellLifecycleRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellListRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellModelChangeResult; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellOperationRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellPage; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSession; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSessionModels; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSessionModelsRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSessionOptions; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSessionOptionsRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSessionRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellStreamRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSubmitRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTask; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTaskCancelRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTaskEvent; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTaskEventQueryRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTaskGetRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTaskQueryRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTranscript; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTranscriptRequest; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentService; -import com.alibaba.qwen.code.managedagent.service.ManagedEventStreamService; -import com.alibaba.qwen.code.managedagent.service.ManagedTaskCancelService; -import com.alibaba.qwen.code.managedagent.service.ManagedTaskService; -import com.alibaba.qwen.code.managedagent.service.SessionLifecycleService; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.ApiModels; +import com.alibaba.qwen.code.managedagent.model.ApiModels.CommandAdmission; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellAdmission; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellCancelRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellChangeCwdRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellChangeModelRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellCommandOperation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellCreateRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellCwdOperation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellLifecycleRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellListRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellModelChangeResult; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellOperationRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellPage; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSession; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSessionModels; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSessionModelsRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSessionOptions; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSessionOptionsRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSessionRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellStreamRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSubmitRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTask; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTaskCancelRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTaskEvent; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTaskEventQueryRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTaskGetRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTaskQueryRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTranscript; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTranscriptRequest; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.TenantContext; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; +import com.alibaba.qwen.code.managedagent.session.ManagedEventStreamService; +import com.alibaba.qwen.code.managedagent.session.ManagedTaskCancelService; +import com.alibaba.qwen.code.managedagent.session.ManagedTaskService; +import com.alibaba.qwen.code.managedagent.session.SessionLifecycleService; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; @@ -148,7 +152,7 @@ public class WebShellAgentController { WorkspaceSelection selection = null; if (request.workspace() != null) { if (request.workspace().isNull()) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_request", "Workspace cannot be null."); } selection = WorkspaceSelection.parse(request.workspace(), true); @@ -156,12 +160,12 @@ public class WebShellAgentController { } if (request.environmentId() != null && !request.environmentId().isBlank()) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "unsupported_feature", "Standalone Phase 1 has no environment templates."); } if (selection == null && (request.approvalMode() != null || request.planMode() != null)) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "unsupported_approval_mode", "Approval mode selection requires a bound Workspace."); } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/WebShellSkillsController.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/WebShellSkillsController.java index 387e58417ac..9999e168f1e 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/WebShellSkillsController.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/WebShellSkillsController.java @@ -1,8 +1,9 @@ package com.alibaba.qwen.code.managedagent.api; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSessionRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSessionSkills; -import com.alibaba.qwen.code.managedagent.service.ManagedSkillCatalogService; +import com.alibaba.qwen.code.managedagent.catalog.ManagedSkillCatalogService; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSessionRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSessionSkills; +import com.alibaba.qwen.code.managedagent.model.TenantContext; import jakarta.validation.Valid; import org.springframework.http.CacheControl; import org.springframework.http.ResponseEntity; 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 daaabcbb6f2..36826a9e89b 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 @@ -1,9 +1,10 @@ package com.alibaba.qwen.code.managedagent.api; -import com.alibaba.qwen.code.managedagent.service.WorkspaceDiscoveryService; -import com.alibaba.qwen.code.managedagent.service.WorkspaceDiscoveryService.WorkspacePage; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry.WorkspaceSummary; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCreationStore; +import com.alibaba.qwen.code.managedagent.model.TenantContext; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry.WorkspaceSummary; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCreationStore; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceDiscoveryService; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceDiscoveryService.WorkspacePage; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.JsonNode; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/WorkspaceFileController.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/WorkspaceFileController.java index 95e6838677e..65aa5b76a94 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/WorkspaceFileController.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/WorkspaceFileController.java @@ -1,6 +1,7 @@ package com.alibaba.qwen.code.managedagent.api; -import com.alibaba.qwen.code.managedagent.store.WorkspaceFileStore; +import com.alibaba.qwen.code.managedagent.model.TenantContext; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceFileStore; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.databind.JsonNode; import jakarta.validation.Valid; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/AliyunToolPublicationObjectStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/AliyunToolPublicationObjectStore.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/AliyunToolPublicationObjectStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/AliyunToolPublicationObjectStore.java index af4a8911f97..d1d0f709e50 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/AliyunToolPublicationObjectStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/AliyunToolPublicationObjectStore.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.artifact; import com.aliyun.oss.ClientConfiguration; import com.aliyun.oss.ClientException; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedArtifactPolicy.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/ManagedArtifactPolicy.java similarity index 89% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedArtifactPolicy.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/ManagedArtifactPolicy.java index 9ab3b2be3db..583cd0eadb1 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedArtifactPolicy.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/ManagedArtifactPolicy.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.artifact; public interface ManagedArtifactPolicy { /** A stable configuration fingerprint that changes whenever a policy decision changes. */ diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedArtifactService.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/ManagedArtifactService.java similarity index 89% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedArtifactService.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/ManagedArtifactService.java index 4e7adaf85da..e498068b062 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedArtifactService.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/ManagedArtifactService.java @@ -1,16 +1,17 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.artifact; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.ArtifactAccess; -import com.alibaba.qwen.code.managedagent.api.ApiModels.ArtifactResponse; -import com.alibaba.qwen.code.managedagent.api.ApiModels.ToolResultResponse; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellPage; -import com.alibaba.qwen.code.managedagent.api.TenantContext; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedArtifactReader; -import com.alibaba.qwen.code.managedagent.store.ManagedToolResultStore; -import com.alibaba.qwen.code.managedagent.store.ManagedToolResultStore.Artifact; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.ApiModels.ArtifactAccess; +import com.alibaba.qwen.code.managedagent.model.ApiModels.ArtifactResponse; +import com.alibaba.qwen.code.managedagent.model.ApiModels.ToolResultResponse; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellPage; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.model.TenantContext; +import com.alibaba.qwen.code.managedagent.persistence.ManagedArtifactReader; +import com.alibaba.qwen.code.managedagent.persistence.ManagedToolResultStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedToolResultStore.Artifact; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import jakarta.servlet.http.HttpServletResponse; @@ -183,7 +184,7 @@ public class ManagedArtifactService { throw notFound(); } if (!policy.readOriginal(tenant.tenantId(), tenant.actorId(), source.workspaceId(), source.sessionId())) { - throw new ApiException(HttpStatus.FORBIDDEN, "artifact_content_forbidden", + throw new ManagedAgentException(HttpStatus.FORBIDDEN, "artifact_content_forbidden", "The current actor cannot read original artifact bytes."); } } @@ -207,7 +208,7 @@ public class ManagedArtifactService { } String etag = "\"" + descriptor.path("sha256").asText() + "\""; if (ifMatch != null && !matches(ifMatch, etag)) { - throw new ApiException(HttpStatus.PRECONDITION_FAILED, "artifact_revision_mismatch", + throw new ManagedAgentException(HttpStatus.PRECONDITION_FAILED, "artifact_revision_mismatch", "The artifact validator does not match."); } if (ifRange != null && !etag.equals(ifRange.trim())) { @@ -217,7 +218,7 @@ public class ManagedArtifactService { Selection selection; try { selection = select(range, size); - } catch (ApiException error) { + } catch (ManagedAgentException error) { if (error.getStatus() == HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE) { response.setHeader("Content-Range", "bytes */" + size); } @@ -225,7 +226,7 @@ public class ManagedArtifactService { } if (!readers.tryAcquire()) { response.setHeader("Retry-After", "1"); - throw new ApiException(HttpStatus.TOO_MANY_REQUESTS, "artifact_read_limit", + throw new ManagedAgentException(HttpStatus.TOO_MANY_REQUESTS, "artifact_read_limit", "The artifact reader limit has been reached."); } acquired = true; @@ -278,7 +279,7 @@ public class ManagedArtifactService { if (response.isCommitted()) { throw new IOException("Artifact stream interrupted", error); } - if (error instanceof ApiException api) { + if (error instanceof ManagedAgentException api) { if ("tool_output_session_retired".equals(api.getCode()) || "tool_output_read_expired".equals(api.getCode())) { session(tenant, sessionId); @@ -345,7 +346,7 @@ public class ManagedArtifactService { long start = parsed.getRangeStart(size); long end = parsed.getRangeEnd(size); if (size == 0 || start >= size || end < start) { - throw new ApiException(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE, "range_not_satisfiable", + throw new ManagedAgentException(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE, "range_not_satisfiable", "The range does not intersect this representation."); } long length = end - start + 1; @@ -364,15 +365,15 @@ public class ManagedArtifactService { return false; } - private static ApiException badRequest(String code, String message) { - return new ApiException(HttpStatus.BAD_REQUEST, code, message); + private static ManagedAgentException badRequest(String code, String message) { + return new ManagedAgentException(HttpStatus.BAD_REQUEST, code, message); } - private static ApiException notFound() { - return new ApiException(HttpStatus.NOT_FOUND, "artifact_not_found", "The resource was not found."); + private static ManagedAgentException notFound() { + return new ManagedAgentException(HttpStatus.NOT_FOUND, "artifact_not_found", "The resource was not found."); } - private static ApiException unavailable() { - return new ApiException(HttpStatus.SERVICE_UNAVAILABLE, "artifact_unavailable", "Artifact content is unavailable."); + private static ManagedAgentException unavailable() { + return new ManagedAgentException(HttpStatus.SERVICE_UNAVAILABLE, "artifact_unavailable", "Artifact content is unavailable."); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedToolDetailsService.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/ManagedToolDetailsService.java similarity index 65% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedToolDetailsService.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/ManagedToolDetailsService.java index 37070e865c4..4d477a1566c 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedToolDetailsService.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/ManagedToolDetailsService.java @@ -1,10 +1,11 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.artifact; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellToolDetails; -import com.alibaba.qwen.code.managedagent.api.TenantContext; -import com.alibaba.qwen.code.managedagent.store.ManagedToolDetailsStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellToolDetails; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.model.TenantContext; +import com.alibaba.qwen.code.managedagent.persistence.ManagedToolDetailsStore; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; @@ -31,7 +32,7 @@ public class ManagedToolDetailsService { tenant.requireActorId(); SessionRecord session = sessions.requireReadableSession(tenant.tenantId(), tenant.actorId(), sessionId); if (session.workspace() == null || "DELETING".equals(session.status())) { - throw new ApiException(HttpStatus.NOT_FOUND, "tool_details_not_found", "Tool details are unavailable."); + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "tool_details_not_found", "Tool details are unavailable."); } return session; } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationObjectStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/ToolPublicationObjectStore.java similarity index 96% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationObjectStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/ToolPublicationObjectStore.java index 9e8625a3250..31bac5d17a6 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationObjectStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/ToolPublicationObjectStore.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.artifact; import java.io.InputStream; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationRetentionObserver.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/ToolPublicationRetentionObserver.java similarity index 91% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationRetentionObserver.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/ToolPublicationRetentionObserver.java index ff6a09e84ff..6710fac1dec 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationRetentionObserver.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/ToolPublicationRetentionObserver.java @@ -1,6 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.artifact; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationRetentionStore; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationStorageException.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/ToolPublicationStorageException.java similarity index 90% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationStorageException.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/ToolPublicationStorageException.java index 027cc4b8ff4..977f3a38373 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationStorageException.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/artifact/ToolPublicationStorageException.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.artifact; import java.util.Objects; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/AutomationScanner.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/automation/AutomationScanner.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/AutomationScanner.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/automation/AutomationScanner.java index 9ef882dcb7a..d0c0b008a95 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/AutomationScanner.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/automation/AutomationScanner.java @@ -1,12 +1,12 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.automation; import com.alibaba.qwen.code.daemon.DaemonHttpException; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore.OccurrenceRow; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore.OccurrenceView; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore.ScheduleRow; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore.OccurrenceRow; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore.OccurrenceView; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore.ScheduleRow; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/CronSlots.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/automation/CronSlots.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/CronSlots.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/automation/CronSlots.java index 6bca42b4561..61460720c93 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/CronSlots.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/automation/CronSlots.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.automation; import java.time.Instant; import java.time.LocalDateTime; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedAutomationService.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/automation/ManagedAutomationService.java similarity index 90% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedAutomationService.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/automation/ManagedAutomationService.java index 91e0f501181..95187630675 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedAutomationService.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/automation/ManagedAutomationService.java @@ -1,26 +1,28 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.automation; import com.alibaba.qwen.code.daemon.DaemonException; import com.alibaba.qwen.code.daemon.DaemonHttpException; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.AutomationDefinitionRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicAutomation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicAutomationRun; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicList; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore.CommandRow; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore.OccurrenceCursor; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore.OccurrencePage; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore.OccurrenceRow; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore.OccurrenceView; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore.ScheduleCursor; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore.SchedulePage; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore.ScheduleRow; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.model.ApiModels.AutomationDefinitionRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicAutomation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicAutomationRun; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicList; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore.CommandRow; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore.OccurrenceCursor; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore.OccurrencePage; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore.OccurrenceRow; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore.OccurrenceView; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore.ScheduleCursor; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore.SchedulePage; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore.ScheduleRow; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -112,7 +114,7 @@ public class ManagedAutomationService { requireActor(actorId); ManagedAgentService.validateIdempotencyKey(idempotencyKey); if (request.sessionId() == null || request.sessionId().isEmpty()) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_automation", "session_id is required."); } Map definition = definition(request, true); @@ -140,13 +142,13 @@ public class ManagedAutomationService { if (landed.isEmpty() && ledger.countLive(tenantId, session.sessionId()) >= MAX_DEFINITIONS) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "automation_count_limit", "A Session holds at most " + MAX_DEFINITIONS + " live automation definitions."); } if (landed.isPresent() && !landed.get().sessionId().equals(request.sessionId())) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "automation_operation_conflict", "The Idempotency-Key already landed on another Session."); } @@ -197,7 +199,7 @@ public class ManagedAutomationService { requireLive(row); if (request.sessionId() != null && !request.sessionId().equals(row.sessionId())) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_automation", "session_id cannot change after creation."); } @@ -241,7 +243,7 @@ public class ManagedAutomationService { try { session = requireCreatorSession(tenantId, actorId, row.sessionId()); - } catch (ApiException error) { + } catch (ManagedAgentException error) { // Design decision 9: the Harness commits the terminal // revision while its Session is reachable. A definition // whose Session is not ACTIVE (closed, archived) can never @@ -332,7 +334,7 @@ public class ManagedAutomationService { occurrenceKey, null, AutomationScanner.TRIGGER_MANUAL, AutomationLedgerStore.OUTCOME_SKIPPED, refusal, fence, now), owner); - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "automation_run_skipped", "The manual run was skipped: " + refusal + "."); } @@ -342,7 +344,7 @@ public class ManagedAutomationService { occurrenceKey, null, AutomationScanner.TRIGGER_MANUAL, AutomationLedgerStore.OUTCOME_FIRING, null, fence, now), owner)) - .orElseThrow(() -> new ApiException(HttpStatus.CONFLICT, + .orElseThrow(() -> new ManagedAgentException(HttpStatus.CONFLICT, "automation_busy", "The automation is being scanned; retry.")); if (AutomationLedgerStore.OUTCOME_FIRING.equals( @@ -363,7 +365,7 @@ public class ManagedAutomationService { String reason = ledger.findOccurrence(tenantId, automationId, occurrenceKey).orElse(occurrence) .reason(); - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "automation_run_skipped", "The manual run was skipped: " + reason + "."); } @@ -470,7 +472,7 @@ public class ManagedAutomationService { SessionRecord session, Map body) { try { return relay(session.tenantId(), session.sessionId(), body); - } catch (ApiException refusal) { + } catch (ManagedAgentException refusal) { if (PRE_COMMIT_REFUSALS.contains(refusal.getCode())) { ledger.releaseCommand(tenantId, idempotencyKey, requestDigest, actorId); @@ -499,12 +501,12 @@ public class ManagedAutomationService { return translate(refusal); } if (error instanceof UnsupportedOperationException) { - return new ApiException(HttpStatus.SERVICE_UNAVAILABLE, + return new ManagedAgentException(HttpStatus.SERVICE_UNAVAILABLE, "automation_unavailable", "The Hosted Harness is not available."); } if (error instanceof DaemonException) { - return new ApiException(HttpStatus.SERVICE_UNAVAILABLE, + return new ManagedAgentException(HttpStatus.SERVICE_UNAVAILABLE, "automation_operation_unknown", "The Hosted Harness answer was lost; retry the same key."); } @@ -530,7 +532,7 @@ public class ManagedAutomationService { break; } } - throw new ApiException(HttpStatus.CONFLICT, "automation_busy", + throw new ManagedAgentException(HttpStatus.CONFLICT, "automation_busy", "The automation is being scanned; retry."); } @@ -539,7 +541,7 @@ public class ManagedAutomationService { Map answer) { JsonNode schedule = mapper.valueToTree(answer.get("schedule")); if (schedule == null || !schedule.isObject()) { - throw new ApiException(HttpStatus.SERVICE_UNAVAILABLE, + throw new ManagedAgentException(HttpStatus.SERVICE_UNAVAILABLE, "automation_operation_failed", "The Hosted Harness answered without the definition."); } @@ -548,7 +550,7 @@ public class ManagedAutomationService { schedule.required("scheduleId").asText()).filter(committed -> committed.sessionId().equals(session.sessionId()) && committed.recordRevision() >= recordRevision) - .orElseThrow(() -> new ApiException(HttpStatus.SERVICE_UNAVAILABLE, + .orElseThrow(() -> new ManagedAgentException(HttpStatus.SERVICE_UNAVAILABLE, "automation_projection_unavailable", "The committed automation definition is unavailable.")); if (row.recordRevision() > recordRevision) { @@ -597,19 +599,19 @@ public class ManagedAutomationService { if (create) { for (String field : List.of("goal", "cron", "timezone", "prompt")) { if (!definition.containsKey(field)) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_automation", field + " is required."); } } } if (request.prompt() != null && request.prompt() .getBytes(StandardCharsets.UTF_8).length > 64 * 1024) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_automation", "prompt exceeds 64 KiB."); } if (request.timezone() != null && CronSlots.resolve(request.timezone()).isEmpty()) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "automation_timezone_unknown", "The timezone does not resolve on this deployment."); } @@ -620,19 +622,19 @@ public class ManagedAutomationService { // control plane can never mirror, list, fire or retire. if (request.cron().getBytes(StandardCharsets.UTF_8).length > 400) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_automation", "cron exceeds 400 bytes."); } try { CronSlots.compile(request.cron()); } catch (IllegalArgumentException error) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_automation", "The cron is invalid."); } } if (request.sessionMode() != null && !"persistent".equals(request.sessionMode())) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "automation_mode_disabled", "Only the persistent target mode is enabled."); } @@ -648,7 +650,7 @@ public class ManagedAutomationService { private static void requireLive(ScheduleRow row) { if (!AutomationLedgerStore.STATE_LIVE.equals(row.state())) { - throw new ApiException(HttpStatus.CONFLICT, "automation_retired", + throw new ManagedAgentException(HttpStatus.CONFLICT, "automation_retired", "The automation is retired."); } } @@ -658,7 +660,7 @@ public class ManagedAutomationService { // scanner reads and the overlap count joins on live; without it a // fired run would never be seen to end. if (!settings.isEnabled() || !sessionStoreEnabled) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "automation_unavailable", "Automation is not enabled on this deployment."); } @@ -666,7 +668,7 @@ public class ManagedAutomationService { private static void requireActor(String actorId) { if (actorId == null || actorId.isEmpty()) { - throw new ApiException(HttpStatus.UNAUTHORIZED, "actor_required", + throw new ManagedAgentException(HttpStatus.UNAUTHORIZED, "actor_required", "A trusted actor is required."); } } @@ -674,14 +676,14 @@ public class ManagedAutomationService { private static void requireScheduleId(String automationId) { if (automationId == null || !SCHEDULE_ID.matcher(automationId) .matches()) { - throw new ApiException(HttpStatus.NOT_FOUND, + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "automation_not_found", "The automation was not found."); } } private static void requireLimit(int limit) { if (limit < 1 || limit > 100) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_limit", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_limit", "Limit must be between 1 and 100."); } } @@ -696,7 +698,7 @@ public class ManagedAutomationService { String actorId, String sessionId) { Optional found = sessions.findSession(tenantId, sessionId); - ApiException notFound = new ApiException(HttpStatus.NOT_FOUND, + ManagedAgentException notFound = new ManagedAgentException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found."); if (found.isEmpty() || "DELETED".equals(found.get().status()) || found.get().workspace() == null @@ -708,7 +710,7 @@ public class ManagedAutomationService { // The owner family's refusal, as lifecycle and cwd answer a // non-creator (SurfaceRegistry rule class OWNER). if (!workspaces.createdSession(tenantId, actorId, sessionId)) { - throw new ApiException(HttpStatus.FORBIDDEN, + throw new ManagedAgentException(HttpStatus.FORBIDDEN, "session_operation_forbidden", "Only the Session's creator manages its automations."); } @@ -716,12 +718,12 @@ public class ManagedAutomationService { .findReadable(tenantId, actorId, session.workspace().getWorkspaceId()); if (summary == null || !summary.canCreateSession()) { - throw new ApiException(HttpStatus.FORBIDDEN, + throw new ManagedAgentException(HttpStatus.FORBIDDEN, "session_operation_forbidden", "The caller may not create in the Session's Workspace."); } if (!"ACTIVE".equals(session.status())) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "session_not_active", "The Session is not active."); } return session; @@ -730,11 +732,11 @@ public class ManagedAutomationService { private ScheduleRow requireReadable(String tenantId, String actorId, String automationId) { ScheduleRow row = ledger.findSchedule(tenantId, automationId) - .orElseThrow(() -> new ApiException(HttpStatus.NOT_FOUND, + .orElseThrow(() -> new ManagedAgentException(HttpStatus.NOT_FOUND, "automation_not_found", "The automation was not found.")); if (!workspaces.canRead(tenantId, actorId, row.workspaceId())) { - throw new ApiException(HttpStatus.NOT_FOUND, + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "automation_not_found", "The automation was not found."); } return row; @@ -749,7 +751,7 @@ public class ManagedAutomationService { } if (!command.get().requestDigest().equals(requestDigest) || !command.get().actorId().equals(actorId)) { - throw new ApiException(HttpStatus.CONFLICT, "idempotency_conflict", + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "The idempotency key was reused with different content."); } if (command.get().resultJson().isEmpty()) { @@ -806,7 +808,7 @@ public class ManagedAutomationService { .toString(); } - static ApiException translate(DaemonHttpException error) { + static ManagedAgentException translate(DaemonHttpException error) { String code = AutomationScanner.errorCode(error); HttpStatus status = switch (error.getStatusCode()) { case 404 -> HttpStatus.NOT_FOUND; @@ -814,7 +816,7 @@ public class ManagedAutomationService { case 400 -> HttpStatus.BAD_REQUEST; default -> HttpStatus.SERVICE_UNAVAILABLE; }; - return new ApiException(status, + return new ManagedAgentException(status, code == null ? "automation_operation_failed" : code, "The Hosted Harness refused the automation operation."); } @@ -857,7 +859,7 @@ public class ManagedAutomationService { Long.parseLong(parts[0]); return parts; } catch (IllegalArgumentException error) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_cursor", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_cursor", message); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/AgentDefinitionExtensions.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/catalog/AgentDefinitionExtensions.java similarity index 93% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/AgentDefinitionExtensions.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/catalog/AgentDefinitionExtensions.java index ab0dfcdd2f3..22530da8277 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/AgentDefinitionExtensions.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/catalog/AgentDefinitionExtensions.java @@ -1,6 +1,8 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.catalog; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.http.HttpStatus; @@ -150,8 +152,8 @@ public final class AgentDefinitionExtensions { return true; } - private static ApiException unsupported(String field) { - return new ApiException(HttpStatus.CONFLICT, "agent_definition_unsupported", + private static ManagedAgentException unsupported(String field) { + return new ManagedAgentException(HttpStatus.CONFLICT, "agent_definition_unsupported", "The agent definition field cannot take effect yet.", Map.of("field", field)); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentDefinitionService.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/catalog/ManagedAgentDefinitionService.java similarity index 88% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentDefinitionService.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/catalog/ManagedAgentDefinitionService.java index b676efd2a4e..54edd960737 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentDefinitionService.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/catalog/ManagedAgentDefinitionService.java @@ -1,12 +1,14 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.catalog; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.AgentDefinition; -import com.alibaba.qwen.code.managedagent.api.ApiModels.AgentDefinitionRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore.Admission; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore.ConcurrentWriteException; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore.DefinitionRevision; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.ApiModels.AgentDefinition; +import com.alibaba.qwen.code.managedagent.model.ApiModels.AgentDefinitionRequest; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore.Admission; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore.ConcurrentWriteException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore.DefinitionRevision; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @@ -102,7 +104,7 @@ public class ManagedAgentDefinitionService { admission = write.get(); } catch (ConcurrentWriteException conflict) { admission = store.replayCommitted(tenantId, idempotencyKey, - requestDigest).orElseThrow(() -> new ApiException( + requestDigest).orElseThrow(() -> new ManagedAgentException( HttpStatus.CONFLICT, conflict.code(), conflict.getMessage())); } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedHookCatalogService.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/catalog/ManagedHookCatalogService.java similarity index 91% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedHookCatalogService.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/catalog/ManagedHookCatalogService.java index 1273376c292..e4f3c48d6e5 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedHookCatalogService.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/catalog/ManagedHookCatalogService.java @@ -1,6 +1,7 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.catalog; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedMcpCatalogService.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/catalog/ManagedMcpCatalogService.java similarity index 95% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedMcpCatalogService.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/catalog/ManagedMcpCatalogService.java index 9ad8e87cabb..7d922d7068a 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedMcpCatalogService.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/catalog/ManagedMcpCatalogService.java @@ -1,6 +1,7 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.catalog; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedSkillCatalogService.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/catalog/ManagedSkillCatalogService.java similarity index 72% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedSkillCatalogService.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/catalog/ManagedSkillCatalogService.java index 7f739aef56f..b989cccf33f 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedSkillCatalogService.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/catalog/ManagedSkillCatalogService.java @@ -1,10 +1,10 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.catalog; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSessionSkills; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSkill; -import com.alibaba.qwen.code.managedagent.store.AgentDefinitionExtensions; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceToolProfiles; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSessionSkills; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSkill; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; import org.springframework.stereotype.Service; import java.util.List; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ChannelAdapterModels.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/channel/ChannelAdapterModels.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ChannelAdapterModels.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/channel/ChannelAdapterModels.java index ac3f1062bd3..ebae2dc5c5b 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ChannelAdapterModels.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/channel/ChannelAdapterModels.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.api; +package com.alibaba.qwen.code.managedagent.channel; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.JsonNode; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedChannelService.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/channel/ManagedChannelService.java similarity index 89% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedChannelService.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/channel/ManagedChannelService.java index dfb509a1ccb..69a5a18a8c3 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedChannelService.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/channel/ManagedChannelService.java @@ -1,42 +1,43 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.channel; import com.alibaba.qwen.code.daemon.DaemonException; import com.alibaba.qwen.code.daemon.DaemonHttpException; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.CommandAdmission; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicChannel; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicChannelDelivery; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicChannelRoute; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicList; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.ChannelInstanceView; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.ClaimResponse; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.ClaimedDelivery; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.ClaimedSegment; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.DeliveryView; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.InboundAdmission; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.InboundEventRequest; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.ReceiptRequest; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.RegisterChannelRequest; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.ResendResponse; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.ChannelInstanceView; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.ClaimResponse; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.ClaimedDelivery; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.ClaimedSegment; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.DeliveryView; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.InboundAdmission; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.InboundEventRequest; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.ReceiptRequest; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.RegisterChannelRequest; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.ResendResponse; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.ChannelDeliveryRepository; -import com.alibaba.qwen.code.managedagent.store.ChannelDeliveryRepository.ChannelDelivery; -import com.alibaba.qwen.code.managedagent.store.ChannelDeliveryRepository.DeliveryCursor; -import com.alibaba.qwen.code.managedagent.store.ChannelDeliveryRepository.DeliveryPage; -import com.alibaba.qwen.code.managedagent.store.ChannelInstanceStore; -import com.alibaba.qwen.code.managedagent.store.ChannelInstanceStore.ChannelBinding; -import com.alibaba.qwen.code.managedagent.store.ChannelInstanceStore.ChannelClaim; -import com.alibaba.qwen.code.managedagent.store.ChannelInstanceStore.ChannelInstance; -import com.alibaba.qwen.code.managedagent.store.ChannelInstanceStore.InstanceCursor; -import com.alibaba.qwen.code.managedagent.store.ChannelInstanceStore.InstancePage; -import com.alibaba.qwen.code.managedagent.store.ChannelInstanceStore.PendingDelivery; -import com.alibaba.qwen.code.managedagent.store.ChannelRouteRepository; -import com.alibaba.qwen.code.managedagent.store.ChannelRouteRepository.ChannelRoute; -import com.alibaba.qwen.code.managedagent.store.JdbcChannelDeliveryRepository; -import com.alibaba.qwen.code.managedagent.store.JdbcChannelRouteRepository; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.model.ApiModels.CommandAdmission; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicChannel; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicChannelDelivery; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicChannelRoute; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicList; +import com.alibaba.qwen.code.managedagent.persistence.ChannelDeliveryRepository; +import com.alibaba.qwen.code.managedagent.persistence.ChannelDeliveryRepository.ChannelDelivery; +import com.alibaba.qwen.code.managedagent.persistence.ChannelDeliveryRepository.DeliveryCursor; +import com.alibaba.qwen.code.managedagent.persistence.ChannelDeliveryRepository.DeliveryPage; +import com.alibaba.qwen.code.managedagent.persistence.ChannelInstanceStore; +import com.alibaba.qwen.code.managedagent.persistence.ChannelInstanceStore.ChannelBinding; +import com.alibaba.qwen.code.managedagent.persistence.ChannelInstanceStore.ChannelClaim; +import com.alibaba.qwen.code.managedagent.persistence.ChannelInstanceStore.ChannelInstance; +import com.alibaba.qwen.code.managedagent.persistence.ChannelInstanceStore.InstanceCursor; +import com.alibaba.qwen.code.managedagent.persistence.ChannelInstanceStore.InstancePage; +import com.alibaba.qwen.code.managedagent.persistence.ChannelInstanceStore.PendingDelivery; +import com.alibaba.qwen.code.managedagent.persistence.ChannelRouteRepository; +import com.alibaba.qwen.code.managedagent.persistence.ChannelRouteRepository.ChannelRoute; +import com.alibaba.qwen.code.managedagent.persistence.JdbcChannelDeliveryRepository; +import com.alibaba.qwen.code.managedagent.persistence.JdbcChannelRouteRepository; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.digest.DigestUtils; @@ -133,7 +134,7 @@ public class ManagedChannelService { try { policyJson = mapper.writeValueAsString(request.policy()); } catch (com.fasterxml.jackson.core.JsonProcessingException error) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_request", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_request", "The channel policy is not serializable."); } String cwd = request.cwdRelative() == null @@ -143,7 +144,7 @@ public class ManagedChannelService { try { new WorkspaceSelection(request.workspaceId(), cwd); } catch (IllegalArgumentException error) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_request", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_request", "The Workspace selection is invalid."); } ChannelInstance stored; @@ -154,7 +155,7 @@ public class ManagedChannelService { request.actorId(), request.workspaceId(), cwd, policyJson, 0, 0)); } catch (IllegalStateException error) { - throw new ApiException(HttpStatus.CONFLICT, error.getMessage(), + throw new ManagedAgentException(HttpStatus.CONFLICT, error.getMessage(), "The channel registration conflicts with the stored" + " connection."); } @@ -172,12 +173,12 @@ public class ManagedChannelService { InboundEventRequest event) { ChannelInstance instance = requireInstance(tenantId, channelId); if (!"connected".equals(instance.state())) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "channel_disconnected", "The channel is not connected."); } if (event.accountGeneration() != instance.accountGeneration()) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, event.accountGeneration() < instance.accountGeneration() ? "channel_generation_stale" : "channel_generation_unregistered", @@ -229,7 +230,7 @@ public class ManagedChannelService { throw translate(error); } if (routes.admit(tenantId, routeKey, inputId) == null) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "channel_route_conflict", "The ingress row was admitted with another input."); } @@ -240,7 +241,7 @@ public class ManagedChannelService { int limit) { ChannelInstance instance = requireInstance(tenantId, channelId); if (!"connected".equals(instance.state())) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "channel_disconnected", "The channel is not connected."); } @@ -279,7 +280,7 @@ public class ManagedChannelService { if (request.ordinal() == null || request.providerMessageId() == null || request.providerMessageId().isBlank()) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_request", "An accepted receipt names its segment ordinal and" + " provider message id."); @@ -498,7 +499,7 @@ public class ManagedChannelService { requireReadableInstance(tenantId, actorId, channelId); return deliveries.find(tenantId, channelId, deliveryId) .map(ManagedChannelService::publicDelivery) - .orElseThrow(() -> new ApiException(HttpStatus.NOT_FOUND, + .orElseThrow(() -> new ManagedAgentException(HttpStatus.NOT_FOUND, "delivery_not_found", "The delivery was not found.")); } @@ -597,7 +598,7 @@ public class ManagedChannelService { private ChannelDelivery stepLedger(String tenantId, String channelId, String deliveryId, String state, String providerReceipt, Long claimGeneration) { ChannelDelivery current = deliveries.find(tenantId, channelId, - deliveryId).orElseThrow(() -> new ApiException( + deliveryId).orElseThrow(() -> new ManagedAgentException( HttpStatus.NOT_FOUND, "delivery_not_found", "The delivery was not found.")); if (state.equals(current.state())) { @@ -696,7 +697,7 @@ public class ManagedChannelService { try { bytes = Base64.getDecoder().decode(attachment.bytesBase64()); } catch (IllegalArgumentException error) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_request", "An attachment is not base64."); } @@ -709,7 +710,7 @@ public class ManagedChannelService { String channelId) { requireChannelId(channelId); return instances.findInstance(tenantId, channelId).orElseThrow(() -> - new ApiException(HttpStatus.NOT_FOUND, "channel_not_found", + new ManagedAgentException(HttpStatus.NOT_FOUND, "channel_not_found", "The channel was not found.")); } @@ -717,7 +718,7 @@ public class ManagedChannelService { String actorId, String channelId) { ChannelInstance instance = requireInstance(tenantId, channelId); if (!workspaces.canRead(tenantId, actorId, instance.workspaceId())) { - throw new ApiException(HttpStatus.NOT_FOUND, "channel_not_found", + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "channel_not_found", "The channel was not found."); } return instance; @@ -726,37 +727,37 @@ public class ManagedChannelService { private ChannelClaim requireClaim(String tenantId, String channelId, String deliveryId) { return instances.findClaim(tenantId, channelId, deliveryId) - .orElseThrow(() -> new ApiException(HttpStatus.NOT_FOUND, + .orElseThrow(() -> new ManagedAgentException(HttpStatus.NOT_FOUND, "delivery_not_found", "The delivery was not found.")); } private static void requireChannelId(String channelId) { if (channelId == null || !channelId.matches("[A-Za-z0-9._:@+-]{1,128}")) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_request", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_request", "The channel id is invalid."); } } private static void requireLimit(int limit) { if (limit < 1 || limit > 100) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_limit", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_limit", "Limit must be between 1 and 100."); } } private static void forbidSeparator(String value, String name) { if (value.contains(SEPARATOR)) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_request", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_request", name + " must not contain NUL."); } } - private static ApiException translate(DaemonException error) { + private static ManagedAgentException translate(DaemonException error) { if (!(error instanceof DaemonHttpException http)) { // A generation clash or dropped connection is transient for the // adapter: the same retryable envelope an HTTP refusal takes. - return new ApiException(HttpStatus.SERVICE_UNAVAILABLE, + return new ManagedAgentException(HttpStatus.SERVICE_UNAVAILABLE, "channel_operation_failed", "The Hosted Harness failed the channel operation."); } @@ -783,7 +784,7 @@ public class ManagedChannelService { ? HttpStatus.SERVICE_UNAVAILABLE : HttpStatus.CONFLICT) : http.getStatusCode() == 400 ? HttpStatus.BAD_REQUEST : HttpStatus.SERVICE_UNAVAILABLE; - return new ApiException(status, code, + return new ManagedAgentException(status, code, "The Hosted Harness refused the channel operation."); } @@ -844,7 +845,7 @@ public class ManagedChannelService { return new String[] {decoded.substring(0, separator), decoded.substring(separator + 1)}; } catch (IllegalArgumentException error) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_cursor", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_cursor", message); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/AliyunToolPublicationStorageAutoConfiguration.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/AliyunToolPublicationStorageAutoConfiguration.java index 41124243cf3..a88e6def2de 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/AliyunToolPublicationStorageAutoConfiguration.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/AliyunToolPublicationStorageAutoConfiguration.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent.config; -import com.alibaba.qwen.code.managedagent.store.AliyunToolPublicationObjectStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationObjectStore; +import com.alibaba.qwen.code.managedagent.artifact.AliyunToolPublicationObjectStore; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.aliyun.oss.ClientBuilderConfiguration; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/EventTransportConfiguration.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/EventTransportConfiguration.java index 53cd3188709..efc04c189f7 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/EventTransportConfiguration.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/EventTransportConfiguration.java @@ -1,13 +1,13 @@ package com.alibaba.qwen.code.managedagent.config; +import com.alibaba.qwen.code.managedagent.event.EventTransportConsumer; +import com.alibaba.qwen.code.managedagent.event.LiteTopicEventTransport; +import com.alibaba.qwen.code.managedagent.event.LiteTopicPublicEventTransport; +import com.alibaba.qwen.code.managedagent.event.MessageMaterializer; +import com.alibaba.qwen.code.managedagent.event.TransportWakeActivator; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.service.EventTransportConsumer; -import com.alibaba.qwen.code.managedagent.service.LiteTopicEventTransport; -import com.alibaba.qwen.code.managedagent.service.LiteTopicPublicEventTransport; -import com.alibaba.qwen.code.managedagent.service.MessageMaterializer; -import com.alibaba.qwen.code.managedagent.service.OwnerSubscriptions; -import com.alibaba.qwen.code.managedagent.service.TransportWakeActivator; -import com.alibaba.qwen.code.managedagent.store.TransportConsumerStore; +import com.alibaba.qwen.code.managedagent.persistence.TransportConsumerStore; +import com.alibaba.qwen.code.managedagent.session.OwnerSubscriptions; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.rocketmq.client.apis.ClientConfiguration; import org.apache.rocketmq.client.apis.ClientException; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/HarnessConfiguration.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/HarnessConfiguration.java index bd4df9976f5..15ae80fdb79 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/HarnessConfiguration.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/HarnessConfiguration.java @@ -3,12 +3,12 @@ package com.alibaba.qwen.code.managedagent.config; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; import com.alibaba.qwen.code.managedagent.harness.QwenHostedHarnessConnector; import com.alibaba.qwen.code.managedagent.harness.UnavailableHarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ManagedActionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.SshWorkspaceStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedActionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.SshWorkspaceStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/InternalSurfaceConfiguration.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/InternalSurfaceConfiguration.java index 66f1e23835a..93e809359e2 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/InternalSurfaceConfiguration.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/InternalSurfaceConfiguration.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent.config; import com.alibaba.qwen.code.managedagent.api.ApiExceptionHandler; -import com.alibaba.qwen.code.managedagent.api.PublicSurface; +import com.alibaba.qwen.code.managedagent.security.PublicSurface; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/JavaDurableAdmissionConfiguration.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/JavaDurableAdmissionConfiguration.java index c8f0d6e0c1d..6ed8d575deb 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/JavaDurableAdmissionConfiguration.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/JavaDurableAdmissionConfiguration.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent.config; -import com.alibaba.qwen.code.managedagent.service.JavaDurableAdmission; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.session.JavaDurableAdmission; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ManagedAgentProperties.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ManagedAgentProperties.java index d28593fc48e..063492cfb06 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ManagedAgentProperties.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ManagedAgentProperties.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent.config; -import com.alibaba.qwen.code.runtimebroker.LocalProcessRuntimeProvisioner; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; import jakarta.annotation.PostConstruct; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -190,7 +190,7 @@ public class ManagedAgentProperties implements EnvironmentAware { && !runtimeBroker.getResidentKubernetesApiUrl().isBlank() && !runtimeBroker.getResidentKubernetesTokenFile().isBlank() && !runtimeBroker.getResidentKubernetesCaFile().isBlank(); if (!runtimeBroker.getResidentWorkspaces().isEmpty()) { - new com.alibaba.qwen.code.managedagent.store.ResidentWorkspaces(runtimeBroker.getResidentWorkspaces()); + new com.alibaba.qwen.code.managedagent.persistence.ResidentWorkspaces(runtimeBroker.getResidentWorkspaces()); if (!residentFiles || !harness.isWorkspaceFilesEnabled()) { throw new IllegalStateException("Resident Workspaces require exclusive CSI/files configuration"); } @@ -1181,10 +1181,10 @@ public class ManagedAgentProperties implements EnvironmentAware { } public record ResidentWorkspace(String workspaceId, long workspaceGeneration, - com.alibaba.qwen.code.managedagent.store.WorkspaceCsiRegistration registration, - com.alibaba.qwen.code.managedagent.service.WorkspaceCsiResourceGuard.ProtectionIdentity protection, + com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiRegistration registration, + com.alibaba.qwen.code.managedagent.workspace.runtime.WorkspaceCsiResourceGuard.ProtectionIdentity protection, String image, List command, - List artifacts) { + List artifacts) { public ResidentWorkspace { if (registration == null || protection == null || workspaceId == null || workspaceId.isBlank() || workspaceGeneration < 1 || image == null || !image.matches("[^\\s]+@sha256:[0-9a-f]{64}") @@ -1193,7 +1193,7 @@ public class ManagedAgentProperties implements EnvironmentAware { || value.length() > 8192 || value.indexOf('\0') >= 0) || artifacts == null || artifacts.size() > 48 || artifacts.stream().anyMatch(java.util.Objects::isNull) - || artifacts.stream().map(com.alibaba.qwen.code.managedagent.service.WorkspaceCsiRuntimeProvisioner.WorkerArtifact::configMapName) + || artifacts.stream().map(com.alibaba.qwen.code.managedagent.workspace.runtime.WorkspaceCsiRuntimeProvisioner.WorkerArtifact::configMapName) .distinct().count() != artifacts.size()) { throw new IllegalArgumentException("Invalid resident Workspace configuration"); } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ManagedArtifactConfiguration.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ManagedArtifactConfiguration.java index 106cd5bcbe6..5d13856a823 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ManagedArtifactConfiguration.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ManagedArtifactConfiguration.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent.config; -import com.alibaba.qwen.code.managedagent.service.ManagedArtifactPolicy; -import com.alibaba.qwen.code.managedagent.service.MessageMaterializer; +import com.alibaba.qwen.code.managedagent.artifact.ManagedArtifactPolicy; +import com.alibaba.qwen.code.managedagent.event.MessageMaterializer; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ManagedSchemaConfiguration.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ManagedSchemaConfiguration.java index 49859cd1936..94f7d59abca 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ManagedSchemaConfiguration.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ManagedSchemaConfiguration.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.managedagent.config; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import org.springframework.boot.autoconfigure.flyway.FlywayMigrationStrategy; import org.springframework.context.annotation.Bean; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ManagedSessionJsonConfiguration.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ManagedSessionJsonConfiguration.java index f9f4c44e8be..73483c09cdb 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ManagedSessionJsonConfiguration.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ManagedSessionJsonConfiguration.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent.config; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitTransactionRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitTransactionRequest; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/RuntimeBrokerConfiguration.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/RuntimeBrokerConfiguration.java index bf2f196942e..f2ef6dbbd69 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/RuntimeBrokerConfiguration.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/RuntimeBrokerConfiguration.java @@ -1,19 +1,19 @@ package com.alibaba.qwen.code.managedagent.config; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; -import com.alibaba.qwen.code.managedagent.service.RuntimeWarmer; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationDataStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationDataStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRepository; -import com.alibaba.qwen.code.runtimebroker.SecretProtector; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRepository; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.security.SecretProtector; import org.apache.commons.lang3.StringUtils; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -80,7 +80,7 @@ public class RuntimeBrokerConfiguration { org.springframework.beans.factory.ObjectProvider publicationData, org.springframework.jdbc.core.JdbcTemplate jdbc, org.springframework.transaction.PlatformTransactionManager manager, - com.alibaba.qwen.code.managedagent.service.SshWorkspaceService ssh) { + com.alibaba.qwen.code.managedagent.workspace.SshWorkspaceService ssh) { return new EmbeddedRuntimeBroker(store, properties, bindingRepository, sessionRepository, executionRepository, workspaceExecutionStore, publications.getIfAvailable(), diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/RuntimeRetentionConfiguration.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/RuntimeRetentionConfiguration.java index b932b21c0d8..9a4ecd30677 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/RuntimeRetentionConfiguration.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/RuntimeRetentionConfiguration.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent.config; -import com.alibaba.qwen.code.managedagent.service.RuntimeRetentionJob; -import com.alibaba.qwen.code.managedagent.store.ManagedRuntimeRetentionGuard; +import com.alibaba.qwen.code.managedagent.persistence.ManagedRuntimeRetentionGuard; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeRetentionJob; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeRetention; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/SshRuntimeSettings.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/SshRuntimeSettings.java index b97f366e235..b8f5a6576dc 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/SshRuntimeSettings.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/SshRuntimeSettings.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.managedagent.config; -import com.alibaba.qwen.code.runtimebroker.SshRuntimeNode; +import com.alibaba.qwen.code.runtimebroker.provisioning.SshRuntimeNode; import java.util.List; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ToolPublicationConfiguration.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ToolPublicationConfiguration.java index 9e42dadf5cf..68cc5a70d76 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ToolPublicationConfiguration.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/config/ToolPublicationConfiguration.java @@ -1,16 +1,16 @@ package com.alibaba.qwen.code.managedagent.config; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.SessionResourceCollectionCollector; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationAdmissionStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationCollector; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationContract; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationDataStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationObjectStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationRetentionObserver; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationRetentionStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationVerifier; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationRetentionObserver; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.SessionResourceCollectionCollector; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationAdmissionStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationCollector; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationContract; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationDataStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationRetentionStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationVerifier; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRepository; import org.apache.commons.lang3.StringUtils; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/CommittedEventPublisher.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/CommittedEventPublisher.java similarity index 78% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/CommittedEventPublisher.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/CommittedEventPublisher.java index 80fccd2f53c..45cf8b30bb5 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/CommittedEventPublisher.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/CommittedEventPublisher.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.event; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; import java.util.List; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/CompositeCommittedEventPublisher.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/CompositeCommittedEventPublisher.java similarity index 93% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/CompositeCommittedEventPublisher.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/CompositeCommittedEventPublisher.java index 3573bc0c93e..2d61014b762 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/CompositeCommittedEventPublisher.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/CompositeCommittedEventPublisher.java @@ -1,8 +1,7 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.event; -import com.alibaba.qwen.code.managedagent.store.CommittedEventPublisher; -import com.alibaba.qwen.code.managedagent.store.EventTransport; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.session.SessionEventHub; import jdk.jfr.Enabled; import jdk.jfr.Event; import jdk.jfr.EventType; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/EventTransport.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/EventTransport.java similarity index 92% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/EventTransport.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/EventTransport.java index 43c610de348..0f6754ff78d 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/EventTransport.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/EventTransport.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.event; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; import java.util.List; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/EventTransportConsumer.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/EventTransportConsumer.java similarity index 96% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/EventTransportConsumer.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/EventTransportConsumer.java index 0ad6110506b..1398ff00b4c 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/EventTransportConsumer.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/EventTransportConsumer.java @@ -1,8 +1,6 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.event; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelope; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelopes; -import com.alibaba.qwen.code.managedagent.store.TransportConsumerStore; +import com.alibaba.qwen.code.managedagent.persistence.TransportConsumerStore; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.rocketmq.client.apis.consumer.ConsumeResult; import org.apache.rocketmq.client.apis.message.MessageView; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/JournalEventTransport.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/JournalEventTransport.java similarity index 81% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/JournalEventTransport.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/JournalEventTransport.java index 46a8cbd921d..5b2c0813cd1 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/JournalEventTransport.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/JournalEventTransport.java @@ -1,8 +1,8 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.event; /** * The authoritative-journal wire (design 2026-10-04-managed-agent-event-transport, - * phase MQ2b). An after-commit publication point on {@link ManagedSessionStore#commit} + * phase MQ2b). An after-commit publication point on {@link com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore#commit} * hands the committed journal record (the raw record bytes) to this port. It is * distinct from the {@link EventTransport} hub seam, which carries the public * event stream that MQ2c wires as the {@code public_event} envelope extension. diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/LiteTopicEventTransport.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/LiteTopicEventTransport.java similarity index 95% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/LiteTopicEventTransport.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/LiteTopicEventTransport.java index 72e5eb9f729..ab8d2f51daa 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/LiteTopicEventTransport.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/LiteTopicEventTransport.java @@ -1,8 +1,5 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.event; -import com.alibaba.qwen.code.managedagent.store.JournalEventTransport; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelope; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelopes; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.rocketmq.client.apis.ClientServiceProvider; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/LiteTopicPublicEventTransport.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/LiteTopicPublicEventTransport.java similarity index 96% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/LiteTopicPublicEventTransport.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/LiteTopicPublicEventTransport.java index 6db1baa8a56..c8a7fe707f4 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/LiteTopicPublicEventTransport.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/LiteTopicPublicEventTransport.java @@ -1,9 +1,6 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.event; -import com.alibaba.qwen.code.managedagent.store.EventTransport; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelope; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelopes; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.rocketmq.client.apis.ClientServiceProvider; import org.apache.rocketmq.client.apis.message.Message; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedEventEnvelope.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/ManagedEventEnvelope.java similarity index 94% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedEventEnvelope.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/ManagedEventEnvelope.java index 25409ce3689..f29bc662ec6 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedEventEnvelope.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/ManagedEventEnvelope.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.event; /** * The managed-event-envelope/1 contract mirrored to Java: the distribution diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedEventEnvelopes.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/ManagedEventEnvelopes.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedEventEnvelopes.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/ManagedEventEnvelopes.java index d0143fae2ea..7aba37af0f8 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedEventEnvelopes.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/ManagedEventEnvelopes.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.event; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.JsonNodeFactory; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/MessageMaterializer.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/MessageMaterializer.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/MessageMaterializer.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/MessageMaterializer.java index 950f3a90fa2..99d7c1e36ef 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/MessageMaterializer.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/MessageMaterializer.java @@ -1,7 +1,7 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.event; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.MaterializationTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.MaterializationTarget; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/TransportWakeActivator.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/TransportWakeActivator.java similarity index 96% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/TransportWakeActivator.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/TransportWakeActivator.java index 63bc152416a..78c9fb05dc1 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/TransportWakeActivator.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/event/TransportWakeActivator.java @@ -1,10 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.event; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelope; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelopes; -import com.alibaba.qwen.code.managedagent.store.TransportConsumerStore; -import com.alibaba.qwen.code.managedagent.store.TransportConsumerStore.WakeFence; +import com.alibaba.qwen.code.managedagent.persistence.TransportConsumerStore; +import com.alibaba.qwen.code.managedagent.persistence.TransportConsumerStore.WakeFence; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ApiException.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/exception/ManagedAgentException.java similarity index 68% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ApiException.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/exception/ManagedAgentException.java index 2ab0115ebab..1acfe90ba71 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ApiException.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/exception/ManagedAgentException.java @@ -1,19 +1,19 @@ -package com.alibaba.qwen.code.managedagent.api; +package com.alibaba.qwen.code.managedagent.exception; import org.springframework.http.HttpStatus; import java.util.Map; -public class ApiException extends RuntimeException { +public class ManagedAgentException extends RuntimeException { private final HttpStatus status; private final String code; private final Map details; - public ApiException(HttpStatus status, String code, String message) { + public ManagedAgentException(HttpStatus status, String code, String message) { this(status, code, message, Map.of()); } - public ApiException(HttpStatus status, String code, String message, + public ManagedAgentException(HttpStatus status, String code, String message, Throwable cause) { this(status, code, message, Map.of(), cause); } @@ -22,12 +22,12 @@ public class ApiException extends RuntimeException { * Creates an error whose envelope carries {@code details} next to its code, * message and request id. */ - public ApiException(HttpStatus status, String code, String message, + public ManagedAgentException(HttpStatus status, String code, String message, Map details) { this(status, code, message, details, null); } - private ApiException(HttpStatus status, String code, String message, + private ManagedAgentException(HttpStatus status, String code, String message, Map details, Throwable cause) { super(message, cause); this.status = status; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/harness/HarnessConnector.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/harness/HarnessConnector.java index 7b8506ecc96..d538d64d171 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/harness/HarnessConnector.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/harness/HarnessConnector.java @@ -31,24 +31,24 @@ public interface HarnessConnector extends AutoCloseable { default boolean supportsLifecycle() { return false; } default boolean supportsLifecycle(String profile) { - return com.alibaba.qwen.code.managedagent.store.WorkspaceToolProfiles.FILES.equals(profile) && supportsLifecycle(); + return com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles.FILES.equals(profile) && supportsLifecycle(); } - default void prepareLifecycleResources(com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord operation) { + default void prepareLifecycleResources(com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord operation) { throw new UnsupportedOperationException("Hosted resource lifecycle is unavailable"); } - default void settleLifecycleResources(com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord operation) { + default void settleLifecycleResources(com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord operation) { throw new UnsupportedOperationException("Hosted resource lifecycle is unavailable"); } default boolean supportsFencedTitles() { return false; } - default JsonNode settleLifecycle(com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord operation) { + default JsonNode settleLifecycle(com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord operation) { throw new UnsupportedOperationException("Hosted lifecycle is unavailable"); } - default void detachLifecycle(com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord operation) { + default void detachLifecycle(com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord operation) { throw new UnsupportedOperationException("Hosted lifecycle is unavailable"); } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/harness/QwenHostedHarnessConnector.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/harness/QwenHostedHarnessConnector.java index fd15cd2451f..02903005229 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/harness/QwenHostedHarnessConnector.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/harness/QwenHostedHarnessConnector.java @@ -15,18 +15,18 @@ import com.alibaba.qwen.code.daemon.PromptReceipt; import com.alibaba.qwen.code.daemon.SessionCreationOutcomeUnknownException; import com.alibaba.qwen.code.daemon.StreamHarnessEvents; import com.alibaba.qwen.code.daemon.SubmitHarnessTurn; +import com.alibaba.qwen.code.managedagent.catalog.AgentDefinitionExtensions; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.AgentDefinitionExtensions; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ManagedActionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.SshWorkspaceStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceToolProfiles; -import com.alibaba.qwen.code.managedagent.store.WriterCredentialPolicy; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.persistence.ManagedActionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.SshWorkspaceStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.security.WriterCredentialPolicy; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; import com.fasterxml.jackson.databind.JsonNode; import org.apache.commons.lang3.StringUtils; @@ -206,7 +206,7 @@ public class QwenHostedHarnessConnector implements HarnessConnector { @Override public com.fasterxml.jackson.databind.JsonNode settleLifecycle( - com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord operation) { + com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord operation) { try { return doSettleLifecycle(operation, "effects"); } catch (HostedHarnessGenerationException error) { @@ -216,7 +216,7 @@ public class QwenHostedHarnessConnector implements HarnessConnector { } private com.fasterxml.jackson.databind.JsonNode doSettleLifecycle( - com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord operation, String phase) { + com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord operation, String phase) { SessionRecord session = sessions.requireSession(operation.tenantId(), operation.sessionId()); if (operation.lifecycleProtocolVersion() < 0 || operation.lifecycleProtocolVersion() > 2) { throw new IllegalArgumentException("Unknown lifecycle protocol"); @@ -262,16 +262,16 @@ public class QwenHostedHarnessConnector implements HarnessConnector { } @Override - public void prepareLifecycleResources(com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord operation) { + public void prepareLifecycleResources(com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord operation) { runResourcePhase(operation, "prepare_resources"); } @Override - public void settleLifecycleResources(com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord operation) { + public void settleLifecycleResources(com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord operation) { runResourcePhase(operation, "settle_resources"); } - private void runResourcePhase(com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord operation, String phase) { + private void runResourcePhase(com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord operation, String phase) { try { doSettleLifecycle(operation, phase); } catch (HostedHarnessGenerationException error) { @@ -281,7 +281,7 @@ public class QwenHostedHarnessConnector implements HarnessConnector { } @Override - public void detachLifecycle(com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord operation) { + public void detachLifecycle(com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord operation) { try { doDetachLifecycle(operation); } catch (HostedHarnessGenerationException error) { @@ -290,7 +290,7 @@ public class QwenHostedHarnessConnector implements HarnessConnector { } } - private void doDetachLifecycle(com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord operation) { + private void doDetachLifecycle(com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord operation) { AttachmentKey key = new AttachmentKey(operation.tenantId(), operation.sessionId()); HarnessSessionRef ref = attachments.get(key); try { diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ApiModels.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/model/ApiModels.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ApiModels.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/model/ApiModels.java index 09f1d5a795e..d1db7eba53c 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/ApiModels.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/model/ApiModels.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.api; +package com.alibaba.qwen.code.managedagent.model; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/RequestDigests.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/model/RequestDigests.java similarity index 93% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/RequestDigests.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/model/RequestDigests.java index 81d108bc4fa..b049b1b295d 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/RequestDigests.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/model/RequestDigests.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.model; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.MapperFeature; @@ -29,7 +29,7 @@ public class RequestDigests { } } - int byteLength(Object value) { + public int byteLength(Object value) { try { return canonicalMapper.writeValueAsBytes(value).length; } catch (JsonProcessingException error) { diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/StoreModels.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/model/StoreModels.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/StoreModels.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/model/StoreModels.java index c25dbe976f3..2a68e8fb81f 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/StoreModels.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/model/StoreModels.java @@ -1,5 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.model; +import com.alibaba.qwen.code.managedagent.persistence.EventIdentity; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import java.util.Arrays; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/TenantContext.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/model/TenantContext.java similarity index 59% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/TenantContext.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/model/TenantContext.java index 72c35506571..1526945bb6b 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/TenantContext.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/model/TenantContext.java @@ -1,11 +1,12 @@ -package com.alibaba.qwen.code.managedagent.api; +package com.alibaba.qwen.code.managedagent.model; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import org.springframework.http.HttpStatus; public record TenantContext(String tenantId, String actorId) { public String requireActorId() { if (actorId == null) { - throw new ApiException(HttpStatus.UNAUTHORIZED, + throw new ManagedAgentException(HttpStatus.UNAUTHORIZED, "actor_required", "A trusted actor is required."); } return actorId; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/AgentDefinitionCompiler.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/AgentDefinitionCompiler.java similarity index 92% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/AgentDefinitionCompiler.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/AgentDefinitionCompiler.java index 388f5283aba..4f380c01425 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/AgentDefinitionCompiler.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/AgentDefinitionCompiler.java @@ -1,6 +1,8 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.catalog.AgentDefinitionExtensions; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.http.HttpStatus; @@ -117,8 +119,8 @@ final class AgentDefinitionCompiler { return new Compiled(approvalMode, toolProfile); } - private static ApiException unsupported(String field) { - return new ApiException(HttpStatus.CONFLICT, + private static ManagedAgentException unsupported(String field) { + return new ManagedAgentException(HttpStatus.CONFLICT, "agent_definition_unsupported", "The agent definition field cannot take effect yet.", Map.of("field", field)); diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/AutomationLedgerStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/AutomationLedgerStore.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/AutomationLedgerStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/AutomationLedgerStore.java index d008a1ddacb..d2950c217a9 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/AutomationLedgerStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/AutomationLedgerStore.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; 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; @@ -312,7 +312,7 @@ public class AutomationLedgerStore { ScheduleRow current = existing.get(); if (!Objects.equals(current.sessionId(), sessionId) || !Objects.equals(current.workspaceId(), workspaceId)) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, ManagedExtensionRecordStore.ERROR_REJECTED, "A schedule identity belongs to another Session."); } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ChannelDeliveryRepository.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ChannelDeliveryRepository.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ChannelDeliveryRepository.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ChannelDeliveryRepository.java index 7208cc33583..7021985e947 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ChannelDeliveryRepository.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ChannelDeliveryRepository.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import java.util.List; import java.util.Optional; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ChannelInstanceStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ChannelInstanceStore.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ChannelInstanceStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ChannelInstanceStore.java index 74cf67e473b..d2595a69da0 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ChannelInstanceStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ChannelInstanceStore.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; @@ -379,7 +379,7 @@ public class ChannelInstanceStore { if (claims.size() != 1 || !tenantId.equals(claims.getFirst().tenantId()) || !sessionId.equals(claims.getFirst().sessionId()) || !deliveryId.equals(claims.getFirst().deliveryId()) || !operationId.equals(reconciliationOperationId(claims.getFirst()))) { - throw new com.alibaba.qwen.code.managedagent.api.ApiException(org.springframework.http.HttpStatus.CONFLICT, + throw new com.alibaba.qwen.code.managedagent.exception.ManagedAgentException(org.springframework.http.HttpStatus.CONFLICT, "channel_claim_stale", "The channel delivery claim changed before reconciliation committed."); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ChannelRouteRepository.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ChannelRouteRepository.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ChannelRouteRepository.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ChannelRouteRepository.java index 4a99ef5cba6..98d7bfe31ad 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ChannelRouteRepository.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ChannelRouteRepository.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import java.util.List; import java.util.Optional; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ChannelStoreSupport.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ChannelStoreSupport.java similarity index 91% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ChannelStoreSupport.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ChannelStoreSupport.java index 1548a1c4ab4..77033d012f0 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ChannelStoreSupport.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ChannelStoreSupport.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ChildResultRelayStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ChildResultRelayStore.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ChildResultRelayStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ChildResultRelayStore.java index eaf6044e82b..50f44e42bbc 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ChildResultRelayStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ChildResultRelayStore.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.OperationKind; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ChildWorkspaceStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ChildWorkspaceStore.java similarity index 96% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ChildWorkspaceStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ChildWorkspaceStore.java index bf2ff329a72..ef7597d5956 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ChildWorkspaceStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ChildWorkspaceStore.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; @@ -146,11 +146,11 @@ public class ChildWorkspaceStore { } Row row = find(tenantId, parentSessionId, childRunId); if (row == null) { - throw new ApiException(HttpStatus.CONFLICT, "child_workspace_conflict", + throw new ManagedAgentException(HttpStatus.CONFLICT, "child_workspace_conflict", "The child Workspace is unavailable."); } if (!workspaceMode.equals(row.workspaceMode())) { - throw new ApiException(HttpStatus.CONFLICT, "child_workspace_conflict", + throw new ManagedAgentException(HttpStatus.CONFLICT, "child_workspace_conflict", "The child Workspace was admitted for another mode."); } return row; @@ -312,7 +312,7 @@ public class ChildWorkspaceStore { List rows = jdbc.query(SELECT + " WHERE w.tenant_id = ? AND w.parent_session_id = ?" + " AND w.child_run_id = ? FOR UPDATE", this::row, tenantId, parentSessionId, childRunId); if (rows.isEmpty()) { - throw new ApiException(HttpStatus.NOT_FOUND, "child_workspace_not_found", + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "child_workspace_not_found", "The child run has no child Workspace."); } Row row = rows.getFirst(); @@ -324,16 +324,16 @@ public class ChildWorkspaceStore { String recorded = asked; if (MERGE.equals(asked)) { if (row.finishRequest() != null) { - throw new ApiException(HttpStatus.CONFLICT, "child_workspace_conflict", + throw new ManagedAgentException(HttpStatus.CONFLICT, "child_workspace_conflict", "The child Workspace is already being discarded."); } if (!READY.equals(row.state())) { - throw new ApiException(HttpStatus.CONFLICT, "child_workspace_not_ready", + throw new ManagedAgentException(HttpStatus.CONFLICT, "child_workspace_not_ready", "Only a ready child Workspace can be merged."); } } else { if (MERGED.equals(row.state())) { - throw new ApiException(HttpStatus.CONFLICT, "child_workspace_conflict", + throw new ManagedAgentException(HttpStatus.CONFLICT, "child_workspace_conflict", "The child Workspace was already merged."); } if (DISCARDED.equals(row.state())) { @@ -342,7 +342,7 @@ public class ChildWorkspaceStore { // A merge not yet started (the row is still ready) yields to // the discard; one that started runs to its end. if (MERGING.equals(row.state()) || APPLYING.equals(row.state()) || APPLIED.equals(row.state())) { - throw new ApiException(HttpStatus.CONFLICT, "child_workspace_finishing", + throw new ManagedAgentException(HttpStatus.CONFLICT, "child_workspace_finishing", "The child Workspace is being merged."); } if (MERGE.equals(row.finishRequest()) && row.resultCommit() == null) { diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/EventIdentity.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/EventIdentity.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/EventIdentity.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/EventIdentity.java index 61eb76dbee0..f92345cf9c2 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/EventIdentity.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/EventIdentity.java @@ -1,4 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; + +import com.alibaba.qwen.code.managedagent.model.StoreModels; import java.nio.charset.StandardCharsets; import java.util.Map; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/JdbcChannelDeliveryRepository.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/JdbcChannelDeliveryRepository.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/JdbcChannelDeliveryRepository.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/JdbcChannelDeliveryRepository.java index 666e82cae33..96dc820c617 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/JdbcChannelDeliveryRepository.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/JdbcChannelDeliveryRepository.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.fasterxml.jackson.core.JsonProcessingException; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/JdbcChannelRouteRepository.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/JdbcChannelRouteRepository.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/JdbcChannelRouteRepository.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/JdbcChannelRouteRepository.java index 977c807c204..72b7957b665 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/JdbcChannelRouteRepository.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/JdbcChannelRouteRepository.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.OperationKind; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.ReceiptNamespace; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/LocalStorageOwners.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/LocalStorageOwners.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/LocalStorageOwners.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/LocalStorageOwners.java index 09b0506662c..519df6a4502 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/LocalStorageOwners.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/LocalStorageOwners.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedActionStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedActionStore.java similarity index 96% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedActionStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedActionStore.java index 2cec188909a..6a8b376d7e6 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedActionStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedActionStore.java @@ -1,10 +1,12 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.StoredResource; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationAdmission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationTarget; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationAdmission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationTarget; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.StoredResource; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.OperationKind; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.ReceiptNamespace; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.ReceiptScope; @@ -69,7 +71,7 @@ public class ManagedActionStore { return actorId == null ? null : ManagedWorkspaceRegistry.actorKey(tenantId, actorId); } catch (IllegalArgumentException error) { - throw new ApiException(HttpStatus.FORBIDDEN, + throw new ManagedAgentException(HttpStatus.FORBIDDEN, "actor_scope_mismatch", "Authenticated actor scope is invalid."); } } @@ -107,15 +109,15 @@ public class ManagedActionStore { private record OwnerRow(byte[] owner, byte[] creator, String workspaceId, String toolProfile) { } - private static ApiException forbidden() { - return new ApiException( + private static ManagedAgentException forbidden() { + return new ManagedAgentException( HttpStatus.FORBIDDEN, "action_forbidden", "Only the Session's owner or a Workspace operator may answer its Actions."); } - private static ApiException shellForbidden() { - return new ApiException( + private static ManagedAgentException shellForbidden() { + return new ManagedAgentException( HttpStatus.FORBIDDEN, "action_forbidden", "Only the Session's recorded owner may answer its Shell Actions."); @@ -461,7 +463,7 @@ public class ManagedActionStore { OperationRecord existing = sessions.findOperation(tenantId, sessionId, replay.get(0)).orElseThrow(); if (!existing.requestDigest().equals(requestDigest)) { - throw new ApiException( + throw new ManagedAgentException( HttpStatus.CONFLICT, "idempotency_conflict", "The idempotency key was reused with different content."); @@ -540,7 +542,7 @@ public class ManagedActionStore { if (ownerRow.workspaceId() != null && !sessions.hasExecutionRegistryFacts(tenantId, sessionId)) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "workspace_unavailable", "Hosted Workspace execution is not available."); } @@ -621,27 +623,27 @@ public class ManagedActionStore { // reach — whichever arm admitted the caller. if (ownerRow.workspaceId() != null && !sessions.hasExecutionRegistryFacts(tenantId, sessionId)) { - throw new ApiException(HttpStatus.CONFLICT, "workspace_unavailable", + throw new ManagedAgentException(HttpStatus.CONFLICT, "workspace_unavailable", "Hosted Workspace execution is not available."); } WorkspaceMigrationAdmission.requireSessionOpen(jdbc, tenantId, sessionId); String sessionStatus = jdbc.queryForObject("SELECT status FROM ma_session" + " WHERE tenant_id = ? AND session_id = ?", String.class, tenantId, sessionId); if (!"ACTIVE".equals(sessionStatus)) { - throw new ApiException(HttpStatus.CONFLICT, "session_inactive", "The Session does not accept responses."); + throw new ManagedAgentException(HttpStatus.CONFLICT, "session_inactive", "The Session does not accept responses."); } Action action = find(tenantId, sessionId, actionId) .orElseThrow( () -> - new ApiException( + new ManagedAgentException( HttpStatus.NOT_FOUND, "action_not_found", "The Action was not found.")); JsonNode o = action.options(); if (publicPlanExit(tenantId, sessionId, o) && (!admitted || !workspaceOperatorAdmits(tenantId, ownerRow, actorId))) { - throw new ApiException(HttpStatus.FORBIDDEN, "action_forbidden", + throw new ManagedAgentException(HttpStatus.FORBIDDEN, "action_forbidden", "Only the Session owner with current OPERATOR access may approve a public plan."); } if (body.size() != 3 @@ -650,19 +652,19 @@ public class ManagedActionStore { || !body.path("inputRevision").isIntegralNumber() || body.path("inputRevision").asLong() != o.path("inputRevision").asLong() || !body.path("policyRevision").equals(o.path("policyRevision"))) { - throw new ApiException( + throw new ManagedAgentException( HttpStatus.BAD_REQUEST, "invalid_action_response", "The response does not match the original Action."); } if (!"requested".equals(action.state())) { - throw new ApiException( + throw new ManagedAgentException( HttpStatus.CONFLICT, endedCode(action.state()), "The Action has already ended."); } if (now >= o.path("expiresAt").asLong()) { - throw new ApiException( + throw new ManagedAgentException( HttpStatus.CONFLICT, "action_expired", "The Action has expired."); } String scope = ManagedSessionStore.sessionScopeKey(tenantId, sessionId); @@ -675,7 +677,7 @@ public class ManagedActionStore { (r, row) -> new String[]{r.getString(1), r.getString(2)}, ManagedSchemaKeys.key(tenantId), actionScope); if (!reserved.isEmpty()) { if (!decision.equals(reserved.getFirst()[0])) { - throw new ApiException(HttpStatus.CONFLICT, "action_already_resolved", "A different Action decision is already admitted."); + throw new ManagedAgentException(HttpStatus.CONFLICT, "action_already_resolved", "A different Action decision is already admitted."); } String original = jdbc.queryForObject("SELECT operation_id FROM ma_operation WHERE operation_key = ?", String.class, reserved.getFirst()[1]); @@ -849,7 +851,7 @@ public class ManagedActionStore { private static void require(boolean valid) { if (!valid) { - throw new ApiException( + throw new ManagedAgentException( HttpStatus.BAD_REQUEST, "managed_session_action_rejected", "The Action journal record is invalid."); diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedAgentDefinitionStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedAgentDefinitionStore.java similarity index 95% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedAgentDefinitionStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedAgentDefinitionStore.java index 3ea150e96be..45ba632fa4e 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedAgentDefinitionStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedAgentDefinitionStore.java @@ -1,8 +1,8 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.service.RequestDigests; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; 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; @@ -124,7 +124,7 @@ public class ManagedAgentDefinitionStore { if (!revision.digest().equals(session.agentDefinitionDigest()) || !digests.digest(content) .equals("sha256:" + session.agentDefinitionDigest())) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "hosted_agent_definition_conflict", "The pinned agent definition digest does not match."); } @@ -186,7 +186,7 @@ public class ManagedAgentDefinitionStore { } String[] command = commands.getFirst(); if (!command[0].equals(requestDigest)) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "The Idempotency-Key was used with a different request."); } @@ -239,8 +239,8 @@ public class ManagedAgentDefinitionStore { return rows.isEmpty() ? Optional.empty() : Optional.of(rows.getFirst()); } - public static ApiException notFound() { - return new ApiException(HttpStatus.NOT_FOUND, "agent_not_found", + public static ManagedAgentException notFound() { + return new ManagedAgentException(HttpStatus.NOT_FOUND, "agent_not_found", "The agent definition was not found."); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedAgentStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedAgentStore.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedAgentStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedAgentStore.java index 0b0be76f5e2..a0997da9538 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedAgentStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedAgentStore.java @@ -1,46 +1,50 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellApprovalChangeResult; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellApprovalSelection; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellModelChangeResult; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellModelContext; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellModelOption; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellModelSelection; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSessionOptions; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.EventIdentity.Identity; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry.ResolvedBinding; -import com.alibaba.qwen.code.managedagent.store.StoreModels.AcceptanceVerdict; -import com.alibaba.qwen.code.managedagent.store.StoreModels.Admission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.CommandRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.DispatchTarget; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventPage; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.HarnessEvent; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ItemPartRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ItemRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.MaterializationResult; -import com.alibaba.qwen.code.managedagent.store.StoreModels.MaterializationTarget; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationAdmission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationTarget; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ParkedOperation; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ProjectedEvent; -import com.alibaba.qwen.code.managedagent.store.StoreModels.RenameDelivery; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ReplayFloorTarget; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ReplayWindow; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionMutation; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionMutationCommand; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionMutationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionPage; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SnapshotRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.TurnPage; -import com.alibaba.qwen.code.managedagent.store.StoreModels.TurnRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.TurnSummary; +import com.alibaba.qwen.code.managedagent.event.CommittedEventPublisher; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellApprovalChangeResult; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellApprovalSelection; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellModelChangeResult; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellModelContext; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellModelOption; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellModelSelection; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSessionOptions; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.model.StoreModels.AcceptanceVerdict; +import com.alibaba.qwen.code.managedagent.model.StoreModels.Admission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.CommandRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.DispatchTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventPage; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.HarnessEvent; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ItemPartRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ItemRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.MaterializationResult; +import com.alibaba.qwen.code.managedagent.model.StoreModels.MaterializationTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationAdmission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ParkedOperation; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ProjectedEvent; +import com.alibaba.qwen.code.managedagent.model.StoreModels.RenameDelivery; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ReplayFloorTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ReplayWindow; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionMutation; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionMutationCommand; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionMutationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionPage; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SnapshotRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.TurnPage; +import com.alibaba.qwen.code.managedagent.model.StoreModels.TurnRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.TurnSummary; +import com.alibaba.qwen.code.managedagent.persistence.EventIdentity.Identity; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry.ResolvedBinding; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; import com.alibaba.qwen.code.runtimebroker.CsiFilesRetirementProfile; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; @@ -404,7 +408,7 @@ public class ManagedAgentStore implements AgentStateStore { if (planMode && (!planModeSupported || !approvalSelectionSupported || pin.hooks() || !(WorkspaceToolProfiles.FILES.equals(pin.toolProfile()) || WorkspaceToolProfiles.isPublicShell(pin.toolProfile())))) { - throw new ApiException(HttpStatus.CONFLICT, "unsupported_feature", "Plan mode is unavailable"); + throw new ManagedAgentException(HttpStatus.CONFLICT, "unsupported_feature", "Plan mode is unavailable"); } if (!input.isEmpty() && WorkspaceToolProfiles.isPublicShell(pin.toolProfile()) && !workspaceShellEnabled) { @@ -492,7 +496,7 @@ public class ManagedAgentStore implements AgentStateStore { List existing = findWorkspaceCommand(tenantId, actorId, idempotencyKey); if (existing.isEmpty()) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "The creation command is missing."); } return replayWorkspaceCommand(tenantId, actorId, requestDigest, @@ -624,7 +628,7 @@ public class ManagedAgentStore implements AgentStateStore { parentSessionId); if (parent.workspace() == null || residentWorkspaces.find(parent.workspace()) != null || !"ACTIVE".equals(parent.status()) || CsiFilesRetirementProfile.PROFILE.equals(parent.toolProfile())) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "child_parent_unavailable", "The parent Session cannot admit a child."); } @@ -635,7 +639,7 @@ public class ManagedAgentStore implements AgentStateStore { if (!existing.isEmpty()) { WorkspaceCommand command = existing.getFirst(); if (!command.requestDigest().equals(requestDigest)) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "The idempotency key was reused with different content."); } @@ -666,7 +670,7 @@ public class ManagedAgentStore implements AgentStateStore { && ("completed".equals(runState.getFirst()) || "failed".equals(runState.getFirst()) || "cancelled".equals(runState.getFirst()))) { - throw new ApiException(HttpStatus.CONFLICT, "child_run_settled", + throw new ManagedAgentException(HttpStatus.CONFLICT, "child_run_settled", "The child run already settled; creation owes no more Session."); } // A child bound to a snapshot reads with the read-only profile @@ -778,7 +782,7 @@ public class ManagedAgentStore implements AgentStateStore { childRunId, tenantId); if (ready.size() != 1 || !ready.getFirst()) { - throw new ApiException(HttpStatus.CONFLICT, "child_workspace_not_ready", + throw new ManagedAgentException(HttpStatus.CONFLICT, "child_workspace_not_ready", "The child run's Workspace is not ready to bind a child Session."); } // The request is written once, when the row is admitted, so the @@ -790,7 +794,7 @@ public class ManagedAgentStore implements AgentStateStore { + " AND w.child_run_id = ? AND w.tenant_id = ?", String.class, parentSessionId, childRunId, tenantId); if (requests.size() != 1) { - throw new ApiException(HttpStatus.CONFLICT, "child_workspace_not_ready", + throw new ManagedAgentException(HttpStatus.CONFLICT, "child_workspace_not_ready", "The child run's Workspace is not ready to bind a child Session."); } return ChildWorkspaceStore.workspaceMode(requests.getFirst()); @@ -803,7 +807,7 @@ public class ManagedAgentStore implements AgentStateStore { String requestDigest) { SessionRecord parent = requireSessionForUpdate(tenantId, parentSessionId); if (CsiFilesRetirementProfile.PROFILE.equals(parent.toolProfile())) { - throw new ApiException( + throw new ManagedAgentException( HttpStatus.CONFLICT, "child_parent_unavailable", "The parent Session cannot admit a child."); @@ -812,12 +816,12 @@ public class ManagedAgentStore implements AgentStateStore { List existing = findWorkspaceCommand(tenantId, childActorOf(parentSessionId), idempotencyKey); if (existing.isEmpty()) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "The creation command is missing."); } WorkspaceCommand command = existing.getFirst(); if (!command.requestDigest().equals(requestDigest)) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "The idempotency key was reused with different content."); } @@ -855,17 +859,17 @@ public class ManagedAgentStore implements AgentStateStore { || internalTeamLead != WorkspaceToolProfiles.INTERNAL_TEAM_LEAD.equals(session.toolProfile()) || internalTeamLead && (!"qwen-code".equals(session.agentId()) || session.agentDefinitionDigest() != null)) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "The idempotency key was reused with different content."); } ContextBinding bound = session.workspace(); if (bound == null) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "workspace_unavailable", "Workspace binding is missing."); } if (!workspaces.canRead(tenantId, actorId, bound.getWorkspaceId())) { - throw new ApiException(HttpStatus.NOT_FOUND, + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "workspace_not_found", "Workspace not found."); } return new Admission(command.sessionId(), command.turnId(), true, @@ -895,8 +899,8 @@ public class ManagedAgentStore implements AgentStateStore { return kind == SessionMutationKind.RENAME && workspaceFilesEnabled; } - private static ApiException workspaceExecutionUnavailable() { - return new ApiException(HttpStatus.CONFLICT, + private static ManagedAgentException workspaceExecutionUnavailable() { + return new ManagedAgentException(HttpStatus.CONFLICT, "workspace_unavailable", "Hosted Workspace execution is not available."); } @@ -915,7 +919,7 @@ public class ManagedAgentStore implements AgentStateStore { tenantId, idempotencyKey, true); if (existing == null || !Boolean.valueOf(workspaceBound).equals(existing.workspaceBound())) { - throw new ApiException(HttpStatus.CONFLICT, "idempotency_conflict", + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "The idempotency key was reused with different content."); } } @@ -973,7 +977,7 @@ public class ManagedAgentStore implements AgentStateStore { if (!availableApprovalModes(pin).contains(requested) && !(supported && pin.digest() == null && "yolo".equals(requested) && WorkspaceToolProfiles.isPublicShell(pin.toolProfile()))) { - throw new ApiException(HttpStatus.BAD_REQUEST, "unsupported_approval_mode", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "unsupported_approval_mode", "The selected approval mode is not available for this Agent."); } return new AgentPin(pin.revision(), pin.digest(), requested, pin.toolProfile(), pin.hooks()); @@ -985,7 +989,7 @@ public class ManagedAgentStore implements AgentStateStore { String requested, boolean workspaceBound) { if ("qwen-code".equals(agentId)) { if (requested != null && !requested.equals(agentRevision)) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "unsupported_feature", "Only the current agent revision can be selected."); } @@ -1183,11 +1187,11 @@ public class ManagedAgentStore implements AgentStateStore { WorkspaceMigrationAdmission.requireOpen(jdbc, tenantId, session.workspace().getStorageId()); } if (!"ACTIVE".equals(session.status())) { - throw new ApiException(HttpStatus.CONFLICT, "session_not_active", + throw new ManagedAgentException(HttpStatus.CONFLICT, "session_not_active", "The Session does not accept new Turns."); } if (hasActiveTurn(tenantId, sessionId)) { - throw new ApiException(HttpStatus.CONFLICT, "turn_active", + throw new ManagedAgentException(HttpStatus.CONFLICT, "turn_active", "The Session already has an active Turn."); } // The W2 handshake: an open execution operation on a bound Session @@ -1200,7 +1204,7 @@ public class ManagedAgentStore implements AgentStateStore { // intentionally cover them stay untouched. if (session.workspace() != null && hasOpenExecutionOperation(tenantId, sessionId)) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "session_context_busy", "The Session has an open operation."); } @@ -1305,13 +1309,13 @@ public class ManagedAgentStore implements AgentStateStore { Map row = retained.getFirst(); if (!key.equals(row.get("idempotency_key")) || !digest.equals(row.get("request_digest")) || !title.equals(readMap((String) row.get("request_json")).get("title"))) { - throw new ApiException( + throw new ManagedAgentException( HttpStatus.CONFLICT, "idempotency_conflict", "The idempotency key was reused with different content."); } if ("SUPERSEDED".equals(row.get("state"))) { - throw new ApiException( + throw new ManagedAgentException( HttpStatus.CONFLICT, "session_mutation_superseded", "A later Session title attempt has been admitted."); @@ -1320,7 +1324,7 @@ public class ManagedAgentStore implements AgentStateStore { // reconciler and is never re-sent. if ("RECOVERY_BLOCKED".equals(row.get("state")) || "UNKNOWN".equals(row.get("state"))) { - throw new ApiException( + throw new ManagedAgentException( HttpStatus.CONFLICT, "operation_outcome_unknown", "The original title delivery is awaiting reconciliation."); @@ -1414,10 +1418,10 @@ public class ManagedAgentStore implements AgentStateStore { && !workspaces.createdSession(session.tenantId(), actorId, session.sessionId())) { if ("DELETED".equals(session.status())) { - throw new ApiException(HttpStatus.NOT_FOUND, "session_not_found", + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found."); } - throw new ApiException(HttpStatus.CONFLICT, "workspace_unavailable", + throw new ManagedAgentException(HttpStatus.CONFLICT, "workspace_unavailable", "Hosted Workspace execution is not available."); } } @@ -1461,7 +1465,7 @@ public class ManagedAgentStore implements AgentStateStore { .equals( readMap((String) rows.getFirst().get("request_json")) .get("title"))) { - throw new ApiException( + throw new ManagedAgentException( HttpStatus.CONFLICT, "session_mutation_superseded", "A later Session title attempt has been admitted."); @@ -1474,7 +1478,7 @@ public class ManagedAgentStore implements AgentStateStore { != ((Number) operation.get("claim_generation")).longValue() || !List.of("RUNNING", "RECOVERY_BLOCKED", "UNKNOWN") .contains(operation.get("state"))) { - throw new ApiException( + throw new ManagedAgentException( HttpStatus.CONFLICT, "operation_claim_lost", "The title delivery claim was lost."); @@ -1581,7 +1585,7 @@ public class ManagedAgentStore implements AgentStateStore { owner, delivery.claimGeneration()); if (changed != 1) { - throw new ApiException( + throw new ManagedAgentException( HttpStatus.CONFLICT, "operation_claim_lost", "The title delivery claim was lost."); @@ -1696,7 +1700,7 @@ public class ManagedAgentStore implements AgentStateStore { CommandRecord command = existing.get(); if (!command.requestDigest().equals(requestDigest) || !command.sessionId().equals(sessionId)) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "The idempotency key was reused with different content."); } @@ -1757,7 +1761,7 @@ public class ManagedAgentStore implements AgentStateStore { new IllegalStateException( "Session mutation command is unavailable")); if (!command.sessionId().equals(sessionId)) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "The idempotency key belongs to another Session."); } @@ -1775,7 +1779,7 @@ public class ManagedAgentStore implements AgentStateStore { // completing this one now would revert that newer outcome. if ("FAILED".equals(command.status()) && supersededByLaterMutation( tenantId, sessionId, operation, idempotencyKey, kind)) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "session_mutation_superseded", "A later change to the Session completed after this" + " request was retired."); @@ -1904,11 +1908,11 @@ public class ManagedAgentStore implements AgentStateStore { // invisible; a readable non-owner gets the sibling family's 403. private void requireWorkspaceCreator(SessionRecord session, String actorId) { if (!workspaces.canRead(session.tenantId(), actorId, session.workspace().getWorkspaceId())) { - throw new ApiException( + throw new ManagedAgentException( HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found."); } if (!workspaces.isSessionOwner(session.tenantId(), actorId, session.sessionId())) { - throw new ApiException(HttpStatus.FORBIDDEN, "session_operation_forbidden", + throw new ManagedAgentException(HttpStatus.FORBIDDEN, "session_operation_forbidden", "Only the Session owner may manage it."); } } @@ -1926,7 +1930,7 @@ public class ManagedAgentStore implements AgentStateStore { Optional existing = findCommand(tenantId, namespace, scopedKey, true); if (existing.isPresent()) { if (!existing.get().requestDigest().equals(requestDigest) || !existing.get().sessionId().equals(sessionId)) { - throw new ApiException(HttpStatus.CONFLICT, "idempotency_conflict", + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "The idempotency key was reused with different content."); } return new SessionMutation(session, true); @@ -1935,7 +1939,7 @@ public class ManagedAgentStore implements AgentStateStore { // refusal: a fresh key against a deleted Session must not answer // a retryable 409 for a Session that will never come back. if ("DELETED".equals(session.status())) { - throw new ApiException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found."); + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found."); } if (WorkspaceToolProfiles.isShellOrMcp(session.toolProfile()) && (WorkspaceToolProfiles.lifecycleProtocol(session.toolProfile()) != 2 @@ -2236,7 +2240,7 @@ public class ManagedAgentStore implements AgentStateStore { || !(lineage.getFirst().get("creator_actor_key") instanceof byte[] actor) || actor.length == 0 || !java.util.Arrays.equals(actor, creator)) { - throw new ApiException( + throw new ManagedAgentException( HttpStatus.NOT_FOUND, "session_not_found", "The child Session lineage was not found."); @@ -2285,14 +2289,14 @@ public class ManagedAgentStore implements AgentStateStore { kind, actorDigest, idempotencyKey); if (existing.isPresent()) { if (!existing.get().requestDigest().equals(requestDigest)) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "The idempotency key was reused with different content."); } return new OperationAdmission(existing.get(), true); } if ("DELETED".equals(session.status())) { - throw new ApiException(HttpStatus.NOT_FOUND, "session_not_found", + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found."); } // A terminally FAILED operation leaves the Session in the pending @@ -2330,7 +2334,7 @@ public class ManagedAgentStore implements AgentStateStore { throw workspaceExecutionUnavailable(); } if (hasPendingRenameDelivery(tenantId, sessionId)) { - throw new ApiException(HttpStatus.CONFLICT, "session_operation_active", + throw new ManagedAgentException(HttpStatus.CONFLICT, "session_operation_active", "The Session has a title delivery awaiting completion."); } if (session.workspace() != null) { @@ -2494,7 +2498,7 @@ public class ManagedAgentStore implements AgentStateStore { SessionRecord session = requireLegacySessionForUpdate(tenantId, sessionId); ContextBinding binding = session.workspace(); if (binding == null) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "unsupported_feature", "The Session has no Workspace context."); } @@ -2510,21 +2514,21 @@ public class ManagedAgentStore implements AgentStateStore { WorkspaceAccess cwdAccess = workspaces.accessOf(session.tenantId(), actorId, binding.getWorkspaceId()); if (!cwdAccess.canRead()) { - throw new ApiException( + throw new ManagedAgentException( HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found."); } Optional existing = replayOperation(tenantId, sessionId, OperationKind.CWD_CHANGE, actorDigest, idempotencyKey); if (existing.isPresent()) { if (!existing.get().requestDigest().equals(requestDigest)) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "The idempotency key was reused with different content."); } return new OperationAdmission(existing.get(), true); } if (!cwdAccess.atLeast(WorkspaceAccess.OPERATOR)) { - throw new ApiException(HttpStatus.FORBIDDEN, "session_operation_forbidden", + throw new ManagedAgentException(HttpStatus.FORBIDDEN, "session_operation_forbidden", "Only a Workspace operator may change the Session directory."); } if (residentWorkspaces.find(binding) != null) { @@ -2536,7 +2540,7 @@ public class ManagedAgentStore implements AgentStateStore { throw workspaceExecutionUnavailable(); } if ("DELETED".equals(session.status())) { - throw new ApiException(HttpStatus.NOT_FOUND, "session_not_found", + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found."); } if (!"ACTIVE".equals(session.status())) { @@ -2544,7 +2548,7 @@ public class ManagedAgentStore implements AgentStateStore { } requireCwdChangeRegistryFacts(session); if (binding.getContextRevision() != expectedContextRevision) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "context_revision_conflict", "The Session context revision has changed."); } @@ -2556,7 +2560,7 @@ public class ManagedAgentStore implements AgentStateStore { || hasActiveTurn(tenantId, sessionId) || hasDecidableAction(session) || hasRetainedRuntimeSession(tenantId, sessionId)) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "session_context_busy", "The Session has an active Turn, operation or retained Runtime context."); } @@ -2763,18 +2767,18 @@ public class ManagedAgentStore implements AgentStateStore { OperationKind.TASK_CANCEL, actorDigest, idempotencyKey); if (existing.isPresent()) { if (!existing.get().requestDigest().equals(requestDigest)) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "The idempotency key was reused with different content."); } return new OperationAdmission(existing.get(), true); } if ("DELETED".equals(session.status())) { - throw new ApiException(HttpStatus.NOT_FOUND, "session_not_found", + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found."); } if (!"ACTIVE".equals(session.status())) { - throw new ApiException(HttpStatus.CONFLICT, "session_not_active", + throw new ManagedAgentException(HttpStatus.CONFLICT, "session_not_active", "The Session is " + session.status().toLowerCase( java.util.Locale.ROOT) + " and accepts no task cancellation."); @@ -2791,12 +2795,12 @@ public class ManagedAgentStore implements AgentStateStore { ManagedSessionStore.sessionScopeKey(tenantId, sessionId), taskId.substring("task_".length())); if (task.isEmpty()) { - throw new ApiException(HttpStatus.NOT_FOUND, "task_not_found", + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "task_not_found", "The task was not found."); } if (!ManagedExtensionProjection.taskActions(task.getFirst()[0], task.getFirst()[1]).contains("cancel")) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "task_action_unavailable", "The task does not accept a cancellation now."); } @@ -3813,12 +3817,12 @@ public class ManagedAgentStore implements AgentStateStore { ManagedReceipts.Receipt command = ManagedReceipts.command(jdbc, tenantId, operation, idempotencyKey, false); if (command == null) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "The idempotency key is already in use."); } if (!command.requestDigest().equals(requestDigest)) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "The idempotency key was reused with different content."); } @@ -4022,7 +4026,7 @@ public class ManagedAgentStore implements AgentStateStore { ? null : new WebShellModelSelection(row.getString("model_id"), row.getLong("model_revision")), tenantId, sessionId, promptId); if (rows.size() != 1) { - throw new ApiException(HttpStatus.CONFLICT, "turn_not_found", "The model snapshot Turn was not found"); + throw new ManagedAgentException(HttpStatus.CONFLICT, "turn_not_found", "The model snapshot Turn was not found"); } return rows.getFirst(); } @@ -4035,12 +4039,12 @@ public class ManagedAgentStore implements AgentStateStore { WorkspaceMigrationAdmission.lockTenant(jdbc, tenantId); SessionRecord session = requireLegacySessionForUpdate(tenantId, sessionId); if (session.workspace() == null) { - throw new ApiException(HttpStatus.BAD_REQUEST, "unsupported_feature", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "unsupported_feature", "Model selection requires a Workspace Session"); } WorkspaceAccess access = workspaces.accessOf(tenantId, actorId, session.workspace().getWorkspaceId()); if (!access.canRead()) { - throw new ApiException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found"); + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found"); } String scope = com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys .key("SET_MODEL", sessionId, actorId); @@ -4054,7 +4058,7 @@ public class ManagedAgentStore implements AgentStateStore { || !"SET_MODEL".equals(replay.operation()) || !java.util.Arrays.equals(actorId.getBytes(StandardCharsets.UTF_8), replay.actorKey())) { - throw new ApiException(HttpStatus.CONFLICT, "idempotency_conflict", + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "The idempotency key was reused with different content"); } Map result = readMap(replay.resultJson()); @@ -4062,20 +4066,20 @@ public class ManagedAgentStore implements AgentStateStore { (String) result.get("modelId"), ((Number) result.get("revision")).longValue()), true); } if (!access.atLeast(WorkspaceAccess.OPERATOR)) { - throw new ApiException(HttpStatus.FORBIDDEN, "session_operation_forbidden", + throw new ManagedAgentException(HttpStatus.FORBIDDEN, "session_operation_forbidden", "Only a Workspace operator may change the model"); } if (!supported || modelCatalog.isEmpty() || !workspaceFilesEnabled) { - throw new ApiException(HttpStatus.CONFLICT, "unsupported_feature", "Model selection is unavailable"); + throw new ManagedAgentException(HttpStatus.CONFLICT, "unsupported_feature", "Model selection is unavailable"); } if (modelCatalog.stream().noneMatch(option -> option.modelId().equals(modelId))) { - throw new ApiException(HttpStatus.BAD_REQUEST, "unsupported_model", "The model is not published by this host"); + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "unsupported_model", "The model is not published by this host"); } requireIdlePolicyChange(session); long current = jdbc.queryForObject("SELECT model_revision FROM ma_session WHERE tenant_id = ?" + " AND session_id = ?", Long.class, tenantId, sessionId); if (current != expectedRevision || current >= 9_007_199_254_740_991L) { - throw new ApiException(HttpStatus.CONFLICT, "model_selection_conflict", "The model revision changed"); + throw new ManagedAgentException(HttpStatus.CONFLICT, "model_selection_conflict", "The model revision changed"); } long revision = current + 1; long now = clock.millis(); @@ -4149,14 +4153,14 @@ public class ManagedAgentStore implements AgentStateStore { } String mode = row.getString("approval_mode"); if (mode == null && row.getLong("selected_revision") != 0) { - throw new ApiException(HttpStatus.CONFLICT, "approval_snapshot_missing", "The Turn has no approval snapshot"); + throw new ManagedAgentException(HttpStatus.CONFLICT, "approval_snapshot_missing", "The Turn has no approval snapshot"); } // Legacy prompt replays must preserve the original absence of a selection. return mode == null ? null : new WebShellApprovalSelection(mode, row.getLong("approval_revision"), row.getBoolean("plan_enabled")); }, tenantId, sessionId, promptId); if (rows.size() != 1) { - throw new ApiException(HttpStatus.CONFLICT, "turn_not_found", "The Turn was not found"); + throw new ManagedAgentException(HttpStatus.CONFLICT, "turn_not_found", "The Turn was not found"); } return rows.getFirst(); } @@ -4178,16 +4182,16 @@ public class ManagedAgentStore implements AgentStateStore { WorkspaceMigrationAdmission.lockTenant(jdbc, tenantId); SessionRecord session = requireLegacySessionForUpdate(tenantId, sessionId); if (session.workspace() == null) { - throw new ApiException(HttpStatus.BAD_REQUEST, "unsupported_feature", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "unsupported_feature", "Approval selection requires a Workspace Session"); } WorkspaceAccess access = workspaces.accessOf(tenantId, actorId, session.workspace().getWorkspaceId()); if (!access.canRead()) { - throw new ApiException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found"); + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found"); } if (!workspaces.isSessionOwner(tenantId, actorId, sessionId) || !access.atLeast(WorkspaceAccess.OPERATOR)) { - throw new ApiException(HttpStatus.FORBIDDEN, "session_operation_forbidden", + throw new ManagedAgentException(HttpStatus.FORBIDDEN, "session_operation_forbidden", "Only the Session owner with OPERATOR access may change approval policy"); } String scope = com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys @@ -4202,7 +4206,7 @@ public class ManagedAgentStore implements AgentStateStore { || !"SET_APPROVAL".equals(replay.operation()) || !java.util.Arrays.equals(actorId.getBytes(StandardCharsets.UTF_8), replay.actorKey())) { - throw new ApiException(HttpStatus.CONFLICT, "idempotency_conflict", + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "The idempotency key was reused with different content"); } Map result = readMap(replay.resultJson()); @@ -4212,23 +4216,23 @@ public class ManagedAgentStore implements AgentStateStore { if (!supported || session.agentDefinitionDigest() != null && !agentDefinitionSupported || !workspaceFilesEnabled || !WorkspaceToolProfiles.supportsApprovalSelection(session) || WorkspaceToolProfiles.isPublicShell(session.toolProfile()) && !workspaceShellEnabled) { - throw new ApiException(HttpStatus.CONFLICT, "unsupported_feature", "Approval selection is unavailable"); + throw new ManagedAgentException(HttpStatus.CONFLICT, "unsupported_feature", "Approval selection is unavailable"); } if (!WorkspaceToolProfiles.supportsApprovalMode(mode)) { - throw new ApiException(HttpStatus.BAD_REQUEST, "unsupported_approval_mode", "The approval mode is unavailable"); + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "unsupported_approval_mode", "The approval mode is unavailable"); } boolean planMode = requestedPlanMode == null ? Boolean.TRUE.equals(jdbc.queryForObject("SELECT plan_enabled FROM ma_session WHERE tenant_id=? AND session_id=?", Boolean.class, tenantId, sessionId)) : requestedPlanMode; if (planMode && (!planModeSupported || !supportsPlanMode(session))) { - throw new ApiException(HttpStatus.CONFLICT, "unsupported_feature", "Plan mode is unavailable"); + throw new ManagedAgentException(HttpStatus.CONFLICT, "unsupported_feature", "Plan mode is unavailable"); } requireIdlePolicyChange(session); long current = jdbc.queryForObject("SELECT approval_revision FROM ma_session WHERE tenant_id = ?" + " AND session_id = ?", Long.class, tenantId, sessionId); if (current != expectedRevision || current >= 9_007_199_254_740_991L || planMode && current >= 9_007_199_254_740_990L) { - throw new ApiException(HttpStatus.CONFLICT, "approval_selection_conflict", "The approval revision changed"); + throw new ManagedAgentException(HttpStatus.CONFLICT, "approval_selection_conflict", "The approval revision changed"); } long revision = current + 1; long now = clock.millis(); @@ -4254,7 +4258,7 @@ public class ManagedAgentStore implements AgentStateStore { requireSessionStatus(session.status(), "ACTIVE"); requireCwdChangeRegistryFacts(session); if (hasActiveTurn(tenantId, sessionId) || hasDecidableAction(session)) { - throw new ApiException(HttpStatus.CONFLICT, "turn_active", "The Session has an active Turn or approval"); + throw new ManagedAgentException(HttpStatus.CONFLICT, "turn_active", "The Session has an active Turn or approval"); } if (hasOpenOperation(tenantId, sessionId) || hasPendingRenameDelivery(tenantId, sessionId) || hasRetainedRuntimeSession(tenantId, sessionId) @@ -4263,7 +4267,7 @@ public class ManagedAgentStore implements AgentStateStore { || !jdbc.queryForList("SELECT 1 FROM ma_session_head WHERE tenant_id = ?" + " AND session_id = ? AND head_kind = 'MANAGED_SESSION' AND" + " (state <> 'ACTIVE' OR recovery_status <> 'READY')", tenantId, sessionId).isEmpty()) { - throw new ApiException(HttpStatus.CONFLICT, "session_context_busy", "The Session requires settlement"); + throw new ManagedAgentException(HttpStatus.CONFLICT, "session_context_busy", "The Session requires settlement"); } } @@ -4467,7 +4471,7 @@ public class ManagedAgentStore implements AgentStateStore { tenantId, sessionId); if (rows.isEmpty()) { - throw new ApiException(HttpStatus.NOT_FOUND, "session_not_found", + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found."); } return rows.getFirst(); @@ -5500,7 +5504,7 @@ public class ManagedAgentStore implements AgentStateStore { accepted = WorkspaceLifecycleStore.requireIdleJournal(jdbc, objectMapper, tenantId, sessionId, false, WorkspaceToolProfiles.lifecycleProtocol(session.toolProfile()) == 2); - } catch (ApiException unverified) { + } catch (ManagedAgentException unverified) { return false; } if (accepted.contains(turn.promptId()) || !withdrawSubmissionAttempted(tenantId, sessionId, turnId, owner)) { @@ -5634,7 +5638,7 @@ public class ManagedAgentStore implements AgentStateStore { public SessionRecord requireSession(String tenantId, String sessionId) { return findSession(tenantId, sessionId).orElseThrow(() -> - new ApiException(HttpStatus.NOT_FOUND, "session_not_found", + new ManagedAgentException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found.")); } @@ -6112,7 +6116,7 @@ public class ManagedAgentStore implements AgentStateStore { tenantId, sessionId); } catch (EmptyResultDataAccessException error) { - throw new ApiException(HttpStatus.NOT_FOUND, + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found."); } } @@ -6120,7 +6124,7 @@ public class ManagedAgentStore implements AgentStateStore { private TurnRecord requireTurn(String tenantId, String sessionId, String turnId) { return findTurn(tenantId, sessionId, turnId).orElseThrow(() -> - new ApiException(HttpStatus.NOT_FOUND, "turn_not_found", + new ManagedAgentException(HttpStatus.NOT_FOUND, "turn_not_found", "The Turn was not found.")); } @@ -6132,7 +6136,7 @@ public class ManagedAgentStore implements AgentStateStore { + " turn_id = ? FOR UPDATE", turnMapper, tenantId, sessionId, turnId); } catch (EmptyResultDataAccessException error) { - throw new ApiException(HttpStatus.NOT_FOUND, "turn_not_found", + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "turn_not_found", "The Turn was not found."); } } @@ -6288,7 +6292,7 @@ public class ManagedAgentStore implements AgentStateStore { private void requireNoOpenOperation(String tenantId, String sessionId) { if (hasOpenOperation(tenantId, sessionId)) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "session_operation_active", "The Session already has a lifecycle operation in progress."); } @@ -6310,7 +6314,7 @@ public class ManagedAgentStore implements AgentStateStore { if ("ACTIVE".equals(status) && (hasLiveTurn(session.tenantId(), session.sessionId()) || session.workspace() != null && hasDecidableAction(session))) { - throw new ApiException(HttpStatus.CONFLICT, "turn_active", + throw new ManagedAgentException(HttpStatus.CONFLICT, "turn_active", "The Session has an active Turn."); } } @@ -6397,8 +6401,8 @@ public class ManagedAgentStore implements AgentStateStore { } } - private static ApiException sessionStateConflict(String status) { - return new ApiException(HttpStatus.CONFLICT, + private static ManagedAgentException sessionStateConflict(String status) { + return new ManagedAgentException(HttpStatus.CONFLICT, "session_state_conflict", "The Session is " + status.toLowerCase(Locale.ROOT) + " and cannot perform this operation."); diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedArtifactReader.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedArtifactReader.java similarity index 95% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedArtifactReader.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedArtifactReader.java index 35679d863a9..5ccb8168d74 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedArtifactReader.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedArtifactReader.java @@ -1,7 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.store.ManagedToolResultStore.Artifact; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedToolResultStore.Artifact; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.ObjectProvider; import org.springframework.http.HttpStatus; @@ -150,7 +150,7 @@ public class ManagedArtifactReader { private ToolPublicationDataStore data() { var data = publications.getIfAvailable(); if (data == null) { - throw new ApiException(HttpStatus.SERVICE_UNAVAILABLE, "artifact_unavailable", + throw new ManagedAgentException(HttpStatus.SERVICE_UNAVAILABLE, "artifact_unavailable", "Artifact storage is unavailable."); } return data; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedChannelRecords.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedChannelRecords.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedChannelRecords.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedChannelRecords.java index 554067f1589..f2f1e579c9a 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedChannelRecords.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedChannelRecords.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords.InvalidRecordException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords.InvalidRecordException; import com.fasterxml.jackson.databind.JsonNode; import java.util.HashSet; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedExtensionProjection.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedExtensionProjection.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedExtensionProjection.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedExtensionProjection.java index 0237bd08ca3..4f9c8cc1cd0 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedExtensionProjection.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedExtensionProjection.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; import com.fasterxml.jackson.databind.JsonNode; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedExtensionRecordStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedExtensionRecordStore.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedExtensionRecordStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedExtensionRecordStore.java index 2a1dcd01cee..32b5f8dc373 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedExtensionRecordStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedExtensionRecordStore.java @@ -1,11 +1,12 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellModelContext; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection.Body; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection.TaskProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords.InvalidRecordException; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.StoredResource; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellModelContext; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection.Body; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection.TaskProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords.InvalidRecordException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.StoredResource; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; @@ -407,7 +408,7 @@ public class ManagedExtensionRecordStore { JsonNode record = nativeRecords == null ? parse(lines[index]) : nativeRecords.get(index); if (record == null) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, ManagedSessionStoreModels.ERROR_INVALID_REQUEST, "Record line " + (index + 1) + " is not a JSON object" + " the Session authority can read."); @@ -602,7 +603,7 @@ public class ManagedExtensionRecordStore { // non-commit (an authority kept alive for the corrected // retry), never as a write failure that latches the parent's // Session log shut behind it. - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "child_run_lineage_minted", "Child run " + recordId + "'s never-started verdict does" + " not name the Session its creation minted."); @@ -621,7 +622,7 @@ public class ManagedExtensionRecordStore { for (String line : new String(bytes, StandardCharsets.UTF_8).split("\n")) { JsonNode parsed = parse(line); if (parsed == null) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, ManagedSessionStoreModels.ERROR_INVALID_REQUEST, "Record line is not a JSON object the Session authority can read."); } @@ -686,7 +687,7 @@ public class ManagedExtensionRecordStore { for (String line : new String(bytes, StandardCharsets.UTF_8).split("\n")) { JsonNode parsed = parse(line); if (parsed == null) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, ManagedSessionStoreModels.ERROR_INVALID_REQUEST, "Record line is not a JSON object the Session authority can read."); } @@ -1433,7 +1434,7 @@ public class ManagedExtensionRecordStore { taskEvents.appendStateChange(tenantId, sessionId, taskId, projection.state(), projection.runtimeState(), occurredAt); - } catch (ApiException refused) { + } catch (ManagedAgentException refused) { // The record row above is the authoritative state and it is // already written; the event journal is a derived, bounded // feed. A journal that refuses past its backlog bound — or @@ -1589,7 +1590,7 @@ public class ManagedExtensionRecordStore { && (outbound ? target == null || target.equals(parent) : sender.equals(parent)); if (!follows) { - throw new ApiException(HttpStatus.CONFLICT, ERROR_MESSAGE_LINEAGE, + throw new ManagedAgentException(HttpStatus.CONFLICT, ERROR_MESSAGE_LINEAGE, outbound ? "Session message to a parent must follow this" + " Session's lineage." @@ -1634,7 +1635,7 @@ public class ManagedExtensionRecordStore { boolean follows = parent != null && childRunId.equals(edge) && (target == null || target.equals(parent)); if (!follows) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, ERROR_COMMAND_LINEAGE, "Session command to a parent must follow this" + " Session's lineage."); @@ -1912,8 +1913,8 @@ public class ManagedExtensionRecordStore { } } - private static ApiException rejected(String message) { - return new ApiException(HttpStatus.CONFLICT, ERROR_REJECTED, message); + private static ManagedAgentException rejected(String message) { + return new ManagedAgentException(HttpStatus.CONFLICT, ERROR_REJECTED, message); } private record StoredRow(String domain, String recordId, long revision, diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedExtensionRecords.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedExtensionRecords.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedExtensionRecords.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedExtensionRecords.java index 53fd0c1c099..80e85ea9540 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedExtensionRecords.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedExtensionRecords.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedHookRecords.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedHookRecords.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedHookRecords.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedHookRecords.java index 31a09c2b9d0..896304a9d27 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedHookRecords.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedHookRecords.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords.InvalidRecordException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords.InvalidRecordException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import org.apache.commons.codec.digest.DigestUtils; 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/persistence/ManagedHostedRecoveryRecords.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedHostedRecoveryRecords.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedHostedRecoveryRecords.java index 8017a811e80..9bef655dbe9 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/persistence/ManagedHostedRecoveryRecords.java @@ -1,7 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.StoredResource; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.StoredResource; import com.fasterxml.jackson.databind.JsonNode; import org.springframework.http.HttpStatus; @@ -291,7 +291,7 @@ public final class ManagedHostedRecoveryRecords { } } - private static ApiException rejected(String message) { - return new ApiException(HttpStatus.CONFLICT, "managed_hosted_recovery_record_rejected", message); + private static ManagedAgentException rejected(String message) { + return new ManagedAgentException(HttpStatus.CONFLICT, "managed_hosted_recovery_record_rejected", message); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedLegacySessionGuard.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedLegacySessionGuard.java similarity index 93% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedLegacySessionGuard.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedLegacySessionGuard.java index 5780bd542a8..8ee657b5a94 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedLegacySessionGuard.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedLegacySessionGuard.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import org.springframework.http.HttpStatus; import org.springframework.jdbc.core.ConnectionCallback; import org.springframework.jdbc.core.JdbcTemplate; @@ -51,7 +51,7 @@ final class ManagedLegacySessionGuard { static void requireLegacyMutation(boolean privateSession) { if (privateSession) { - throw new ApiException(HttpStatus.CONFLICT, "csi_managed_mutation_unavailable", + throw new ManagedAgentException(HttpStatus.CONFLICT, "csi_managed_mutation_unavailable", "The private CSI Session does not admit legacy Managed Agent mutations."); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedMcpRecords.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedMcpRecords.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedMcpRecords.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedMcpRecords.java index 1af4e2386a3..aec024aaad7 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedMcpRecords.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedMcpRecords.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords.InvalidRecordException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords.InvalidRecordException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedProjectionResourceCollector.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedProjectionResourceCollector.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedProjectionResourceCollector.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedProjectionResourceCollector.java index e8469bbfcc5..10cbe581cd8 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedProjectionResourceCollector.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedProjectionResourceCollector.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedReceipts.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedReceipts.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedReceipts.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedReceipts.java index d41b0b3bc81..65956892e06 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedReceipts.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedReceipts.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.ReceiptNamespace; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.ReceiptScope; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedRuntimeRetentionGuard.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedRuntimeRetentionGuard.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedRuntimeRetentionGuard.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedRuntimeRetentionGuard.java index 0b1f20e41d6..deaa592da70 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedRuntimeRetentionGuard.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedRuntimeRetentionGuard.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.HarnessOwnership; import com.alibaba.qwen.code.runtimebroker.JdbcCsiFilesRetirementGuard; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaJdbcTemplate.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaJdbcTemplate.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaJdbcTemplate.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaJdbcTemplate.java index 956c87f679b..1efe5251736 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaJdbcTemplate.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaJdbcTemplate.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaRows; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionCommandRecords.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionCommandRecords.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionCommandRecords.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionCommandRecords.java index 1189f3f1091..13d0e193047 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionCommandRecords.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionCommandRecords.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords.InvalidRecordException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords.InvalidRecordException; import com.fasterxml.jackson.databind.JsonNode; import java.util.List; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionMessageRecords.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionMessageRecords.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionMessageRecords.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionMessageRecords.java index ccccde6913d..2db19d60748 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionMessageRecords.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionMessageRecords.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords.InvalidRecordException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords.InvalidRecordException; import com.fasterxml.jackson.databind.JsonNode; import java.util.List; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionReaderVersion.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionReaderVersion.java similarity index 76% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionReaderVersion.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionReaderVersion.java index 75145447833..7dfac3b1ebb 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionReaderVersion.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionReaderVersion.java @@ -1,7 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.PublicSurface; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.security.PublicSurface; import org.springframework.http.HttpStatus; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -22,14 +22,14 @@ final class ManagedSessionReaderVersion { || path.startsWith("/internal/managed-tool-publications/")) { String header = request.getHeader(HEADER); if (header != null && !header.matches("[12]")) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_managed_session_reader_version", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_managed_session_reader_version", "The Managed Session reader version is invalid."); } ceiling = header == null ? 1 : Integer.parseInt(header); } } if (floor > ceiling) { - throw new ApiException(HttpStatus.CONFLICT, "managed_session_reader_version_unsupported", + throw new ManagedAgentException(HttpStatus.CONFLICT, "managed_session_reader_version_unsupported", "This reader cannot read the Managed Session storage version."); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionRetirementStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionRetirementStore.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionRetirementStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionRetirementStore.java index eaac60a5402..d9191c2e9d8 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionRetirementStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionRetirementStore.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionStore.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionStore.java index 9e799d16625..a2e732b4e89 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionStore.java @@ -1,22 +1,27 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.AcquireWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.BlockRecoveryRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitReceipt; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitResource; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitTransactionRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.PublishToolResultRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.RecoveryStateReceipt; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.RenewWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.RestoreHead; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.SealReceipt; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.SealWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.StoredResource; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.StoredTransaction; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.ToolResultResourceRef; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.TransactionPage; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.WriterGrant; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; +import com.alibaba.qwen.code.managedagent.catalog.AgentDefinitionExtensions; +import com.alibaba.qwen.code.managedagent.event.JournalEventTransport; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.AcquireWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.BlockRecoveryRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitReceipt; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitResource; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitTransactionRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.PublishToolResultRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.RecoveryStateReceipt; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.RenewWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.RestoreHead; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.SealReceipt; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.SealWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.StoredResource; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.StoredTransaction; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.ToolResultResourceRef; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.TransactionPage; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.WriterGrant; +import com.alibaba.qwen.code.managedagent.security.WriterCredentialPolicy; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import com.alibaba.qwen.code.runtimebroker.JdbcCsiActivationAdmission; import com.alibaba.qwen.code.runtimebroker.JdbcCsiFilesRetirementGuard; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; @@ -247,8 +252,8 @@ public class ManagedSessionStore { WorkspaceLifecycleStore.requireClaim(jdbc, tenantId, sessionId, authority, true); } - private static ApiException guardContended() { - return new ApiException(HttpStatus.SERVICE_UNAVAILABLE, + private static ManagedAgentException guardContended() { + return new ManagedAgentException(HttpStatus.SERVICE_UNAVAILABLE, "tenant_guard_contended", "A tenant-wide Managed Session guard could not be acquired" + " within the hot-path bound; retry."); @@ -263,7 +268,7 @@ public class ManagedSessionStore { org.springframework.transaction.support.TransactionCallback body) { try { return transactions.execute(body); - } catch (ApiException refusal) { + } catch (ManagedAgentException refusal) { if (!"tenant_guard_contended".equals(refusal.getCode())) { throw refusal; } @@ -1015,7 +1020,7 @@ public class ManagedSessionStore { "workspace_lifecycle_authorization_revoked"); } if (refusal.getStatusCode() == 409) { - throw new ApiException(HttpStatus.CONFLICT, refusal.getCode(), refusal.getMessage()); + throw new ManagedAgentException(HttpStatus.CONFLICT, refusal.getCode(), refusal.getMessage()); } throw refusal; } @@ -1298,7 +1303,7 @@ public class ManagedSessionStore { String scopeKey = sessionScopeKey(tenantId, sessionId); ResourceRow resource = findResource(scopeKey, resourceId); if (resource == null) { - throw new ApiException(HttpStatus.NOT_FOUND, + throw new ManagedAgentException(HttpStatus.NOT_FOUND, ManagedSessionStoreModels.ERROR_RESOURCE_NOT_FOUND, "The Managed Session resource does not exist."); } @@ -1360,7 +1365,7 @@ public class ManagedSessionStore { ResourceRow resource = nativeResourceMetadata(tenantId, sessionId, resourceId); if (resource == null) { - throw new ApiException( + throw new ManagedAgentException( HttpStatus.NOT_FOUND, ManagedSessionStoreModels.ERROR_RESOURCE_NOT_FOUND, "The Managed Session resource does not exist."); @@ -1453,7 +1458,7 @@ public class ManagedSessionStore { } throw failure; } - ApiException failure = finishNativeRead(admission, fetched, true, writerToken); + ManagedAgentException failure = finishNativeRead(admission, fetched, true, writerToken); if (failure != null) { throw failure; } @@ -1541,7 +1546,7 @@ public class ManagedSessionStore { } } - private ApiException finishNativeRead( + private ManagedAgentException finishNativeRead( NativeRead admission, ResourceRow fetched, boolean returned, String writerToken) { return ownerReads.execute( status -> { @@ -1568,7 +1573,7 @@ public class ManagedSessionStore { completeNativeRead(admission, "UNKNOWN", null, "jdbc_fetch_unknown"); return null; } - ApiException failure = null; + ManagedAgentException failure = null; try { requireHeadScope( head, @@ -1620,7 +1625,7 @@ public class ManagedSessionStore { databaseNow(), sessionScopeKey(head.tenantId(), head.sessionId()), fetched.resourceId()); - } catch (ApiException rejected) { + } catch (ManagedAgentException rejected) { failure = rejected; } requireCsiReadGrant(continuation, head, writerToken); @@ -1655,7 +1660,7 @@ public class ManagedSessionStore { && actual.encryptionKeyId() == null; } - private static ApiException nativeReadConflict() { + private static ManagedAgentException nativeReadConflict() { return conflict( "csi_resource_read_conflict", "The original resource read identity is unavailable."); @@ -2049,7 +2054,7 @@ public class ManagedSessionStore { if (resource.byteLength() > maxResourceBytes && !("managed-tool-outcome".equals(resource.kind()) && resource.bytesBase64() == null)) { - throw new ApiException(HttpStatus.NOT_IMPLEMENTED, + throw new ManagedAgentException(HttpStatus.NOT_IMPLEMENTED, ManagedSessionStoreModels.ERROR_OSS_DISABLED, "Resources larger than " + (maxResourceBytes / 1024) + " KiB require the disabled" + " OSS storage path."); @@ -2752,8 +2757,8 @@ public class ManagedSessionStore { } } - private static ApiException resourceCorrupt() { - return new ApiException(HttpStatus.INTERNAL_SERVER_ERROR, + private static ManagedAgentException resourceCorrupt() { + return new ManagedAgentException(HttpStatus.INTERNAL_SERVER_ERROR, "managed_session_resource_corrupt", "The Managed Session resource failed verification."); } @@ -2866,7 +2871,7 @@ public class ManagedSessionStore { private static void requireTransactionWorkspace(TransactionRow row, String workspaceId) { if (!workspaceId.equals(row.workspaceId())) { - throw new ApiException(HttpStatus.INTERNAL_SERVER_ERROR, + throw new ManagedAgentException(HttpStatus.INTERNAL_SERVER_ERROR, ManagedSessionStoreModels.ERROR_JOURNAL_CORRUPT, "The Managed Session transaction scope is corrupt."); } @@ -2875,7 +2880,7 @@ public class ManagedSessionStore { private static String tokenHash(String writerToken) { if (writerToken == null || !WRITER_TOKEN.matcher(writerToken).matches()) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_writer_token", ManagedSessionStoreModels.WRITER_TOKEN_HEADER + " must contain 32-512 Base64URL characters."); @@ -2921,43 +2926,43 @@ public class ManagedSessionStore { right.getBytes(StandardCharsets.US_ASCII)); } - private static ApiException sessionNotFound() { - return new ApiException(HttpStatus.NOT_FOUND, + private static ManagedAgentException sessionNotFound() { + return new ManagedAgentException(HttpStatus.NOT_FOUND, "managed_session_not_found", "The Managed Session does not exist."); } - private static ApiException writerConflict() { + private static ManagedAgentException writerConflict() { return conflict(ManagedSessionStoreModels.ERROR_WRITER_CONFLICT, "The Managed Session writer grant is stale or unavailable."); } // Package-private: ToolPublicationStore's evidence reads answer a // damaged journal with the same fault the session store raises. - static ApiException journalCorrupt() { - return new ApiException(HttpStatus.INTERNAL_SERVER_ERROR, + static ManagedAgentException journalCorrupt() { + return new ManagedAgentException(HttpStatus.INTERNAL_SERVER_ERROR, ManagedSessionStoreModels.ERROR_JOURNAL_CORRUPT, "The Managed Session transaction failed verification."); } - private static ApiException headCorrupt() { - return new ApiException(HttpStatus.INTERNAL_SERVER_ERROR, + private static ManagedAgentException headCorrupt() { + return new ManagedAgentException(HttpStatus.INTERNAL_SERVER_ERROR, ManagedSessionStoreModels.ERROR_HEAD_CORRUPT, "The Managed Session head failed verification."); } - private static ApiException invalid(String message) { - return new ApiException(HttpStatus.BAD_REQUEST, + private static ManagedAgentException invalid(String message) { + return new ManagedAgentException(HttpStatus.BAD_REQUEST, ManagedSessionStoreModels.ERROR_INVALID_REQUEST, message); } - private static ApiException payloadTooLarge(String message) { - return new ApiException(HttpStatus.PAYLOAD_TOO_LARGE, + private static ManagedAgentException payloadTooLarge(String message) { + return new ManagedAgentException(HttpStatus.PAYLOAD_TOO_LARGE, ManagedSessionStoreModels.ERROR_PAYLOAD_TOO_LARGE, message); } - private static ApiException conflict(String code, String message) { - return new ApiException(HttpStatus.CONFLICT, code, message); + private static ManagedAgentException conflict(String code, String message) { + return new ManagedAgentException(HttpStatus.CONFLICT, code, message); } private record HeadRow(String tenantId, String workspaceId, diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionStoreModels.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionStoreModels.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionStoreModels.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionStoreModels.java index a9839cabdfa..d1869f91b2b 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionStoreModels.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionStoreModels.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.fasterxml.jackson.annotation.JsonInclude; import jakarta.validation.Valid; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSnapshotStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSnapshotStore.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSnapshotStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSnapshotStore.java index 9bc5c0ccd6a..111c56374cb 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSnapshotStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSnapshotStore.java @@ -1,8 +1,9 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ItemRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SnapshotRecord; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ItemRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SnapshotRecord; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; @@ -804,13 +805,13 @@ final class ManagedSnapshotStore { return ((Number) row.get(name)).longValue(); } - private static ApiException invalidCursor() { - return new ApiException( + private static ManagedAgentException invalidCursor() { + return new ManagedAgentException( HttpStatus.BAD_REQUEST, "invalid_item_cursor", "The item cursor is invalid."); } - private static ApiException expiredCursor() { - return new ApiException( + private static ManagedAgentException expiredCursor() { + return new ManagedAgentException( HttpStatus.CONFLICT, "cursor_expired", "The snapshot cursor has expired."); } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedTaskEventStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedTaskEventStore.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedTaskEventStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedTaskEventStore.java index c711ab09f8a..f31c3ee0eba 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedTaskEventStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedTaskEventStore.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; import com.fasterxml.jackson.databind.JsonNode; @@ -432,8 +432,8 @@ public class ManagedTaskEventStore { return ManagedSchemaKeys.key("task-event", tenantId, sessionId, taskId, Long.toString(sequence)); } - private static ApiException conflict(String code, String message) { - return new ApiException(HttpStatus.CONFLICT, code, message); + private static ManagedAgentException conflict(String code, String message) { + return new ManagedAgentException(HttpStatus.CONFLICT, code, message); } private static TaskEvent eventRow(ResultSet result, int row) throws SQLException { @@ -445,7 +445,7 @@ public class ManagedTaskEventStore { result.getObject("end_ordinal", Long.class), result.getBoolean("archived")); } - private static ApiException invalidCursor() { - return new ApiException(HttpStatus.BAD_REQUEST, "invalid_event_cursor", "The task event cursor is invalid."); + private static ManagedAgentException invalidCursor() { + return new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_event_cursor", "The task event cursor is invalid."); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedTeamRecords.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedTeamRecords.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedTeamRecords.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedTeamRecords.java index ec5c974ee11..bbe3ef706ba 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedTeamRecords.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedTeamRecords.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords.InvalidRecordException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords.InvalidRecordException; import com.fasterxml.jackson.databind.JsonNode; import java.util.HashSet; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedToolDetailsStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedToolDetailsStore.java similarity index 96% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedToolDetailsStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedToolDetailsStore.java index fe5309f5eef..03836d8974c 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedToolDetailsStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedToolDetailsStore.java @@ -1,8 +1,8 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellShellResult; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellToolDetails; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellShellResult; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellToolDetails; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.digest.DigestUtils; @@ -293,12 +293,12 @@ public class ManagedToolDetailsStore { private record Message(byte[] bytes, int readBytes) { } - private static ApiException limit() { - return new ApiException(HttpStatus.PAYLOAD_TOO_LARGE, "tool_details_limit", + private static ManagedAgentException limit() { + return new ManagedAgentException(HttpStatus.PAYLOAD_TOO_LARGE, "tool_details_limit", "Tool details exceed the bounded history read limit."); } - private static ApiException unavailable() { - return new ApiException(HttpStatus.NOT_FOUND, "tool_details_not_found", "Tool details are unavailable."); + private static ManagedAgentException unavailable() { + return new ManagedAgentException(HttpStatus.NOT_FOUND, "tool_details_not_found", "Tool details are unavailable."); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedToolResultProjector.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedToolResultProjector.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedToolResultProjector.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedToolResultProjector.java index 4c98f37e7b3..1e4fea4e2da 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedToolResultProjector.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedToolResultProjector.java @@ -1,11 +1,11 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; +import com.alibaba.qwen.code.managedagent.artifact.ManagedArtifactPolicy; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.service.ManagedArtifactPolicy; -import com.alibaba.qwen.code.managedagent.store.ManagedToolResultStore.Artifact; -import com.alibaba.qwen.code.managedagent.store.ManagedToolResultStore.Claim; -import com.alibaba.qwen.code.managedagent.store.ManagedToolResultStore.Projection; -import com.alibaba.qwen.code.managedagent.store.ManagedToolResultStore.Source; +import com.alibaba.qwen.code.managedagent.persistence.ManagedToolResultStore.Artifact; +import com.alibaba.qwen.code.managedagent.persistence.ManagedToolResultStore.Claim; +import com.alibaba.qwen.code.managedagent.persistence.ManagedToolResultStore.Projection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedToolResultStore.Source; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedToolResultStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedToolResultStore.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedToolResultStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedToolResultStore.java index 2c9e563e35c..157c9ec5f1c 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedToolResultStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedToolResultStore.java @@ -1,5 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.OperationKind; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; 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/persistence/ManagedWorkspaceRegistry.java similarity index 94% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedWorkspaceRegistry.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedWorkspaceRegistry.java index f6e57f57f7b..845fe821045 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/persistence/ManagedWorkspaceRegistry.java @@ -1,7 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import com.alibaba.qwen.code.runtimebroker.managedworkspace.WorkspaceAccess; import com.alibaba.qwen.code.runtimebroker.managedworkspace.WorkspaceActor; @@ -289,14 +289,14 @@ public class ManagedWorkspaceRegistry { "Workspace resolution requires a creation transaction"); } if (actorId == null || actorId.isEmpty()) { - throw new ApiException(HttpStatus.UNAUTHORIZED, + throw new ManagedAgentException(HttpStatus.UNAUTHORIZED, "actor_required", "A trusted actor is required."); } byte[] key; try { key = actorKey(tenantId, actorId); } catch (IllegalArgumentException error) { - throw new ApiException(HttpStatus.FORBIDDEN, + throw new ManagedAgentException(HttpStatus.FORBIDDEN, "actor_scope_mismatch", "Authenticated actor scope is invalid."); } String workspaceId; @@ -323,7 +323,7 @@ public class ManagedWorkspaceRegistry { if (selection == null) { throw workspaceRequired(); } - throw new ApiException(HttpStatus.NOT_FOUND, + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "workspace_not_found", "Workspace not found."); } List access = jdbc.query( @@ -338,14 +338,14 @@ public class ManagedWorkspaceRegistry { if (selection == null) { throw workspaceRequired(); } - throw new ApiException(HttpStatus.NOT_FOUND, + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "workspace_not_found", "Workspace not found."); } if (!access.getFirst().value().canCreate()) { if (selection == null) { throw workspaceRequired(); } - throw new ApiException(HttpStatus.FORBIDDEN, + throw new ManagedAgentException(HttpStatus.FORBIDDEN, "workspace_forbidden", "Workspace cannot be used."); } WorkspaceRecord record = records.getFirst(); @@ -358,18 +358,18 @@ public class ManagedWorkspaceRegistry { String nodeId = JSON.readTree(remote.getFirst()).path("nodeId").asText(); allowed = ssh.getNodes().stream().anyMatch(node -> node.nodeId().equals(nodeId) && node.admits(tenantId, actorId)); } catch (com.fasterxml.jackson.core.JsonProcessingException error) { - throw new ApiException(HttpStatus.CONFLICT, "workspace_unavailable", "Workspace registration is invalid."); + throw new ManagedAgentException(HttpStatus.CONFLICT, "workspace_unavailable", "Workspace registration is invalid."); } } if (!allowed) { - throw new ApiException(HttpStatus.FORBIDDEN, "runtime_node_forbidden", "New SSH Sessions are disabled or unauthorized."); + throw new ManagedAgentException(HttpStatus.FORBIDDEN, "runtime_node_forbidden", "New SSH Sessions are disabled or unauthorized."); } } if (record.getState() != WorkspaceState.ACTIVE) { if (selection == null) { throw workspaceRequired(); } - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "workspace_unavailable", "Workspace is unavailable."); } ContextBinding binding = new ContextBinding(tenantId, workspaceId, @@ -385,7 +385,7 @@ public class ManagedWorkspaceRegistry { 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."); + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "workspace_not_found", "Workspace not found."); } return resolved; } @@ -421,8 +421,8 @@ public class ManagedWorkspaceRegistry { } } - private static ApiException workspaceRequired() { - return new ApiException(HttpStatus.BAD_REQUEST, + private static ManagedAgentException workspaceRequired() { + return new ManagedAgentException(HttpStatus.BAD_REQUEST, "workspace_required", "Select a Workspace."); } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ResidentWorkspaces.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ResidentWorkspaces.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ResidentWorkspaces.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ResidentWorkspaces.java index 3a2a470bd72..6a24e53eb1e 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ResidentWorkspaces.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ResidentWorkspaces.java @@ -1,6 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.RuntimeBroker.ResidentWorkspace; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; import com.alibaba.qwen.code.runtimebroker.ResidentWorkspaceProfile; import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; import com.alibaba.qwen.code.runtimebroker.RuntimeScope; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/SessionMessageRelayStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/SessionMessageRelayStore.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/SessionMessageRelayStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/SessionMessageRelayStore.java index 5b101fc46f5..7f92961a589 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/SessionMessageRelayStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/SessionMessageRelayStore.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/SessionResourceCollectionCollector.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/SessionResourceCollectionCollector.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/SessionResourceCollectionCollector.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/SessionResourceCollectionCollector.java index bb9d48325cd..3e7dbafc09d 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/SessionResourceCollectionCollector.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/SessionResourceCollectionCollector.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.OperationKind; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/SshWorkspaceStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/SshWorkspaceStore.java similarity index 95% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/SshWorkspaceStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/SshWorkspaceStore.java index 464aaac4b45..8f9a604727d 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/SshWorkspaceStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/SshWorkspaceStore.java @@ -1,13 +1,14 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeScope; -import com.alibaba.qwen.code.runtimebroker.SshRuntimeStorage; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.provisioning.SshRuntimeStorage; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.http.HttpStatus; @@ -73,7 +74,7 @@ public class SshWorkspaceStore { var rows = operationRows(tenant, actor, id, true); if (!rows.isEmpty()) { if (!digest.equals(rows.getFirst().get("request_digest"))) { - throw new ApiException(HttpStatus.CONFLICT, "idempotency_conflict", "Registration key was used for another request."); + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "Registration key was used for another request."); } return operation(rows.getFirst(), true); } @@ -97,7 +98,7 @@ public class SshWorkspaceStore { public Operation get(String tenant, String actor, String id) { var rows = operationRows(tenant, actor, id, false); if (rows.isEmpty()) { - throw new ApiException(HttpStatus.NOT_FOUND, "operation_not_found", "Workspace registration not found."); + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "operation_not_found", "Workspace registration not found."); } return operation(rows.getFirst(), true); } @@ -110,7 +111,7 @@ public class SshWorkspaceStore { return null; } if (!ManagedSchemaKeys.key(node, path, name).equals(rows.getFirst().get("request_digest"))) { - throw new ApiException(HttpStatus.CONFLICT, "idempotency_conflict", "Registration key was used for another request."); + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "Registration key was used for another request."); } return operation(rows.getFirst(), true); } @@ -120,7 +121,7 @@ public class SshWorkspaceStore { || node == null || node.isBlank() || node.length() > 128 || path == null || path.isBlank() || path.length() > 512 || name == null || name.isBlank() || name.length() > 512) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_request", "Workspace registration request is invalid."); + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_request", "Workspace registration request is invalid."); } } @@ -166,7 +167,7 @@ public class SshWorkspaceStore { var rows = jdbc.queryForList("SELECT storage_kind, mount_registration_id FROM ma_storage_owner WHERE storage_key = ? FOR UPDATE", physical); if (rows.size() != 1 || !KIND.equals(rows.getFirst().get("storage_kind")) || !intent.registrationId().equals(rows.getFirst().get("mount_registration_id"))) { - throw new ApiException(HttpStatus.CONFLICT, "storage_already_registered", "Physical directory already has an owner."); + throw new ManagedAgentException(HttpStatus.CONFLICT, "storage_already_registered", "Physical directory already has an owner."); } String alias = JdbcRuntimeBindingRepository.storageAliasKey(intent.tenantId(), intent.storageId()); jdbc.update("INSERT INTO ma_storage (alias_key, tenant_key, storage_key, tenant_id, storage_id, physical_key," @@ -186,7 +187,7 @@ public class SshWorkspaceStore { requireClaim(intent, owner); publish(intent); if (finish(intent, owner, "COMPLETED", null) != 1) { - throw new ApiException(HttpStatus.CONFLICT, "operation_claim_lost", "Registration claim expired."); + throw new ManagedAgentException(HttpStatus.CONFLICT, "operation_claim_lost", "Registration claim expired."); } }); } @@ -370,7 +371,7 @@ public class SshWorkspaceStore { if (jdbc.queryForList("SELECT operation_key FROM ma_operation WHERE operation_key = ? AND claim_owner = ?" + " AND state = 'RUNNING' AND claim_until > " + ManagedSchemaTime.SQL_NOW + " FOR UPDATE", String.class, operationKey(intent.tenantId(), intent.operationId()), owner).size() != 1) { - throw new ApiException(HttpStatus.CONFLICT, "operation_claim_lost", "Registration claim expired."); + throw new ManagedAgentException(HttpStatus.CONFLICT, "operation_claim_lost", "Registration claim expired."); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationAdmissionStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationAdmissionStore.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationAdmissionStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationAdmissionStore.java index b6d26c09d17..5eb096c3d7d 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationAdmissionStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationAdmissionStore.java @@ -1,7 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitResource; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitTransactionRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitResource; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitTransactionRequest; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaRows; @@ -26,8 +26,8 @@ import java.util.Map; import java.util.Objects; import java.util.Set; -import static com.alibaba.qwen.code.managedagent.store.ToolPublicationContract.require; -import static com.alibaba.qwen.code.managedagent.store.ToolPublicationContract.text; +import static com.alibaba.qwen.code.managedagent.persistence.ToolPublicationContract.require; +import static com.alibaba.qwen.code.managedagent.persistence.ToolPublicationContract.text; /** Joins one frozen publication root and its original receipt in the Session transaction. */ public final class ToolPublicationAdmissionStore { diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationCollector.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationCollector.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationCollector.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationCollector.java index b775c2ad301..41fb9729619 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationCollector.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationCollector.java @@ -1,5 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.OperationKind; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationContract.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationContract.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationContract.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationContract.java index e86d3046594..5f45f8d065a 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationContract.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationContract.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.StreamReadFeature; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationDataStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationDataStore.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationDataStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationDataStore.java index 456c1f8f5ba..d04189cfd1f 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationDataStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationDataStore.java @@ -1,6 +1,8 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationStorageException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.OperationKind; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; @@ -40,8 +42,8 @@ import java.util.Objects; import java.util.UUID; import java.util.concurrent.TimeUnit; -import static com.alibaba.qwen.code.managedagent.store.ToolPublicationContract.require; -import static com.alibaba.qwen.code.managedagent.store.ToolPublicationContract.text; +import static com.alibaba.qwen.code.managedagent.persistence.ToolPublicationContract.require; +import static com.alibaba.qwen.code.managedagent.persistence.ToolPublicationContract.text; /** O2b's publication catalog. Object I/O always runs outside SQL transactions. */ public final class ToolPublicationDataStore { @@ -530,8 +532,8 @@ public final class ToolPublicationDataStore { } } - private static ApiException permanentVerificationFailure(RuntimeException error) { - if (error instanceof ApiException api) { + private static ManagedAgentException permanentVerificationFailure(RuntimeException error) { + if (error instanceof ManagedAgentException api) { if (List.of("managed_tool_publication_busy", "managed_tool_publication_claim_lost", "managed_tool_publication_claim_expired", "managed_tool_publication_operation_expired") .contains(api.getCode())) { @@ -541,11 +543,11 @@ public final class ToolPublicationDataStore { } if (error instanceof CorruptObjectException || error instanceof ToolPublicationContract.ContractViolationException) { - return new ApiException(HttpStatus.BAD_REQUEST, "invalid_request", "Publication verification failed"); + return new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_request", "Publication verification failed"); } if (error instanceof ToolPublicationStorageException storage && storage.getReason() == ToolPublicationStorageException.Reason.ACCESS_DENIED) { - return new ApiException(HttpStatus.FORBIDDEN, "managed_tool_publication_storage_denied", + return new ManagedAgentException(HttpStatus.FORBIDDEN, "managed_tool_publication_storage_denied", "Publication storage rejected verification"); } return null; @@ -573,7 +575,7 @@ public final class ToolPublicationDataStore { if (due == null || due.after(current)) { return false; } - ApiException failure = permanentVerificationFailure(error); + ManagedAgentException failure = permanentVerificationFailure(error); if (failure != null) { releasedObject[0] = recordVerificationFailure(scope, publicationId, operationId, failure); } else { @@ -599,7 +601,7 @@ public final class ToolPublicationDataStore { return null; } boolean liveClaim = rows.getFirst().claimUntil() != null && rows.getFirst().claimUntil().after(current); - ApiException failure = permanentVerificationFailure(error); + ManagedAgentException failure = permanentVerificationFailure(error); if (liveClaim && failure != null) { return recordVerificationFailure(task.scope(), task.publicationId(), task.operationId(), failure); } @@ -618,7 +620,7 @@ public final class ToolPublicationDataStore { scope, operationId, error.getClass().getSimpleName()); } - private String recordVerificationFailure(String scope, String publicationId, String operationId, ApiException failure) { + private String recordVerificationFailure(String scope, String publicationId, String operationId, ManagedAgentException failure) { jdbc.update("UPDATE ma_operation SET gmt_modified = " + ManagedSchemaTime.SQL_NOW + ", state = 'FAILED', failure_status = ?, failure_code = ?, claim_owner = NULL, claim_until = NULL, verification_next_at = NULL WHERE operation_kind IN ('OUTPUT_UPLOAD', 'OUTPUT_VERIFY', 'OUTPUT_FINISH') AND scope_key = ? AND publication_id = ? AND operation_id = ?", failure.getStatus().value(), failure.getCode(), scope, publicationId, operationId); jdbc.update("UPDATE ma_output_capture SET gmt_modified = " + ManagedSchemaTime.SQL_NOW + ", active_operation_id = NULL WHERE scope_key = ? AND publication_id = ? AND active_operation_id = ?", scope, publicationId, operationId); @@ -854,7 +856,7 @@ public final class ToolPublicationDataStore { }, scope, publicationId, operationId); if (rows.isEmpty()) { - throw new ApiException(HttpStatus.NOT_FOUND, + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "managed_tool_publication_operation_unknown", "Publication operation is unknown"); } Map row = rows.get(0); @@ -2616,7 +2618,7 @@ public final class ToolPublicationDataStore { private static void requireCapacity(long requested, long available) { if (requested > available) { - throw new ApiException(HttpStatus.INSUFFICIENT_STORAGE, + throw new ManagedAgentException(HttpStatus.INSUFFICIENT_STORAGE, "managed_tool_publication_quota_exhausted", "Tool publication capacity is exhausted"); } @@ -2658,7 +2660,7 @@ public final class ToolPublicationDataStore { private static void requireContract(boolean valid, HttpStatus status, String code, String message) { if (!valid) { - throw new ApiException(status, code, message); + throw new ManagedAgentException(status, code, message); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationRetentionStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationRetentionStore.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationRetentionStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationRetentionStore.java index 43cafeaa3b6..41b472837d0 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationRetentionStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationRetentionStore.java @@ -1,6 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.OperationKind; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaRows; @@ -208,7 +209,7 @@ public final class ToolPublicationRetentionStore { var head = heads.getFirst(); if ("ACTIVE".equals(head.get("state")) && ((Number) head.get("writer_active")).intValue() != 0) { - throw new ApiException(HttpStatus.CONFLICT, "managed_session_writer_active", + throw new ManagedAgentException(HttpStatus.CONFLICT, "managed_session_writer_active", "Session deletion is waiting for its writer to stop."); } protectedRecovery = !"READY".equals(head.get("recovery_status")); @@ -476,8 +477,8 @@ public final class ToolPublicationRetentionStore { } } - private ApiException expired() { - return new ApiException(HttpStatus.CONFLICT, "tool_output_read_expired", + private ManagedAgentException expired() { + return new ManagedAgentException(HttpStatus.CONFLICT, "tool_output_read_expired", "The output read lease expired or its Session was retired."); } @@ -645,8 +646,8 @@ public final class ToolPublicationRetentionStore { attempt.generation()); } - private static ApiException unresolvedPut() { - return new ApiException(HttpStatus.CONFLICT, "tool_output_put_unresolved", + private static ManagedAgentException unresolvedPut() { + return new ManagedAgentException(HttpStatus.CONFLICT, "tool_output_put_unresolved", "The original object write is unresolved; a new write is not admitted."); } @@ -762,8 +763,8 @@ public final class ToolPublicationRetentionStore { Object value = row.get(field); return Boolean.TRUE.equals(value) || value instanceof Number number && number.intValue() != 0; } - private static ApiException retired() { - return new ApiException(HttpStatus.CONFLICT, "tool_output_session_retired", + private static ManagedAgentException retired() { + return new ManagedAgentException(HttpStatus.CONFLICT, "tool_output_session_retired", "The Session output is permanently retired."); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationStore.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationStore.java index d2007fd4fe1..3db7a481103 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationStore.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; @@ -38,8 +38,8 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import static com.alibaba.qwen.code.managedagent.store.ToolPublicationContract.require; -import static com.alibaba.qwen.code.managedagent.store.ToolPublicationContract.text; +import static com.alibaba.qwen.code.managedagent.persistence.ToolPublicationContract.require; +import static com.alibaba.qwen.code.managedagent.persistence.ToolPublicationContract.text; /** Reserves publication capacity and fences producer grants against the Session owner. */ public final class ToolPublicationStore { @@ -193,7 +193,7 @@ public final class ToolPublicationStore { return producerBindingWithHashLocked(scope, publicationId, tokenHash, bindingDigest, Access.CLAIM, true); } catch (IllegalArgumentException error) { - throw new ApiException(HttpStatus.CONFLICT, "managed_tool_publication_fenced", + throw new ManagedAgentException(HttpStatus.CONFLICT, "managed_tool_publication_fenced", "Original publication authority is fenced", error); } } @@ -224,7 +224,7 @@ public final class ToolPublicationStore { boolean fencedCsi = error instanceof RuntimeBrokerException broker && "workspace_csi_unavailable".equals(broker.getCode()) && !broker.isRetryable(); if (expectedBindingDigest != null && (missingRuntime || fencedCsi)) { - throw new ApiException(HttpStatus.CONFLICT, "managed_tool_publication_runtime_unavailable", + throw new ManagedAgentException(HttpStatus.CONFLICT, "managed_tool_publication_runtime_unavailable", "Original publication runtime is unavailable"); } throw error; @@ -1147,7 +1147,7 @@ public final class ToolPublicationStore { // details also say how many reservations of this size the Session could // ever hold at once, so the Harness can tell a batch that never fits // (#14518). - private static ApiException reservationRefused(String limit, boolean retained, String tenantKey, + private static ManagedAgentException reservationRefused(String limit, boolean retained, String tenantKey, String scope, long held, long used, long requested, long allowed, long admits) { LOG.warn("Tool publication reservation refused limit={} retained={} tenant={} scope={} held={}" + " used={} requested={} allowed={} admits={}", limit, retained, tenantKey, scope, held, used, @@ -1155,9 +1155,9 @@ public final class ToolPublicationStore { String message = "Tool publication reservation refused at the " + limit + " limit"; Map details = Map.of("limit", limit, "admits", admits); return retained - ? new ApiException(HttpStatus.CONFLICT, + ? new ManagedAgentException(HttpStatus.CONFLICT, "managed_tool_publication_retention_exhausted", message, details) - : new ApiException(HttpStatus.TOO_MANY_REQUESTS, + : new ManagedAgentException(HttpStatus.TOO_MANY_REQUESTS, "managed_tool_publication_capacity_exhausted", message, details); } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationVerifier.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationVerifier.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationVerifier.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationVerifier.java index 74bc21048b6..ff0ade23648 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationVerifier.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationVerifier.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/TransportConsumerStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/TransportConsumerStore.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/TransportConsumerStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/TransportConsumerStore.java index 596e54ac616..e9ad5b9bd28 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/TransportConsumerStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/TransportConsumerStore.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WakeRecoveryStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WakeRecoveryStore.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WakeRecoveryStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WakeRecoveryStore.java index abb1cbe1adf..9f800a3c78b 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WakeRecoveryStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WakeRecoveryStore.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; 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/persistence/WorkspaceCreationRoots.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCreationRoots.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCreationRoots.java index 5bec7bbd0fe..bd188d63c23 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/persistence/WorkspaceCreationRoots.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.ReceiptNamespace; 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/persistence/WorkspaceCreationStore.java similarity index 91% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCreationStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCreationStore.java index 0aa0d74127d..d980eb44733 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/persistence/WorkspaceCreationStore.java @@ -1,10 +1,10 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -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; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry.WorkspaceSummary; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCreationRoots.Details; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; 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; @@ -68,23 +68,23 @@ public class WorkspaceCreationStore { String sourceWorkspaceId, String cwdRelative) { if (sourceWorkspaceId == null && cwdRelative != null || sourceWorkspaceId != null && cwdRelative == null) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_request", + throw new ManagedAgentException(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", + throw new ManagedAgentException(HttpStatus.CONFLICT, "workspace_creation_unavailable", "Workspace creation is not enabled."); } String name = displayName == null ? "" : displayName.strip(); if (name.isEmpty() || name.length() > 128 || name.codePoints().anyMatch(Character::isISOControl)) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_workspace_name", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_workspace_name", "Workspace name must contain 1-128 characters without control characters."); } if (key == null || !key.matches("[\\x21-\\x7e]{1,128}")) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_idempotency_key", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_idempotency_key", "Idempotency-Key must contain 1-128 visible characters."); } WorkspaceStorageKindGuard.requireFreshTransaction(); @@ -169,7 +169,7 @@ public class WorkspaceCreationStore { public DirectoryPage directories(String tenant, String actor, String workspace, String cwd) { if (!directorySelectionEnabled()) { - throw new ApiException(HttpStatus.CONFLICT, "workspace_creation_unavailable", + throw new ManagedAgentException(HttpStatus.CONFLICT, "workspace_creation_unavailable", "Directory selection is not enabled."); } WorkspaceSelection selected = new WorkspaceSelection(workspace, cwd); @@ -209,7 +209,7 @@ public class WorkspaceCreationStore { WorkspaceSelection selected) { for (String segment : selected.cwdRelative().split("/")) { if (reserved(segment)) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_cwd", "Select a project directory."); + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_cwd", "Select a project directory."); } } var source = registry.resolveOwnedDirectory(tenant, actor, selected.workspaceId(), selected.cwdRelative()); @@ -247,7 +247,7 @@ public class WorkspaceCreationStore { private WorkspaceSummary replay(String tenant, String actor, Details details) { WorkspaceSummary found = registry.findReadable(tenant, actor, details.workspaceId()); if (found == null) { - throw new ApiException(HttpStatus.NOT_FOUND, "workspace_not_found", "Workspace not found."); + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "workspace_not_found", "Workspace not found."); } return found; } @@ -259,7 +259,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", + throw new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "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/WorkspaceCsiCheckpointSnapshotStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiCheckpointSnapshotStore.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiCheckpointSnapshotStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiCheckpointSnapshotStore.java index 5b6c424e4dd..8443bf95ae4 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiCheckpointSnapshotStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiCheckpointSnapshotStore.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiHostedMain.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiHostedMain.java similarity index 96% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiHostedMain.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiHostedMain.java index 2148c5103aa..e67a76db360 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiHostedMain.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiHostedMain.java @@ -1,11 +1,12 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.daemon.HostedHarnessClient; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; -import com.alibaba.qwen.code.runtimebroker.HttpRuntimeTransport; +import com.alibaba.qwen.code.managedagent.security.WriterCredentialPolicy; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; import com.fasterxml.jackson.core.StreamReadFeature; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonNode; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRegistration.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRegistration.java similarity index 94% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRegistration.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRegistration.java index 55e1c8c3dd1..dfdd23ea610 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRegistration.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRegistration.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; @@ -52,7 +52,7 @@ public record WorkspaceCsiRegistration(String tenantId, String storageId, } public String physicalKey() { - return com.alibaba.qwen.code.runtimebroker.ManagedCsiProtocol.physicalKey(backendDomain, driver, volumeHandle); + return com.alibaba.qwen.code.runtimebroker.transport.ManagedCsiProtocol.physicalKey(backendDomain, driver, volumeHandle); } @Override diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRegistrationMain.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRegistrationMain.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRegistrationMain.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRegistrationMain.java index 0c57de8407e..99cca7c40a6 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRegistrationMain.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRegistrationMain.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.fasterxml.jackson.core.StreamReadFeature; import com.fasterxml.jackson.databind.DeserializationFeature; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiReservationStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiReservationStore.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiReservationStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiReservationStore.java index 879fb2ce9b4..13435f090c4 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiReservationStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiReservationStore.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRetirementMain.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRetirementMain.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRetirementMain.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRetirementMain.java index 30c453180e6..28e942e463f 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRetirementMain.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRetirementMain.java @@ -1,8 +1,8 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.core.StreamReadFeature; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRuntimeAccess.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRuntimeAccess.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRuntimeAccess.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRuntimeAccess.java index 6a26659d75d..1ab4ed1e636 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRuntimeAccess.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRuntimeAccess.java @@ -1,8 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.runtimebroker.CsiFileHistoryProtocol; -import com.alibaba.qwen.code.runtimebroker.CsiNativeReadbackProtocol; import com.alibaba.qwen.code.runtimebroker.HarnessSessionResolver; import com.alibaba.qwen.code.runtimebroker.JdbcCsiActivationAdmission; import com.alibaba.qwen.code.runtimebroker.JdbcCsiExecutionAdmission; @@ -22,6 +20,8 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeTransport; import com.alibaba.qwen.code.runtimebroker.WorkspaceCsiRuntimeIdentity; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.transport.CsiFileHistoryProtocol; +import com.alibaba.qwen.code.runtimebroker.transport.CsiNativeReadbackProtocol; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRuntimeMain.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRuntimeMain.java similarity index 92% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRuntimeMain.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRuntimeMain.java index 392023f0a58..5ec36a79621 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRuntimeMain.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRuntimeMain.java @@ -1,17 +1,17 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.service.WorkspaceCsiResourceGuard; -import com.alibaba.qwen.code.managedagent.service.WorkspaceCsiRuntimeProvisioner; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; -import com.alibaba.qwen.code.runtimebroker.HttpRuntimeTransport; +import com.alibaba.qwen.code.managedagent.workspace.runtime.WorkspaceCsiResourceGuard; +import com.alibaba.qwen.code.managedagent.workspace.runtime.WorkspaceCsiRuntimeProvisioner; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; -import com.alibaba.qwen.code.runtimebroker.KubernetesHttpRuntimeClient; -import com.alibaba.qwen.code.runtimebroker.ManagedCsiFilesProtocol; -import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerHttpServer; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; +import com.alibaba.qwen.code.runtimebroker.provisioning.KubernetesHttpRuntimeClient; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedCsiFilesProtocol; +import com.alibaba.qwen.code.runtimebroker.transport.RuntimeBrokerHttpServer; import com.fasterxml.jackson.core.StreamReadFeature; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiSessionMain.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiSessionMain.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiSessionMain.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiSessionMain.java index 8682c218278..a405b376b1b 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiSessionMain.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiSessionMain.java @@ -1,8 +1,8 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.service.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.CsiFilesRetirementProfile; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.fasterxml.jackson.core.StreamReadFeature; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiWorkerAckMain.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiWorkerAckMain.java similarity index 94% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiWorkerAckMain.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiWorkerAckMain.java index b6c593976f3..a2b7eebb214 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiWorkerAckMain.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiWorkerAckMain.java @@ -1,10 +1,12 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; -import com.alibaba.qwen.code.runtimebroker.HttpRuntimeTransport; +import com.alibaba.qwen.code.managedagent.artifact.AliyunToolPublicationObjectStore; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; import com.aliyun.oss.ClientBuilderConfiguration; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiWorkerAckStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiWorkerAckStore.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiWorkerAckStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiWorkerAckStore.java index 4e78e6d0d63..7aedaad4bda 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiWorkerAckStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiWorkerAckStore.java @@ -1,14 +1,14 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; -import com.alibaba.qwen.code.runtimebroker.ManagedCsiProtocol; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeTransport; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; import com.alibaba.qwen.code.runtimebroker.WorkspaceCsiRuntimeIdentity; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedCsiProtocol; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.core.type.TypeReference; @@ -36,7 +36,7 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.TimeUnit; -import static com.alibaba.qwen.code.managedagent.store.ToolPublicationContract.require; +import static com.alibaba.qwen.code.managedagent.persistence.ToolPublicationContract.require; /** Confirms one original receipt; it cannot authorize physical retirement. */ public final class WorkspaceCsiWorkerAckStore { diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceEvidenceResources.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceEvidenceResources.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceEvidenceResources.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceEvidenceResources.java index 576c73f77b7..45dc5ede566 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceEvidenceResources.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceEvidenceResources.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceExecutionStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceExecutionStore.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceExecutionStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceExecutionStore.java index addf767e4c4..2809b5c3586 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceExecutionStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceExecutionStore.java @@ -1,9 +1,9 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; import com.alibaba.qwen.code.runtimebroker.HarnessOwnership; -import com.alibaba.qwen.code.runtimebroker.LocalProcessRuntimeProvisioner; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; @@ -11,6 +11,7 @@ import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import com.alibaba.qwen.code.runtimebroker.managedworkspace.WorkspaceAccess; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; import org.apache.commons.codec.digest.DigestUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; @@ -101,7 +102,7 @@ public class WorkspaceExecutionStore { public void authorizeLifecycle(SessionRecord session, com.alibaba.qwen.code.runtimebroker.RuntimeLifecycleAuthority authority) { try { WorkspaceLifecycleStore.requireClaim(jdbc, session.tenantId(), session.sessionId(), authority, false); - } catch (ApiException error) { + } catch (ManagedAgentException error) { throw new RuntimeBrokerException(error.getStatus().value(), error.getCode(), error.getMessage(), false, error); } authorizePassiveAttachment(session, authority); @@ -535,7 +536,7 @@ public class WorkspaceExecutionStore { public boolean canStopDrained(RuntimeBindingRecord saved) { if ((saved.getState() != RuntimeBindingRecord.State.DRAINING && saved.getState() != RuntimeBindingRecord.State.LOST) || !saved.isDrainRequested() || !saved.getRequest().isManagedContext() || saved.getOperationOwner() == null - || !java.util.Set.of(LocalProcessRuntimeProvisioner.KIND, com.alibaba.qwen.code.runtimebroker.SshRuntimeProvisioner.KIND).contains(saved.getRequest().getProvisionerKind()) + || !java.util.Set.of(LocalProcessRuntimeProvisioner.KIND, com.alibaba.qwen.code.runtimebroker.provisioning.SshRuntimeProvisioner.KIND).contains(saved.getRequest().getProvisionerKind()) || !(WorkspaceExecutionProfile.admitsIsolationClass(saved.getRequest().getScope().getIsolationClass()) || HarnessOwnership.sharesRuntimeSessions(saved.getRequest()))) { return false; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceFileStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceFileStore.java similarity index 87% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceFileStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceFileStore.java index c658bf6c618..1ecf11e4f9d 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceFileStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceFileStore.java @@ -1,12 +1,12 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -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.service.SshWorkspaceService; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.workspace.SshWorkspaceService; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; -import com.alibaba.qwen.code.runtimebroker.WorkspaceFileProcess; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.provisioning.WorkspaceFileProcess; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.digest.DigestUtils; import org.springframework.http.HttpStatus; @@ -102,7 +102,7 @@ public class WorkspaceFileStore { throw changed(); } if (!reads.tryAcquire()) { - throw new ApiException(HttpStatus.SERVICE_UNAVAILABLE, "workspace_files_busy", "Workspace file access is busy; try again."); + throw new ManagedAgentException(HttpStatus.SERVICE_UNAVAILABLE, "workspace_files_busy", "Workspace file access is busy; try again."); } try { Map result; @@ -126,7 +126,7 @@ public class WorkspaceFileStore { throw changed(); } } else { - throw new ApiException(HttpStatus.CONFLICT, "workspace_files_unsupported", "This Workspace storage does not support file references."); + throw new ManagedAgentException(HttpStatus.CONFLICT, "workspace_files_unsupported", "This Workspace storage does not support file references."); } Scope after = scope(tenant, actor, workspace, cwd); if (!before.revision().equals(after.revision())) { @@ -147,7 +147,7 @@ public class WorkspaceFileStore { return Objects.requireNonNull(transaction.execute(status -> { var binding = registry.resolveForCreation(tenant, actor, new WorkspaceSelection(workspace, cwd)).binding(); if (!properties.getHarness().isWorkspaceFilesEnabled()) { - throw new ApiException(HttpStatus.CONFLICT, "workspace_files_disabled", "Workspace file access is disabled."); + throw new ManagedAgentException(HttpStatus.CONFLICT, "workspace_files_disabled", "Workspace file access is disabled."); } var rows = jdbc.queryForList("SELECT storage_kind, registration_json, registration_revision, mount_revision, fence_operation_id FROM ma_storage WHERE alias_key = ? FOR UPDATE", JdbcRuntimeBindingRepository.storageAliasKey(tenant, binding.getStorageId())); @@ -167,11 +167,11 @@ public class WorkspaceFileStore { })); } - private static ApiException changed() { - return new ApiException(HttpStatus.CONFLICT, "workspace_file_scope_changed", "Workspace changed; select the file again."); + private static ManagedAgentException changed() { + return new ManagedAgentException(HttpStatus.CONFLICT, "workspace_file_scope_changed", "Workspace changed; select the file again."); } - private static ApiException unavailable() { - return new ApiException(HttpStatus.CONFLICT, "workspace_file_unavailable", "Workspace file is unavailable."); + private static ManagedAgentException unavailable() { + return new ManagedAgentException(HttpStatus.CONFLICT, "workspace_file_unavailable", "Workspace file is unavailable."); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceLifecycleStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceLifecycleStore.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceLifecycleStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceLifecycleStore.java index b875b9f38a7..572d89c3cd2 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceLifecycleStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceLifecycleStore.java @@ -1,7 +1,9 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeLifecycleAuthority; @@ -142,7 +144,7 @@ public class WorkspaceLifecycleStore { var pending = scan.pending(); var cleanup = scan.cleanup(); if (!pending.isEmpty() || !allowCleanup && cleanup.values().stream().anyMatch(state -> !"confirmed".equals(state))) { - throw new ApiException(HttpStatus.CONFLICT, "turn_active", "The Session has an active Turn."); + throw new ManagedAgentException(HttpStatus.CONFLICT, "turn_active", "The Session has an active Turn."); } return java.util.Set.copyOf(scan.accepted()); } @@ -204,7 +206,7 @@ public class WorkspaceLifecycleStore { } try { requireIdleJournal(jdbc, json, operation.tenantId(), operation.sessionId()); - } catch (ApiException blocked) { + } catch (ManagedAgentException blocked) { return null; } JsonNode header = header(operation.tenantId(), operation.sessionId()); @@ -534,7 +536,7 @@ public class WorkspaceLifecycleStore { return new RuntimeLifecycleAuthority(operation.operationId(), operation.claimGeneration()); } - public static ApiException blocked(String code) { - return new ApiException(HttpStatus.CONFLICT, code, "Workspace lifecycle recovery is blocked."); + public static ManagedAgentException blocked(String code) { + return new ManagedAgentException(HttpStatus.CONFLICT, code, "Workspace lifecycle recovery is blocked."); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMaintenanceRecovery.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMaintenanceRecovery.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMaintenanceRecovery.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMaintenanceRecovery.java index 99fbd357180..2435eb775cb 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMaintenanceRecovery.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMaintenanceRecovery.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMaintenanceRecoveryMain.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMaintenanceRecoveryMain.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMaintenanceRecoveryMain.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMaintenanceRecoveryMain.java index d8ca7df9a30..4be63359129 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMaintenanceRecoveryMain.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMaintenanceRecoveryMain.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.RuntimeBroker.WorkspaceMount; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMigrationAdmission.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMigrationAdmission.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMigrationAdmission.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMigrationAdmission.java index 674e40af647..29117ab1e61 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMigrationAdmission.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMigrationAdmission.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import org.springframework.jdbc.core.ConnectionCallback; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMigrationStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMigrationStore.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMigrationStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMigrationStore.java index 570fad4e47f..cf1d3a033ff 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMigrationStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMigrationStore.java @@ -1,13 +1,13 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; -import com.alibaba.qwen.code.runtimebroker.LocalProcessRuntimeProvisioner; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import org.springframework.jdbc.core.JdbcTemplate; @@ -25,7 +25,7 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.atomic.AtomicReference; -import static com.alibaba.qwen.code.managedagent.store.WorkspaceRecoveryStore.*; +import static com.alibaba.qwen.code.managedagent.persistence.WorkspaceRecoveryStore.*; /** Offline storage transition; public Session and journal evidence remain immutable. */ public final class WorkspaceMigrationStore { diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceOperations.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceOperations.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceOperations.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceOperations.java index 82eba2aab06..77670987ca8 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceOperations.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceOperations.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceOperatorRecoveryStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceOperatorRecoveryStore.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceOperatorRecoveryStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceOperatorRecoveryStore.java index d78ed68f4d0..32c1647d2c7 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceOperatorRecoveryStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceOperatorRecoveryStore.java @@ -1,11 +1,11 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.HarnessOwnership; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; -import com.alibaba.qwen.code.runtimebroker.LocalProcessRuntimeProvisioner; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.digest.DigestUtils; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceProfileLifecycleVerifier.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceProfileLifecycleVerifier.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceProfileLifecycleVerifier.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceProfileLifecycleVerifier.java index 4c73d71c9a7..7bc3c55a994 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceProfileLifecycleVerifier.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceProfileLifecycleVerifier.java @@ -1,6 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; @@ -166,7 +167,7 @@ public class WorkspaceProfileLifecycleVerifier { if (!source.outcomeRef().isNull()) { try { outcome = records.readRecordResource(operation.tenantId(), operation.sessionId(), source.outcomeRef()); - } catch (com.alibaba.qwen.code.managedagent.api.ApiException invalid) { + } catch (com.alibaba.qwen.code.managedagent.exception.ManagedAgentException invalid) { unsettled(); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceRecoveryMain.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceRecoveryMain.java similarity index 94% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceRecoveryMain.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceRecoveryMain.java index b50d4c6025f..db9065b051f 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceRecoveryMain.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceRecoveryMain.java @@ -1,5 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; +import com.alibaba.qwen.code.managedagent.artifact.AliyunToolPublicationObjectStore; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.RuntimeBroker.WorkspaceMount; import com.aliyun.oss.ClientBuilderConfiguration; @@ -26,9 +28,9 @@ import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; -import static com.alibaba.qwen.code.managedagent.store.WorkspaceRecoveryStore.JSON; -import static com.alibaba.qwen.code.managedagent.store.WorkspaceRecoveryStore.check; -import static com.alibaba.qwen.code.managedagent.store.WorkspaceRecoveryStore.text; +import static com.alibaba.qwen.code.managedagent.persistence.WorkspaceRecoveryStore.JSON; +import static com.alibaba.qwen.code.managedagent.persistence.WorkspaceRecoveryStore.check; +import static com.alibaba.qwen.code.managedagent.persistence.WorkspaceRecoveryStore.text; /** Private offline entry; it never boots the application or a Runtime. */ public final class WorkspaceRecoveryMain { diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceRecoveryReader.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceRecoveryReader.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceRecoveryReader.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceRecoveryReader.java index 5c9175194d5..88a49eeb1f1 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceRecoveryReader.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceRecoveryReader.java @@ -1,5 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -13,12 +14,12 @@ import java.util.List; import java.util.Map; import java.util.Set; -import static com.alibaba.qwen.code.managedagent.store.WorkspaceRecoveryStore.JSON; -import static com.alibaba.qwen.code.managedagent.store.WorkspaceRecoveryStore.check; -import static com.alibaba.qwen.code.managedagent.store.WorkspaceRecoveryStore.hash; -import static com.alibaba.qwen.code.managedagent.store.WorkspaceRecoveryStore.parse; -import static com.alibaba.qwen.code.managedagent.store.WorkspaceRecoveryStore.positive; -import static com.alibaba.qwen.code.managedagent.store.WorkspaceRecoveryStore.text; +import static com.alibaba.qwen.code.managedagent.persistence.WorkspaceRecoveryStore.JSON; +import static com.alibaba.qwen.code.managedagent.persistence.WorkspaceRecoveryStore.check; +import static com.alibaba.qwen.code.managedagent.persistence.WorkspaceRecoveryStore.hash; +import static com.alibaba.qwen.code.managedagent.persistence.WorkspaceRecoveryStore.parse; +import static com.alibaba.qwen.code.managedagent.persistence.WorkspaceRecoveryStore.positive; +import static com.alibaba.qwen.code.managedagent.persistence.WorkspaceRecoveryStore.text; /** Original authority reads without acquiring, renewing or quarantining anything. */ final class WorkspaceRecoveryReader { diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceRecoveryStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceRecoveryStore.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceRecoveryStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceRecoveryStore.java index f7a9169569a..3da85d71e14 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceRecoveryStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceRecoveryStore.java @@ -1,5 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; 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/persistence/WorkspaceStorageGuard.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceStorageGuard.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceStorageGuard.java index 54a0cb5074c..e2f404dcf3a 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/persistence/WorkspaceStorageGuard.java @@ -1,11 +1,11 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; -import com.alibaba.qwen.code.runtimebroker.MacOsHostIdentity; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.provisioning.MacOsHostIdentity; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.digest.HmacAlgorithms; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceStorageKindGuard.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceStorageKindGuard.java similarity index 96% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceStorageKindGuard.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceStorageKindGuard.java index 95d4bb5ea57..f3c4fcbfd33 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceStorageKindGuard.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceStorageKindGuard.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import org.springframework.jdbc.core.ConnectionCallback; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceStorageRegistrationMain.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceStorageRegistrationMain.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceStorageRegistrationMain.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceStorageRegistrationMain.java index 31e590dd80f..3187cb5d1d9 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceStorageRegistrationMain.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceStorageRegistrationMain.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.RuntimeBroker.WorkspaceMount; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/PublicSurface.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/security/PublicSurface.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/PublicSurface.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/security/PublicSurface.java index b1aa5bc7079..5383bb7d7a7 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/PublicSurface.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/security/PublicSurface.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.api; +package com.alibaba.qwen.code.managedagent.security; import jakarta.servlet.http.HttpServletRequest; import org.springframework.http.server.PathContainer; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WriterCredentialPolicy.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/security/WriterCredentialPolicy.java similarity index 93% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WriterCredentialPolicy.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/security/WriterCredentialPolicy.java index 4dc525b5120..ecb1ba36734 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WriterCredentialPolicy.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/security/WriterCredentialPolicy.java @@ -1,7 +1,8 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.security; -import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; import org.apache.commons.codec.digest.HmacAlgorithms; import org.apache.commons.codec.digest.HmacUtils; import org.apache.commons.lang3.StringUtils; @@ -75,7 +76,7 @@ public class WriterCredentialPolicy { .getBytes(StandardCharsets.US_ASCII), writerToken.getBytes(StandardCharsets.US_ASCII)); if (!valid) { - throw new ApiException(HttpStatus.FORBIDDEN, + throw new ManagedAgentException(HttpStatus.FORBIDDEN, ManagedSessionStoreModels.ERROR_WRITER_CREDENTIAL_INVALID, "The writer credential is not valid for this Session."); } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/AcceptanceEvidence.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/AcceptanceEvidence.java similarity index 85% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/AcceptanceEvidence.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/AcceptanceEvidence.java index 9a32f60b5dc..45a4a238901 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/AcceptanceEvidence.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/AcceptanceEvidence.java @@ -1,8 +1,7 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.AcceptanceVerdict; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ParkedOperation; +import com.alibaba.qwen.code.managedagent.model.StoreModels.AcceptanceVerdict; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ParkedOperation; import java.util.List; import java.util.Optional; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ActionResponseCoordinator.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ActionResponseCoordinator.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ActionResponseCoordinator.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ActionResponseCoordinator.java index 9b9bdc9818b..e119e028a41 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ActionResponseCoordinator.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ActionResponseCoordinator.java @@ -1,14 +1,13 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.daemon.DaemonHttpException; import com.alibaba.qwen.code.daemon.HostedHarnessCapabilityMismatchException; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ManagedActionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedActionStore.Action; -import com.alibaba.qwen.code.managedagent.store.ManagedActionStore.Response; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.persistence.ManagedActionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedActionStore.Action; +import com.alibaba.qwen.code.managedagent.persistence.ManagedActionStore.Response; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/AgentStateStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/AgentStateStore.java similarity index 93% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/AgentStateStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/AgentStateStore.java index 31a0230d0c6..77c9f37559c 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/AgentStateStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/AgentStateStore.java @@ -1,38 +1,39 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellApprovalChangeResult; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellApprovalSelection; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellModelChangeResult; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellModelContext; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellModelOption; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellModelSelection; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSessionOptions; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; -import com.alibaba.qwen.code.managedagent.store.StoreModels.AcceptanceVerdict; -import com.alibaba.qwen.code.managedagent.store.StoreModels.Admission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.CommandRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.DispatchTarget; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventPage; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.HarnessEvent; -import com.alibaba.qwen.code.managedagent.store.StoreModels.MaterializationResult; -import com.alibaba.qwen.code.managedagent.store.StoreModels.MaterializationTarget; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationAdmission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationTarget; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ParkedOperation; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ReplayFloorTarget; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ReplayWindow; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionMutation; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionMutationCommand; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionMutationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionPage; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SnapshotRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.TurnPage; -import com.alibaba.qwen.code.managedagent.store.StoreModels.TurnRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.TurnSummary; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellApprovalChangeResult; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellApprovalSelection; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellModelChangeResult; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellModelContext; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellModelOption; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellModelSelection; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSessionOptions; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.model.StoreModels.AcceptanceVerdict; +import com.alibaba.qwen.code.managedagent.model.StoreModels.Admission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.CommandRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.DispatchTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventPage; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.HarnessEvent; +import com.alibaba.qwen.code.managedagent.model.StoreModels.MaterializationResult; +import com.alibaba.qwen.code.managedagent.model.StoreModels.MaterializationTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationAdmission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ParkedOperation; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ReplayFloorTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ReplayWindow; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionMutation; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionMutationCommand; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionMutationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionPage; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SnapshotRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.TurnPage; +import com.alibaba.qwen.code.managedagent.model.StoreModels.TurnRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.TurnSummary; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import java.time.Duration; import java.util.List; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/HarnessCoordinator.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/HarnessCoordinator.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/HarnessCoordinator.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/HarnessCoordinator.java index 7b0b85ecab3..d95980e89ec 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/HarnessCoordinator.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/HarnessCoordinator.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.daemon.DaemonHttpException; import com.alibaba.qwen.code.daemon.DaemonProtocolException; @@ -14,12 +14,12 @@ import com.alibaba.qwen.code.managedagent.harness.HarnessConnector.SourceEvent; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector.SourceStream; import com.alibaba.qwen.code.managedagent.harness.HarnessDisabledException; import com.alibaba.qwen.code.managedagent.harness.HostedHarnessRecoveryDeclinedException; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.DispatchTarget; -import com.alibaba.qwen.code.managedagent.store.StoreModels.HarnessEvent; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ProjectedEvent; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.TurnRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.DispatchTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.HarnessEvent; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ProjectedEvent; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.TurnRecord; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import jakarta.annotation.PreDestroy; import org.apache.commons.lang3.StringUtils; 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/session/HarnessEventProjector.java similarity index 96% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/HarnessEventProjector.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/HarnessEventProjector.java index 3a92b975cd1..bb257c74e8f 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/session/HarnessEventProjector.java @@ -1,8 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector.SourceEvent; -import com.alibaba.qwen.code.managedagent.store.EventIdentity; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ProjectedEvent; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ProjectedEvent; +import com.alibaba.qwen.code.managedagent.persistence.EventIdentity; import org.springframework.stereotype.Component; import java.nio.charset.StandardCharsets; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/JavaDurableAdmission.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/JavaDurableAdmission.java similarity index 88% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/JavaDurableAdmission.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/JavaDurableAdmission.java index 6428ea87bf2..b2af437edcb 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/JavaDurableAdmission.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/JavaDurableAdmission.java @@ -1,8 +1,7 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.Admission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.Admission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; import java.util.Locale; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedActionService.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ManagedActionService.java similarity index 91% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedActionService.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ManagedActionService.java index 36ad83bc7e5..0fc017307e2 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedActionService.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ManagedActionService.java @@ -1,17 +1,18 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicActionList; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicCommandOperation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellCommandOperation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellPage; -import com.alibaba.qwen.code.managedagent.store.ManagedActionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedActionStore.Action; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationAdmission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationContract; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicActionList; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicCommandOperation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellCommandOperation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellPage; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationAdmission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.persistence.ManagedActionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedActionStore.Action; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationContract; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -93,7 +94,7 @@ public class ManagedActionService { actions.find(tenant, session, id) .orElseThrow( () -> - new ApiException( + new ManagedAgentException( HttpStatus.NOT_FOUND, "action_not_found", "The Action was not found.")), @@ -116,7 +117,7 @@ public class ManagedActionService { || revision == null || !revision.isIntegralNumber() || !revision.canConvertToLong()) { - throw new ApiException( + throw new ManagedAgentException( HttpStatus.BAD_REQUEST, "invalid_action_response", "Only permission responses are supported."); @@ -191,7 +192,7 @@ public class ManagedActionService { String tenant, String actor, String session, String cursor, int limit) { sessions.requireReadableSession(tenant, actor, session); if (limit < 1 || limit > 100) { - throw new ApiException( + throw new ManagedAgentException( HttpStatus.BAD_REQUEST, "invalid_limit", "Limit must be between 1 and 100."); } Long before = null; @@ -210,7 +211,7 @@ public class ManagedActionService { before = Long.parseLong(parts[0]); beforeId = parts[1]; } catch (IllegalArgumentException error) { - throw new ApiException( + throw new ManagedAgentException( HttpStatus.BAD_REQUEST, "invalid_cursor", "Action cursor is invalid."); } } @@ -310,7 +311,7 @@ public class ManagedActionService { .put("text", new String(bytes, 0, end, StandardCharsets.UTF_8)) .put("truncated", end < bytes.length) .put(web ? "byteLength" : "byte_length", bytes.length); - } catch (ApiException | IllegalArgumentException error) { + } catch (ManagedAgentException | IllegalArgumentException error) { // Stored-input integrity failure, not the normal version 1 path. // The preview is still omitted; the reason must remain greppable // and must never carry payload or preview text. diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentService.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ManagedAgentService.java similarity index 93% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentService.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ManagedAgentService.java index 00bdb63a4d0..1515eaeebec 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentService.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ManagedAgentService.java @@ -1,59 +1,60 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.daemon.DaemonHttpException; import com.alibaba.qwen.code.daemon.SubmitHarnessTurn; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.CommandAdmission; -import com.alibaba.qwen.code.managedagent.api.ApiModels.InputBlock; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicContentPart; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicEvent; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicItem; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicItemList; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicList; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicSession; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicTurn; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicWorkspace; -import com.alibaba.qwen.code.managedagent.api.ApiModels.SessionCapabilities; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellApprovalChangeResult; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellApprovalSelection; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellContentPart; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellEvent; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellItem; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellModelChangeResult; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellModelContext; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellModelSelection; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellPage; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSession; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSessionApproval; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSessionCapabilities; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSessionModels; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSessionOptions; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTranscript; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTurn; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellWorkspace; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedArtifactReader; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels; -import com.alibaba.qwen.code.managedagent.store.StoreModels.Admission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventPage; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ItemPartRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ItemRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ReplayWindow; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionMutationCommand; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionMutationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionPage; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SnapshotRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.TurnPage; -import com.alibaba.qwen.code.managedagent.store.StoreModels.TurnSummary; -import com.alibaba.qwen.code.managedagent.store.WorkspaceToolProfiles; +import com.alibaba.qwen.code.managedagent.model.ApiModels.CommandAdmission; +import com.alibaba.qwen.code.managedagent.model.ApiModels.InputBlock; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicContentPart; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicEvent; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicItem; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicItemList; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicList; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicSession; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicTurn; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicWorkspace; +import com.alibaba.qwen.code.managedagent.model.ApiModels.SessionCapabilities; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellApprovalChangeResult; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellApprovalSelection; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellContentPart; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellEvent; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellItem; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellModelChangeResult; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellModelContext; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellModelSelection; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellPage; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSession; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSessionApproval; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSessionCapabilities; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSessionModels; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSessionOptions; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTranscript; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTurn; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellWorkspace; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.model.StoreModels.Admission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventPage; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ItemPartRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ItemRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ReplayWindow; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionMutationCommand; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionMutationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionPage; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SnapshotRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.TurnPage; +import com.alibaba.qwen.code.managedagent.model.StoreModels.TurnSummary; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedArtifactReader; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.CsiFilesRetirementProfile; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; @@ -277,7 +278,7 @@ public class ManagedAgentService { requireModelActor(actorId); var summary = getWebShellSession(tenantId, actorId, sessionId); if (summary.workspace() == null) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "unsupported_feature", "Approval selection requires a Workspace Session"); } boolean supported = Boolean.TRUE.equals(summary.capabilities().approvalModeChange()); @@ -310,7 +311,7 @@ public class ManagedAgentService { private static void requireModelActor(String actorId) { if (actorId == null || actorId.isEmpty()) { - throw new ApiException(HttpStatus.UNAUTHORIZED, "actor_required", "A trusted actor is required"); + throw new ManagedAgentException(HttpStatus.UNAUTHORIZED, "actor_required", "A trusted actor is required"); } } @@ -328,7 +329,7 @@ public class ManagedAgentService { List blocks, WorkspaceSelection selection, String approvalMode, Boolean planMode) { validateIdempotencyKey(idempotencyKey); if (actorId == null || actorId.isEmpty()) { - throw new ApiException(HttpStatus.UNAUTHORIZED, + throw new ManagedAgentException(HttpStatus.UNAUTHORIZED, "actor_required", "A trusted actor is required."); } List> input = input(blocks, false); @@ -362,7 +363,7 @@ public class ManagedAgentService { return response(recorded.get()); } if (!input.isEmpty() && !harness.isWorkspaceFilesAvailable()) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "workspace_unavailable", "Hosted Workspace execution is not available."); } @@ -464,13 +465,13 @@ public class ManagedAgentService { SessionRecord parent = store.requireSession(tenantId, parentSessionId); if (parent.workspace() == null || !"ACTIVE".equals(parent.status()) || CsiFilesRetirementProfile.PROFILE.equals(parent.toolProfile())) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "child_parent_unavailable", "The parent Session cannot admit a child."); } String creationKey = childCreationKey(parentSessionId, childRunId); if (!normalizedInput.isEmpty() && !harness.isWorkspaceFilesAvailable()) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "workspace_unavailable", "Hosted Workspace execution is not available."); } @@ -487,7 +488,7 @@ public class ManagedAgentService { childCwd = store.findChildWorkspaceCwd(tenantId, parentSessionId, childRunId); if (childCwd == null) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "child_workspace_not_ready", "The child run's Workspace is not ready to bind a child Session."); } @@ -804,18 +805,18 @@ public class ManagedAgentService { if (error instanceof DaemonHttpException refusal && refusal.getStatusCode() == HttpStatus.CONFLICT.value() && "session_mutation_superseded".equals(refusal.getErrorCode())) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "session_mutation_superseded", "A later Session title attempt has been admitted."); } - if (error instanceof ApiException failure) { + if (error instanceof ManagedAgentException failure) { throw failure; } if (error instanceof RuntimeBrokerException refusal && !refusal.isRetryable()) { HttpStatus status = HttpStatus.resolve( refusal.getStatusCode()); - throw new ApiException( + throw new ManagedAgentException( status == null ? HttpStatus.CONFLICT : status, refusal.getCode(), refusal.getMessage()); } @@ -825,7 +826,7 @@ public class ManagedAgentService { // operation rather than a subsystem the fault may not be in. LOG.warn("Managed Agent rename failed tenant={} session={}", tenantId, sessionId, error); - throw new ApiException(HttpStatus.SERVICE_UNAVAILABLE, + throw new ManagedAgentException(HttpStatus.SERVICE_UNAVAILABLE, "hosted_harness_unavailable", "The Hosted Harness could not persist the Session title.", error); @@ -960,13 +961,13 @@ public class ManagedAgentService { String sessionId, String turnId) { // The path schema counts characters, not UTF-16 units. if (turnId.codePointCount(0, turnId.length()) > TURN_ID_MAX_LENGTH) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_request", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_request", "The Turn id is invalid."); } requireReadableSession(tenantId, actorId, sessionId); return store.findTurnSummary(tenantId, sessionId, turnId) .map(ManagedAgentService::publicTurn) - .orElseThrow(() -> new ApiException(HttpStatus.NOT_FOUND, + .orElseThrow(() -> new ManagedAgentException(HttpStatus.NOT_FOUND, "turn_not_found", "The Turn was not found.")); } @@ -995,7 +996,7 @@ public class ManagedAgentService { public PublicItemList listPublicItems(String tenantId, String actorId, String sessionId, String cursor, long afterSequence, int requestedLimit) { if (afterSequence < 0) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_event_cursor", "Item sequence must be non-negative."); + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_event_cursor", "Item sequence must be non-negative."); } requireReadableSession(tenantId, actorId, sessionId); var page = store.findSnapshotPage(tenantId, sessionId, cursor, afterSequence, limit(requestedLimit)); @@ -1058,7 +1059,7 @@ public class ManagedAgentService { private static void requireEventCursor(long afterSequence) { if (afterSequence < 0) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_event_cursor", "Event sequence must be non-negative."); } @@ -1508,10 +1509,10 @@ public class ManagedAgentService { // meets the reads' 404 there, never the live-Session 409 that // would name the row. if ("DELETED".equals(session.status())) { - throw new ApiException(HttpStatus.NOT_FOUND, + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found."); } - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "workspace_unavailable", "Hosted Workspace execution is not available."); } @@ -1564,7 +1565,7 @@ public class ManagedAgentService { && !workspaces.accessOf(session.tenantId(), actorId, session.workspace().getWorkspaceId()) .atLeast(WorkspaceAccess.OPERATOR)) { - throw new ApiException(HttpStatus.FORBIDDEN, "task_forbidden", + throw new ManagedAgentException(HttpStatus.FORBIDDEN, "task_forbidden", "Only a Workspace operator may cancel the task."); } } @@ -1667,28 +1668,28 @@ public class ManagedAgentService { // beginSessionMutation, and a recorded lifecycle outcome must // keep answering above it. if ("DELETED".equals(session.status())) { - throw new ApiException(HttpStatus.NOT_FOUND, + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found."); } String workspaceId = session.workspace().getWorkspaceId(); WorkspaceAccess access = workspaces.accessOf(session.tenantId(), actorId, workspaceId); if (!access.canRead()) { - throw new ApiException(HttpStatus.NOT_FOUND, + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found."); } if (access.atLeast(WorkspaceAccess.OPERATOR)) { - throw new ApiException(HttpStatus.CONFLICT, + throw new ManagedAgentException(HttpStatus.CONFLICT, "workspace_unavailable", "Hosted Workspace execution is not available."); } - throw new ApiException(HttpStatus.FORBIDDEN, + throw new ManagedAgentException(HttpStatus.FORBIDDEN, "session_operation_forbidden", "Only a Workspace operator may use the Session."); } } - SessionRecord requireReadableSession(String tenantId, + public SessionRecord requireReadableSession(String tenantId, String actorId, String sessionId) { SessionRecord session = requireVisibleSession(tenantId, sessionId); requireReadGrant(session, actorId); @@ -1698,7 +1699,7 @@ public class ManagedAgentService { void requireReadGrant(SessionRecord session, String actorId) { if (session.workspace() != null && !workspaces.canRead(session.tenantId(), actorId, session.workspace().getWorkspaceId())) { - throw new ApiException(HttpStatus.NOT_FOUND, + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found."); } } @@ -1722,15 +1723,15 @@ public class ManagedAgentService { private SessionRecord requireVisibleSession(SessionRecord session) { if ("DELETED".equals(session.status())) { - throw new ApiException(HttpStatus.NOT_FOUND, + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found."); } return session; } - private static ApiException dependencyUnavailable(String code, + private static ManagedAgentException dependencyUnavailable(String code, String message) { - return new ApiException(HttpStatus.SERVICE_UNAVAILABLE, code, + return new ManagedAgentException(HttpStatus.SERVICE_UNAVAILABLE, code, message); } @@ -1804,7 +1805,7 @@ public class ManagedAgentService { private void requireHarness() { if (!harness.isAvailable()) { - throw new ApiException(HttpStatus.SERVICE_UNAVAILABLE, + throw new ManagedAgentException(HttpStatus.SERVICE_UNAVAILABLE, "hosted_harness_disabled", "Hosted Harness is not configured."); } @@ -1814,7 +1815,7 @@ public class ManagedAgentService { boolean required) { if (blocks == null || blocks.isEmpty()) { if (required) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "input_required", "At least one input is required."); } return List.of(); @@ -1828,7 +1829,7 @@ public class ManagedAgentService { } if (block == null || block.text() == null || block.text().isEmpty() || block.mimeType() != null || block.name() != null || block.data() != null) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "unsupported_input", "Expected non-empty text, a text file or an image."); } @@ -1837,14 +1838,14 @@ public class ManagedAgentService { int blockChars = block.text().codePointCount(0, block.text().length()); if (blockChars > MAX_BLOCK_INPUT_CHARS) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_input", "Input block exceeds the " + MAX_BLOCK_INPUT_CHARS + " character per-block limit."); } totalChars += blockChars; if (totalChars > MAX_AGGREGATE_INPUT_CHARS) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_input", "Input exceeds the " + MAX_AGGREGATE_INPUT_CHARS + " character aggregate limit."); @@ -1855,7 +1856,7 @@ public class ManagedAgentService { var normalized = normalizeInput(result); if (normalized.stream().anyMatch(block -> !"text".equals(block.get("type"))) && digests.byteLength(normalized) > ManagedInputAttachments.MAX_INPUT_BYTES) { - throw new ApiException(HttpStatus.PAYLOAD_TOO_LARGE, "input_too_large", + throw new ManagedAgentException(HttpStatus.PAYLOAD_TOO_LARGE, "input_too_large", "An input containing attachments must fit within 8 MiB of encoded JSON."); } return normalized; @@ -1931,7 +1932,7 @@ public class ManagedAgentService { return validTitle(explicitTitle); } if (metadata.size() > 16) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_metadata", "Metadata accepts at most 16 keys."); } for (Map.Entry entry : metadata.entrySet()) { @@ -1939,11 +1940,11 @@ public class ManagedAgentService { || entry.getKey().length() > 64 || (!"title".equals(entry.getKey()) && ((String) entry.getValue()).length() > 512)) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_metadata", "Metadata limits were exceeded."); } if (!"title".equals(entry.getKey())) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "unsupported_feature", "Phase 1 persists metadata.title only."); } @@ -1967,12 +1968,12 @@ public class ManagedAgentService { return null; } if (title.length() > 256) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_title", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_title", "Title must not exceed 256 characters."); } if (title.chars().anyMatch(character -> character <= 31 || character == 127)) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_title", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_title", "Title must not contain control characters."); } return unicodeBlank(title) ? null : title; @@ -1980,15 +1981,15 @@ public class ManagedAgentService { private static String validRenameTitle(String title) { if (title == null || unicodeBlank(title)) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_title", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_title", "Title must contain 1-256 characters."); } return validTitle(title); } - static void validateIdempotencyKey(String key) { + public static void validateIdempotencyKey(String key) { if (key == null || !IDEMPOTENCY_KEY.matcher(key).matches()) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_idempotency_key", "Idempotency-Key must contain 1-128 visible characters."); } @@ -1996,7 +1997,7 @@ public class ManagedAgentService { private static int limit(int requested) { if (requested <= 0 || requested > 100) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_limit", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_limit", "Limit must be between 1 and 100."); } return requested; @@ -2004,7 +2005,7 @@ public class ManagedAgentService { private static int eventLimit(int requested) { if (requested <= 0 || requested > 1000) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_limit", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_limit", "Limit must be between 1 and 1000."); } return requested; @@ -2035,7 +2036,7 @@ public class ManagedAgentService { decoded.substring(0, separator)), decoded.substring(separator + 1)); } catch (IllegalArgumentException error) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_cursor", "Session cursor is invalid."); } } @@ -2070,7 +2071,7 @@ public class ManagedAgentService { } catch (NumberFormatException error) { // A creation time beyond a long is not a cursor this server wrote. } - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_cursor", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_cursor", "Turn cursor is invalid."); } @@ -2085,7 +2086,7 @@ public class ManagedAgentService { } return value; } catch (NumberFormatException error) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_cursor", "Transcript cursor is invalid."); } } @@ -2106,7 +2107,7 @@ public class ManagedAgentService { return false; } if (javaDurableAdmission == null) { - throw new ApiException(HttpStatus.BAD_REQUEST, + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "unsupported_feature", "java_durable admission is not enabled on this deployment."); } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedEventStreamService.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ManagedEventStreamService.java similarity index 94% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedEventStreamService.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ManagedEventStreamService.java index 2349f5d5376..fe2a41cd632 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedEventStreamService.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ManagedEventStreamService.java @@ -1,16 +1,16 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicEvent; -import com.alibaba.qwen.code.managedagent.api.ApiModels.SessionResyncRequired; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellEvent; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellResyncRequired; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.service.SessionEventHub.Delivery; -import com.alibaba.qwen.code.managedagent.service.SessionEventHub.Subscription; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ReplayWindow; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicEvent; +import com.alibaba.qwen.code.managedagent.model.ApiModels.SessionResyncRequired; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellEvent; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellResyncRequired; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ReplayWindow; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.session.SessionEventHub.Delivery; +import com.alibaba.qwen.code.managedagent.session.SessionEventHub.Subscription; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; @@ -321,7 +321,7 @@ public class ManagedEventStreamService { try { agentService.requireReadGrant(session, actorId); return true; - } catch (ApiException error) { + } catch (ManagedAgentException error) { if (error.getStatus() != HttpStatus.NOT_FOUND) { throw error; } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedInputAttachments.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ManagedInputAttachments.java similarity index 90% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedInputAttachments.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ManagedInputAttachments.java index cf4dda65522..4baf957479e 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedInputAttachments.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ManagedInputAttachments.java @@ -1,8 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.InputBlock; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.ApiModels.InputBlock; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; import org.springframework.http.HttpStatus; import java.net.URLEncoder; @@ -77,8 +77,8 @@ final class ManagedInputAttachments { }; } - private static ApiException invalid() { - return new ApiException(HttpStatus.BAD_REQUEST, "unsupported_input", + private static ManagedAgentException invalid() { + return new ManagedAgentException(HttpStatus.BAD_REQUEST, "unsupported_input", "Attachments require a UTF-8 text file or a valid PNG, JPEG, GIF or WebP image; URLs and host paths are unsupported."); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedTaskCancelService.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ManagedTaskCancelService.java similarity index 85% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedTaskCancelService.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ManagedTaskCancelService.java index 3c5a2eb2f37..8567731bcc1 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedTaskCancelService.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ManagedTaskCancelService.java @@ -1,12 +1,12 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicCommandOperation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellCommandOperation; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationAdmission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicCommandOperation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellCommandOperation; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationAdmission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; @@ -70,7 +70,7 @@ public class ManagedTaskCancelService { SessionRecord session = sessions.requireReadableSession(tenantId, actorId, sessionId); if (records.findTask(tenantId, sessionId, taskId).isEmpty()) { - throw new ApiException(HttpStatus.NOT_FOUND, "task_not_found", + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "task_not_found", "The task was not found."); } sessions.requireTaskCanceller(session, actorId); diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedTaskService.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ManagedTaskService.java similarity index 86% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedTaskService.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ManagedTaskService.java index 9b0f83e05ea..b20b44fae35 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ManagedTaskService.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ManagedTaskService.java @@ -1,21 +1,21 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicList; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicTask; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicTaskEvent; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellPage; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTask; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTaskEvent; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection.TaskProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore.TaskPage; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore.TaskRow; -import com.alibaba.qwen.code.managedagent.store.ManagedTaskEventStore; -import com.alibaba.qwen.code.managedagent.store.ManagedTaskEventStore.CursorPositions; -import com.alibaba.qwen.code.managedagent.store.ManagedTaskEventStore.EventPage; -import com.alibaba.qwen.code.managedagent.store.ManagedTaskEventStore.TaskEvent; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicList; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicTask; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicTaskEvent; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellPage; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTask; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTaskEvent; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection.TaskProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore.TaskPage; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore.TaskRow; +import com.alibaba.qwen.code.managedagent.persistence.ManagedTaskEventStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedTaskEventStore.CursorPositions; +import com.alibaba.qwen.code.managedagent.persistence.ManagedTaskEventStore.EventPage; +import com.alibaba.qwen.code.managedagent.persistence.ManagedTaskEventStore.TaskEvent; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; @@ -118,7 +118,7 @@ public class ManagedTaskService { private TaskPage pageOf(String tenantId, String sessionId, String cursor, int limit) { if (limit < 1 || limit > 100) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_limit", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_limit", "Limit must be between 1 and 100."); } if (cursor == null || cursor.isEmpty()) { @@ -133,14 +133,14 @@ public class ManagedTaskService { } var matcher = CURSOR.matcher(decoded); if (!matcher.matches()) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_cursor", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_cursor", "Task cursor is invalid."); } try { return records.listTasks(tenantId, sessionId, Long.parseLong(matcher.group(1)), matcher.group(2), limit); } catch (NumberFormatException error) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_cursor", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_cursor", "Task cursor is invalid."); } } @@ -150,7 +150,7 @@ public class ManagedTaskService { boolean active = "ACTIVE".equals(sessions.requireReadableSession( tenantId, actorId, sessionId).status()); return new Viewed<>(records.findTask(tenantId, sessionId, taskId) - .orElseThrow(() -> new ApiException(HttpStatus.NOT_FOUND, + .orElseThrow(() -> new ManagedAgentException(HttpStatus.NOT_FOUND, "task_not_found", "The task was not found.")), active); } @@ -170,7 +170,7 @@ public class ManagedTaskService { String sessionId, String taskId, String after, int limit) { task(tenantId, actorId, sessionId, taskId); if (limit < 1 || limit > 100) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_limit", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_limit", "Limit must be between 1 and 100."); } long position; @@ -192,7 +192,7 @@ public class ManagedTaskService { long floor = events.positions(tenantId, sessionId, taskId) .expiredThrough(); if (after != null && !after.isEmpty() && position < floor) { - throw new ApiException(HttpStatus.CONFLICT, "cursor_expired", + throw new ManagedAgentException(HttpStatus.CONFLICT, "cursor_expired", "The task event cursor is below the task's durable" + " retention floor."); } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/OperationReconciler.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/OperationReconciler.java similarity index 95% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/OperationReconciler.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/OperationReconciler.java index ca97d00b4af..6386b096354 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/OperationReconciler.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/OperationReconciler.java @@ -1,8 +1,7 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.AcceptanceVerdict; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ParkedOperation; +import com.alibaba.qwen.code.managedagent.model.StoreModels.AcceptanceVerdict; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ParkedOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/OwnerSubscriptions.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/OwnerSubscriptions.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/OwnerSubscriptions.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/OwnerSubscriptions.java index 82abd834a03..5406e168676 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/OwnerSubscriptions.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/OwnerSubscriptions.java @@ -1,8 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector.AttachedSession; -import com.alibaba.qwen.code.managedagent.store.TransportConsumerStore; +import com.alibaba.qwen.code.managedagent.persistence.TransportConsumerStore; import org.apache.rocketmq.client.apis.consumer.LitePushConsumer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/RenameEvidence.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/RenameEvidence.java similarity index 83% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/RenameEvidence.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/RenameEvidence.java index 490635cd734..63c1b435d26 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/RenameEvidence.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/RenameEvidence.java @@ -1,8 +1,7 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.AcceptanceVerdict; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ParkedOperation; +import com.alibaba.qwen.code.managedagent.model.StoreModels.AcceptanceVerdict; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ParkedOperation; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract; import org.springframework.stereotype.Component; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ReplayCursorExpired.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ReplayCursorExpired.java similarity index 77% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ReplayCursorExpired.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ReplayCursorExpired.java index c0164382fc7..ec7ea95e95a 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ReplayCursorExpired.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ReplayCursorExpired.java @@ -1,7 +1,7 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ReplayWindow; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ReplayWindow; import org.springframework.http.HttpStatus; import java.util.Map; @@ -13,7 +13,7 @@ import java.util.Map; * answer it with {@code 409 cursor_expired}; streams send one resync frame * instead. */ -public final class ReplayCursorExpired extends ApiException { +public final class ReplayCursorExpired extends ManagedAgentException { private final transient ReplayWindow window; ReplayCursorExpired(ReplayWindow window) { diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ReplayFloorAdvancer.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ReplayFloorAdvancer.java similarity index 94% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ReplayFloorAdvancer.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ReplayFloorAdvancer.java index ffc083b09c1..bb1bf2b09fb 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ReplayFloorAdvancer.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/ReplayFloorAdvancer.java @@ -1,8 +1,7 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ReplayFloorTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ReplayFloorTarget; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/SessionEventHub.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/SessionEventHub.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/SessionEventHub.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/SessionEventHub.java index 53ad757358c..591a8376481 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/SessionEventHub.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/SessionEventHub.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; import org.springframework.stereotype.Component; import java.time.Duration; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/SessionLifecycleCoordinator.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/SessionLifecycleCoordinator.java similarity index 96% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/SessionLifecycleCoordinator.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/SessionLifecycleCoordinator.java index 42771896e3f..eded700146b 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/SessionLifecycleCoordinator.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/SessionLifecycleCoordinator.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.daemon.DaemonHttpException; import com.alibaba.qwen.code.daemon.DaemonProtocolException; @@ -6,16 +6,17 @@ import com.alibaba.qwen.code.daemon.HostedHarnessCapabilityMismatchException; import com.alibaba.qwen.code.daemon.HostedHarnessGenerationException; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore.CwdChangeOutcome; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationAdmission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationTarget; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationAdmission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore.CwdChangeOutcome; +import com.alibaba.qwen.code.managedagent.workspace.ChildLifecycleAdmissions; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; @@ -99,10 +100,10 @@ public class SessionLifecycleCoordinator { private static final String HOSTED_LIFECYCLE_RECOVERY_REQUIRED = "hosted_lifecycle_recovery_required"; private final AgentStateStore store; - private com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore lifecycle; + private com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore lifecycle; @org.springframework.beans.factory.annotation.Autowired(required = false) - public void setWorkspaceLifecycleStore(com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore lifecycle) { + public void setWorkspaceLifecycleStore(com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore lifecycle) { this.lifecycle = lifecycle; } @@ -126,7 +127,7 @@ public class SessionLifecycleCoordinator { private final ObjectMapper objectMapper; private final ChildLifecycleAdmissions childCloses; private final ManagedAgentService sessions; - private final com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore childWorkspaces; + private final com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore childWorkspaces; private final ObjectProvider brokerProviders; private final ExecutorService executor; private final Clock clock; @@ -175,7 +176,7 @@ public class SessionLifecycleCoordinator { ObjectProvider brokerProviders, ExecutorService executor, Clock clock, ManagedAgentProperties properties, - com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore childWorkspaces) { + com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore childWorkspaces) { this.childWorkspaces = childWorkspaces; this.store = store; this.sessionStore = sessionStore; @@ -294,7 +295,7 @@ public class SessionLifecycleCoordinator { blocked = "workspace_close_identity_unverified"; } } - if (cause instanceof com.alibaba.qwen.code.managedagent.api.ApiException apiError + if (cause instanceof com.alibaba.qwen.code.managedagent.exception.ManagedAgentException apiError && (apiError.getCode().startsWith("workspace_lifecycle") || apiError.getCode().startsWith("workspace_close"))) { blocked = apiError.getCode(); } @@ -550,7 +551,7 @@ public class SessionLifecycleCoordinator { // exactly the predicate hasLiveWriter reads, and writerLive stays gated // on a fresh writerStillLive(claimed) check regardless. private static boolean retryable(Throwable cause) { - if (cause instanceof com.alibaba.qwen.code.managedagent.api.ApiException apiError + if (cause instanceof com.alibaba.qwen.code.managedagent.exception.ManagedAgentException apiError && apiError.getStatus().is4xxClientError()) { return "workspace_lifecycle_writer_active".equals(apiError.getCode()) || "managed_session_writer_active".equals(apiError.getCode()); @@ -595,7 +596,7 @@ public class SessionLifecycleCoordinator { } private static boolean operationIsLifecycle(OperationRecord operation) { - return com.alibaba.qwen.code.managedagent.store.WorkspaceToolProfiles.lifecycleProtocol(operation.lifecycleProtocolVersion()); + return com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles.lifecycleProtocol(operation.lifecycleProtocolVersion()); } // The SDK wraps a daemon refusal in MutationOutcomeUnknownException once @@ -686,7 +687,7 @@ public class SessionLifecycleCoordinator { private boolean settle(OperationRecord operation, java.util.concurrent.atomic.AtomicBoolean harnessSettled) { if (operation.lifecycleProtocolVersion() < 0 || operation.lifecycleProtocolVersion() > 2) { - throw com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.blocked("workspace_lifecycle_protocol_unavailable"); + throw com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.blocked("workspace_lifecycle_protocol_unavailable"); } boolean harnessConfirmed = false; var session = store.requireSession(operation.tenantId(), operation.sessionId()); @@ -700,13 +701,13 @@ public class SessionLifecycleCoordinator { } if (bound && operationIsLifecycle(operation)) { if (lifecycle == null || !RuntimeWarmer.supportsClose(runtimeWarmer, session.workspace())) { - throw com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.blocked("workspace_close_identity_unverified"); + throw com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.blocked("workspace_close_identity_unverified"); } lifecycle.requireSettledExecutions(operation); JsonNode effects = lifecycle.recoverEffects(operation); if (effects == null) { if (!harness.supportsLifecycle(session.toolProfile())) { - throw com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.blocked("workspace_lifecycle_protocol_unavailable"); + throw com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.blocked("workspace_lifecycle_protocol_unavailable"); } try { effects = harness.settleLifecycle(operation); @@ -743,14 +744,14 @@ public class SessionLifecycleCoordinator { String profile = session.toolProfile(); try { harness.prepareLifecycleResources(operation); - if (com.alibaba.qwen.code.managedagent.store.WorkspaceToolProfiles.SHELL.equals(profile)) { + if (com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles.SHELL.equals(profile)) { runtimeWarmer.drainWorkspaceResources(operation.tenantId(), operation.sessionId(), - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.authority(operation)) + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.authority(operation)) .toCompletableFuture().join(); } harness.settleLifecycleResources(operation); runtimeWarmer.drainWorkspaceResources(operation.tenantId(), operation.sessionId(), - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.authority(operation)) + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.authority(operation)) .toCompletableFuture().join(); } catch (RuntimeException unsettled) { if (!(unsettled instanceof com.alibaba.qwen.code.daemon.DaemonException) @@ -761,17 +762,17 @@ public class SessionLifecycleCoordinator { && (http.getErrorCode() != null && (http.getErrorCode().startsWith("workspace_lifecycle_claim") || http.getErrorCode().startsWith("workspace_lifecycle_authorization") || http.getErrorCode().startsWith("workspace_close") - && !(com.alibaba.qwen.code.managedagent.store.WorkspaceToolProfiles.MCP.equals(profile) + && !(com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles.MCP.equals(profile) && "workspace_close_identity_unverified".equals(http.getErrorCode())) || "runtime_admission_closed".equals(http.getErrorCode())))) { throw unsettled; } - if (com.alibaba.qwen.code.managedagent.store.WorkspaceToolProfiles.MCP.equals(profile)) { + if (com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles.MCP.equals(profile)) { runtimeWarmer.recoverStoppedWorkspaceResources(operation.tenantId(), operation.sessionId(), - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.authority(operation)) + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.authority(operation)) .toCompletableFuture().join(); } else { - throw com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.blocked("workspace_lifecycle_resources_unsettled"); + throw com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.blocked("workspace_lifecycle_resources_unsettled"); } } } @@ -781,7 +782,7 @@ public class SessionLifecycleCoordinator { } harness.detachLifecycle(operation); if (sessionStore.hasLiveWriter(operation.tenantId(), operation.sessionId())) { - throw com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.blocked("workspace_lifecycle_writer_active"); + throw com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.blocked("workspace_lifecycle_writer_active"); } runtimeWarmer.closeWorkspace(operation.tenantId(), operation.sessionId()).toCompletableFuture().join(); return true; @@ -852,10 +853,10 @@ public class SessionLifecycleCoordinator { return true; } childWorkspaces.requestFinish(tenantId, sessionId, childRunId, - com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore.DISCARD, + com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore.DISCARD, clock.millis()); return true; - } catch (com.alibaba.qwen.code.managedagent.api.ApiException refused) { + } catch (com.alibaba.qwen.code.managedagent.exception.ManagedAgentException refused) { if (java.util.Set.of("child_workspace_conflict", "child_workspace_finishing", "child_workspace_not_found") .contains(refused.getCode())) { diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/SessionLifecycleService.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/SessionLifecycleService.java similarity index 89% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/SessionLifecycleService.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/SessionLifecycleService.java index d1aa5258720..ef5f27e8954 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/SessionLifecycleService.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/SessionLifecycleService.java @@ -1,16 +1,17 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicCommandOperation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicCwdOperation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellCommandOperation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellCwdOperation; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationAdmission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; -import com.alibaba.qwen.code.managedagent.store.WorkspaceToolProfiles; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicCommandOperation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicCwdOperation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellCommandOperation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellCwdOperation; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationAdmission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.managedworkspace.WorkspaceException; import com.alibaba.qwen.code.runtimebroker.managedworkspace.WorkspaceRelativePath; import org.springframework.beans.factory.annotation.Autowired; @@ -126,23 +127,23 @@ public class SessionLifecycleService { // Actor before key, on the service itself: the published refusal // order must not rest on argument-evaluation order at the routes. if (actorId == null || actorId.isEmpty()) { - throw new ApiException(HttpStatus.UNAUTHORIZED, "actor_required", + throw new ManagedAgentException(HttpStatus.UNAUTHORIZED, "actor_required", "A trusted actor is required."); } ManagedAgentService.validateIdempotencyKey(idempotencyKey); if (cwdRelative == null) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_request", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_request", "cwd_relative is required."); } String normalized; try { normalized = WorkspaceRelativePath.normalize(cwdRelative); } catch (WorkspaceException error) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_cwd", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_cwd", "The working directory is invalid."); } if (expectedContextRevision == null || expectedContextRevision < 1) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_request", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_request", "expected_context_revision must be at least 1."); } String requestDigest = digests.digest(Map.of("sessionId", sessionId, @@ -233,13 +234,13 @@ public class SessionLifecycleService { private OperationRecord operation(String tenantId, String actorId, String sessionId, String operationId) { if (operationId.length() > 64) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_request", + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_request", "The operation id is invalid."); } SessionRecord session = store.requireSession(tenantId, sessionId); sessions.requireReadGrant(session, actorId); return store.findOperation(tenantId, sessionId, operationId) - .orElseThrow(() -> new ApiException(HttpStatus.NOT_FOUND, + .orElseThrow(() -> new ManagedAgentException(HttpStatus.NOT_FOUND, "operation_not_found", "The operation was not found.")); } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/SessionMessageRelay.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/SessionMessageRelay.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/SessionMessageRelay.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/SessionMessageRelay.java index ab29beec51f..700ca60bc4c 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/SessionMessageRelay.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/SessionMessageRelay.java @@ -1,12 +1,12 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.daemon.DaemonHttpException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords; -import com.alibaba.qwen.code.managedagent.store.SessionMessageRelayStore; -import com.alibaba.qwen.code.managedagent.store.SessionMessageRelayStore.MessageRow; -import com.alibaba.qwen.code.managedagent.store.SessionMessageRelayStore.PendingMessage; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords; +import com.alibaba.qwen.code.managedagent.persistence.SessionMessageRelayStore; +import com.alibaba.qwen.code.managedagent.persistence.SessionMessageRelayStore.MessageRow; +import com.alibaba.qwen.code.managedagent.persistence.SessionMessageRelayStore.PendingMessage; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/SessionRenameCoordinator.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/SessionRenameCoordinator.java similarity index 95% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/SessionRenameCoordinator.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/SessionRenameCoordinator.java index 1fa33cba8a2..cf81671fa5e 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/SessionRenameCoordinator.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/SessionRenameCoordinator.java @@ -1,9 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.RenameDelivery; +import com.alibaba.qwen.code.managedagent.model.StoreModels.RenameDelivery; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/TaskCancelCoordinator.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/TaskCancelCoordinator.java similarity index 96% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/TaskCancelCoordinator.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/TaskCancelCoordinator.java index 64ee180b179..778dd265f65 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/TaskCancelCoordinator.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/TaskCancelCoordinator.java @@ -1,17 +1,16 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore.TaskCancelOutcome; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore.TaskTarget; -import com.alibaba.qwen.code.managedagent.store.StoreModels.AcceptanceVerdict; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationTarget; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ParkedOperation; +import com.alibaba.qwen.code.managedagent.model.StoreModels.AcceptanceVerdict; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ParkedOperation; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore.TaskTarget; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore.TaskCancelOutcome; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; import jakarta.annotation.PreDestroy; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/TurnInputEvidence.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/TurnInputEvidence.java similarity index 76% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/TurnInputEvidence.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/TurnInputEvidence.java index ae3bd04e5f3..cf38e7dcdd8 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/TurnInputEvidence.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/TurnInputEvidence.java @@ -1,10 +1,9 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.AcceptanceVerdict; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ParkedOperation; +import com.alibaba.qwen.code.managedagent.model.StoreModels.AcceptanceVerdict; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ParkedOperation; import org.springframework.stereotype.Component; import java.util.Optional; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WakeRecovery.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/WakeRecovery.java similarity index 91% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WakeRecovery.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/WakeRecovery.java index 809c6b84d57..50caa5a8c9d 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WakeRecovery.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/session/WakeRecovery.java @@ -1,10 +1,10 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords; -import com.alibaba.qwen.code.managedagent.store.WakeRecoveryStore; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords; +import com.alibaba.qwen.code.managedagent.persistence.WakeRecoveryStore; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ChildLifecycleAdmissions.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/ChildLifecycleAdmissions.java similarity index 88% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ChildLifecycleAdmissions.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/ChildLifecycleAdmissions.java index 628824ace9f..6bca16c247a 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ChildLifecycleAdmissions.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/ChildLifecycleAdmissions.java @@ -1,7 +1,9 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationAdmission; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationAdmission; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import org.springframework.stereotype.Component; import java.util.Map; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ChildResultRelay.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/ChildResultRelay.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ChildResultRelay.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/ChildResultRelay.java index ad1e0b9446b..13c1365647a 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ChildResultRelay.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/ChildResultRelay.java @@ -1,15 +1,16 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace; import com.alibaba.qwen.code.daemon.DaemonHttpException; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.CommandAdmission; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore.PendingChild; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore.RelayRow; -import com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.model.ApiModels.CommandAdmission; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore.PendingChild; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore.RelayRow; +import com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; import com.fasterxml.jackson.databind.JsonNode; @@ -520,7 +521,7 @@ public class ChildResultRelay { admission = sessions.createChildSession(pending.tenantId(), pending.parentSessionId(), pending.childRunId(), description, prompt, isolated); - } catch (ApiException refused) { + } catch (ManagedAgentException refused) { // A new child only (a replay answers before this // check): the row moved off the parent's binding or was // asked to finish since it read ready, and it never @@ -668,7 +669,7 @@ public class ChildResultRelay { try { workspace = childWorkspaces.request(row.tenantId(), row.parentSessionId(), row.childRunId(), workspaceMode); - } catch (ApiException refused) { + } catch (ManagedAgentException refused) { if (!"child_workspace_unsupported".equals(refused.getCode()) && !"child_parent_unavailable".equals(refused.getCode())) { throw refused; @@ -741,7 +742,7 @@ public class ChildResultRelay { try { childWorkspaces.requestFinish(row.tenantId(), row.parentSessionId(), row.childRunId(), ChildWorkspaceStore.DISCARD); - } catch (ApiException refused) { + } catch (ManagedAgentException refused) { if (!SETTLED_FINISH_REFUSALS.contains(refused.getCode())) { throw refused; } @@ -782,7 +783,7 @@ public class ChildResultRelay { completed && !workspace.snapshot() ? ChildWorkspaceStore.MERGE : ChildWorkspaceStore.DISCARD); - } catch (ApiException refused) { + } catch (ManagedAgentException refused) { if (!SETTLED_FINISH_REFUSALS.contains(refused.getCode())) { throw refused; } @@ -837,7 +838,7 @@ public class ChildResultRelay { try { childWorkspaces.requestFinish(row.tenantId(), row.parentSessionId(), row.childRunId(), ChildWorkspaceStore.MERGE); - } catch (ApiException refused) { + } catch (ManagedAgentException refused) { // A discard that came first keeps its place. if (!SETTLED_FINISH_REFUSALS.contains(refused.getCode())) { throw refused; @@ -1255,7 +1256,7 @@ public class ChildResultRelay { childWorkspaces.requestFinish(row.tenantId(), row.parentSessionId(), row.childRunId(), ChildWorkspaceStore.MERGE); - } catch (ApiException refused) { + } catch (ManagedAgentException refused) { // A discard asked first (the parent closing) keeps its // place: the row then reports `discarded`. if (!"child_workspace_conflict".equals(refused.getCode())) { diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ChildWorkspaceException.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/ChildWorkspaceException.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ChildWorkspaceException.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/ChildWorkspaceException.java index 2c290062be3..ee4fb753c64 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ChildWorkspaceException.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/ChildWorkspaceException.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace; /** * A child Workspace step that could not complete (#13753 I1). A terminal diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ChildWorkspaceProvider.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/ChildWorkspaceProvider.java similarity index 79% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ChildWorkspaceProvider.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/ChildWorkspaceProvider.java index b2f063f2c10..3a04ced7e3e 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ChildWorkspaceProvider.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/ChildWorkspaceProvider.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; @@ -8,7 +8,7 @@ import java.nio.file.Path; * The Workspace provider's child Workspace capability (#13753 I1): the * verified root of a binding's storage and the Git steps that run inside * it. Only a provider whose control plane mounts the storage answers one; - * {@link RuntimeWarmer#childWorkspaces()} is null everywhere else. + * {@link com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer#childWorkspaces()} is null everywhere else. */ public interface ChildWorkspaceProvider { /** diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ChildWorkspaceService.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/ChildWorkspaceService.java similarity index 91% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ChildWorkspaceService.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/ChildWorkspaceService.java index 3b850dfefa4..984fd0c13e6 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ChildWorkspaceService.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/ChildWorkspaceService.java @@ -1,11 +1,12 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore; -import com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore.Row; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore; +import com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore.Row; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; @@ -34,21 +35,21 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; import java.util.function.Supplier; -import static com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore.APPLIED; -import static com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore.APPLYING; -import static com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore.BLOCKED; -import static com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore.CONFLICTED; -import static com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore.DISCARD; -import static com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore.DISCARDED; -import static com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore.DISCARDING; -import static com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore.DISCARD_PINNED; -import static com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore.FAILED; -import static com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore.MERGE; -import static com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore.MERGED; -import static com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore.MERGING; -import static com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore.PREPARING; -import static com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore.READY; -import static com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore.columns; +import static com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore.APPLIED; +import static com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore.APPLYING; +import static com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore.BLOCKED; +import static com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore.CONFLICTED; +import static com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore.DISCARD; +import static com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore.DISCARDED; +import static com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore.DISCARDING; +import static com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore.DISCARD_PINNED; +import static com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore.FAILED; +import static com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore.MERGE; +import static com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore.MERGED; +import static com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore.MERGING; +import static com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore.PREPARING; +import static com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore.READY; +import static com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore.columns; /** * The child Workspace of the isolation slice (#13753 I1): prepares a Git @@ -124,12 +125,12 @@ public class ChildWorkspaceService { */ public Row prepare(String tenantId, String parentSessionId, String childRunId) { if (warmer.childWorkspaces() == null) { - throw new ApiException(HttpStatus.CONFLICT, "child_workspace_unsupported", + throw new ManagedAgentException(HttpStatus.CONFLICT, "child_workspace_unsupported", "This host cannot create a child Workspace."); } SessionRecord parent = sessions.requireSession(tenantId, parentSessionId); if (parent.workspace() == null || !"ACTIVE".equals(parent.status())) { - throw new ApiException(HttpStatus.CONFLICT, "child_parent_unavailable", + throw new ManagedAgentException(HttpStatus.CONFLICT, "child_parent_unavailable", "The parent Session cannot admit a child."); } return drive(store.admit(tenantId, parentSessionId, childRunId, parent.workspace(), @@ -146,12 +147,12 @@ public class ChildWorkspaceService { public Row request(String tenantId, String parentSessionId, String childRunId, String workspaceMode) { if (warmer.childWorkspaces() == null) { - throw new ApiException(HttpStatus.CONFLICT, "child_workspace_unsupported", + throw new ManagedAgentException(HttpStatus.CONFLICT, "child_workspace_unsupported", "This host cannot create a child Workspace."); } SessionRecord parent = sessions.requireSession(tenantId, parentSessionId); if (parent.workspace() == null || !"ACTIVE".equals(parent.status())) { - throw new ApiException(HttpStatus.CONFLICT, "child_parent_unavailable", + throw new ManagedAgentException(HttpStatus.CONFLICT, "child_parent_unavailable", "The parent Session cannot admit a child."); } return store.admit(tenantId, parentSessionId, childRunId, parent.workspace(), workspaceMode, @@ -246,7 +247,7 @@ public class ChildWorkspaceService { } else { retry(claimed, error.getCode(), error.getMessage()); } - } catch (ApiException error) { + } catch (ManagedAgentException error) { retry(claimed, error.getCode(), error.getMessage()); } catch (RuntimeException error) { // Unforeseen faults count too, so they end blocked instead @@ -535,7 +536,7 @@ public class ChildWorkspaceService { private void advance(Row claimed, String toState, java.util.Map columns) { if (!store.transition(claimed, owner, toState, columns, clock.get())) { - throw new ApiException(HttpStatus.CONFLICT, "child_workspace_claim_lost", + throw new ManagedAgentException(HttpStatus.CONFLICT, "child_workspace_claim_lost", "The child Workspace moved on under another claim."); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ChildWorktreeGit.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/ChildWorktreeGit.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ChildWorktreeGit.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/ChildWorktreeGit.java index 44f531d24fd..ea71f6a600b 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ChildWorktreeGit.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/ChildWorktreeGit.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace; import org.apache.commons.lang3.StringUtils; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/SshWorkspaceService.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/SshWorkspaceService.java similarity index 90% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/SshWorkspaceService.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/SshWorkspaceService.java index 8e9ef720299..a6cec64c5c5 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/SshWorkspaceService.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/SshWorkspaceService.java @@ -1,21 +1,22 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace; -import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.config.SshRuntimeSettings; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.SshWorkspaceStore; -import com.alibaba.qwen.code.managedagent.store.SshWorkspaceStore.Intent; -import com.alibaba.qwen.code.managedagent.store.SshWorkspaceStore.Operation; -import com.alibaba.qwen.code.managedagent.store.SshWorkspaceStore.Parked; -import com.alibaba.qwen.code.managedagent.store.StoreModels.AcceptanceVerdict; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ParkedOperation; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels.AcceptanceVerdict; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ParkedOperation; +import com.alibaba.qwen.code.managedagent.persistence.SshWorkspaceStore; +import com.alibaba.qwen.code.managedagent.persistence.SshWorkspaceStore.Intent; +import com.alibaba.qwen.code.managedagent.persistence.SshWorkspaceStore.Operation; +import com.alibaba.qwen.code.managedagent.persistence.SshWorkspaceStore.Parked; +import com.alibaba.qwen.code.managedagent.session.AcceptanceEvidence; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.RuntimeScope; -import com.alibaba.qwen.code.runtimebroker.SshConnectionManager; -import com.alibaba.qwen.code.runtimebroker.SshRuntimeNode; -import com.alibaba.qwen.code.runtimebroker.SshRuntimeStorage; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.provisioning.SshConnectionManager; +import com.alibaba.qwen.code.runtimebroker.provisioning.SshRuntimeNode; +import com.alibaba.qwen.code.runtimebroker.provisioning.SshRuntimeStorage; import jakarta.annotation.PreDestroy; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; @@ -183,11 +184,11 @@ public class SshWorkspaceService implements AutoCloseable, AcceptanceEvidence { private SshRuntimeSettings.Node admit(String tenant, String actor, String id) { if (!properties.getRuntimeBroker().getSsh().isEnabled()) { - throw new ApiException(HttpStatus.NOT_FOUND, "ssh_runtime_disabled", "SSH Workspace registration is disabled."); + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "ssh_runtime_disabled", "SSH Workspace registration is disabled."); } SshRuntimeSettings.Node node = nodes.get(id); if (node == null || !node.admits(tenant, actor)) { - throw new ApiException(HttpStatus.FORBIDDEN, "runtime_node_forbidden", "Runtime node is unavailable."); + throw new ManagedAgentException(HttpStatus.FORBIDDEN, "runtime_node_forbidden", "Runtime node is unavailable."); } return node; } @@ -210,10 +211,10 @@ public class SshWorkspaceService implements AutoCloseable, AcceptanceEvidence { request.put("allowedRoots", node.allowedRoots()); var result = connections().bootstrap(node.runtimeNode(), request); if (!node.qwenVersion().equals(result.get("qwenVersion"))) { - throw new ApiException(HttpStatus.CONFLICT, "ssh_runtime_version_mismatch", "Remote qwen-code version does not match its pinned version."); + throw new ManagedAgentException(HttpStatus.CONFLICT, "ssh_runtime_version_mismatch", "Remote qwen-code version does not match its pinned version."); } if (SshWorkspaceStore.string(SshWorkspaceStore.object(result, "identity"), "root").length() > 512) { - throw new ApiException(HttpStatus.BAD_REQUEST, "invalid_request", "Canonical Workspace path exceeds its limit."); + throw new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_request", "Canonical Workspace path exceeds its limit."); } return result; } @@ -275,7 +276,7 @@ public class SshWorkspaceService implements AutoCloseable, AcceptanceEvidence { store.complete(intent, owner); } catch (RuntimeBrokerException error) { store.fail(intent, owner, error.getCode(), error.isRetryable()); - } catch (ApiException error) { + } catch (ManagedAgentException error) { store.fail(intent, owner, error.getCode(), false); } catch (RuntimeException error) { store.fail(intent, owner, "workspace_registration_failed", false); diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceDiscoveryService.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/WorkspaceDiscoveryService.java similarity index 88% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceDiscoveryService.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/WorkspaceDiscoveryService.java index 80002d31a3f..5473e4aeed7 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceDiscoveryService.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/WorkspaceDiscoveryService.java @@ -1,8 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry.WorkspaceSummary; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry.WorkspaceSummary; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.digest.DigestUtils; import org.springframework.http.HttpStatus; @@ -75,14 +75,14 @@ public class WorkspaceDiscoveryService { WorkspaceSummary found = registry.findReadable(tenantId, actorId, workspaceId); if (found == null) { - throw new ApiException(HttpStatus.NOT_FOUND, + throw new ManagedAgentException(HttpStatus.NOT_FOUND, "workspace_not_found", "Workspace not found."); } return found; } - private static ApiException invalidCursor() { - return new ApiException(HttpStatus.BAD_REQUEST, + private static ManagedAgentException invalidCursor() { + return new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_workspace_cursor", "Workspace cursor or limit is invalid."); } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/WorkspaceSelection.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/WorkspaceSelection.java similarity index 83% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/WorkspaceSelection.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/WorkspaceSelection.java index 9589fa6fd99..3eb35e5d059 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/api/WorkspaceSelection.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/WorkspaceSelection.java @@ -1,5 +1,6 @@ -package com.alibaba.qwen.code.managedagent.api; +package com.alibaba.qwen.code.managedagent.workspace; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.runtimebroker.managedworkspace.WorkspaceException; import com.alibaba.qwen.code.runtimebroker.managedworkspace.WorkspaceRelativePath; import com.fasterxml.jackson.databind.JsonNode; @@ -57,13 +58,13 @@ public record WorkspaceSelection(String workspaceId, String cwdRelative) { } } - private static ApiException invalidRequest() { - return new ApiException(HttpStatus.BAD_REQUEST, "invalid_request", + private static ManagedAgentException invalidRequest() { + return new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_request", "Workspace selection is invalid."); } - private static ApiException invalidCwd() { - return new ApiException(HttpStatus.BAD_REQUEST, "invalid_cwd", + private static ManagedAgentException invalidCwd() { + return new ManagedAgentException(HttpStatus.BAD_REQUEST, "invalid_cwd", "Workspace directory must be a relative path."); } } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceToolProfiles.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/WorkspaceToolProfiles.java similarity index 94% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceToolProfiles.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/WorkspaceToolProfiles.java index b034c2ca8a6..3da194a9c49 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/WorkspaceToolProfiles.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/WorkspaceToolProfiles.java @@ -1,4 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.workspace; + +import com.alibaba.qwen.code.managedagent.model.StoreModels; public final class WorkspaceToolProfiles { public static final String FILES = "hosted-workspace-files/1"; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/EmbeddedRuntimeBroker.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/EmbeddedRuntimeBroker.java similarity index 95% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/EmbeddedRuntimeBroker.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/EmbeddedRuntimeBroker.java index 26ef4d4b677..e9d4065260e 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/EmbeddedRuntimeBroker.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/EmbeddedRuntimeBroker.java @@ -1,17 +1,17 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationDataStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationDataStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.workspace.ChildWorkspaceProvider; +import com.alibaba.qwen.code.managedagent.workspace.ChildWorktreeGit; +import com.alibaba.qwen.code.managedagent.workspace.SshWorkspaceService; import com.alibaba.qwen.code.runtimebroker.HarnessSessionResolver; -import com.alibaba.qwen.code.runtimebroker.HttpRuntimeTransport; -import com.alibaba.qwen.code.runtimebroker.LocalProcessRuntimeProvisioner; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; -import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerHttpServer; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; import com.alibaba.qwen.code.runtimebroker.RuntimeLease; import com.alibaba.qwen.code.runtimebroker.RuntimeLifecycleAuthority; @@ -21,10 +21,13 @@ import com.alibaba.qwen.code.runtimebroker.RuntimePublicationVerifier; import com.alibaba.qwen.code.runtimebroker.RuntimeScope; import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeTransport; -import com.alibaba.qwen.code.runtimebroker.StaticRuntimeProvisioner; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRepository; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.provisioning.StaticRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import com.alibaba.qwen.code.runtimebroker.transport.RuntimeBrokerHttpServer; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.digest.DigestUtils; @@ -55,7 +58,7 @@ public class EmbeddedRuntimeBroker implements RuntimeWarmer, AutoCloseable { private final AgentStateStore store; private final WorkspaceRuntimeResolver workspaces; private final ChildWorkspaceProvider childWorkspaces; - private final com.alibaba.qwen.code.managedagent.store.ResidentWorkspaces residents; + private final com.alibaba.qwen.code.managedagent.persistence.ResidentWorkspaces residents; private final boolean resident; private final Set retired = ConcurrentHashMap.newKeySet(); private static final Set LIFECYCLE_FENCED = Set.of("CLOSING", @@ -148,7 +151,7 @@ public class EmbeddedRuntimeBroker implements RuntimeWarmer, AutoCloseable { this.ssh = ssh; ManagedAgentProperties.RuntimeBroker broker = properties.getRuntimeBroker(); - this.residents = new com.alibaba.qwen.code.managedagent.store.ResidentWorkspaces(broker.getResidentWorkspaces()); + this.residents = new com.alibaba.qwen.code.managedagent.persistence.ResidentWorkspaces(broker.getResidentWorkspaces()); this.resident = "kubernetes-workspace".equals(broker.getProvisioner()); require(broker.getToken(), "Runtime Broker token"); require(broker.getWorkspaceGeneration(), @@ -208,13 +211,13 @@ public class EmbeddedRuntimeBroker implements RuntimeWarmer, AutoCloseable { this.localProvisioner = baseProvisioner; if (remote) { RuntimeProvisioner local = baseProvisioner; - var remoteProvisioner = new com.alibaba.qwen.code.runtimebroker.SshRuntimeProvisioner( + var remoteProvisioner = new com.alibaba.qwen.code.runtimebroker.provisioning.SshRuntimeProvisioner( ssh::node, ssh::runtimeStorage, ssh.connections(), http); - baseProvisioner = new com.alibaba.qwen.code.runtimebroker.RoutingRuntimeProvisioner( - java.util.Map.of(local.kind(), local, com.alibaba.qwen.code.runtimebroker.SshRuntimeProvisioner.KIND, remoteProvisioner), - scope -> ssh.runtimeStorage(scope) == null ? local.kind() : com.alibaba.qwen.code.runtimebroker.SshRuntimeProvisioner.KIND, + baseProvisioner = new com.alibaba.qwen.code.runtimebroker.provisioning.RoutingRuntimeProvisioner( + java.util.Map.of(local.kind(), local, com.alibaba.qwen.code.runtimebroker.provisioning.SshRuntimeProvisioner.KIND, remoteProvisioner), + scope -> ssh.runtimeStorage(scope) == null ? local.kind() : com.alibaba.qwen.code.runtimebroker.provisioning.SshRuntimeProvisioner.KIND, (kind, lease) -> { - if (!com.alibaba.qwen.code.runtimebroker.SshRuntimeProvisioner.KIND.equals(kind)) { + if (!com.alibaba.qwen.code.runtimebroker.provisioning.SshRuntimeProvisioner.KIND.equals(kind)) { ssh.connections().registerDirect(lease); } }, ssh.connections()::forget); @@ -420,7 +423,7 @@ public class EmbeddedRuntimeBroker implements RuntimeWarmer, AutoCloseable { var session = store.findSessionById(sessionId).orElse(null); if (resident) { if (session == null || !tenantId.equals(session.tenantId()) || residents.find(session.workspace()) == null) { - return CompletableFuture.failedFuture(com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore.unavailable()); + return CompletableFuture.failedFuture(com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore.unavailable()); } return service.closeResidentHarnessSession(residents.request(session.workspace()), sessionId); } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ResidentWorkspaceProvisioner.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/ResidentWorkspaceProvisioner.java similarity index 93% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ResidentWorkspaceProvisioner.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/ResidentWorkspaceProvisioner.java index f97b342e43d..e2759fd48a9 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/ResidentWorkspaceProvisioner.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/ResidentWorkspaceProvisioner.java @@ -1,12 +1,11 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.RuntimeBroker.ResidentWorkspace; -import com.alibaba.qwen.code.managedagent.store.ResidentWorkspaces; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiReservationStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.persistence.ResidentWorkspaces; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiReservationStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; -import com.alibaba.qwen.code.runtimebroker.KubernetesHttpRuntimeClient; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeLease; import com.alibaba.qwen.code.runtimebroker.RuntimeObservation; @@ -15,6 +14,7 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; import com.alibaba.qwen.code.runtimebroker.RuntimeProvisioner; import com.alibaba.qwen.code.runtimebroker.RuntimeResourceHandle; import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.provisioning.KubernetesHttpRuntimeClient; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/RuntimeRecoveryCoordinator.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/RuntimeRecoveryCoordinator.java similarity index 93% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/RuntimeRecoveryCoordinator.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/RuntimeRecoveryCoordinator.java index c52897c7cd8..58a28fe8f59 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/RuntimeRecoveryCoordinator.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/RuntimeRecoveryCoordinator.java @@ -1,8 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; -import com.alibaba.qwen.code.runtimebroker.LocalProcessRuntimeProvisioner; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/RuntimeRetentionJob.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/RuntimeRetentionJob.java similarity index 96% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/RuntimeRetentionJob.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/RuntimeRetentionJob.java index 421ee4b5fa1..920a4aa9462 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/RuntimeRetentionJob.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/RuntimeRetentionJob.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeRetention; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/RuntimeWarmer.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/RuntimeWarmer.java similarity index 92% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/RuntimeWarmer.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/RuntimeWarmer.java index f928efc1583..076b2a50b2f 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/RuntimeWarmer.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/RuntimeWarmer.java @@ -1,6 +1,7 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.workspace.ChildWorkspaceProvider; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import java.util.concurrent.CompletionStage; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiProtectionMain.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiProtectionMain.java similarity index 93% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiProtectionMain.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiProtectionMain.java index dfc339266f0..69443066cbc 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiProtectionMain.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiProtectionMain.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiRegistration; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiRegistration; import com.fasterxml.jackson.core.StreamReadFeature; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.json.JsonMapper; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiResourceGuard.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiResourceGuard.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiResourceGuard.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiResourceGuard.java index 7155ea7ea07..4937bc73fde 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiResourceGuard.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiResourceGuard.java @@ -1,8 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiRegistration; -import com.alibaba.qwen.code.runtimebroker.KubernetesRuntimeClient; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiRegistration; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.provisioning.KubernetesRuntimeClient; import java.util.LinkedHashMap; import java.util.List; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiRuntimeIdentity.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiRuntimeIdentity.java similarity index 92% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiRuntimeIdentity.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiRuntimeIdentity.java index 0d0821fd6cc..96bcdc82bad 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiRuntimeIdentity.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiRuntimeIdentity.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiRuntimeProvisioner.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiRuntimeProvisioner.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiRuntimeProvisioner.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiRuntimeProvisioner.java index d8558de1bf2..4d192cf1294 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiRuntimeProvisioner.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiRuntimeProvisioner.java @@ -1,11 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiRegistration; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiReservationStore; -import com.alibaba.qwen.code.runtimebroker.HttpRuntimeTransport; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiRegistration; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiReservationStore; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; -import com.alibaba.qwen.code.runtimebroker.KubernetesRuntimeClient; -import com.alibaba.qwen.code.runtimebroker.ManagedCsiFilesProtocol; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.RuntimeLease; @@ -17,6 +14,9 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeResourceHandle; import com.alibaba.qwen.code.runtimebroker.RuntimeScope; import com.alibaba.qwen.code.runtimebroker.RuntimeTransport; import com.alibaba.qwen.code.runtimebroker.WorkspaceCsiRuntimeIdentity; +import com.alibaba.qwen.code.runtimebroker.provisioning.KubernetesRuntimeClient; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedCsiFilesProtocol; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.DataAccessException; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceMigrationMain.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceMigrationMain.java similarity index 89% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceMigrationMain.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceMigrationMain.java index f7b60a368bc..0ad6f9b884b 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceMigrationMain.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceMigrationMain.java @@ -1,20 +1,20 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.RuntimeBroker.WorkspaceMount; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceMigrationStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; -import com.alibaba.qwen.code.runtimebroker.HttpRuntimeTransport; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceMigrationStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; -import com.alibaba.qwen.code.runtimebroker.LocalProcessRuntimeProvisioner; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.jdbc.datasource.DriverManagerDataSource; @@ -100,7 +100,7 @@ public final class WorkspaceMigrationMain { } } catch (Exception error) { try { - store.failed(com.alibaba.qwen.code.managedagent.store.WorkspaceRecoveryStore.errorCode(error)); + store.failed(com.alibaba.qwen.code.managedagent.persistence.WorkspaceRecoveryStore.errorCode(error)); } catch (Exception recordingFailure) { error.addSuppressed(recordingFailure); } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRecoveryCommand.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRecoveryCommand.java similarity index 96% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRecoveryCommand.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRecoveryCommand.java index 84e97f12c7e..75cc75d468d 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRecoveryCommand.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRecoveryCommand.java @@ -1,18 +1,18 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; import com.alibaba.qwen.code.maintenance.WorkspaceRecoveryApplication; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceOperatorRecoveryStore; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; -import com.alibaba.qwen.code.runtimebroker.HttpRuntimeTransport; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceOperatorRecoveryStore; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; -import com.alibaba.qwen.code.runtimebroker.LocalProcessRuntimeProvisioner; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; import com.alibaba.qwen.code.runtimebroker.RuntimeObservation; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.boot.WebApplicationType; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeProvisioner.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeProvisioner.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeProvisioner.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeProvisioner.java index 325a04eb865..2a31a591a2f 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeProvisioner.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeProvisioner.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeLease; import com.alibaba.qwen.code.runtimebroker.RuntimeObservation; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeResolver.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeResolver.java similarity index 96% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeResolver.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeResolver.java index 22db53a7c53..926f6069c77 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeResolver.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeResolver.java @@ -1,14 +1,15 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; -import com.alibaba.qwen.code.runtimebroker.LocalProcessRuntimeProvisioner; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.workspace.SshWorkspaceService; import com.alibaba.qwen.code.runtimebroker.RuntimeScope; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import com.alibaba.qwen.code.runtimebroker.managedworkspace.WorkspaceRelativePath; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; import java.io.IOException; import java.nio.file.Files; @@ -23,7 +24,7 @@ final class WorkspaceRuntimeResolver { private final AgentStateStore sessions; private final WorkspaceExecutionStore authority; private final SshWorkspaceService ssh; - private final com.alibaba.qwen.code.managedagent.store.ResidentWorkspaces residents; + private final com.alibaba.qwen.code.managedagent.persistence.ResidentWorkspaces residents; private final Map mounts = new LinkedHashMap<>(); private final String boundSessionIsolationClass; @@ -39,7 +40,7 @@ final class WorkspaceRuntimeResolver { this.authority = authority; var broker = properties.getRuntimeBroker(); this.boundSessionIsolationClass = broker.getBoundSessionIsolationClass(); - this.residents = new com.alibaba.qwen.code.managedagent.store.ResidentWorkspaces(broker.getResidentWorkspaces()); + this.residents = new com.alibaba.qwen.code.managedagent.persistence.ResidentWorkspaces(broker.getResidentWorkspaces()); if (WorkspaceExecutionProfile.CAPABILITY_DIGEST.equals( properties.getHarness().getCapabilityDigest()) || com.alibaba.qwen.code.runtimebroker.ResidentWorkspaceProfile.CAPABILITY_DIGEST.equals( @@ -111,7 +112,7 @@ final class WorkspaceRuntimeResolver { } var resident = residents.find(binding); if (resident != null) { - return new Resolved(binding, com.alibaba.qwen.code.managedagent.store.ResidentWorkspaces.scope(resident) + return new Resolved(binding, com.alibaba.qwen.code.managedagent.persistence.ResidentWorkspaces.scope(resident) .withLifecycleAuthority(lifecycle)); } Mount mount = mount(binding); diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeTransport.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeTransport.java similarity index 96% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeTransport.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeTransport.java index 32d33d832c2..6dd3c7e6d9b 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeTransport.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeTransport.java @@ -1,15 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; import com.alibaba.qwen.code.runtimebroker.HarnessOwnership; -import com.alibaba.qwen.code.runtimebroker.HttpRuntimeTransport; import com.alibaba.qwen.code.runtimebroker.JdbcCsiFilesRetirementGuard; -import com.alibaba.qwen.code.runtimebroker.LocalProcessRuntimeProvisioner; -import com.alibaba.qwen.code.runtimebroker.ManagedCsiProtocol; -import com.alibaba.qwen.code.runtimebroker.ManagedHookProtocol; -import com.alibaba.qwen.code.runtimebroker.ManagedMcpProtocol; -import com.alibaba.qwen.code.runtimebroker.ManagedMonitorProtocol; -import com.alibaba.qwen.code.runtimebroker.ManagedShellProtocol; import com.alibaba.qwen.code.runtimebroker.ResidentWorkspaceProfile; import com.alibaba.qwen.code.runtimebroker.RuntimeAttestation; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; @@ -23,9 +16,16 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeSession; import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeTransport; -import com.alibaba.qwen.code.runtimebroker.SshRuntimeProvisioner; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.provisioning.SshRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedCsiProtocol; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedHookProtocol; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedMcpProtocol; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedMonitorProtocol; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedShellProtocol; import java.nio.charset.StandardCharsets; import java.util.LinkedHashMap; @@ -325,7 +325,7 @@ final class WorkspaceRuntimeTransport implements RuntimeTransport { } private static Context requireLocalCapture(Context context) { - if (!java.util.Set.of(LocalProcessRuntimeProvisioner.KIND, com.alibaba.qwen.code.runtimebroker.SshRuntimeProvisioner.KIND) + if (!java.util.Set.of(LocalProcessRuntimeProvisioner.KIND, com.alibaba.qwen.code.runtimebroker.provisioning.SshRuntimeProvisioner.KIND) .contains(context.runtime().getRequest().getProvisionerKind())) { throw WorkspaceExecutionStore.unavailable(); } @@ -357,7 +357,7 @@ final class WorkspaceRuntimeTransport implements RuntimeTransport { Map operation) { if (managed(session)) { Context selected = context(lease, session, false); - if (com.alibaba.qwen.code.runtimebroker.SshRuntimeProvisioner.KIND.equals(selected.runtime().getRequest().getProvisionerKind()) + if (com.alibaba.qwen.code.runtimebroker.provisioning.SshRuntimeProvisioner.KIND.equals(selected.runtime().getRequest().getProvisionerKind()) && !java.util.Set.of("history", "raw-file-history", "workspace-context").contains(operation.get("kind"))) { throw new RuntimeBrokerException(501, "ssh_runtime_control_unsupported", "SSH Runtime supports files and foreground Shell only.", false); diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/BrokerValues.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/BrokerValues.java index 79825c940e5..e9b663c55cc 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/BrokerValues.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/BrokerValues.java @@ -1,6 +1,7 @@ package com.alibaba.qwen.code.runtimebroker; import com.alibaba.fastjson2.JSON; + import java.math.BigDecimal; import java.math.BigInteger; import java.net.URI; @@ -11,7 +12,7 @@ import java.util.List; import java.util.Map; import java.util.regex.Pattern; -final class BrokerValues { +public final class BrokerValues { private static final int MAXIMUM_ID_LENGTH = 512; private static final Pattern PATH_SAFE_ID = Pattern.compile( "[A-Za-z0-9._-]{1," + MAXIMUM_ID_LENGTH + "}"); @@ -25,7 +26,7 @@ final class BrokerValues { private BrokerValues() { } - static String requireId(String value, String name) { + public static String requireId(String value, String name) { if (value == null || value.isEmpty() || value.length() > MAXIMUM_ID_LENGTH || value.indexOf('\0') >= 0) { @@ -56,7 +57,7 @@ final class BrokerValues { * Text without an unpaired surrogate: the JSON writer turns one into * '?', so two identifiers could reach the Runtime as one. */ - static String requireWellFormed(String value, String name) { + public static String requireWellFormed(String value, String name) { if (!isWellFormed(value)) { throw new IllegalArgumentException(name + " must be well-formed text"); @@ -72,7 +73,7 @@ final class BrokerValues { * surrogate. Anything else, such as an array or a set the writer would * also serialize, answers false. */ - static boolean isWellFormedJson(Object value) { + public static boolean isWellFormedJson(Object value) { if (value instanceof String text) { return isWellFormed(text); } @@ -104,7 +105,7 @@ final class BrokerValues { && point <= Character.MAX_SURROGATE); } - static URI requireOrigin(URI value, String name) { + public static URI requireOrigin(URI value, String name) { if (value == null || (!("http".equalsIgnoreCase(value.getScheme())) && !("https".equalsIgnoreCase(value.getScheme()))) @@ -128,7 +129,7 @@ final class BrokerValues { * such as 40e-1, can arrive as a Double and is then rejected too. A * cursor is validated exactly but never narrowed to a long. */ - static BigDecimal exactInteger(Object value) { + public static BigDecimal exactInteger(Object value) { if (value instanceof Integer || value instanceof Long) { return BigDecimal.valueOf(((Number) value).longValue()); } @@ -146,7 +147,7 @@ final class BrokerValues { * The exact long a parsed JSON integer denotes, or null: an * {@link #exactInteger(Object) exact integer} that fits in a long. */ - static Long exactLong(Object value) { + public static Long exactLong(Object value) { BigDecimal integer = exactInteger(value); if (integer == null) { return null; @@ -159,7 +160,7 @@ final class BrokerValues { } } - static Map immutableMap(Map source) { + public static Map immutableMap(Map source) { Map copy = new LinkedHashMap<>(); for (Map.Entry entry : source.entrySet()) { if (!(entry.getKey() instanceof String key)) { @@ -237,7 +238,7 @@ final class BrokerValues { // numeric subtypes by magnitude (a written 1L can read back as Integer). // Identity comparison therefore canonicalizes numbers by value so a // round-tripped payload still matches the caller's own map. - static boolean sameJsonMap(Map first, + public static boolean sameJsonMap(Map first, Map second) { if (first == second) { return true; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/CsiNativeActivationProof.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/CsiNativeActivationProof.java index c016e221839..1f742f120bc 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/CsiNativeActivationProof.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/CsiNativeActivationProof.java @@ -1,5 +1,7 @@ package com.alibaba.qwen.code.runtimebroker; +import com.alibaba.qwen.code.runtimebroker.transport.CsiFileHistoryProtocol; +import com.alibaba.qwen.code.runtimebroker.transport.CsiNativeReadbackProtocol; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.StreamReadConstraints; import com.fasterxml.jackson.core.StreamReadFeature; @@ -8,6 +10,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.node.ObjectNode; + import java.io.ByteArrayOutputStream; import java.io.IOException; import java.math.BigDecimal; @@ -1004,7 +1007,7 @@ public final class CsiNativeActivationProof { false, null, previous.usedIds(), null, previous.batches(), previous.fileHistory(), previous.intents(), previous.receipts(), 0); } - static byte[] utf8(String text) { + public static byte[] utf8(String text) { try { ByteBuffer encoded = StandardCharsets.UTF_8.newEncoder().onMalformedInput(CodingErrorAction.REPORT) .onUnmappableCharacter(CodingErrorAction.REPORT).encode(CharBuffer.wrap(text)); @@ -1734,26 +1737,26 @@ public final class CsiNativeActivationProof { } } - static void closed(JsonNode node, Set fields) { + public static void closed(JsonNode node, Set fields) { object(node); require(node.size() == fields.size()); node.fieldNames().forEachRemaining(field -> require(fields.contains(field))); } - static String text(JsonNode node, String field) { + public static String text(JsonNode node, String field) { JsonNode value = node.get(field); require(value != null && value.isTextual() && !value.textValue().isEmpty() && value.textValue().length() <= 4096); return value.textValue(); } - static long number(JsonNode value) { + public static long number(JsonNode value) { require(value != null && value.isIntegralNumber() && value.canConvertToLong() && value.longValue() >= 0 && value.longValue() <= MAX_SAFE); return value.longValue(); } - static String id(JsonNode node, String field) { + public static String id(JsonNode node, String field) { String value = text(node, field); byte[] utf8 = value.getBytes(StandardCharsets.UTF_8); require(utf8.length <= 512 && new String(utf8, StandardCharsets.UTF_8).equals(value) @@ -1768,7 +1771,7 @@ public final class CsiNativeActivationProof { return value; } - static String canonical(JsonNode node) { + public static String canonical(JsonNode node) { require(node != null); if (node.isObject()) { List fields = new ArrayList<>(); diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ExecutionReconciliation.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ExecutionReconciliation.java index 538eaf559da..e624a60215b 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ExecutionReconciliation.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ExecutionReconciliation.java @@ -26,7 +26,7 @@ public final class ExecutionReconciliation { private final Outcome outcome; private final String runtimeState; - ExecutionReconciliation(ToolExecutionRecord record, Outcome outcome, + public ExecutionReconciliation(ToolExecutionRecord record, Outcome outcome, String runtimeState) { if (record == null || outcome == null) { throw new IllegalArgumentException( diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/HarnessOwnership.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/HarnessOwnership.java index 98fc76e7e89..c1128790f91 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/HarnessOwnership.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/HarnessOwnership.java @@ -1,5 +1,7 @@ package com.alibaba.qwen.code.runtimebroker; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; + /** * Says who owns the Harness fences on a Runtime binding. A Session-isolated * binding belongs to the Harness Session its isolation key names; a diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/InMemoryToolExecutionRepository.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/InMemoryToolExecutionRepository.java index 9ebda88ea97..0e441fc4735 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/InMemoryToolExecutionRepository.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/InMemoryToolExecutionRepository.java @@ -1,12 +1,14 @@ package com.alibaba.qwen.code.runtimebroker; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedHoldFamily; + import java.time.Clock; import java.time.Duration; import java.time.Instant; -import java.util.HashMap; import java.util.Comparator; -import java.util.Map; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.TreeMap; /** Process-local execution ledger for tests and single-node use. */ diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/JdbcCsiExecutionAdmission.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/JdbcCsiExecutionAdmission.java index 967e8373553..f0611ebb75a 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/JdbcCsiExecutionAdmission.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/JdbcCsiExecutionAdmission.java @@ -1,13 +1,11 @@ package com.alibaba.qwen.code.runtimebroker; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; - -import static com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof.canonical; -import static com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof.id; -import static com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof.number; - +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocol; +import com.alibaba.qwen.code.runtimebroker.transport.CsiNativeReadbackProtocol; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; + import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -18,6 +16,10 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import static com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof.canonical; +import static com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof.id; +import static com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof.number; + /** Joins an immutable native grant to the original execution, never to a new head. */ public final class JdbcCsiExecutionAdmission { private static final ObjectMapper JSON = new ObjectMapper(); diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/JdbcRuntimeBindingRepository.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/JdbcRuntimeBindingRepository.java index 4d9431b66cd..fce56be3015 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/JdbcRuntimeBindingRepository.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/JdbcRuntimeBindingRepository.java @@ -1,6 +1,11 @@ package com.alibaba.qwen.code.runtimebroker; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.security.ProtectedSecret; +import com.alibaba.qwen.code.runtimebroker.security.SecretProtector; + +import javax.sql.DataSource; import java.net.URI; import java.nio.charset.StandardCharsets; @@ -20,8 +25,6 @@ import java.util.Set; import java.util.UUID; import java.util.function.Supplier; -import javax.sql.DataSource; - /** JDBC Runtime binding repository coordinated through a shared database. */ public final class JdbcRuntimeBindingRepository implements RuntimeBindingRepository { diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/JdbcToolExecutionRepository.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/JdbcToolExecutionRepository.java index 8e212f07d15..38ba2f5328c 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/JdbcToolExecutionRepository.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/JdbcToolExecutionRepository.java @@ -1,10 +1,12 @@ package com.alibaba.qwen.code.runtimebroker; -import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; - import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONReader; import com.alibaba.fastjson2.JSONWriter; +import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedHoldFamily; + +import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; @@ -17,8 +19,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import javax.sql.DataSource; - /** JDBC ledger for idempotent Tool executions. */ public final class JdbcToolExecutionRepository implements ToolExecutionRepository { diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/JsonCodec.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/JsonCodec.java index a29c42a0ab4..fbb6985968e 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/JsonCodec.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/JsonCodec.java @@ -3,18 +3,19 @@ package com.alibaba.qwen.code.runtimebroker; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONReader; import com.alibaba.fastjson2.JSONWriter; + import java.nio.charset.StandardCharsets; import java.util.Map; -final class JsonCodec { +public final class JsonCodec { private JsonCodec() { } - static byte[] encode(Object value) { + public static byte[] encode(Object value) { return JSON.toJSONBytes(value, JSONWriter.Feature.WriteNulls); } - static Map parseObject(byte[] bytes, String context) { + public static Map parseObject(byte[] bytes, String context) { Object parsed; try { parsed = JSON.parseObject(new String(bytes, StandardCharsets.UTF_8), @@ -32,7 +33,7 @@ final class JsonCodec { return BrokerValues.immutableMap(object); } - static String requiredString(Map object, String field, + public static String requiredString(Map object, String field, String context) { Object value = object.get(field); if (!(value instanceof String)) { diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeAdmission.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeAdmission.java index 2473c403d67..d59f6a1c13f 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeAdmission.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeAdmission.java @@ -1,5 +1,8 @@ package com.alibaba.qwen.code.runtimebroker; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.provisioning.SshRuntimeProvisioner; + /** Checks performed while the parent generation admission lock is held. */ final class RuntimeAdmission { private RuntimeAdmission() { diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeAttestation.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeAttestation.java index ad9ede3585d..f7dbea93f6f 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeAttestation.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeAttestation.java @@ -1,5 +1,7 @@ package com.alibaba.qwen.code.runtimebroker; +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocol; + /** Private Runtime proof returned before a restored endpoint is used. */ public final class RuntimeAttestation { private final String runtimeInstanceId; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeBindingRecord.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeBindingRecord.java index 3ab3a46a646..ba89f883208 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeBindingRecord.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeBindingRecord.java @@ -1,5 +1,7 @@ package com.alibaba.qwen.code.runtimebroker; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; + import java.time.Instant; import java.util.Objects; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerException.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerException.java index bdb141732f5..0de76f4d50b 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerException.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerException.java @@ -19,7 +19,7 @@ public final class RuntimeBrokerException extends RuntimeException { this(statusCode, code, message, retryable, cause, Map.of()); } - RuntimeBrokerException(int statusCode, String code, String message, + public RuntimeBrokerException(int statusCode, String code, String message, boolean retryable, Throwable cause, Map details) { super(message, cause); this.details = Map.copyOf(details); diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerService.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerService.java index f24901201e3..5a71a52296c 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerService.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerService.java @@ -1,11 +1,19 @@ package com.alibaba.qwen.code.runtimebroker; -import java.time.Clock; -import java.time.Duration; -import java.time.Instant; +import com.alibaba.qwen.code.runtimebroker.provisioning.ProviderRuntimeProtocol; +import com.alibaba.qwen.code.runtimebroker.provisioning.SshRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.transport.CsiFileHistoryProtocol; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedHoldFamily; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedHookProtocol; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedMcpProtocol; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedMonitorProtocol; + import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.time.Clock; +import java.time.Duration; +import java.time.Instant; import java.util.ArrayList; import java.util.HexFormat; import java.util.LinkedHashMap; @@ -25,9 +33,9 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.locks.ReentrantLock; import java.util.function.Supplier; /** Repository-backed orchestration for the private Managed Runtime contract. */ @@ -2050,7 +2058,7 @@ public final class RuntimeBrokerService implements AutoCloseable { * through to the worker (issue #13183 saw hundreds of status calls per * execution this way). */ - CompletionStage observeExecution( + public CompletionStage observeExecution( String harnessSessionId, String runtimeSessionId, String executionCallId) { requireOpen(); diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeProvisionRequest.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeProvisionRequest.java index cfda16f6bc2..b34f21403b4 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeProvisionRequest.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeProvisionRequest.java @@ -1,5 +1,7 @@ package com.alibaba.qwen.code.runtimebroker; +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocol; + import java.util.Objects; /** Immutable Runtime placement request including its isolation key. */ diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeProvisionSeed.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeProvisionSeed.java index 33f279e98ec..0bfc6baac0d 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeProvisionSeed.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeProvisionSeed.java @@ -83,7 +83,7 @@ public final class RuntimeProvisionSeed { return token; } - boolean matches(RuntimeLease lease) { + public boolean matches(RuntimeLease lease) { return lease != null && leaseId.equals(lease.getLeaseId()) && epoch == lease.getEpoch() && token.equals(lease.getToken()) diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeResourceHandle.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeResourceHandle.java index ccb3247f665..c29ed11bb83 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeResourceHandle.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeResourceHandle.java @@ -43,11 +43,11 @@ public final class RuntimeResourceHandle { return value; } - String toJson() { + public String toJson() { return json; } - static RuntimeResourceHandle fromJson(String kind, int version, + public static RuntimeResourceHandle fromJson(String kind, int version, String json) { if (json == null || json.isBlank()) { throw new IllegalArgumentException("resource handle is required"); diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ToolExecutionRecord.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ToolExecutionRecord.java index 5901901e06a..3765642da96 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ToolExecutionRecord.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ToolExecutionRecord.java @@ -1,5 +1,7 @@ package com.alibaba.qwen.code.runtimebroker; +import com.alibaba.qwen.code.runtimebroker.provisioning.ProviderRuntimeProtocol; + import java.time.Instant; import java.util.Map; import java.util.Objects; @@ -15,7 +17,7 @@ public final class ToolExecutionRecord { * its dispatch answer was lost: tool v3 and provider references can be * observed and cancelled there, a tool v2 reference cannot. */ - boolean observableAfterLoss() { + public boolean observableAfterLoss() { return Integer.valueOf(3).equals(reference.get("runtimeProtocol")) || ProviderRuntimeProtocol.isReference(reference); } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/WorkspaceCsiRuntimeIdentity.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/WorkspaceCsiRuntimeIdentity.java index 6b9981267f5..6a440ef076d 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/WorkspaceCsiRuntimeIdentity.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/WorkspaceCsiRuntimeIdentity.java @@ -1,8 +1,11 @@ package com.alibaba.qwen.code.runtimebroker; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedCsiFilesProtocol; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedCsiProtocol; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; + import java.net.URI; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/JdbcRuntimeBrokerSchema.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/managedschema/JdbcRuntimeBrokerSchema.java similarity index 73% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/JdbcRuntimeBrokerSchema.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/managedschema/JdbcRuntimeBrokerSchema.java index 11c5149a5d0..af7f35d1fde 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/JdbcRuntimeBrokerSchema.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/managedschema/JdbcRuntimeBrokerSchema.java @@ -1,6 +1,5 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.managedschema; -import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import javax.sql.DataSource; /** Managed Server and standalone Broker consume one versioned fresh-database schema. */ diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/KubernetesCsiLogReader.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesCsiLogReader.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/KubernetesCsiLogReader.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesCsiLogReader.java index 3591b3ce340..275238b833d 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/KubernetesCsiLogReader.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesCsiLogReader.java @@ -1,4 +1,7 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; + +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/KubernetesHttpRuntimeClient.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesHttpRuntimeClient.java similarity index 96% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/KubernetesHttpRuntimeClient.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesHttpRuntimeClient.java index af81fe79f93..f1b549c7470 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/KubernetesHttpRuntimeClient.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesHttpRuntimeClient.java @@ -1,13 +1,21 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; + +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManagerFactory; import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; -import java.nio.charset.StandardCharsets; import java.nio.ByteBuffer; import java.nio.charset.CharacterCodingException; import java.nio.charset.CodingErrorAction; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.security.GeneralSecurityException; @@ -19,8 +27,6 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.TimeUnit; -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManagerFactory; /** Bounded core-v1 API calls with rotating service-account tokens and explicit CA trust. */ public final class KubernetesHttpRuntimeClient implements KubernetesRuntimeClient { @@ -177,13 +183,13 @@ public final class KubernetesHttpRuntimeClient implements KubernetesRuntimeClien }); } - static void dnsLabel(String value) { + public static void dnsLabel(String value) { if (value == null || !value.matches("[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?")) { throw new IllegalArgumentException("Kubernetes name must be a DNS label"); } } - static void dnsSubdomain(String value) { + public static void dnsSubdomain(String value) { if (value == null || value.length() > 253) { throw new IllegalArgumentException("Kubernetes name must be a DNS subdomain"); } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/KubernetesRuntimeClient.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesRuntimeClient.java similarity index 95% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/KubernetesRuntimeClient.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesRuntimeClient.java index 7aebccbfaf7..88f4c5d0d8d 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/KubernetesRuntimeClient.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesRuntimeClient.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; import java.util.Map; import java.util.concurrent.CompletionStage; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/KubernetesRuntimeProvisioner.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesRuntimeProvisioner.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/KubernetesRuntimeProvisioner.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesRuntimeProvisioner.java index 5dedee1127e..f6863c7291e 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/KubernetesRuntimeProvisioner.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesRuntimeProvisioner.java @@ -1,4 +1,17 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; + +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeLease; +import com.alibaba.qwen.code.runtimebroker.RuntimeObservation; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.RuntimeResourceHandle; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; import java.net.InetAddress; import java.net.URI; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/LocalProcessRuntimeProvisioner.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/LocalProcessRuntimeProvisioner.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/LocalProcessRuntimeProvisioner.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/LocalProcessRuntimeProvisioner.java index 9163f7e0a66..0b45e9e89f6 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/LocalProcessRuntimeProvisioner.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/LocalProcessRuntimeProvisioner.java @@ -1,6 +1,24 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; import com.alibaba.fastjson2.JSONObject; +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.CsiFilesRetirementProfile; +import com.alibaba.qwen.code.runtimebroker.HarnessOwnership; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeDrainReceipt; +import com.alibaba.qwen.code.runtimebroker.RuntimeLease; +import com.alibaba.qwen.code.runtimebroker.RuntimeObservation; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.RuntimeRecoveryEvidence; +import com.alibaba.qwen.code.runtimebroker.RuntimeResourceHandle; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/LocalRuntimeStore.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/LocalRuntimeStore.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/LocalRuntimeStore.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/LocalRuntimeStore.java index 0760e8dcb57..a6eb55e8427 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/LocalRuntimeStore.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/LocalRuntimeStore.java @@ -1,4 +1,12 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; + +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.RuntimeResourceHandle; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; import java.io.IOException; import java.net.URI; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/MacOsHostIdentity.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/MacOsHostIdentity.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/MacOsHostIdentity.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/MacOsHostIdentity.java index fadae9c563b..31765529669 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/MacOsHostIdentity.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/MacOsHostIdentity.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; import java.io.IOException; import java.nio.charset.StandardCharsets; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedContextProtocol.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/ManagedContextProtocol.java similarity index 87% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedContextProtocol.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/ManagedContextProtocol.java index 7faa2bcb687..1ef252aa5b4 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedContextProtocol.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/ManagedContextProtocol.java @@ -1,8 +1,14 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONReader; +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; + import java.net.URI; import java.nio.ByteBuffer; import java.nio.charset.CharacterCodingException; @@ -14,10 +20,10 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; /** Closed managed-context/1 records shared with the TypeScript Worker. */ -final class ManagedContextProtocol { - static final String PROTOCOL = "managed-context/1"; - static final String ATTEST_PATH = "/internal/managed-runtime/v3/attest"; - static final String CONTEXT_PATH = "/internal/managed-runtime/v3/context"; +public final class ManagedContextProtocol { + public static final String PROTOCOL = "managed-context/1"; + public static final String ATTEST_PATH = "/internal/managed-runtime/v3/attest"; + public static final String CONTEXT_PATH = "/internal/managed-runtime/v3/context"; private static final long MAX_EPOCH = 9_007_199_254_740_991L; private static final Pattern IDENTIFIER = Pattern.compile( "[A-Za-z0-9._:-]{1,128}"); @@ -35,12 +41,12 @@ final class ManagedContextProtocol { private ManagedContextProtocol() { } - static String storageId(String value) { + public static String storageId(String value) { require(value != null && value.matches("[\\x21-\\x7e]{1,256}")); return value; } - static void validateScope(RuntimeProvisionRequest request) { + public static void validateScope(RuntimeProvisionRequest request) { RuntimeScope scope = request.getScope(); identifier(scope.getTenantId()); identifier(scope.getWorkspaceId()); @@ -49,7 +55,7 @@ final class ManagedContextProtocol { require(scope.getCapabilityDigest().matches("sha256:[0-9a-f]{64}")); } - static Map boot(RuntimeProvisionRequest request, + public static Map boot(RuntimeProvisionRequest request, RuntimeProvisionSeed seed) { require(request != null && request.isManagedContext() && seed != null); RuntimeScope scope = request.getScope(); @@ -74,7 +80,7 @@ final class ManagedContextProtocol { return Map.copyOf(boot); } - static void validateBoot(Map boot) { + public static void validateBoot(Map boot) { require(boot.keySet().equals(BOOT_KEYS) && "boot".equals(boot.get("type")) && exactNumber(boot.get("version"), 2) @@ -113,7 +119,7 @@ final class ManagedContextProtocol { return URI.create(url); } - static Map attestationRequest(Map boot) { + public static Map attestationRequest(Map boot) { Map body = new LinkedHashMap<>(boot); Set.of("type", "version", "token", "runtimeInstanceId", "runtimeIncarnation", "leaseId", "epoch").forEach(body::remove); @@ -121,14 +127,14 @@ final class ManagedContextProtocol { return Map.copyOf(body); } - static Map attestationResponse(Map boot) { + public static Map attestationResponse(Map boot) { Map response = new LinkedHashMap<>(boot); Set.of("type", "version", "token").forEach(response::remove); response.put("protocolVersion", 3); return Map.copyOf(response); } - static Map installation(RuntimeProvisionRequest request, + public static Map installation(RuntimeProvisionRequest request, String operationId, String sessionId, ContextBinding binding) { require(request != null && request.isManagedContext() && binding != null); identifier(operationId); @@ -153,7 +159,7 @@ final class ManagedContextProtocol { "binding", fields, "contextDigest", binding.getContextDigest()); } - static Map receipt(RuntimeProvisionSeed seed, + public static Map receipt(RuntimeProvisionSeed seed, String operationId, String sessionId, ContextBinding binding) { return Map.of("protocolVersion", 3, "managedContext", PROTOCOL, "operationId", operationId, "sessionId", sessionId, @@ -164,7 +170,7 @@ final class ManagedContextProtocol { "workspaceGeneration", Long.toString(binding.getWorkspaceGeneration())); } - static Map parse(byte[] bytes) { + public static Map parse(byte[] bytes) { try { String json = StandardCharsets.UTF_8.newDecoder() .decode(ByteBuffer.wrap(bytes)).toString(); @@ -177,7 +183,7 @@ final class ManagedContextProtocol { } } - static void verify(Map actual, Map expected) { + public static void verify(Map actual, Map expected) { if (!BrokerValues.sameJsonMap(actual, expected)) { throw new RuntimeBrokerException(409, "managed_runtime_identity_conflict", diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ProviderRuntimeProtocol.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/ProviderRuntimeProtocol.java similarity index 93% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ProviderRuntimeProtocol.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/ProviderRuntimeProtocol.java index 9cae9eab615..adddd08f1a9 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ProviderRuntimeProtocol.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/ProviderRuntimeProtocol.java @@ -1,14 +1,17 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; + +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; -import java.util.Map; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.regex.Pattern; /** The prepared-invocation contract, separate from raw Tool v2 references. */ -final class ProviderRuntimeProtocol { - static final String NAME = "managed-runtime-provider/1"; - static final String PATH = "/internal/managed-runtime/provider/v1/control"; +public final class ProviderRuntimeProtocol { + public static final String NAME = "managed-runtime-provider/1"; + public static final String PATH = "/internal/managed-runtime/provider/v1/control"; static final int CONTROL_LIMIT_BYTES = 1024 * 1024; static final int HISTORY_LIMIT_BYTES = 8 * 1024 * 1024; private static final Set IDENTITY_FIELDS = Set.of("sessionId", @@ -37,15 +40,15 @@ final class ProviderRuntimeProtocol { private ProviderRuntimeProtocol() { } - static boolean isReference(Map reference) { + public static boolean isReference(Map reference) { return reference != null && reference.keySet().equals(REFERENCE_FIELDS); } - static void reference(Map reference, String sessionId) { + public static void reference(Map reference, String sessionId) { identity(reference, REFERENCE_FIELDS, sessionId); } - static void control(Map operation, String harnessSessionId, String sessionId) { + public static void control(Map operation, String harnessSessionId, String sessionId) { // The JSON writer would send an unpaired surrogate as '?', so a key or // string of the input could reach the Worker, and run, as another. if (!BrokerValues.isWellFormedJson(operation)) { @@ -178,7 +181,7 @@ final class ProviderRuntimeProtocol { } } - static int limit(String kind) { + public static int limit(String kind) { return HISTORY_KINDS.contains(kind) ? HISTORY_LIMIT_BYTES : CONTROL_LIMIT_BYTES; } @@ -224,7 +227,7 @@ final class ProviderRuntimeProtocol { } } - static Map object(Object value) { + public static Map object(Object value) { if (!(value instanceof Map)) { throw invalid(); } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RoutingRuntimeProvisioner.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/RoutingRuntimeProvisioner.java similarity index 92% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RoutingRuntimeProvisioner.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/RoutingRuntimeProvisioner.java index 452eb24d46c..9a93520a0ce 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RoutingRuntimeProvisioner.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/RoutingRuntimeProvisioner.java @@ -1,4 +1,15 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; + +import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeDrainReceipt; +import com.alibaba.qwen.code.runtimebroker.RuntimeLease; +import com.alibaba.qwen.code.runtimebroker.RuntimeObservation; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.RuntimeResourceHandle; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; import java.util.LinkedHashSet; import java.util.List; @@ -6,9 +17,9 @@ import java.util.Map; import java.util.concurrent.CompletionStage; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import java.util.function.Function; import java.util.function.BiConsumer; import java.util.function.Consumer; +import java.util.function.Function; /** Dispatches saved provider identity without changing placement or lease identity. */ public final class RoutingRuntimeProvisioner implements RuntimeProvisioner { diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/SshConnectionManager.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshConnectionManager.java similarity index 99% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/SshConnectionManager.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshConnectionManager.java index 9fa1cbf5c79..ca08e3c3c70 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/SshConnectionManager.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshConnectionManager.java @@ -1,17 +1,22 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; + +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeLease; import java.io.IOException; -import java.net.InetAddress; import java.net.ConnectException; +import java.net.InetAddress; import java.net.ServerSocket; import java.net.StandardProtocolFamily; import java.net.URI; import java.net.UnixDomainSocketAddress; +import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import java.nio.channels.OverlappingFileLockException; import java.nio.channels.SocketChannel; -import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.LinkOption; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/SshRuntimeNode.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshRuntimeNode.java similarity index 91% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/SshRuntimeNode.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshRuntimeNode.java index 734543a9e9a..5dff8646ac7 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/SshRuntimeNode.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshRuntimeNode.java @@ -1,4 +1,6 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; + +import com.alibaba.qwen.code.runtimebroker.BrokerValues; import java.util.List; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/SshRuntimeProvisioner.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshRuntimeProvisioner.java similarity index 95% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/SshRuntimeProvisioner.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshRuntimeProvisioner.java index 4b27c4ab19b..bc568dcc238 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/SshRuntimeProvisioner.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshRuntimeProvisioner.java @@ -1,4 +1,18 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; + +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeDrainReceipt; +import com.alibaba.qwen.code.runtimebroker.RuntimeLease; +import com.alibaba.qwen.code.runtimebroker.RuntimeObservation; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.RuntimeResourceHandle; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; import java.net.URI; import java.nio.charset.StandardCharsets; @@ -9,12 +23,12 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutorService; -import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/SshRuntimeStorage.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshRuntimeStorage.java similarity index 90% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/SshRuntimeStorage.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshRuntimeStorage.java index 7ce194f511a..e9d6a39fe3e 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/SshRuntimeStorage.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshRuntimeStorage.java @@ -1,4 +1,6 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; + +import com.alibaba.qwen.code.runtimebroker.BrokerValues; import java.util.Map; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/StaticRuntimeProvisioner.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/StaticRuntimeProvisioner.java similarity index 78% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/StaticRuntimeProvisioner.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/StaticRuntimeProvisioner.java index 9c0c8017406..9bbe6e37e79 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/StaticRuntimeProvisioner.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/StaticRuntimeProvisioner.java @@ -1,4 +1,8 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; + +import com.alibaba.qwen.code.runtimebroker.RuntimeLease; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisioner; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/WorkspaceFileProcess.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/WorkspaceFileProcess.java similarity index 91% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/WorkspaceFileProcess.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/WorkspaceFileProcess.java index 933392a2945..b5c9a3c6db6 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/WorkspaceFileProcess.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/provisioning/WorkspaceFileProcess.java @@ -1,4 +1,8 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; + +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import java.time.Duration; import java.util.List; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/AesGcmSecretProtector.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/security/AesGcmSecretProtector.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/AesGcmSecretProtector.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/security/AesGcmSecretProtector.java index b500291db4e..3d2337520c0 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/AesGcmSecretProtector.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/security/AesGcmSecretProtector.java @@ -1,10 +1,16 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.security; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONWriter; +import com.alibaba.qwen.code.runtimebroker.BrokerValues; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.spec.GCMParameterSpec; +import javax.crypto.spec.SecretKeySpec; + import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.security.GeneralSecurityException; @@ -12,10 +18,6 @@ import java.security.SecureRandom; import java.util.Base64; import java.util.LinkedHashMap; import java.util.Map; -import javax.crypto.Cipher; -import javax.crypto.SecretKey; -import javax.crypto.spec.GCMParameterSpec; -import javax.crypto.spec.SecretKeySpec; /** AES-256-GCM protector for Runtime seed credentials. */ public final class AesGcmSecretProtector implements SecretProtector { diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ProtectedSecret.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/security/ProtectedSecret.java similarity index 88% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ProtectedSecret.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/security/ProtectedSecret.java index 4839d800d8e..44bb0441dc9 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ProtectedSecret.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/security/ProtectedSecret.java @@ -1,4 +1,6 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.security; + +import com.alibaba.qwen.code.runtimebroker.BrokerValues; /** Encrypted secret material and the key reference required to open it. */ public final class ProtectedSecret { diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/SecretProtector.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/security/SecretProtector.java similarity index 81% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/SecretProtector.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/security/SecretProtector.java index 0f417dfd42d..ad06349028c 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/SecretProtector.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/security/SecretProtector.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.security; /** Protects Runtime credentials before they enter durable storage. */ public interface SecretProtector { diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/CsiFileHistoryProtocol.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/CsiFileHistoryProtocol.java similarity index 96% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/CsiFileHistoryProtocol.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/CsiFileHistoryProtocol.java index db8b507c58d..03dcc59ed89 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/CsiFileHistoryProtocol.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/CsiFileHistoryProtocol.java @@ -1,14 +1,14 @@ -package com.alibaba.qwen.code.runtimebroker; - -import static com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof.closed; -import static com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof.id; -import static com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof.number; -import static com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof.text; +package com.alibaba.qwen.code.runtimebroker.transport; +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import com.alibaba.qwen.code.runtimebroker.managedworkspace.WorkspaceRelativePath; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; + import java.math.BigInteger; import java.time.Instant; import java.util.HashSet; @@ -16,6 +16,11 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; +import static com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof.closed; +import static com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof.id; +import static com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof.number; +import static com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof.text; + /** Original owner history control, separate from generic provider controls. */ public final class CsiFileHistoryProtocol { public static final String PATH = ManagedCsiFilesProtocol.PREFIX + "/file-history"; @@ -78,7 +83,7 @@ public final class CsiFileHistoryProtocol { return BrokerValues.immutableMap(value); } - static void observation(JsonNode value, String owner) { + public static void observation(JsonNode value, String owner) { closed(value, Set.of("state", "backupDirectory", "retainedBackups")); JsonNode directory = value.path("backupDirectory"); closed(directory, Set.of("volumeDevice", "volumeInode", "directoryDevice", "directoryInode")); diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/CsiNativeReadbackProtocol.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/CsiNativeReadbackProtocol.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/CsiNativeReadbackProtocol.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/CsiNativeReadbackProtocol.java index d6d3a500420..363dfda4569 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/CsiNativeReadbackProtocol.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/CsiNativeReadbackProtocol.java @@ -1,7 +1,14 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.transport; +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.CsiFilesRetirementProfile; +import com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocol; import com.fasterxml.jackson.databind.ObjectMapper; + import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.HashSet; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/HttpRuntimeTransport.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/HttpRuntimeTransport.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/HttpRuntimeTransport.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/HttpRuntimeTransport.java index a2e863d7c97..71762d9b620 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/HttpRuntimeTransport.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/HttpRuntimeTransport.java @@ -1,9 +1,29 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.transport; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONReader; import com.alibaba.fastjson2.JSONWriter; +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.CsiFilesRetirementProfile; +import com.alibaba.qwen.code.runtimebroker.HarnessOwnership; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import com.alibaba.qwen.code.runtimebroker.ResidentWorkspaceProfile; +import com.alibaba.qwen.code.runtimebroker.RuntimeAttestation; +import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeLease; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.RuntimePublicationGrant; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.RuntimeSession; +import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeTransport; +import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocol; +import com.alibaba.qwen.code.runtimebroker.provisioning.ProviderRuntimeProtocol; + import java.math.BigDecimal; import java.net.URI; import java.net.http.HttpClient; @@ -1582,7 +1602,7 @@ public final class HttpRuntimeTransport implements RuntimeTransport { return new RuntimeBrokerException(status, code, message, retryable); } - static final class BoundedBody { + public static final class BoundedBody { private final byte[] bytes; private final boolean overflow; @@ -1591,11 +1611,11 @@ public final class HttpRuntimeTransport implements RuntimeTransport { this.overflow = overflow; } - byte[] bytes() { + public byte[] bytes() { return bytes; } - boolean overflow() { + public boolean overflow() { return overflow; } } @@ -1606,7 +1626,7 @@ public final class HttpRuntimeTransport implements RuntimeTransport { * after the response headers is bounded by the stage deadline * ({@code orTimeout}), not by {@code HttpRequest.timeout}. */ - static final class BoundedBodySubscriber + public static final class BoundedBodySubscriber implements HttpResponse.BodySubscriber { private final int limit; private byte[] bytes; @@ -1615,7 +1635,7 @@ public final class HttpRuntimeTransport implements RuntimeTransport { new CompletableFuture<>(); private Flow.Subscription subscription; - BoundedBodySubscriber(int limit) { + public BoundedBodySubscriber(int limit) { this.limit = limit; this.bytes = new byte[Math.min(limit, 8192)]; } diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiFilesProtocol.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedCsiFilesProtocol.java similarity index 97% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiFilesProtocol.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedCsiFilesProtocol.java index 489d2729422..4f1918e6212 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiFilesProtocol.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedCsiFilesProtocol.java @@ -1,10 +1,16 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.transport; +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.CsiFilesRetirementProfile; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocol; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; + import java.io.IOException; import java.net.InetAddress; import java.net.URI; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiProtocol.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedCsiProtocol.java similarity index 96% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiProtocol.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedCsiProtocol.java index 94151ab2fc8..fce539a41cb 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiProtocol.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedCsiProtocol.java @@ -1,13 +1,22 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.transport; +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.RuntimeLease; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.RuntimeSession; +import com.alibaba.qwen.code.runtimebroker.provisioning.KubernetesHttpRuntimeClient; +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocol; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; + import java.io.IOException; -import java.nio.ByteBuffer; import java.math.BigInteger; +import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedHoldControlProtocol.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedHoldControlProtocol.java similarity index 92% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedHoldControlProtocol.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedHoldControlProtocol.java index 03bb034ebcb..5e1d1cb70fe 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedHoldControlProtocol.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedHoldControlProtocol.java @@ -1,4 +1,10 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.transport; + +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.RuntimeSession; +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocol; import java.util.Map; import java.util.Set; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedHoldFamily.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedHoldFamily.java similarity index 78% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedHoldFamily.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedHoldFamily.java index fc456feddd8..df1bfca0197 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedHoldFamily.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedHoldFamily.java @@ -1,4 +1,6 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.transport; + +import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; /** * The two H3 hold-row families. A hold row is a ledger row admitted beside @@ -9,7 +11,7 @@ package com.alibaba.qwen.code.runtimebroker; * families hold their Runtime Session identically; only the control kinds * differ. */ -enum ManagedHoldFamily { +public enum ManagedHoldFamily { SHELL("background_v3_process", "shell-status", "shell-terminate"), MONITOR("background_v3_monitor", "monitor-status", "monitor-stop"); @@ -24,24 +26,24 @@ enum ManagedHoldFamily { this.stopKind = stopKind; } - String dispatchMode() { + public String dispatchMode() { return dispatchMode; } - String statusKind() { + public String statusKind() { return statusKind; } - String stopKind() { + public String stopKind() { return stopKind; } /** The family a row belongs to, or null for any other dispatch mode. */ - static ManagedHoldFamily of(ToolExecutionRecord row) { + public static ManagedHoldFamily of(ToolExecutionRecord row) { return ofDispatchMode(row.getReference().get("dispatchMode")); } - static ManagedHoldFamily ofDispatchMode(Object dispatchMode) { + public static ManagedHoldFamily ofDispatchMode(Object dispatchMode) { for (ManagedHoldFamily family : values()) { if (family.dispatchMode.equals(dispatchMode)) { return family; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedHookProtocol.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedHookProtocol.java similarity index 90% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedHookProtocol.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedHookProtocol.java index bd2b5bb6be9..f19782959f1 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedHookProtocol.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedHookProtocol.java @@ -1,4 +1,10 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.transport; + +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.RuntimeSession; +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocol; import java.util.Map; import java.util.Set; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedMcpProtocol.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedMcpProtocol.java similarity index 91% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedMcpProtocol.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedMcpProtocol.java index 59468b34ccd..470543e98d2 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedMcpProtocol.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedMcpProtocol.java @@ -1,4 +1,10 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.transport; + +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.RuntimeSession; +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocol; import java.util.Map; import java.util.Set; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedMonitorProtocol.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedMonitorProtocol.java similarity index 93% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedMonitorProtocol.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedMonitorProtocol.java index 0faeb3ee9a6..94ea1096118 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedMonitorProtocol.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedMonitorProtocol.java @@ -1,4 +1,6 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.transport; + +import com.alibaba.qwen.code.runtimebroker.RuntimeSession; import java.util.Map; import java.util.Set; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedShellProtocol.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedShellProtocol.java similarity index 92% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedShellProtocol.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedShellProtocol.java index 53d28e58822..93a4e36de84 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/ManagedShellProtocol.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedShellProtocol.java @@ -1,4 +1,6 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.transport; + +import com.alibaba.qwen.code.runtimebroker.RuntimeSession; import java.util.Map; import java.util.Set; diff --git a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerHttpServer.java b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/RuntimeBrokerHttpServer.java similarity index 98% rename from packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerHttpServer.java rename to packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/RuntimeBrokerHttpServer.java index 592c962ecf7..fe1842fe7c5 100644 --- a/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerHttpServer.java +++ b/packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/runtimebroker/transport/RuntimeBrokerHttpServer.java @@ -1,7 +1,20 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.transport; +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.CsiFilesRetirementProfile; +import com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof; +import com.alibaba.qwen.code.runtimebroker.ExecutionReconciliation; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; +import com.alibaba.qwen.code.runtimebroker.RuntimeLifecycleAuthority; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; +import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; +import com.alibaba.qwen.code.runtimebroker.provisioning.ProviderRuntimeProtocol; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpServer; + import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -11,8 +24,8 @@ import java.net.URI; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; -import java.util.LinkedHashMap; import java.util.Base64; +import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -22,8 +35,8 @@ import java.util.concurrent.CompletionException; import java.util.concurrent.CompletionStage; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.function.Function; import java.util.function.BiFunction; +import java.util.function.Function; /** * Private HTTP face of the merged Runtime Broker for a Hosted Harness. diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ActionJournal.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ActionJournal.java index 00e43989c90..a4c1840a366 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ActionJournal.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ActionJournal.java @@ -1,8 +1,8 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitResource; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitTransactionRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitResource; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitTransactionRequest; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/AliyunToolPublicationObjectStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/AliyunToolPublicationObjectStoreTest.java index 5402843dd94..8e012c6b6fb 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/AliyunToolPublicationObjectStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/AliyunToolPublicationObjectStoreTest.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.AliyunToolPublicationObjectStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationStorageException; +import com.alibaba.qwen.code.managedagent.artifact.AliyunToolPublicationObjectStore; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationStorageException; import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSException; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/AutomationHarnessFake.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/AutomationHarnessFake.java index 09ed37b51cd..e9f187c1357 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/AutomationHarnessFake.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/AutomationHarnessFake.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.daemon.DaemonHttpException; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import org.springframework.jdbc.core.JdbcTemplate; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ChildResultRelayStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ChildResultRelayStoreTest.java index b46f0c7b767..8db85b35e28 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ChildResultRelayStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ChildResultRelayStoreTest.java @@ -1,12 +1,12 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore.PendingChild; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore.RelayRow; -import com.alibaba.qwen.code.managedagent.store.StoreModels; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore.PendingChild; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore.RelayRow; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -109,9 +109,9 @@ class ChildResultRelayStoreTest { assertThatThrownBy(() -> state.insertChildSessionCommand(TENANT, parent, creationKey, "other-digest", "audit", input, null, lineage)) - .isInstanceOf(ApiException.class) + .isInstanceOf(ManagedAgentException.class) .satisfies(error -> assertThat( - ((ApiException) error).getCode()) + ((ManagedAgentException) error).getCode()) .isEqualTo("idempotency_conflict")); assertThat(creationKey).matches("^[0-9a-f]{64}$"); assertThat(jdbc.queryForObject( @@ -145,9 +145,9 @@ class ChildResultRelayStoreTest { assertThatThrownBy(() -> state.insertChildSessionCommand(TENANT, parent, "key-1", "digest", "audit", List.of(), null, new StoreModels.SessionLineage(parent, parent, "run-1", 1))) - .isInstanceOf(ApiException.class) + .isInstanceOf(ManagedAgentException.class) .satisfies(error -> assertThat( - ((ApiException) error).getCode()) + ((ManagedAgentException) error).getCode()) .isEqualTo("child_parent_unavailable")); } @@ -271,8 +271,8 @@ class ChildResultRelayStoreTest { + " delivery_state, gmt_create)" + " VALUES (?, ?, ?, 'workspace', ?, 'child_run', ?," + " 'h', 1, ?, ?, ?, ?, ?, 1)", - com.alibaba.qwen.code.managedagent.store.ManagedSessionStore.sessionScopeKey(TENANT, sessionId), - com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection.recordKey(sessionId, "child_run", recordId), + com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore.sessionScopeKey(TENANT, sessionId), + com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection.recordKey(sessionId, "child_run", recordId), TENANT, sessionId, recordId, "resource-" + recordId, "shell".equals(kind) ? "background_shell" : kind, taskState, @@ -589,7 +589,7 @@ class ChildResultRelayStoreTest { } private void resource(String sessionId, String resourceId, String kind, String body) { - String scope = com.alibaba.qwen.code.managedagent.store.ManagedSessionStore.sessionScopeKey(TENANT, sessionId); + String scope = com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore.sessionScopeKey(TENANT, sessionId); byte[] bytes = body.getBytes(java.nio.charset.StandardCharsets.UTF_8); jdbc.update("INSERT INTO ma_resource (resource_key, session_scope_key, tenant_id, workspace_id, session_id, resource_id, kind, schema_version, byte_length, sha256, storage_kind, inline_bytes, publish_command_id, state, gmt_create) VALUES (?, ?, ?, 'workspace', ?, ?, ?, 1, ?, ?, 'MYSQL_INLINE', ?, 'command', 'REFERENCED', " + ManagedSchemaTime.SQL_NOW + ")", com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys.key(scope, resourceId), scope, TENANT, sessionId, diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/EmbeddedRuntimeBrokerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/EmbeddedRuntimeBrokerTest.java index 56cd6d062b9..693f8ed2fb2 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/EmbeddedRuntimeBrokerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/EmbeddedRuntimeBrokerTest.java @@ -1,9 +1,9 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; import com.alibaba.qwen.code.runtimebroker.InMemoryRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.InMemoryRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.InMemoryToolExecutionRepository; @@ -40,9 +40,9 @@ class EmbeddedRuntimeBrokerTest { // slow-but-healthy runtime is cut mid-wait and never converges. long stepCallTimeoutMillis = EmbeddedRuntimeBroker.LEASE.toMillis() * 2; assertThat(stepCallTimeoutMillis) - .isGreaterThan(com.alibaba.qwen.code.runtimebroker.LocalProcessRuntimeProvisioner.READY_TIMEOUT.toMillis()); + .isGreaterThan(com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner.READY_TIMEOUT.toMillis()); assertThat(stepCallTimeoutMillis) - .isGreaterThan(com.alibaba.qwen.code.runtimebroker.HttpRuntimeTransport.REQUEST_TIMEOUT.toMillis()); + .isGreaterThan(com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport.REQUEST_TIMEOUT.toMillis()); } private static final String SESSION_ID = @@ -551,7 +551,7 @@ class EmbeddedRuntimeBrokerTest { .isInstanceOf(IllegalStateException.class) .hasMessageContaining("need Git"); properties.getRuntimeBroker().setChildWorkspaceGit("git"); - var probe = new com.alibaba.qwen.code.managedagent.service.ChildWorktreeGit("git", + var probe = new com.alibaba.qwen.code.managedagent.workspace.ChildWorktreeGit("git", java.time.Duration.ofSeconds(30)); try { probe.requireSupportedVersion(); @@ -599,7 +599,7 @@ class EmbeddedRuntimeBrokerTest { new InMemoryRuntimeBindingRepository(), new InMemoryRuntimeSessionRepository(), new InMemoryToolExecutionRepository(), - mock(com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore.class)); + mock(com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore.class)); } private static ManagedAgentProperties properties() throws Exception { diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/EventTransportBrokerGate.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/EventTransportBrokerGate.java index ede3a0f3e47..1bb89f02b77 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/EventTransportBrokerGate.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/EventTransportBrokerGate.java @@ -2,20 +2,20 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.config.EventTransportConfiguration; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.event.CommittedEventPublisher; +import com.alibaba.qwen.code.managedagent.event.CompositeCommittedEventPublisher; +import com.alibaba.qwen.code.managedagent.event.EventTransportConsumer; +import com.alibaba.qwen.code.managedagent.event.JournalEventTransport; +import com.alibaba.qwen.code.managedagent.event.ManagedEventEnvelope; +import com.alibaba.qwen.code.managedagent.event.ManagedEventEnvelopes; +import com.alibaba.qwen.code.managedagent.event.MessageMaterializer; +import com.alibaba.qwen.code.managedagent.event.TransportWakeActivator; +import com.alibaba.qwen.code.managedagent.event.TransportWakeActivator.Outcome; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector.AttachedSession; -import com.alibaba.qwen.code.managedagent.service.CompositeCommittedEventPublisher; -import com.alibaba.qwen.code.managedagent.service.EventTransportConsumer; -import com.alibaba.qwen.code.managedagent.service.MessageMaterializer; -import com.alibaba.qwen.code.managedagent.service.SessionEventHub; -import com.alibaba.qwen.code.managedagent.service.TransportWakeActivator; -import com.alibaba.qwen.code.managedagent.service.TransportWakeActivator.Outcome; -import com.alibaba.qwen.code.managedagent.store.CommittedEventPublisher; -import com.alibaba.qwen.code.managedagent.store.JournalEventTransport; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelope; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelopes; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; -import com.alibaba.qwen.code.managedagent.store.TransportConsumerStore; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.persistence.TransportConsumerStore; +import com.alibaba.qwen.code.managedagent.session.SessionEventHub; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/EventTransportMultiNodeGate.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/EventTransportMultiNodeGate.java index cd06613341a..4e36c8a46be 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/EventTransportMultiNodeGate.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/EventTransportMultiNodeGate.java @@ -1,10 +1,10 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.service.EventTransportNodeMain; -import com.alibaba.qwen.code.managedagent.store.IsolatedManagedSchemaMySqlTestDatabase; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelope; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelopes; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.event.EventTransportNodeMain; +import com.alibaba.qwen.code.managedagent.event.ManagedEventEnvelope; +import com.alibaba.qwen.code.managedagent.event.ManagedEventEnvelopes; +import com.alibaba.qwen.code.managedagent.persistence.IsolatedManagedSchemaMySqlTestDatabase; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ExtensionRecordJournal.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ExtensionRecordJournal.java index a2bf6fc181b..99cc5657c76 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ExtensionRecordJournal.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ExtensionRecordJournal.java @@ -1,10 +1,10 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.AcquireWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitReceipt; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitResource; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitTransactionRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.AcquireWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitReceipt; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitResource; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitTransactionRequest; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; 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 8bb98850064..2bd732530b9 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 @@ -1,9 +1,9 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector.SourceEvent; -import com.alibaba.qwen.code.managedagent.service.HarnessEventProjector; -import com.alibaba.qwen.code.managedagent.store.EventIdentity; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ProjectedEvent; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ProjectedEvent; +import com.alibaba.qwen.code.managedagent.persistence.EventIdentity; +import com.alibaba.qwen.code.managedagent.session.HarnessEventProjector; import org.junit.jupiter.api.Test; import java.util.Map; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HookAdmissionHistory.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HookAdmissionHistory.java index 65463a4484b..e34eeb926f6 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HookAdmissionHistory.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HookAdmissionHistory.java @@ -1,8 +1,8 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitResource; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitTransactionRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitResource; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitTransactionRequest; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedAutomationCrashFixtureMain.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedAutomationCrashFixtureMain.java index 450b0e3fc54..373c9174685 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedAutomationCrashFixtureMain.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedAutomationCrashFixtureMain.java @@ -6,9 +6,9 @@ package com.alibaba.qwen.code.managedagent; +import com.alibaba.qwen.code.managedagent.automation.AutomationScanner; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.service.AutomationScanner; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.ObjectMapper; import com.sun.net.httpserver.HttpExchange; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedAutomationFaultGatesIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedAutomationFaultGatesIT.java index 55ffe8acda5..8eb23f71656 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedAutomationFaultGatesIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedAutomationFaultGatesIT.java @@ -418,7 +418,7 @@ class HostedAutomationFaultGatesIT { String session = createSession("claim-crash"); String id = create(session, "FG11C_CLAIM", "0 0 1 1 *", "claim-crash-base"); String key = "claim-crash-run"; - String runId = com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore.automationRunId(id, + String runId = com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore.automationRunId(id, "manual:" + key); Hold hold = storeHold("claim-crash", body -> (runId + ":2").equals(body.path("commandId").asText())); var answer = java.util.concurrent.CompletableFuture.supplyAsync(() -> { @@ -484,7 +484,7 @@ class HostedAutomationFaultGatesIT { ThreadPoolTaskScheduler.class), Duration.ofSeconds(30)); String id = create(session, "FG11C_SETTLED", "* * * * *", "settled-crash-base"); String key = "settled-crash-run"; - String runId = com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore.automationRunId(id, + String runId = com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore.automationRunId(id, "manual:" + key); // Arm the hold before the POST: the Harness kicks the wake pump before answering // fire_run, so revision 3 can otherwise reach the store before the hold exists. @@ -572,7 +572,7 @@ class HostedAutomationFaultGatesIT { String session = createSession("transport"); String id = create(session, "FG11B_TRANSPORT", "0 0 1 1 *", "transport-base"); String key = "transport-run"; - String runId = com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore.automationRunId(id, + String runId = com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore.automationRunId(id, "manual:" + key); storeDrop.set(runId + ":1"); JsonNode run = request("POST", "/v1/agent-automations/" + id + "/runs", null, key, 202); @@ -1235,7 +1235,7 @@ class HostedAutomationFaultGatesIT { jdbc.update("INSERT INTO ma_workspace_access (tenant_id, workspace_id, actor_id, role)" + " VALUES (?, ?, ?, 'OPERATOR')", tenant, "workspace-0", "actor".getBytes(StandardCharsets.UTF_8)); if ("Linux".equals(System.getProperty("os.name"))) { - spring.getBean(com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard.class) + spring.getBean(com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard.class) .register(tenant, "storage-0", UUID.randomUUID().toString()); } } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedAutomationSpringCrashIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedAutomationSpringCrashIT.java index 94208301cf1..229d093a17a 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedAutomationSpringCrashIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedAutomationSpringCrashIT.java @@ -6,7 +6,7 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.IsolatedManagedSchemaMySqlTestDatabase; +import com.alibaba.qwen.code.managedagent.persistence.IsolatedManagedSchemaMySqlTestDatabase; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -113,7 +113,7 @@ class HostedAutomationSpringCrashIT { .startsWith("jdbc:mysql:"); assertThat(System.getProperty("mysql.user")) .as("FG11c slice 2 requires -Dmysql.user").isNotBlank(); - jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate( + jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate( new DriverManagerDataSource(required("mysql.url"), required("mysql.user"), System.getProperty("mysql.password", ""))); @@ -413,7 +413,7 @@ class HostedAutomationSpringCrashIT { assertThat(System.getProperty("mysql.url")) .as("FG11c slice 2 requires -Dmysql.url") .startsWith("jdbc:mysql:"); - jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate( + jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate( new DriverManagerDataSource(required("mysql.url"), required("mysql.user"), System.getProperty("mysql.password", ""))); @@ -485,7 +485,7 @@ class HostedAutomationSpringCrashIT { .as("FG11c slice 2 requires -Dmysql.url") .startsWith("jdbc:mysql:"); String databaseUrl = freshDatabaseUrl(); - jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate( + jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate( new DriverManagerDataSource(databaseUrl, required("mysql.user"), System.getProperty("mysql.password", ""))); @@ -561,7 +561,7 @@ class HostedAutomationSpringCrashIT { .as("FG11c slice 2 requires -Dmysql.url") .startsWith("jdbc:mysql:"); String databaseUrl = freshDatabaseUrl(); - jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate( + jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate( new DriverManagerDataSource(databaseUrl, required("mysql.user"), System.getProperty("mysql.password", ""))); @@ -687,7 +687,7 @@ class HostedAutomationSpringCrashIT { .as("FG11c slice 2 requires -Dmysql.url") .startsWith("jdbc:mysql:"); String databaseUrl = freshDatabaseUrl(); - jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate( + jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate( new DriverManagerDataSource(databaseUrl, required("mysql.user"), System.getProperty("mysql.password", ""))); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedBackgroundPublicationGate.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedBackgroundPublicationGate.java index 92fde61caed..355269c226d 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedBackgroundPublicationGate.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedBackgroundPublicationGate.java @@ -1,10 +1,10 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.managedprobes.ProbeAdvice; import com.alibaba.qwen.managedprobes.PublicationProbeWiring; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedCancellationProbe.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedCancellationProbe.java index 3d81db227f2..3bc1a6faaaa 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedCancellationProbe.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedCancellationProbe.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; import com.alibaba.qwen.code.runtimebroker.RuntimeSession; import com.alibaba.qwen.code.runtimebroker.RuntimeTransport; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedChannelCrashFixtureMain.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedChannelCrashFixtureMain.java index 0d3b7ac6f51..0ad4c26e542 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedChannelCrashFixtureMain.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedChannelCrashFixtureMain.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.service.ManagedChannelService; +import com.alibaba.qwen.code.managedagent.channel.ManagedChannelService; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.ObjectMapper; import com.sun.net.httpserver.HttpExchange; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedChannelFaultGatesIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedChannelFaultGatesIT.java index cb4a78d4f34..45cb0e49136 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedChannelFaultGatesIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedChannelFaultGatesIT.java @@ -1,8 +1,8 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.api.AuthenticatedTenantActor; +import com.alibaba.qwen.code.managedagent.channel.ManagedChannelService; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.service.ManagedChannelService; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedChannelGateSupport.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedChannelGateSupport.java index 9013a0b3235..6ab21c2e26a 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedChannelGateSupport.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedChannelGateSupport.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.jdbc.core.JdbcTemplate; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedChannelProcessCrashIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedChannelProcessCrashIT.java index 1efdfc81893..11f123866fb 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedChannelProcessCrashIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedChannelProcessCrashIT.java @@ -98,7 +98,7 @@ class HostedChannelProcessCrashIT { assertThat(cases).contains(selected); cases = List.of(selected); } - jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(new DriverManagerDataSource( + jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(new DriverManagerDataSource( required("mysql.url"), required("mysql.user"), System.getProperty("mysql.password", ""))); jdbc.setQueryTimeout(10); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedConcurrentTurnBurstMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedConcurrentTurnBurstMySqlIT.java index 97e7a379cd3..abeaec8f23b 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedConcurrentTurnBurstMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedConcurrentTurnBurstMySqlIT.java @@ -5,7 +5,7 @@ import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.service.HarnessCoordinator; +import com.alibaba.qwen.code.managedagent.session.HarnessCoordinator; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; @@ -402,7 +402,7 @@ class HostedConcurrentTurnBurstMySqlIT { DataSource source = new DriverManagerDataSource(mysqlUrl(), System.getProperty("mysql.user", "root"), System.getProperty("mysql.password", "")); - raw = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(source); + raw = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(source); raw.setQueryTimeout(5); thread = new Thread(this::sampleLoop, "issue13333-lock-monitor"); thread.setDaemon(true); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedDurableWorkers.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedDurableWorkers.java index ea261902bd7..72d557f6e42 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedDurableWorkers.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedDurableWorkers.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.runtimebroker.MacOsHostIdentity; +import com.alibaba.qwen.code.runtimebroker.provisioning.MacOsHostIdentity; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.test.util.ReflectionTestUtils; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedEventStreamLivenessIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedEventStreamLivenessIT.java index bcecd27dbbe..a24d6740414 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedEventStreamLivenessIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedEventStreamLivenessIT.java @@ -3,9 +3,9 @@ package com.alibaba.qwen.code.managedagent; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; -import com.alibaba.qwen.code.managedagent.service.HarnessCoordinator; -import com.alibaba.qwen.code.managedagent.store.IsolatedManagedSchemaMySqlTestDatabase; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.IsolatedManagedSchemaMySqlTestDatabase; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.session.HarnessCoordinator; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedExtensionsIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedExtensionsIT.java index c181aea1e69..00306c59325 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedExtensionsIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedExtensionsIT.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedGateTestSupport.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedGateTestSupport.java index 8454197ecf8..e86190a3e96 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedGateTestSupport.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedGateTestSupport.java @@ -7,10 +7,10 @@ import com.alibaba.qwen.code.daemon.HostedHarnessClient; import com.alibaba.qwen.code.daemon.StreamHarnessEvents; import com.alibaba.qwen.code.managedagent.api.AuthenticatedTenantActor; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector.SourceEvent; -import com.alibaba.qwen.code.managedagent.service.HarnessEventProjector; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ProjectedEvent; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ProjectedEvent; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.session.HarnessEventProjector; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.DispatcherType; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedHarnessMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedHarnessMySqlIT.java index c409d926119..5b3c8d02bfe 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedHarnessMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedHarnessMySqlIT.java @@ -105,7 +105,7 @@ class HostedHarnessMySqlIT { timeouts.setProperty("connectTimeout", "5000"); timeouts.setProperty("socketTimeout", "10000"); dataSource.setConnectionProperties(timeouts); - jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource); + jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource); jdbc.setQueryTimeout(10); Map database = jdbc.queryForMap( "SELECT VERSION() AS version, @@version_comment AS engine"); @@ -220,7 +220,7 @@ class HostedHarnessMySqlIT { void lifecycleOperationsCloseThePackagedHarnessSession() throws Exception { Path cli = Path.of(required("qwen.cli.entry")).toAbsolutePath(); assertThat(cli).as("Build and bundle the packaged CLI first").isRegularFile(); - jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(new DriverManagerDataSource(required("mysql.url"), + jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(new DriverManagerDataSource(required("mysql.url"), required("mysql.user"), System.getProperty("mysql.password", ""))); startModel(); startHarness(cli); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedHookCancelFaultGatesIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedHookCancelFaultGatesIT.java index 277a2d21067..931263fda3c 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedHookCancelFaultGatesIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedHookCancelFaultGatesIT.java @@ -2,8 +2,8 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.daemon.HarnessSessionRef; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedHookFaultGatesIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedHookFaultGatesIT.java index e4e64f8416a..d8cea38b5bb 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedHookFaultGatesIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedHookFaultGatesIT.java @@ -2,8 +2,8 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.daemon.HarnessSessionRef; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedHookReplyLossFaultGatesIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedHookReplyLossFaultGatesIT.java index 1a0d6ebd8e8..c770c3c9b95 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedHookReplyLossFaultGatesIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedHookReplyLossFaultGatesIT.java @@ -2,8 +2,8 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.daemon.HarnessSessionRef; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMcpReplyLossIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMcpReplyLossIT.java index 14ba19164b9..8d440d76b44 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMcpReplyLossIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMcpReplyLossIT.java @@ -1,9 +1,9 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMcpRestartFaultGatesIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMcpRestartFaultGatesIT.java index a39e119ecc5..68136c8643d 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMcpRestartFaultGatesIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMcpRestartFaultGatesIT.java @@ -1,11 +1,11 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMcpStoreFaultGatesIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMcpStoreFaultGatesIT.java index 3f038f212bc..ff42805103f 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMcpStoreFaultGatesIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMcpStoreFaultGatesIT.java @@ -1,16 +1,16 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.FaultingExtensionRecordStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedTaskEventStore; -import com.alibaba.qwen.code.managedagent.store.StoreFaultGate; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.persistence.FaultingExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedTaskEventStore; +import com.alibaba.qwen.code.managedagent.persistence.StoreFaultGate; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMcpStreamGapIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMcpStreamGapIT.java index f1155498602..779ded26b0c 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMcpStreamGapIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMcpStreamGapIT.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMonitorRunFaultGatesIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMonitorRunFaultGatesIT.java index 4943ca5ecb2..2cf30834aaa 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMonitorRunFaultGatesIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMonitorRunFaultGatesIT.java @@ -1,10 +1,10 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; -import com.alibaba.qwen.code.managedagent.service.HarnessEventProjector; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.session.HarnessEventProjector; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.JsonNode; @@ -236,7 +236,7 @@ class HostedMonitorRunFaultGatesIT { EmbeddedRuntimeBroker.class); if ("Linux".equals(System.getProperty("os.name"))) { var guard = spring.getBean( - com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard.class); + com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard.class); for (int index = 0; index < cases.size(); index++) { guard.register(tenant, "storage-" + index, UUID.randomUUID().toString()); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMonitorRunProbe.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMonitorRunProbe.java index 63ac12c750f..88c6b2a910c 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMonitorRunProbe.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedMonitorRunProbe.java @@ -1,9 +1,9 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.daemon.HarnessEventStream; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; -import com.alibaba.qwen.code.managedagent.service.HarnessEventProjector; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.session.HarnessEventProjector; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.sun.net.httpserver.HttpServer; @@ -173,7 +173,7 @@ final class HostedMonitorRunProbe implements AutoCloseable { // case), so each later letter polls slower. The record read leads with // the same key. private String scopeKey(String sessionId) { - return com.alibaba.qwen.code.managedagent.store.ManagedSessionStore + return com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore .sessionScopeKey(tenant, sessionId); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedOperatorRecoveryProbe.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedOperatorRecoveryProbe.java index 714168ca2b0..20020c2acd5 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedOperatorRecoveryProbe.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedOperatorRecoveryProbe.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; -import com.alibaba.qwen.code.managedagent.service.WorkspaceRecoveryCommand; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; +import com.alibaba.qwen.code.managedagent.workspace.runtime.WorkspaceRecoveryCommand; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedProcessCrashFixtureMain.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedProcessCrashFixtureMain.java index 3b94c0f5328..aa540e8c6ec 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedProcessCrashFixtureMain.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedProcessCrashFixtureMain.java @@ -1,8 +1,8 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.boot.builder.SpringApplicationBuilder; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedProcessCrashIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedProcessCrashIT.java index 5e26c28ce66..f59e17b8eaf 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedProcessCrashIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedProcessCrashIT.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -58,7 +58,7 @@ class HostedProcessCrashIT { timeouts.setProperty("connectTimeout", "5000"); timeouts.setProperty("socketTimeout", "10000"); source.setConnectionProperties(timeouts); - JdbcTemplate jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(source); + JdbcTemplate jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(source); jdbc.setQueryTimeout(10); var database = jdbc.queryForMap("SELECT VERSION() AS version, @@version_comment AS engine"); try (var connection = source.getConnection()) { @@ -95,7 +95,7 @@ class HostedProcessCrashIT { timeouts.setProperty("connectTimeout", "5000"); timeouts.setProperty("socketTimeout", "10000"); source.setConnectionProperties(timeouts); - JdbcTemplate jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(source); + JdbcTemplate jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(source); jdbc.setQueryTimeout(10); try (var fixture = new CoordinatorRestartFixture(jdbc)) { fixture.run(); @@ -366,7 +366,7 @@ class HostedProcessCrashIT { storageRegistrationProperties.getRuntimeBroker().setWorkspaceMounts(List.of( new com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.RuntimeBroker.WorkspaceMount( tenant, "storage", root.resolve("workspace").toString()))); - new com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard(jdbc, + new com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard(jdbc, new org.springframework.jdbc.datasource.DataSourceTransactionManager(jdbc.getDataSource()), storageRegistrationProperties) .register(tenant, "storage", UUID.randomUUID().toString()); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedProviderControlProbe.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedProviderControlProbe.java index 3db6e6c1971..2aad5cb5fa3 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedProviderControlProbe.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedProviderControlProbe.java @@ -1,8 +1,8 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; -import com.alibaba.qwen.code.runtimebroker.HttpRuntimeTransport; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedPublicWorkspaceIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedPublicWorkspaceIT.java index 76ccb5e5f0b..835baa3dd86 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedPublicWorkspaceIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedPublicWorkspaceIT.java @@ -4,7 +4,7 @@ import com.alibaba.qwen.code.daemon.HarnessSessionRef; import com.alibaba.qwen.code.daemon.HostedHarnessClient; import com.alibaba.qwen.code.managedagent.api.AuthenticatedTenantActor; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -85,7 +85,7 @@ class HostedPublicWorkspaceIT { private boolean durableClose; private boolean resident; private boolean residentRestart; - private com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.Placement retainedPlacement; + private com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.Placement retainedPlacement; private boolean shellLifecycleV2; private Map publicationObjects; private String shellFault; @@ -850,29 +850,29 @@ class HostedPublicWorkspaceIT { residentRestart = reconstruct; var roots = boot(); register("workspace-0", "storage-0"); - var fixture = spring.getBean(com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.class); + var fixture = spring.getBean(com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.class); var bindingRepository = spring.getBean(com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository.class); var runtimeSessions = spring.getBean(com.alibaba.qwen.code.runtimebroker.RuntimeSessionRepository.class); - var state = spring.getBean(com.alibaba.qwen.code.managedagent.store.AgentStateStore.class); + var state = spring.getBean(com.alibaba.qwen.code.managedagent.session.AgentStateStore.class); String first = residentSession("G0_RESIDENT_FIRST", "resident-first"); saveResidentOwnership("after-first-turn"); assertThat(Files.readString(roots.getFirst().resolve("child/proof.txt"))).isEqualTo("after-first-" + tenant); var context = state.requireSession(tenant, first).workspace(); - var residentMapping = new com.alibaba.qwen.code.managedagent.store.ResidentWorkspaces( + var residentMapping = new com.alibaba.qwen.code.managedagent.persistence.ResidentWorkspaces( spring.getBean(com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.class) .getRuntimeBroker().getResidentWorkspaces()); var original = bindingRepository.findActive(residentMapping.request(context)); var oldContexts = runtimeSessions.findByBinding(original.getBindingId(), original.getGeneration(), null, 100); assertThat(oldContexts).isNotEmpty(); assertThat(oldContexts).allSatisfy(row -> assertThat(row.getSession().getHarnessSessionId()).isEqualTo(first)); - JsonNode bindingBefore = com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_runtime_binding WHERE binding_id = ?", original.getBindingId()); - JsonNode slotBefore = com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_runtime_slot WHERE request_key = ?", original.getRequest().requestKey()); - JsonNode storageBefore = com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_storage WHERE alias_key = ?", + JsonNode bindingBefore = com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_runtime_binding WHERE binding_id = ?", original.getBindingId()); + JsonNode slotBefore = com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_runtime_slot WHERE request_key = ?", original.getRequest().requestKey()); + JsonNode storageBefore = com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_storage WHERE alias_key = ?", spring.getBean(com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.class) .getRuntimeBroker().getResidentWorkspaces().getFirst().registration().aliasKey()); var registration = spring.getBean(com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.class) .getRuntimeBroker().getResidentWorkspaces().getFirst().registration(); - var expectedOwner = (com.fasterxml.jackson.databind.node.ObjectNode) com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.snapshot(jdbc, + var expectedOwner = (com.fasterxml.jackson.databind.node.ObjectNode) com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_storage_owner WHERE storage_key = ? AND storage_kind = 'CSI'", registration.physicalKey()).get(0); assertThat(expectedOwner.path("holder_key").isNull()).isTrue(); assertThat(expectedOwner.path("runtime_session_id").isNull()).isTrue(); @@ -889,19 +889,19 @@ class HostedPublicWorkspaceIT { String.class, tenant, first)).isEqualTo("SEALED"); assertThat(runtimeSessions.findByBinding(original.getBindingId(), original.getGeneration(), null, 100)) .allSatisfy(row -> assertThat(row.getState()).isEqualTo(com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord.State.RELEASED)); - assertThat(com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_runtime_binding WHERE binding_id = ?", original.getBindingId())).isEqualTo(bindingBefore); - assertThat(com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_runtime_slot WHERE request_key = ?", original.getRequest().requestKey())).isEqualTo(slotBefore); - assertThat(com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_storage WHERE alias_key = ?", registration.aliasKey())).isEqualTo(storageBefore); - assertThat(com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_storage_owner WHERE storage_key = ? AND storage_kind = 'CSI'", registration.physicalKey()).get(0)).isEqualTo(expectedOwner); + assertThat(com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_runtime_binding WHERE binding_id = ?", original.getBindingId())).isEqualTo(bindingBefore); + assertThat(com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_runtime_slot WHERE request_key = ?", original.getRequest().requestKey())).isEqualTo(slotBefore); + assertThat(com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_storage WHERE alias_key = ?", registration.aliasKey())).isEqualTo(storageBefore); + assertThat(com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_storage_owner WHERE storage_key = ? AND storage_kind = 'CSI'", registration.physicalKey()).get(0)).isEqualTo(expectedOwner); assertThat(bindingRepository.findById(original.getBindingId()).getState()).isEqualTo(com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord.State.READY); assertThat(bindingRepository.findById(original.getBindingId()).isDrainRequested()).isFalse(); assertThat(fixture.workerAlive()).isTrue(); assertThat(fixture.physicalReleases).hasValue(0); assertThat(request("POST", "/v1/agents/sessions/" + first + "/close", null, "resident-close", "actor", 202).path("id").asText()).isEqualTo(operation); - com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.assertConflict(() -> new com.alibaba.qwen.code.runtimebroker.HttpRuntimeTransport() + com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.assertConflict(() -> new com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport() .activateWorkspace(original, oldContexts.getFirst(), context, true).toCompletableFuture().join()); - com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.assertConflict(() -> spring.getBean(EmbeddedRuntimeBroker.class).service() + com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.assertConflict(() -> spring.getBean(EmbeddedRuntimeBroker.class).service() .acquire(first, oldContexts.getFirst().getRuntimeSessionId(), oldContexts.getFirst().getSession().getTurnKind()) .toCompletableFuture().join()); if (reconstruct) { @@ -919,10 +919,10 @@ class HostedPublicWorkspaceIT { assertThat(spring).isNotSameAs(previousApplication); assertThat(spring.getBean(EmbeddedRuntimeBroker.class)).isNotSameAs(previousBroker); assertThat(jdbc.getDataSource()).isNotSameAs(previousSource); - fixture = spring.getBean(com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.class); + fixture = spring.getBean(com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.class); bindingRepository = spring.getBean(com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository.class); runtimeSessions = spring.getBean(com.alibaba.qwen.code.runtimebroker.RuntimeSessionRepository.class); - state = spring.getBean(com.alibaba.qwen.code.managedagent.store.AgentStateStore.class); + state = spring.getBean(com.alibaba.qwen.code.managedagent.session.AgentStateStore.class); assertThat(fixture.workerAlive()).isTrue(); assertThat(fixture.starts).hasValue(1); saveResidentOwnership("after-application-reconstruction"); @@ -942,7 +942,7 @@ class HostedPublicWorkspaceIT { assertThat(fixture.starts).hasValue(1); assertThat(fixture.physicalReleases).hasValue(0); assertThat(fixture.workerAlive()).isTrue(); - JsonNode bindingBeforeSecondClose = com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.snapshot(jdbc, + JsonNode bindingBeforeSecondClose = com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_runtime_binding WHERE binding_id = ?", original.getBindingId()); closeResidentSession(second, "resident-second-close"); saveResidentOwnership("after-second-close"); @@ -952,13 +952,13 @@ class HostedPublicWorkspaceIT { String.class, tenant, second)).isEqualTo("SEALED"); assertThat(runtimeSessions.findByBinding(original.getBindingId(), original.getGeneration(), null, 100)) .allSatisfy(row -> assertThat(row.getState()).isEqualTo(com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord.State.RELEASED)); - assertThat(com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.snapshot(jdbc, + assertThat(com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_runtime_binding WHERE binding_id = ?", original.getBindingId())).isEqualTo(bindingBeforeSecondClose); - assertThat(com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.snapshot(jdbc, + assertThat(com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_runtime_slot WHERE request_key = ?", original.getRequest().requestKey())).isEqualTo(slotBefore); - assertThat(com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.snapshot(jdbc, + assertThat(com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_storage WHERE alias_key = ?", registration.aliasKey())).isEqualTo(storageBefore); - assertThat(com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.snapshot(jdbc, + assertThat(com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.snapshot(jdbc, "SELECT * FROM ma_storage_owner WHERE storage_key = ? AND storage_kind = 'CSI'", registration.physicalKey()).get(0)).isEqualTo(expectedOwner); assertThat(bindingRepository.findById(original.getBindingId()).getState()).isEqualTo(com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord.State.READY); assertThat(bindingRepository.findById(original.getBindingId()).isDrainRequested()).isFalse(); @@ -971,7 +971,7 @@ class HostedPublicWorkspaceIT { private void saveResidentOwnership(String stage) throws IOException { var mapping = spring.getBean(com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.class) .getRuntimeBroker().getResidentWorkspaces().getFirst(); - var reader = new com.alibaba.qwen.code.managedagent.service.ResidentAcceptanceSnapshot(jdbc, + var reader = new com.alibaba.qwen.code.managedagent.session.ResidentAcceptanceSnapshot(jdbc, spring.getBean(org.springframework.transaction.PlatformTransactionManager.class), mapping, json); var snapshot = reader.capture(); assertThat(snapshot.path("tables").path("ma_runtime_binding")).hasSize(1); @@ -1056,7 +1056,7 @@ class HostedPublicWorkspaceIT { } } if (residentRestart) { - retainedPlacement = new com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.Placement( + retainedPlacement = new com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.Placement( List.of(node, cli.toString(), "managed-runtime-worker"), temporary.resolve("broker")); } startSpring(cli, roots, harnessPort, brokerPort); @@ -1434,7 +1434,7 @@ class HostedPublicWorkspaceIT { arguments.add("--qwen.managed-agent.runtime-broker.verified-workspace-recovery-enabled=" + (definitionApproval || "Linux".equals(System.getProperty("os.name")))); if (resident) { - com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.arguments(arguments, tenant, roots.getFirst()); + com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.arguments(arguments, tenant, roots.getFirst()); } for (int i = 0; !resident && i < roots.size(); i++) { String prefix = "--qwen.managed-agent.runtime-broker.workspace-mounts[" + i + "]."; @@ -1446,7 +1446,7 @@ class HostedPublicWorkspaceIT { .initializers(context -> { context.getBeanFactory().registerSingleton("g0Authentication", authentication()); if (resident) { - com.alibaba.qwen.code.managedagent.service.ResidentHostedRuntimeFixture.install(context, + com.alibaba.qwen.code.managedagent.workspace.runtime.ResidentHostedRuntimeFixture.install(context, List.of(node, cli.toString(), "managed-runtime-worker"), temporary.resolve("broker"), retainedPlacement); } @@ -1459,7 +1459,7 @@ class HostedPublicWorkspaceIT { .run(arguments.toArray(String[]::new)); jdbc = spring.getBean(JdbcTemplate.class); if (definitionApproval || "Linux".equals(System.getProperty("os.name"))) { - var guard = spring.getBean(com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard.class); + var guard = spring.getBean(com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard.class); for (int index = 0; index < roots.size(); index++) { guard.register(tenant, "storage-" + index, UUID.randomUUID().toString()); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedRecoveryWedgeGate.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedRecoveryWedgeGate.java index 08e661b677f..99c81328a14 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedRecoveryWedgeGate.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedRecoveryWedgeGate.java @@ -1,10 +1,10 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.managedprobes.PublicationProbeWiring; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedSessionRelayFaultGatesIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedSessionRelayFaultGatesIT.java index 48d02970ec2..1891d0723bc 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedSessionRelayFaultGatesIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedSessionRelayFaultGatesIT.java @@ -6,10 +6,10 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.api.AuthenticatedTenantActor; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedShellLifecycleRecoveryIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedShellLifecycleRecoveryIT.java index 85d86cb235e..bd3638ab687 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedShellLifecycleRecoveryIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedShellLifecycleRecoveryIT.java @@ -1,11 +1,11 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.sun.net.httpserver.HttpExchange; @@ -113,7 +113,7 @@ class HostedShellLifecycleRecoveryIT { Files.createDirectory(root.resolve("objects")); var source = new DriverManagerDataSource(required("mysql.url"), required("mysql.user"), System.getProperty("mysql.password", "")); - jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(source); + jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(source); jdbc.setQueryTimeout(10); bindings = new JdbcRuntimeBindingRepository(source, new AesGcmSecretProtector("l4-fixture", new byte[32])); } @@ -126,7 +126,7 @@ class HostedShellLifecycleRecoveryIT { storageRegistrationProperties.getRuntimeBroker().setWorkspaceMounts(List.of( new com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.RuntimeBroker.WorkspaceMount( tenant, "storage", root.resolve("workspace").toString()))); - new com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard(jdbc, + new com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard(jdbc, new org.springframework.jdbc.datasource.DataSourceTransactionManager(jdbc.getDataSource()), storageRegistrationProperties) .register(tenant, "storage", UUID.randomUUID().toString()); jdbc.update("INSERT INTO ma_workspace (tenant_id, workspace_id, workspace_generation, storage_id," diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedShellOutputProbe.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedShellOutputProbe.java index 9f8a0a42b44..e6d46a28a89 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedShellOutputProbe.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedShellOutputProbe.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import com.fasterxml.jackson.databind.JsonNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedSseGapProbe.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedSseGapProbe.java index 82acf01fdd0..047c58ea085 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedSseGapProbe.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedSseGapProbe.java @@ -1,8 +1,8 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; -import com.alibaba.qwen.code.managedagent.service.HarnessEventProjector; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.session.HarnessEventProjector; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedTeamLeadMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedTeamLeadMySqlIT.java index 9084a7726aa..59a5b17a773 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedTeamLeadMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedTeamLeadMySqlIT.java @@ -1,8 +1,8 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.api.AuthenticatedTenantActor; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -847,7 +847,7 @@ class HostedTeamLeadMySqlIT { .run(arguments.toArray(String[]::new)); jdbc = spring.getBean(JdbcTemplate.class); if ("Linux".equals(System.getProperty("os.name"))) { - spring.getBean(com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard.class) + spring.getBean(com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard.class) .register(tenant, "storage-0", UUID.randomUUID().toString()); } } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedTeamMemberCommandMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedTeamMemberCommandMySqlIT.java index 0603018136e..36e502ec62c 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedTeamMemberCommandMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedTeamMemberCommandMySqlIT.java @@ -6,8 +6,8 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.api.AuthenticatedTenantActor; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedWorkflowFaultGatesIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedWorkflowFaultGatesIT.java index 25ce1e624fd..7495640d4db 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedWorkflowFaultGatesIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedWorkflowFaultGatesIT.java @@ -1,9 +1,9 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; -import com.alibaba.qwen.code.managedagent.service.ChildResultRelay; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.workspace.ChildResultRelay; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -178,7 +178,7 @@ class HostedWorkflowFaultGatesIT { EmbeddedRuntimeBroker.class); if ("Linux".equals(System.getProperty("os.name"))) { var guard = spring.getBean( - com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard.class); + com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard.class); for (int index = 0; index < cases.size(); index++) { guard.register(tenant, "storage-" + index, UUID.randomUUID().toString()); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedWorkflowProbe.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedWorkflowProbe.java index 3dc3881e785..a52e97dcb58 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedWorkflowProbe.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedWorkflowProbe.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.service.ChildResultRelay; +import com.alibaba.qwen.code.managedagent.workspace.ChildResultRelay; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedWorkflowRelayFaultGatesIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedWorkflowRelayFaultGatesIT.java index 295acbeb7c1..73c43280e26 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedWorkflowRelayFaultGatesIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedWorkflowRelayFaultGatesIT.java @@ -6,11 +6,11 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.api.AuthenticatedTenantActor; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedWorkspaceToolTurnIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedWorkspaceToolTurnIT.java index 9052c12c614..c6da2942272 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedWorkspaceToolTurnIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/HostedWorkspaceToolTurnIT.java @@ -1,11 +1,11 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; -import com.alibaba.qwen.code.managedagent.service.HarnessEventProjector; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard; +import com.alibaba.qwen.code.managedagent.session.HarnessEventProjector; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; import com.alibaba.qwen.code.runtimebroker.RuntimeSession; import com.alibaba.qwen.code.runtimebroker.RuntimeTransport; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/Issue13180HardenedVerificationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/Issue13180HardenedVerificationTest.java index 7ea0ce0ea73..ebaa4e4574f 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/Issue13180HardenedVerificationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/Issue13180HardenedVerificationTest.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.WriterCredentialPolicy; +import com.alibaba.qwen.code.managedagent.security.WriterCredentialPolicy; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; @@ -219,7 +219,7 @@ class Issue13180HardenedVerificationTest { "INSERT INTO ma_session_record (record_kind, session_scope_key, record_key, tenant_id, session_id," + " action_id, record_id, action_version, domain, revision, state, options_json, gmt_create)" + " VALUES ('ACTION', ?, ?, ?, ?, ?, ?, 1, 'approval', 1, 'requested', ?, ?)", - com.alibaba.qwen.code.managedagent.store.ManagedSessionStore.sessionScopeKey(tenant, session), + com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore.sessionScopeKey(tenant, session), com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys.key(tenant, session, actionId), tenant, session, actionId, actionId, "{\"v\":1,\"requestId\":\"" + actionId + "\"," + "\"turnId\":\"turn-verify\"," diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/Issue13180InternalPortTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/Issue13180InternalPortTest.java index d0f7aa1b5d3..abdd68aa315 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/Issue13180InternalPortTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/Issue13180InternalPortTest.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.WriterCredentialPolicy; +import com.alibaba.qwen.code.managedagent.security.WriterCredentialPolicy; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/JournalEventPublicationPointTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/JournalEventPublicationPointTest.java index 17953592de6..de21d880a90 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/JournalEventPublicationPointTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/JournalEventPublicationPointTest.java @@ -1,8 +1,8 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; -import com.alibaba.qwen.code.managedagent.store.JournalEventTransport; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.event.JournalEventTransport; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedActionsTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedActionsTest.java index e58136c18d1..d4265dddd4c 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedActionsTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedActionsTest.java @@ -3,26 +3,26 @@ package com.alibaba.qwen.code.managedagent; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; -import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.api.AuthenticatedTenantActor; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; import com.alibaba.qwen.code.managedagent.harness.UnavailableHarnessConnector; -import com.alibaba.qwen.code.managedagent.service.ActionResponseCoordinator; -import com.alibaba.qwen.code.managedagent.service.ManagedActionService; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ManagedActionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitTransactionRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.persistence.ManagedActionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitTransactionRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.session.ActionResponseCoordinator; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.session.ManagedActionService; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -115,7 +115,7 @@ class ManagedActionsTest { static class Configuration { @Bean @Primary ManagedAgentStore actionStore(JdbcTemplate jdbc, ObjectMapper mapper, ManagedWorkspaceRegistry registry, - Clock clock, com.alibaba.qwen.code.managedagent.store.CommittedEventPublisher publisher) { + Clock clock, com.alibaba.qwen.code.managedagent.event.CommittedEventPublisher publisher) { var properties = new ManagedAgentProperties(); properties.getHarness().setWorkspaceFilesEnabled(true); return new ManagedAgentStore(jdbc, mapper, clock, publisher, registry, properties); @@ -276,7 +276,7 @@ class ManagedActionsTest { local.options.put("v", 2); local.options.set("inputRef", foreign.options.path("inputRef").deepCopy()); assertThatThrownBy(() -> local.change("requested", null)) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()) + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("managed_session_resource_missing")); assertThat(actions.find(tenant, session, local.id)).isEmpty(); ActionJournal committed = new ActionJournal(local, 100, 1000) @@ -369,7 +369,7 @@ class ManagedActionsTest { } } assertThatThrownBy(() -> journal.change("requested", null), "invalid inputRef (%s)", fault) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()) + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("danglingRef".equals(fault) ? "managed_session_resource_missing" : "managed_session_action_rejected")); assertThat(actions.find(tenant, session, journal.id)).isEmpty(); @@ -484,7 +484,7 @@ class ManagedActionsTest { "extension-writer-token-0123456789", invalid)) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo(expected)); assertThat(actions.find(tenant, session, action.id)).isEmpty(); } @@ -511,7 +511,7 @@ class ManagedActionsTest { .put("policyRevision", "hosted-tool-approval/2"))) { assertThatThrownBy(() -> journal.change("decided", response)) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("managed_session_action_rejected")); 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 e76011f3556..0da88deb9a5 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 @@ -3,69 +3,69 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.ManagedAgentServerIntegrationTest.FixtureHarness; import com.alibaba.qwen.code.managedagent.OpenApiContract.Operation; import com.alibaba.qwen.code.managedagent.api.ApiExceptionHandler; -import com.alibaba.qwen.code.managedagent.api.ApiModels; -import com.alibaba.qwen.code.managedagent.api.ApiModels.ChangeCwdRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.CommandAdmission; -import com.alibaba.qwen.code.managedagent.api.ApiModels.CreateSessionRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.InputBlock; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicCommandOperation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicContentPart; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicCwdOperation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicEvent; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicItem; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicItemList; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicList; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicSession; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicTask; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicTaskEvent; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicTurn; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicWorkspace; -import com.alibaba.qwen.code.managedagent.api.ApiModels.SessionCapabilities; -import com.alibaba.qwen.code.managedagent.api.ApiModels.SessionEventRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.SessionResyncRequired; -import com.alibaba.qwen.code.managedagent.api.ApiModels.UpdateSessionRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellAdmission; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellCancelRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellChangeCwdRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellCommandOperation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellContentPart; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellCreateRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellCwdOperation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellEvent; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellItem; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellLifecycleRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellListRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellOperationRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellPage; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellResyncRequired; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSession; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSessionCapabilities; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSessionRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellStreamRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellSubmitRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTask; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTaskEvent; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTaskEventQueryRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTaskGetRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTaskQueryRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTranscript; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTranscriptRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellTurn; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellWorkspace; import com.alibaba.qwen.code.managedagent.api.AuthenticatedTenantActor; 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; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; -import com.alibaba.qwen.code.managedagent.store.ManagedTaskEventStore; -import com.alibaba.qwen.code.managedagent.store.SshWorkspaceStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.TurnSummary; +import com.alibaba.qwen.code.managedagent.model.ApiModels; +import com.alibaba.qwen.code.managedagent.model.ApiModels.ChangeCwdRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.CommandAdmission; +import com.alibaba.qwen.code.managedagent.model.ApiModels.CreateSessionRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.InputBlock; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicCommandOperation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicContentPart; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicCwdOperation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicEvent; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicItem; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicItemList; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicList; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicSession; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicTask; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicTaskEvent; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicTurn; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicWorkspace; +import com.alibaba.qwen.code.managedagent.model.ApiModels.SessionCapabilities; +import com.alibaba.qwen.code.managedagent.model.ApiModels.SessionEventRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.SessionResyncRequired; +import com.alibaba.qwen.code.managedagent.model.ApiModels.UpdateSessionRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellAdmission; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellCancelRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellChangeCwdRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellCommandOperation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellContentPart; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellCreateRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellCwdOperation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellEvent; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellItem; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellLifecycleRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellListRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellOperationRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellPage; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellResyncRequired; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSession; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSessionCapabilities; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSessionRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellStreamRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellSubmitRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTask; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTaskEvent; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTaskEventQueryRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTaskGetRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTaskQueryRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTranscript; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTranscriptRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellTurn; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellWorkspace; +import com.alibaba.qwen.code.managedagent.model.StoreModels.TurnSummary; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ManagedTaskEventStore; +import com.alibaba.qwen.code.managedagent.persistence.SshWorkspaceStore; +import com.alibaba.qwen.code.managedagent.session.SessionRenameCoordinator; +import com.alibaba.qwen.code.managedagent.workspace.SshWorkspaceService; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -325,7 +325,7 @@ class ManagedAgentApiContractTest { // D7-3: present only where the deployment enables the java_durable // admission profile (JavaDurableAdmissionContractTest). @Autowired(required = false) - private com.alibaba.qwen.code.managedagent.service.JavaDurableAdmission + private com.alibaba.qwen.code.managedagent.session.JavaDurableAdmission javaDurableAdmission; @Autowired @@ -360,7 +360,7 @@ class ManagedAgentApiContractTest { jdbc.update("INSERT INTO ma_workspace_access (tenant_id, workspace_id, actor_id, role)" + " VALUES (?, 'workspace', ?, 'OPERATOR')", tenant, actor.actorId().getBytes(StandardCharsets.UTF_8)); new JdbcRuntimeBindingRepository(jdbc.getDataSource(), - new com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector("fixture", new byte[32])) + new com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector("fixture", new byte[32])) .requestStorageFence(tenant, "storage", UUID.randomUUID().toString()); assertThat(CONTRACT.node("/components/schemas/ErrorEnvelope/properties/error/properties/retryable/type").asText()) .isEqualTo("boolean"); @@ -462,7 +462,7 @@ class ManagedAgentApiContractTest { || pattern.startsWith("/error")) { continue; } - if (!com.alibaba.qwen.code.managedagent.api.PublicSurface + if (!com.alibaba.qwen.code.managedagent.security.PublicSurface .covers(pattern)) { uncovered.add(pattern); } @@ -1861,8 +1861,7 @@ class ManagedAgentApiContractTest { /** A committed record body for a synthetic child_run row. */ private void childRunResource(String tenant, String sessionId, String resourceId, String json) { - String scope = com.alibaba.qwen.code.managedagent.store - .ManagedSessionStore.sessionScopeKey(tenant, sessionId); + String scope = com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore.sessionScopeKey(tenant, sessionId); byte[] body = json.getBytes(StandardCharsets.UTF_8); jdbc.update("INSERT INTO ma_resource (resource_key," + " session_scope_key, tenant_id, workspace_id, session_id," @@ -1900,7 +1899,7 @@ class ManagedAgentApiContractTest { + " ?, 'child_run', 'run-contract', ?, 1," + " 'resource-run-contract', 'child_agent', 'running'," + " 'ready', 'session', 'planned', 1, 2)", - com.alibaba.qwen.code.managedagent.store.ManagedSessionStore + com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore .sessionScopeKey(tenant, sessionId), recordKey, tenant, sessionId, "d".repeat(64)); // #13746 F2: the run's committed record names its child Session, @@ -2024,7 +2023,7 @@ class ManagedAgentApiContractTest { // and its view advertises the action. String workflowKey = "e".repeat(64); jdbc.update("INSERT INTO ma_session_record (session_scope_key, record_key, tenant_id, workspace_id, session_id, domain, record_id, operation_hash, revision, record_resource_id, task_kind, task_state, runtime_state, delivery_target, delivery_state, gmt_create, started_at) VALUES (?, ?, ?, 'workspace-contract', ?, 'child_run', 'run-contract-wf', ?, 1, 'resource-run-contract-wf', 'workflow', 'running', 'ready', 'session', 'planned', 1, 2)", - com.alibaba.qwen.code.managedagent.store.ManagedSessionStore + com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore .sessionScopeKey(tenant, sessionId), workflowKey, tenant, sessionId, "f".repeat(64)); childRunResource(tenant, sessionId, "resource-run-contract-wf", @@ -2082,7 +2081,7 @@ class ManagedAgentApiContractTest { + " AND operation_kind = 'TASK_CANCEL'" + " AND state IN ('PENDING', 'RUNNING')", tenant, sessionId); jdbc.update("INSERT INTO ma_session_record (session_scope_key, record_key, tenant_id, workspace_id, session_id, domain, record_id, operation_hash, revision, record_resource_id, task_kind, task_state, runtime_state, delivery_target, delivery_state, gmt_create, started_at) VALUES (?, ?, ?, 'workspace-contract', ?, 'automation_run', 'arun-contract', ?, 2, 'resource-automation-contract', 'automation_run', 'running', 'ready', 'session', 'planned', 1, 2)", - com.alibaba.qwen.code.managedagent.store.ManagedSessionStore + com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore .sessionScopeKey(tenant, sessionId), automationKey, tenant, sessionId, "2".repeat(64)); childRunResource(tenant, sessionId, "resource-automation-contract", @@ -2422,13 +2421,13 @@ class ManagedAgentApiContractTest { + " 1, 'connected', 'channel-reader', 'ws-channel'," + " '.', '{}', 1000, 1000)", channelTenant); String sessionId = UUID.randomUUID().toString(); - var routeRepository = new com.alibaba.qwen.code.managedagent.store.JdbcChannelRouteRepository(jdbc); - routeRepository.findOrCreate(new com.alibaba.qwen.code.managedagent.store.ChannelRouteRepository.ChannelRoute( + var routeRepository = new com.alibaba.qwen.code.managedagent.persistence.JdbcChannelRouteRepository(jdbc); + routeRepository.findOrCreate(new com.alibaba.qwen.code.managedagent.persistence.ChannelRouteRepository.ChannelRoute( channelTenant, "a".repeat(64), "mail-1", 1, "1700:42", 1, sessionId, "alice@example.com", "alice@example.com", "thread-1", "admitted", "chin-" + "a".repeat(64), List.of("sha256:" + "b".repeat(64)), 1000, 1000)); - var deliveryRepository = new com.alibaba.qwen.code.managedagent.store.JdbcChannelDeliveryRepository(jdbc); - deliveryRepository.findOrCreate(new com.alibaba.qwen.code.managedagent.store.ChannelDeliveryRepository.ChannelDelivery( + var deliveryRepository = new com.alibaba.qwen.code.managedagent.persistence.JdbcChannelDeliveryRepository(jdbc); + deliveryRepository.findOrCreate(new com.alibaba.qwen.code.managedagent.persistence.ChannelDeliveryRepository.ChannelDelivery( channelTenant, "mail-1", "delivery-1", "delivery-1:0", 0, "planned", null, 1000, 1000)); deliveryRepository.transition(channelTenant, "mail-1", "delivery-1", "planned", "sending", null); deliveryRepository.transition(channelTenant, "mail-1", "delivery-1", "sending", "delivered", ""); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentDefinitionAdmissionTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentDefinitionAdmissionTest.java index ba1c97337ba..2630ee38241 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentDefinitionAdmissionTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentDefinitionAdmissionTest.java @@ -1,17 +1,17 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.InputBlock; import com.alibaba.qwen.code.managedagent.api.AuthenticatedTenantActor; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.UnavailableHarnessConnector; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentService; -import com.alibaba.qwen.code.managedagent.service.RequestDigests; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.model.ApiModels.InputBlock; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -169,12 +169,12 @@ class ManagedAgentDefinitionAdmissionTest { assertThatThrownBy(() -> transaction.execute(status -> disabled.insertWorkspaceSessionCommand( tenant, "actor", "fresh", "fresh-digest", agentId, null, null, input, "payload-digest", workspace))) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_unavailable")); assertThatThrownBy(() -> transaction.execute(status -> disabled.insertTurnCommand( tenant, "SUBMIT_TURN", "later", "later-digest", empty.sessionId(), input, "payload-digest"))) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_unavailable")); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_session WHERE tenant_id = ?", Integer.class, tenant)).isEqualTo(2); @@ -421,7 +421,7 @@ class ManagedAgentDefinitionAdmissionTest { // The dispatch is refused only by the unavailable Harness. assertThatThrownBy(() -> service.submitTurn(tenant, "actor", "later", sessionId, List.of(new InputBlock("text", "go")))) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isNotEqualTo("workspace_unavailable")); } @@ -466,10 +466,10 @@ class ManagedAgentDefinitionAdmissionTest { + "\",\"input\":[]}")) .andExpect(status().isAccepted()).andReturn().getResponse().getContentAsString()); var session = store.requireSession(tenant, receipt.get("id").asText()); - var definitions = new com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore(jdbc, new RequestDigests()); + var definitions = new com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore(jdbc, new RequestDigests()); assertThat(definitions.pinnedContent(session).get("instructions")) .isEqualTo("Review in Chinese."); - var resources = new com.alibaba.qwen.code.managedagent.store.ManagedSessionStore(jdbc); + var resources = new com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore(jdbc); var first = resources.publishAgentInstructions(tenant, "workspace", session.sessionId(), "Review in Chinese."); assertThat(resources.publishAgentInstructions(tenant, "workspace", session.sessionId(), @@ -482,7 +482,7 @@ class ManagedAgentDefinitionAdmissionTest { jdbc.update("UPDATE ma_session SET agent_definition_digest = ?" + " WHERE tenant_id = ? AND session_id = ?", "0".repeat(64), tenant, session.sessionId()); assertThatThrownBy(() -> definitions.pinnedContent(store.requireSession(tenant, session.sessionId()))) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); } @Test diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentDefinitionTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentDefinitionTest.java index 36937066e09..38b33142339 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentDefinitionTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentDefinitionTest.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; -import com.alibaba.qwen.code.managedagent.service.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -60,7 +60,7 @@ class ManagedAgentDefinitionTest { private JdbcTemplate jdbc; @Autowired - private com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore definitions; + private com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore definitions; @Autowired private org.springframework.transaction.PlatformTransactionManager transactionManager; @@ -300,8 +300,8 @@ class ManagedAgentDefinitionTest { String tenant = tenant(); String agentId = json(create(tenant, "for-update", DEFINITION) .andExpect(status().isAccepted())).path("id").asText(); - com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore store = - new com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore( + com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore store = + new com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore( new org.springframework.jdbc.core.JdbcTemplate( jdbc.getDataSource()), new RequestDigests()); org.springframework.transaction.support.TransactionTemplate template = diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentMySqlIT.java index 059abc4074a..5dcabc8d5df 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentMySqlIT.java @@ -1,32 +1,32 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.AgentDefinitionRequest; +import com.alibaba.qwen.code.managedagent.catalog.ManagedAgentDefinitionService; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentDefinitionService; -import com.alibaba.qwen.code.managedagent.service.RequestDigests; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection.TaskProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore.TaskRow; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.AcquireWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitReceipt; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitResource; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitTransactionRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.RenewWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.SealWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.WriterGrant; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.Admission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ReplayWindow; -import com.alibaba.qwen.code.managedagent.store.StoreModels.TurnPage; -import com.alibaba.qwen.code.managedagent.store.StoreModels.TurnSummary; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.ApiModels.AgentDefinitionRequest; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels.Admission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ReplayWindow; +import com.alibaba.qwen.code.managedagent.model.StoreModels.TurnPage; +import com.alibaba.qwen.code.managedagent.model.StoreModels.TurnSummary; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection.TaskProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore.TaskRow; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.AcquireWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitReceipt; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitResource; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitTransactionRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.RenewWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.SealWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.WriterGrant; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; import com.alibaba.qwen.code.runtimebroker.JdbcRepositoryContract; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; import com.fasterxml.jackson.databind.JsonNode; @@ -72,7 +72,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; @TestMethodOrder(MethodOrderer.OrderAnnotation.class) class ManagedAgentMySqlIT { - private com.alibaba.qwen.code.managedagent.store.IsolatedManagedSchemaMySqlTestDatabase + private com.alibaba.qwen.code.managedagent.persistence.IsolatedManagedSchemaMySqlTestDatabase database; private String originalUrl; @@ -80,8 +80,7 @@ class ManagedAgentMySqlIT { void isolateDatabase() { originalUrl = System.getProperty("mysql.url"); database = - new com.alibaba.qwen.code.managedagent.store - .IsolatedManagedSchemaMySqlTestDatabase(); + new com.alibaba.qwen.code.managedagent.persistence.IsolatedManagedSchemaMySqlTestDatabase(); System.setProperty("mysql.url", ((DriverManagerDataSource) database.source()).getUrl()); } @@ -117,7 +116,7 @@ class ManagedAgentMySqlIT { .load() .migrate(); JdbcTemplate jdbc = - new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource); + new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource); String runId = UUID.randomUUID().toString().substring(0, 8); ManagedAgentStore store = new ManagedAgentStore( @@ -150,10 +149,9 @@ class ManagedAgentMySqlIT { null, List.of(), null, - new com.alibaba.qwen.code.managedagent.api - .WorkspaceSelection("ws-a", "."))) + new com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection("ws-a", "."))) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("idempotency_conflict")); String tenant = "mysql-projection-" + runId; List> input = List.of(Map.of("type", "text", "text", "hello")); @@ -273,7 +271,7 @@ class ManagedAgentMySqlIT { new AcquireWriterRequest( workspaceId, "writer-b", 60_000L)))) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("managed_session_writer_conflict")); @@ -349,7 +347,7 @@ class ManagedAgentMySqlIT { sessionId, tokenA))) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_not_found")); assertThatThrownBy( @@ -364,7 +362,7 @@ class ManagedAgentMySqlIT { "MYSQL-RESOURCE", tokenA))) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo( @@ -438,7 +436,7 @@ class ManagedAgentMySqlIT { tokenA, staleCommit))) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("managed_session_writer_conflict")); @@ -462,7 +460,7 @@ class ManagedAgentMySqlIT { .load() .migrate(); JdbcTemplate jdbc = - new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource); + new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource); String tenant = "mysql-lease-precision"; String session = "mysql-lease-precision-session"; jdbc.update( @@ -608,7 +606,7 @@ class ManagedAgentMySqlIT { .load() .migrate(); JdbcTemplate jdbc = - new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource); + new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource); cleanupProcessFixture(jdbc); Process crashed = startStoreProcess("commit-and-crash"); @@ -640,7 +638,7 @@ class ManagedAgentMySqlIT { .load() .migrate(); JdbcTemplate jdbc = - new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource); + new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource); // Per-run tenant ids keep reruns on a shared database isolated with // no cleanup; the pair differs only by case, the property under // test (tenant_id is utf8mb4_bin). @@ -652,7 +650,7 @@ class ManagedAgentMySqlIT { new ObjectMapper(), Clock.systemUTC(), ignored -> {}, - new com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry(jdbc), + new com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry(jdbc), new ManagedAgentProperties()); Admission lower = store.insertSessionCommand( @@ -695,7 +693,7 @@ class ManagedAgentMySqlIT { .load() .migrate(); JdbcTemplate jdbc = - new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource); + new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource); ManagedAgentStore store = new ManagedAgentStore( jdbc, @@ -789,7 +787,7 @@ class ManagedAgentMySqlIT { .load() .migrate(); JdbcTemplate jdbc = - new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource); + new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource); ManagedWorkspaceRegistry registry = new ManagedWorkspaceRegistry(jdbc); ManagedAgentStore store = new ManagedAgentStore( @@ -853,8 +851,7 @@ class ManagedAgentMySqlIT { null, List.of(), null, - new com.alibaba.qwen.code.managedagent.api - .WorkspaceSelection(workspace, "."))); + new com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection(workspace, "."))); assertThat(registry.canRead(tenant, actor, workspace)).isTrue(); assertThat(registry.canRead(tenant, "actor-a", workspace)).isFalse(); assertThat(registry.canRead(tenant, actor, "workspace-a")).isFalse(); @@ -876,7 +873,7 @@ class ManagedAgentMySqlIT { "Create-Workspace", digest))) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("idempotency_conflict")); assertThatThrownBy( () -> @@ -888,7 +885,7 @@ class ManagedAgentMySqlIT { "create-workspace", digest))) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("idempotency_conflict")); assertThat( transactions @@ -928,7 +925,7 @@ class ManagedAgentMySqlIT { .load() .migrate(); JdbcTemplate jdbc = - new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource); + new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource); TransactionTemplate transactions = new TransactionTemplate(new DataSourceTransactionManager(dataSource)); String tenant = "mysql-extension"; @@ -979,7 +976,7 @@ class ManagedAgentMySqlIT { transactions, () -> journal.commitMonitor("refused", refused, 99_000))) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo(ManagedExtensionRecordStore.ERROR_REJECTED)); @@ -1060,7 +1057,7 @@ class ManagedAgentMySqlIT { .load() .migrate(); JdbcTemplate jdbc = - new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource); + new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource); ManagedAgentStore agents = new ManagedAgentStore( jdbc, @@ -1173,7 +1170,7 @@ class ManagedAgentMySqlIT { operation.claimGeneration(), true))) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("managed_session_writer_active")); @@ -1241,7 +1238,7 @@ class ManagedAgentMySqlIT { .load() .migrate(); JdbcTemplate jdbc = - new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource); + new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource); ManagedAgentStore agents = new ManagedAgentStore( jdbc, @@ -1390,7 +1387,7 @@ class ManagedAgentMySqlIT { .load() .migrate(); JdbcTemplate jdbc = - new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource); + new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource); ManagedAgentStore store = new ManagedAgentStore( jdbc, @@ -1463,7 +1460,7 @@ class ManagedAgentMySqlIT { request[1], "digest-close"))) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("session_operation_active")); @@ -1553,7 +1550,7 @@ class ManagedAgentMySqlIT { assertThatThrownBy(() -> inTransaction(transactions, () -> journals.acquireWriter(tenant, sessionId, token, new AcquireWriterRequest("workspace", "writer", 60_000L)))) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_not_writable")); String leaseSessionId = store.insertSessionCommand( tenant, "CREATE_SESSION", "lease-session", "digest-lease-session", @@ -1604,7 +1601,7 @@ class ManagedAgentMySqlIT { .load() .migrate(); JdbcTemplate jdbc = - new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource); + new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource); ManagedAgentStore store = new ManagedAgentStore( jdbc, @@ -1685,7 +1682,7 @@ class ManagedAgentMySqlIT { @Order(12) void firstWriterAcquisitionsForDifferentTenantsDoNotDeadlock() throws Exception { var source = dataSource(); - var admin = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(source); + var admin = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(source); String schema = "first_writer_" + UUID.randomUUID().toString().replace("-", ""); admin.execute("CREATE DATABASE " + schema); var isolated = @@ -1698,7 +1695,7 @@ class ManagedAgentMySqlIT { var ready = new java.util.concurrent.CountDownLatch(2); var release = new java.util.concurrent.CountDownLatch(1); var jdbc = - new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(isolated) { + new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(isolated) { @Override public int update(String sql, Object... arguments) { if (sql.startsWith("INSERT IGNORE INTO ma_session_head")) { @@ -1784,8 +1781,7 @@ class ManagedAgentMySqlIT { "-Duser.timezone=" + timezone, "-cp", classpath, - com.alibaba.qwen.code.managedagent.store - .ToolPublicationRetentionClockFixtureMain.class + com.alibaba.qwen.code.managedagent.persistence.ToolPublicationRetentionClockFixtureMain.class .getName()) .redirectErrorStream(true); builder.environment().put("D1_MYSQL_URL", required("mysql.url")); @@ -1826,7 +1822,7 @@ class ManagedAgentMySqlIT { .locations("classpath:db/managed-schema") .load() .migrate(); - var jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(source); + var jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(source); var store = new ManagedAgentStore( jdbc, @@ -1836,11 +1832,11 @@ class ManagedAgentMySqlIT { new ManagedWorkspaceRegistry(jdbc), new ManagedAgentProperties()); var authority = - new com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore( + new com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore( jdbc, new DataSourceTransactionManager(source)); - com.alibaba.qwen.code.managedagent.service.WorkspaceRecoveryContract.verify( + com.alibaba.qwen.code.managedagent.workspace.runtime.WorkspaceRecoveryContract.verify( source, jdbc, store, authority); - com.alibaba.qwen.code.managedagent.service.WorkspaceRecoveryContract.verifyOperatorPrepare( + com.alibaba.qwen.code.managedagent.workspace.runtime.WorkspaceRecoveryContract.verifyOperatorPrepare( source, jdbc, store, authority); } @@ -1885,7 +1881,7 @@ class ManagedAgentMySqlIT { // Session's Hook records. The lookups are the statements the store // ran above. JdbcTemplate jdbc = - new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource); + new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource); jdbc.queryForList("ANALYZE TABLE ma_session_record"); String scopeKey = ManagedSessionStore.sessionScopeKey("mysql-hook-index", session); for (Object[] lookup : @@ -1942,7 +1938,7 @@ class ManagedAgentMySqlIT { .migrate(); var store = new ManagedAgentDefinitionStore( - new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate( + new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate( source), new RequestDigests()); var service = new ManagedAgentDefinitionService(store, new RequestDigests(), new ObjectMapper()); @@ -1962,7 +1958,7 @@ class ManagedAgentMySqlIT { transactions, () -> service.update(other, agentId, "update", DEFINITION))) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.NOT_FOUND); assertThat(error.getCode()).isEqualTo("agent_not_found"); @@ -1993,7 +1989,7 @@ class ManagedAgentMySqlIT { .migrate(); var store = new ManagedAgentDefinitionStore( - new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate( + new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate( source), new RequestDigests()); var service = new ManagedAgentDefinitionService(store, new RequestDigests(), new ObjectMapper()); @@ -2024,7 +2020,7 @@ class ManagedAgentMySqlIT { .locations("classpath:db/managed-schema") .load() .migrate(); - var jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(source); + var jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(source); var store = new ManagedAgentDefinitionStore(jdbc, new RequestDigests()); var service = new ManagedAgentDefinitionService(store, new RequestDigests(), new ObjectMapper()); @@ -2066,7 +2062,7 @@ class ManagedAgentMySqlIT { new TransactionTemplate(new DataSourceTransactionManager(winnerSource)); var raced = new AtomicBoolean(); var racingJdbc = - new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(source) { + new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(source) { @Override public List query(String sql, RowMapper rowMapper, Object... args) { List result = super.query(sql, rowMapper, args); @@ -2096,7 +2092,7 @@ class ManagedAgentMySqlIT { racingService.update( tenant, agentId, "loser", loserRequest))) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()).isEqualTo("agent_revision_conflict"); @@ -2234,7 +2230,7 @@ class ManagedAgentMySqlIT { void publishesAndReadsStaticSkillResourcesAcrossStoreInstances() throws IOException { DriverManagerDataSource source = dataSource(); Flyway.configure().dataSource(source).locations("classpath:db/managed-schema").load().migrate(); - JdbcTemplate jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(source); + JdbcTemplate jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(source); TransactionTemplate transactions = new TransactionTemplate(new DataSourceTransactionManager(source)); ManagedSessionStore resources = new ManagedSessionStore(jdbc); String tenant = "mysql-skills-" + UUID.randomUUID(); @@ -2248,7 +2244,7 @@ class ManagedAgentMySqlIT { () -> resources.publishAgentSkills(tenant, "workspace", session, skills)); assertThat(inTransaction(transactions, () -> resources.publishAgentSkills(tenant, "workspace", session, skills))).isEqualTo(published); - var reloaded = new ManagedSessionStore(new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(source)) + var reloaded = new ManagedSessionStore(new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(source)) .readResource(tenant, "workspace", session, published.resourceId(), token); assertThat(new ObjectMapper().readTree(reloaded.bytes())).isEqualTo(new ObjectMapper().valueToTree(skills)); assertThat(reloaded.digest()).isEqualTo(published.digest()); @@ -2256,7 +2252,7 @@ class ManagedAgentMySqlIT { jdbc.update("UPDATE ma_resource SET inline_bytes = ? WHERE tenant_id = ? AND session_id = ? AND resource_id = ?", "[]".getBytes(StandardCharsets.UTF_8), tenant, session, published.resourceId()); assertThatThrownBy(() -> resources.readResource(tenant, "workspace", session, published.resourceId(), token)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_resource_corrupt")); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentServerIntegrationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentServerIntegrationTest.java index d1bab0e00df..4dd268609b5 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentServerIntegrationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentServerIntegrationTest.java @@ -2,28 +2,28 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.daemon.DaemonHttpException; import com.alibaba.qwen.code.daemon.HarnessRuntimeRecovery; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.CommandAdmission; import com.alibaba.qwen.code.managedagent.api.ManagedSessionStoreController; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.service.HarnessCoordinator; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentService; -import com.alibaba.qwen.code.managedagent.service.RequestDigests; -import com.alibaba.qwen.code.managedagent.service.SessionEventHub; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.Admission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.DispatchTarget; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.HarnessEvent; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ItemRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ProjectedEvent; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionMutationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SnapshotRecord; +import com.alibaba.qwen.code.managedagent.model.ApiModels.CommandAdmission; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels.Admission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.DispatchTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.HarnessEvent; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ItemRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ProjectedEvent; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionMutationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SnapshotRecord; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.session.HarnessCoordinator; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; +import com.alibaba.qwen.code.managedagent.session.SessionEventHub; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -222,12 +222,12 @@ class ManagedAgentServerIntegrationTest { assertThat(retry.replayed()).isTrue(); assertThatThrownBy(() -> upgraded.createSession(tenant, "revision-create", "qwen-code", "2", null, null, List.of())) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("idempotency_conflict")); assertThatThrownBy(() -> upgraded.createSession(tenant, "revision-new", "qwen-code", "1", null, null, List.of())) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("unsupported_feature")); CommandAdmission omitted = upgraded.createSession(tenant, @@ -3483,7 +3483,7 @@ class ManagedAgentServerIntegrationTest { String operation = "operation-" + UUID.randomUUID(); var scope = new com.alibaba.qwen.code.runtimebroker.RuntimeScope(tenant, "workspace", "1", "/workspace", "capability", "session"); var bindings = new com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository(jdbc.getDataSource(), - new com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector("test", new byte[32])); + new com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector("test", new byte[32])); var sessions = new com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository(jdbc.getDataSource()); var executions = new com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository(jdbc.getDataSource()); var provisioner = org.mockito.Mockito.mock(com.alibaba.qwen.code.runtimebroker.RuntimeProvisioner.class, diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentStoreLocaleTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentStoreLocaleTest.java index 2b18fed8bad..99797d32820 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentStoreLocaleTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAgentStoreLocaleTest.java @@ -1,10 +1,10 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.Admission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.Admission; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.fasterxml.jackson.databind.ObjectMapper; import org.h2.jdbcx.JdbcDataSource; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedApprovalChangeTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedApprovalChangeTest.java index 950292df121..e498ec84546 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedApprovalChangeTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedApprovalChangeTest.java @@ -1,21 +1,21 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.daemon.SubmitHarnessTurn; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellApprovalChangeResult; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellApprovalSelection; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.service.HarnessCoordinator; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentService; -import com.alibaba.qwen.code.managedagent.service.RequestDigests; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.AcquireWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.model.ApiModels; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellApprovalChangeResult; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellApprovalSelection; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.AcquireWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.session.HarnessCoordinator; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; @@ -441,7 +441,7 @@ class ManagedApprovalChangeTest { try { change("actor", "race", "yolo", 0); return "unexpected-change"; - } catch (ApiException conflict) { + } catch (ManagedAgentException conflict) { return conflict.getCode(); } }); @@ -472,7 +472,7 @@ class ManagedApprovalChangeTest { start.await(); try { return Long.toString(change("actor", UUID.randomUUID().toString(), "yolo", 0).approvalRevision()); - } catch (ApiException conflict) { + } catch (ManagedAgentException conflict) { return conflict.getCode(); } }; @@ -585,7 +585,7 @@ class ManagedApprovalChangeTest { private TransactionTemplate transaction() { return new TransactionTemplate(manager); } private void assertCode(Runnable action, String code) { - assertThatThrownBy(action::run).isInstanceOfSatisfying(ApiException.class, + assertThatThrownBy(action::run).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo(code)); } } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedApprovalSelectionTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedApprovalSelectionTest.java index 08a1f0b30bf..3680acaeb2a 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedApprovalSelectionTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedApprovalSelectionTest.java @@ -1,19 +1,19 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.CommandAdmission; import com.alibaba.qwen.code.managedagent.api.AuthenticatedTenantActor; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.service.HarnessCoordinator; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentService; -import com.alibaba.qwen.code.managedagent.service.RequestDigests; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.model.ApiModels.CommandAdmission; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.session.HarnessCoordinator; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -83,7 +83,7 @@ class ManagedApprovalSelectionTest { assertThat(session.toolProfile()).isEqualTo("hosted-workspace-shell/1"); assertThatThrownBy(() -> create(store, tenant, "yolo", "qwen-code", "yolo")) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("unsupported_approval_mode")); } @@ -94,7 +94,7 @@ class ManagedApprovalSelectionTest { String tenant = workspace(); assertThatThrownBy(() -> create(store(false, "yolo"), tenant, "key", "qwen-code", mode)) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("unsupported_approval_mode")); assertThat( @@ -121,12 +121,12 @@ class ManagedApprovalSelectionTest { for (String changed : List.of("default", "auto-edit")) { assertThatThrownBy(() -> create(shell, tenant, "selected", "qwen-code", changed)) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("idempotency_conflict")); } assertThatThrownBy(() -> create(shell, tenant, "omitted", "qwen-code", "yolo")) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("idempotency_conflict")); } @@ -142,7 +142,7 @@ class ManagedApprovalSelectionTest { var admitted = create(store, tenant, "key", "model", "default"); assertThatThrownBy(() -> create(store, tenant, "other", "model", "auto-edit")) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("unsupported_approval_mode")); define(tenant, "auto-edit"); @@ -164,7 +164,7 @@ class ManagedApprovalSelectionTest { store.workspaceSessionOptions( "another-tenant", "model"))) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("agent_not_found")); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedArtifactApiIntegrationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedArtifactApiIntegrationTest.java index eb0ad4b1db8..87c81008c8b 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedArtifactApiIntegrationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedArtifactApiIntegrationTest.java @@ -7,18 +7,18 @@ import com.alibaba.qwen.code.managedagent.api.ManagedToolDetailsController; import com.alibaba.qwen.code.managedagent.api.RequestIdFilter; import com.alibaba.qwen.code.managedagent.api.TenantContextArgumentResolver; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; +import com.alibaba.qwen.code.managedagent.artifact.ManagedArtifactPolicy; +import com.alibaba.qwen.code.managedagent.artifact.ManagedArtifactService; +import com.alibaba.qwen.code.managedagent.artifact.ManagedToolDetailsService; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.service.HarnessCoordinator; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentService; -import com.alibaba.qwen.code.managedagent.service.ManagedArtifactPolicy; -import com.alibaba.qwen.code.managedagent.service.ManagedArtifactService; -import com.alibaba.qwen.code.managedagent.service.ManagedToolDetailsService; -import com.alibaba.qwen.code.managedagent.service.RequestDigests; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.SealWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedToolDetailsStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.SealWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedToolDetailsStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.session.HarnessCoordinator; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; @@ -92,10 +92,10 @@ class ManagedArtifactApiIntegrationTest { var context = new org.springframework.context.annotation.AnnotationConfigApplicationContext(); context.registerBean(com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.class, fixture::properties); - context.registerBean(com.alibaba.qwen.code.managedagent.store.ManagedArtifactReader.class, + context.registerBean(com.alibaba.qwen.code.managedagent.persistence.ManagedArtifactReader.class, fixture::reader); - context.registerBean(com.alibaba.qwen.code.managedagent.store.ManagedActionStore.class, - () -> mock(com.alibaba.qwen.code.managedagent.store.ManagedActionStore.class)); + context.registerBean(com.alibaba.qwen.code.managedagent.persistence.ManagedActionStore.class, + () -> mock(com.alibaba.qwen.code.managedagent.persistence.ManagedActionStore.class)); context.registerBean(java.time.Clock.class, () -> java.time.Clock.systemUTC()); context.registerBean(ManagedAgentService.class, () -> sessions); context.refresh(); @@ -507,7 +507,7 @@ class ManagedArtifactApiIntegrationTest { var policy = org.mockito.Mockito.spy(fixture.policy()); var service = new ManagedArtifactService(sessions, fixture.results(), reader, policy, fixture.properties()); var response = new org.springframework.mock.web.MockHttpServletResponse(); - service.content(new com.alibaba.qwen.code.managedagent.api.TenantContext("tenant-1", "reader"), + service.content(new com.alibaba.qwen.code.managedagent.model.TenantContext("tenant-1", "reader"), "session-1", stdout.path("id").asText(), stdout.path("revision").asText(), "bytes=0-2", null, null, response); assertThat(response.getContentAsByteArray()).isEqualTo("abc".getBytes(StandardCharsets.UTF_8)); org.mockito.Mockito.verify(reader, org.mockito.Mockito.times(1)).available(org.mockito.ArgumentMatchers.any()); @@ -794,14 +794,14 @@ class ManagedArtifactApiIntegrationTest { var reader = org.mockito.Mockito.spy(fixture.reader()); org.mockito.Mockito.doAnswer(call -> { fixture.jdbc().update("UPDATE ma_session SET status = 'DELETED' WHERE session_id = X'73657373696f6e2d31'"); - throw new com.alibaba.qwen.code.managedagent.api.ApiException(org.springframework.http.HttpStatus.CONFLICT, + throw new com.alibaba.qwen.code.managedagent.exception.ManagedAgentException(org.springframework.http.HttpStatus.CONFLICT, "tool_output_session_retired", "Retired during lease admission"); }).when(reader).lease(org.mockito.ArgumentMatchers.any()); var service = new ManagedArtifactService(sessions, fixture.results(), reader, fixture.policy(), fixture.properties()); - assertThatThrownBy(() -> service.content(new com.alibaba.qwen.code.managedagent.api.TenantContext("tenant-1", "reader"), + assertThatThrownBy(() -> service.content(new com.alibaba.qwen.code.managedagent.model.TenantContext("tenant-1", "reader"), "session-1", stdout.path("id").asText(), stdout.path("revision").asText(), null, null, null, new org.springframework.mock.web.MockHttpServletResponse())) - .isInstanceOfSatisfying(com.alibaba.qwen.code.managedagent.api.ApiException.class, + .isInstanceOfSatisfying(com.alibaba.qwen.code.managedagent.exception.ManagedAgentException.class, error -> assertThat(error.getStatus()).isEqualTo(org.springframework.http.HttpStatus.NOT_FOUND)); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedArtifactReadIntegrationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedArtifactReadIntegrationTest.java index 25591846077..584b1af23ca 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedArtifactReadIntegrationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedArtifactReadIntegrationTest.java @@ -1,8 +1,16 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.api.*; -import com.alibaba.qwen.code.managedagent.service.*; -import com.alibaba.qwen.code.managedagent.store.ManagedArtifactReader; +import com.alibaba.qwen.code.managedagent.api.ApiExceptionHandler; +import com.alibaba.qwen.code.managedagent.api.AuthenticatedTenantActor; +import com.alibaba.qwen.code.managedagent.api.ManagedArtifactController; +import com.alibaba.qwen.code.managedagent.api.RequestIdFilter; +import com.alibaba.qwen.code.managedagent.api.TenantContextArgumentResolver; +import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; +import com.alibaba.qwen.code.managedagent.artifact.ManagedArtifactPolicy; +import com.alibaba.qwen.code.managedagent.artifact.ManagedArtifactService; +import com.alibaba.qwen.code.managedagent.model.TenantContext; +import com.alibaba.qwen.code.managedagent.persistence.ManagedArtifactReader; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.springframework.test.web.servlet.MockMvc; @@ -101,7 +109,7 @@ class ManagedArtifactReadIntegrationTest { return invocation.callRealMethod(); }) .when(reader) - .readRange(any(), anyLong(), anyInt(), any(com.alibaba.qwen.code.managedagent.store.ToolPublicationRetentionStore.ReadLease.class), any(Runnable.class)); + .readRange(any(), anyLong(), anyInt(), any(com.alibaba.qwen.code.managedagent.persistence.ToolPublicationRetentionStore.ReadLease.class), any(Runnable.class)); var mvc = mvc( new ManagedArtifactService( @@ -473,7 +481,7 @@ class ManagedArtifactReadIntegrationTest { AtomicInteger lookups = new AtomicInteger(), opens = new AtomicInteger(); var data = org.mockito.Mockito.mock( - com.alibaba.qwen.code.managedagent.store.ToolPublicationDataStore.class, + com.alibaba.qwen.code.managedagent.persistence.ToolPublicationDataStore.class, org.mockito.Mockito.withSettings() .spiedInstance(fixture.publications()) .defaultAnswer( @@ -497,7 +505,7 @@ class ManagedArtifactReadIntegrationTest { var reader = new ManagedArtifactReader( beans.getBeanProvider( - com.alibaba.qwen.code.managedagent.store.ToolPublicationDataStore + com.alibaba.qwen.code.managedagent.persistence.ToolPublicationDataStore .class)); AtomicInteger decisions = new AtomicInteger(); var allowed = new java.util.concurrent.atomic.AtomicBoolean(true); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedArtifactSchedulingTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedArtifactSchedulingTest.java index 252f6e3b0f0..d9ef0226ccf 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedArtifactSchedulingTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedArtifactSchedulingTest.java @@ -2,12 +2,12 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.config.ManagedArtifactConfiguration; -import com.alibaba.qwen.code.managedagent.service.MessageMaterializer; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ManagedArtifactReader; -import com.alibaba.qwen.code.managedagent.store.ManagedToolResultProjector; -import com.alibaba.qwen.code.managedagent.store.StoreModels.MaterializationTarget; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationDataStore; +import com.alibaba.qwen.code.managedagent.event.MessageMaterializer; +import com.alibaba.qwen.code.managedagent.model.StoreModels.MaterializationTarget; +import com.alibaba.qwen.code.managedagent.persistence.ManagedArtifactReader; +import com.alibaba.qwen.code.managedagent.persistence.ManagedToolResultProjector; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationDataStore; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.support.StaticListableBeanFactory; import org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration; @@ -78,7 +78,7 @@ class ManagedArtifactSchedulingTest { ManagedAgentProperties.class, fixture::properties); context.registerBean( - com.alibaba.qwen.code.managedagent.service.ManagedArtifactPolicy.class, + com.alibaba.qwen.code.managedagent.artifact.ManagedArtifactPolicy.class, fixture::policy); context.registerBean( "materializer", MessageMaterializer.class, diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAutomationRecordContractTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAutomationRecordContractTest.java index ac958642dec..4df3a18a300 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAutomationRecordContractTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedAutomationRecordContractTest.java @@ -1,8 +1,8 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords.InvalidRecordException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords.InvalidRecordException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedChannelJdbcContract.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedChannelJdbcContract.java index 23579640b1a..dec3b361cb3 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedChannelJdbcContract.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedChannelJdbcContract.java @@ -1,15 +1,15 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ChannelDeliveryRepository; -import com.alibaba.qwen.code.managedagent.store.ChannelDeliveryRepository.ChannelDelivery; -import com.alibaba.qwen.code.managedagent.store.ChannelDeliveryRepository.DeliveryCursor; -import com.alibaba.qwen.code.managedagent.store.ChannelDeliveryRepository.DeliveryPage; -import com.alibaba.qwen.code.managedagent.store.ChannelRouteRepository; -import com.alibaba.qwen.code.managedagent.store.ChannelRouteRepository.ChannelRoute; -import com.alibaba.qwen.code.managedagent.store.ChannelRouteRepository.RouteCursor; -import com.alibaba.qwen.code.managedagent.store.ChannelRouteRepository.RoutePage; -import com.alibaba.qwen.code.managedagent.store.JdbcChannelDeliveryRepository; -import com.alibaba.qwen.code.managedagent.store.JdbcChannelRouteRepository; +import com.alibaba.qwen.code.managedagent.persistence.ChannelDeliveryRepository; +import com.alibaba.qwen.code.managedagent.persistence.ChannelDeliveryRepository.ChannelDelivery; +import com.alibaba.qwen.code.managedagent.persistence.ChannelDeliveryRepository.DeliveryCursor; +import com.alibaba.qwen.code.managedagent.persistence.ChannelDeliveryRepository.DeliveryPage; +import com.alibaba.qwen.code.managedagent.persistence.ChannelRouteRepository; +import com.alibaba.qwen.code.managedagent.persistence.ChannelRouteRepository.ChannelRoute; +import com.alibaba.qwen.code.managedagent.persistence.ChannelRouteRepository.RouteCursor; +import com.alibaba.qwen.code.managedagent.persistence.ChannelRouteRepository.RoutePage; +import com.alibaba.qwen.code.managedagent.persistence.JdbcChannelDeliveryRepository; +import com.alibaba.qwen.code.managedagent.persistence.JdbcChannelRouteRepository; import org.springframework.jdbc.core.JdbcTemplate; import javax.sql.DataSource; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedChannelRecordContractTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedChannelRecordContractTest.java index 508b5e5fb60..9791c4ab756 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedChannelRecordContractTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedChannelRecordContractTest.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords.InvalidRecordException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords.InvalidRecordException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedChildAcceptanceRecordContractTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedChildAcceptanceRecordContractTest.java index 4cbfed033fb..b00aaf1fbdf 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedChildAcceptanceRecordContractTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedChildAcceptanceRecordContractTest.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords.InvalidRecordException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords.InvalidRecordException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedChildRunRecordContractTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedChildRunRecordContractTest.java index 6c2600af234..0afb96fcced 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedChildRunRecordContractTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedChildRunRecordContractTest.java @@ -1,8 +1,8 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords.InvalidRecordException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords.InvalidRecordException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedCwdChangeOperationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedCwdChangeOperationTest.java index 80bea38a0a2..09d02b66530 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedCwdChangeOperationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedCwdChangeOperationTest.java @@ -1,21 +1,21 @@ package com.alibaba.qwen.code.managedagent; -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.service.RuntimeWarmer; -import com.alibaba.qwen.code.managedagent.service.SessionLifecycleCoordinator; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore.CwdChangeOutcome; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationAdmission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionMutationKind; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationAdmission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionMutationKind; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore.CwdChangeOutcome; +import com.alibaba.qwen.code.managedagent.session.SessionLifecycleCoordinator; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; @@ -109,7 +109,7 @@ class ManagedCwdChangeOperationTest { .isEqualTo(operation.operationId()); assertThatThrownBy(() -> begin(fixture, sessionId, "key-1", "digest-2", "services/b", 1)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()) .isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) @@ -150,7 +150,7 @@ class ManagedCwdChangeOperationTest { fixture.insertRuntimeOwner(TENANT, sessionId, state); assertThatThrownBy(() -> fixture.tx(() -> begin(fixture, sessionId, "key", "digest", "services/b", 1))) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.CONFLICT, "session_context_busy")); assertThat(fixture.jdbc.queryForObject("SELECT COUNT(*) FROM" @@ -269,7 +269,7 @@ class ManagedCwdChangeOperationTest { Fixture fixture = fixture(true); assertThatThrownBy(() -> begin(fixture, "missing", "key", "digest", "a", 1)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.NOT_FOUND, "session_not_found")); String legacyId = fixture.store.insertSessionCommand(TENANT, @@ -277,7 +277,7 @@ class ManagedCwdChangeOperationTest { null, List.of(), null).sessionId(); assertThatThrownBy(() -> begin(fixture, legacyId, "key", "digest", "a", 1)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.BAD_REQUEST, "unsupported_feature")); @@ -288,7 +288,7 @@ class ManagedCwdChangeOperationTest { deletedId); assertThatThrownBy(() -> begin(fixture, deletedId, "key", "digest", "a", 1)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.NOT_FOUND, "session_not_found")); String archivedId = fixture.createBoundSession(TENANT, WS); @@ -297,7 +297,7 @@ class ManagedCwdChangeOperationTest { + " session_id = ?", TENANT, archivedId); assertThatThrownBy(() -> begin(fixture, archivedId, "key", "digest", "a", 1)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.CONFLICT, "session_state_conflict")); } @@ -308,14 +308,14 @@ class ManagedCwdChangeOperationTest { String gatedId = disabled.createBoundSession(TENANT, WS); assertThatThrownBy(() -> begin(disabled, gatedId, "key", "digest", "a", 1)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.CONFLICT, "workspace_unavailable")); // The deployment gate opens only after the actor check: a stranger // must not read the flag from its refusal either. assertThatThrownBy(() -> begin(disabled, gatedId, "key", "digest", "a", 1, "stranger", "digest-stranger")) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.NOT_FOUND, "session_not_found")); @@ -328,13 +328,13 @@ class ManagedCwdChangeOperationTest { // creator's grant set as before. assertThatThrownBy(() -> begin(fixture, sessionId, "key", "digest", "a", 1, "stranger", "digest-stranger")) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.NOT_FOUND, "session_not_found")); fixture.grant(TENANT, WS, "colleague", "READER"); assertThatThrownBy(() -> begin(fixture, sessionId, "key", "digest", "a", 1, "colleague", "digest-colleague")) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.FORBIDDEN, "session_operation_forbidden")); fixture.grant(TENANT, WS, "operator-colleague", "OPERATOR"); @@ -353,7 +353,7 @@ class ManagedCwdChangeOperationTest { assertThatThrownBy(() -> begin(fixture, sessionId, "key-2", "digest-2", "services/c", 1, "operator-colleague", "digest-operator")) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.CONFLICT, "workspace_unavailable")); fixture.jdbc.update("UPDATE ma_workspace_access SET role =" @@ -365,7 +365,7 @@ class ManagedCwdChangeOperationTest { + " workspace_id = ?", TENANT, WS); assertThatThrownBy(() -> begin(fixture, sessionId, "key", "digest", "a", 1)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.FORBIDDEN, "session_operation_forbidden")); } @@ -386,7 +386,7 @@ class ManagedCwdChangeOperationTest { ACTOR.getBytes(java.nio.charset.StandardCharsets.UTF_8)); assertThatThrownBy(() -> begin(fixture, sessionId, "key", "digest", "services/b", 1)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.NOT_FOUND, "session_not_found")); } @@ -418,7 +418,7 @@ class ManagedCwdChangeOperationTest { assertThatThrownBy(() -> begin(fixture, sessionId, "key-2", "digest-2", "services/c", 1, "operator-colleague", "digest-operator")) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.FORBIDDEN, "session_operation_forbidden")); } @@ -447,7 +447,7 @@ class ManagedCwdChangeOperationTest { assertThatThrownBy(() -> gated.beginCwdChangeOperation(TENANT, sessionId, ACTOR, ACTOR_DIGEST, "key-2", "digest-2", "services/b", 1)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.CONFLICT, "workspace_unavailable")); } @@ -461,7 +461,7 @@ class ManagedCwdChangeOperationTest { + " AND workspace_id = ?", TENANT, WS); assertThatThrownBy(() -> begin(fixture, drainedId, "key", "digest", "a", 1)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.CONFLICT, "workspace_unavailable")); fixture.jdbc.update("UPDATE ma_workspace SET" @@ -470,7 +470,7 @@ class ManagedCwdChangeOperationTest { TENANT, WS); assertThatThrownBy(() -> begin(fixture, drainedId, "key", "digest", "a", 1)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.CONFLICT, "workspace_unavailable")); fixture.jdbc.update("UPDATE ma_workspace SET" @@ -478,7 +478,7 @@ class ManagedCwdChangeOperationTest { + " workspace_id = ?", TENANT, WS); assertThatThrownBy(() -> begin(fixture, drainedId, "key", "digest", "a", 2)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.CONFLICT, "context_revision_conflict")); } @@ -490,7 +490,7 @@ class ManagedCwdChangeOperationTest { fixture.insertTurn(sessionId, "turn-a", "ACCEPTED"); assertThatThrownBy(() -> begin(fixture, sessionId, "key-a", "digest-a", "a", 1)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.CONFLICT, "session_context_busy")); fixture.jdbc.update("UPDATE ma_turn SET status =" @@ -501,7 +501,7 @@ class ManagedCwdChangeOperationTest { assertThat(first.replayed()).isFalse(); assertThatThrownBy(() -> begin(fixture, sessionId, "key-b", "digest-b", "b", 1)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.CONFLICT, "session_context_busy")); @@ -514,7 +514,7 @@ class ManagedCwdChangeOperationTest { ManagedSchemaKeys.key("rename"), TENANT, secondId); assertThatThrownBy(() -> begin(fixture, secondId, "key", "digest", "a", 1)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.CONFLICT, "session_context_busy")); } @@ -536,7 +536,7 @@ class ManagedCwdChangeOperationTest { fixture, sessionId, key, "digest-" + key, "a", 1)); outcomes.add("admitted"); - } catch (ApiException error) { + } catch (ManagedAgentException error) { outcomes.add(error.getCode()); } catch (Exception error) { outcomes.add(error.getClass().getSimpleName()); @@ -836,7 +836,7 @@ class ManagedCwdChangeOperationTest { assertThatThrownBy(() -> fixture.store.beginCwdChangeOperation( "tenant-b", sessionId, ACTOR, ACTOR_DIGEST, "key", "digest", "a", 1)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.NOT_FOUND, "session_not_found")); } @@ -854,25 +854,25 @@ class ManagedCwdChangeOperationTest { + " session_id = ?", TENANT, archivedId); assertThatThrownBy(() -> begin(fixture, archivedId, "key", "digest", "a", 1, "stranger", "digest-stranger")) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.NOT_FOUND, "session_not_found")); fixture.grant(TENANT, WS, "colleague", "READER"); assertThatThrownBy(() -> begin(fixture, archivedId, "key", "digest", "a", 1, "colleague", "digest-colleague")) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.FORBIDDEN, "session_operation_forbidden")); fixture.grant(TENANT, WS, "operator-colleague", "OPERATOR"); assertThatThrownBy(() -> begin(fixture, archivedId, "key", "digest", "a", 1, "operator-colleague", "digest-operator")) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.CONFLICT, "session_state_conflict")); String activeId = fixture.createBoundSession(TENANT, WS); assertThatThrownBy(() -> begin(fixture, activeId, "key", "digest", "a", 7, "stranger", "digest-stranger")) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.NOT_FOUND, "session_not_found")); } @@ -887,7 +887,7 @@ class ManagedCwdChangeOperationTest { assertThatThrownBy(() -> fixture.store.beginWorkspaceLifecycle(TENANT, sessionId, OperationKind.CLOSE, ACTOR, ACTOR_DIGEST, "close", "close-digest", true)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.CONFLICT, "session_operation_active")); } @@ -997,7 +997,7 @@ class ManagedCwdChangeOperationTest { assertThatThrownBy(() -> fixture.store.insertTurnCommand(TENANT, "SUBMIT", "turn", "digest", sessionId, List.of(), "payload")) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.CONFLICT, "session_context_busy")); // A cancel is still admitted while the operation is open — it @@ -1127,7 +1127,7 @@ class ManagedCwdChangeOperationTest { fixture.insertAction(isolated, "approval-iso", future); assertThatThrownBy(() -> begin(fixture, isolated, "key-iso", "digest-iso", "services/b", 1)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.CONFLICT, "session_context_busy")); fixture.jdbc.update("DELETE FROM ma_session_record WHERE" @@ -1137,7 +1137,7 @@ class ManagedCwdChangeOperationTest { fixture.insertAction(sessionId, "approval-1", future); assertThatThrownBy(() -> begin(fixture, sessionId, "key-2", "digest-2", "services/c", 1)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.CONFLICT, "session_context_busy")); @@ -1326,7 +1326,7 @@ class ManagedCwdChangeOperationTest { .isEqualTo("context_revision_conflict"); assertThatThrownBy(() -> begin(fixture, sessionId, "key", "digest-other", "a", 1)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, HttpStatus.CONFLICT, "idempotency_conflict")); } @@ -1561,7 +1561,7 @@ class ManagedCwdChangeOperationTest { private static final String TENANT = "cwd-tenant"; - private static void assertRefusal(ApiException error, HttpStatus status, + private static void assertRefusal(ManagedAgentException error, HttpStatus status, String code) { assertThat(error.getStatus()).isEqualTo(status); assertThat(error.getCode()).isEqualTo(code); @@ -1764,12 +1764,12 @@ class ManagedCwdChangeOperationTest { return new SessionLifecycleCoordinator(store, null, null, warmer, new ChildResultRelayStore(jdbc), new ObjectMapper(), - new com.alibaba.qwen.code.managedagent.service.ChildLifecycleAdmissions( + new com.alibaba.qwen.code.managedagent.workspace.ChildLifecycleAdmissions( store, - new com.alibaba.qwen.code.managedagent.service.RequestDigests(), + new com.alibaba.qwen.code.managedagent.model.RequestDigests(), warmer), org.mockito.Mockito.mock( - com.alibaba.qwen.code.managedagent.service.ManagedAgentService.class), + com.alibaba.qwen.code.managedagent.session.ManagedAgentService.class), org.mockito.Mockito.mock( org.springframework.beans.factory.ObjectProvider.class), new AbstractExecutorService() { diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedCwdOperationContractShapeTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedCwdOperationContractShapeTest.java index a87a82bd047..0e4b6c04dd7 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedCwdOperationContractShapeTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedCwdOperationContractShapeTest.java @@ -1,9 +1,9 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.ApiModels.ChangeCwdRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicCwdOperation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellChangeCwdRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellCwdOperation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.ChangeCwdRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicCwdOperation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellChangeCwdRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellCwdOperation; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedEventEnvelopeContractTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedEventEnvelopeContractTest.java index 18dfe1ca545..c87707ecf4e 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedEventEnvelopeContractTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedEventEnvelopeContractTest.java @@ -1,8 +1,8 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelope; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelopes; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.event.ManagedEventEnvelope; +import com.alibaba.qwen.code.managedagent.event.ManagedEventEnvelopes; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedEventIdentityMigrationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedEventIdentityMigrationTest.java index 0cffd90d802..00424d186f9 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedEventIdentityMigrationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedEventIdentityMigrationTest.java @@ -1,9 +1,9 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.fasterxml.jackson.databind.ObjectMapper; import org.h2.jdbcx.JdbcDataSource; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedExtensionProjectionContractTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedExtensionProjectionContractTest.java index 74e27cf4cd1..9cca3ad3123 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedExtensionProjectionContractTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedExtensionProjectionContractTest.java @@ -1,8 +1,8 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection.TaskProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection.TaskProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedExtensionRecordContractTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedExtensionRecordContractTest.java index cb063df8b8e..4408ec7d36b 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedExtensionRecordContractTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedExtensionRecordContractTest.java @@ -1,8 +1,8 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords.InvalidRecordException; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords.InvalidRecordException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedExtensionRecordStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedExtensionRecordStoreTest.java index dcc11192f0a..f15cf763a56 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedExtensionRecordStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedExtensionRecordStoreTest.java @@ -1,20 +1,20 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicList; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicTask; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentService; -import com.alibaba.qwen.code.managedagent.service.ManagedTaskService; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitResource; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitTransactionRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedTaskEventStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicList; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicTask; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitResource; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitTransactionRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedTaskEventStore; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; +import com.alibaba.qwen.code.managedagent.session.ManagedTaskService; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -999,10 +999,10 @@ class ManagedExtensionRecordStoreTest { var sending = journal.requestDomain("sending-race", "channel_delivery", delivery, List.of(), 3000); journal.commit(sending); journal.committed(sending); - var instances = new com.alibaba.qwen.code.managedagent.store.ChannelInstanceStore(jdbc); - var ledger = new com.alibaba.qwen.code.managedagent.store.JdbcChannelDeliveryRepository(jdbc); + var instances = new com.alibaba.qwen.code.managedagent.persistence.ChannelInstanceStore(jdbc); + var ledger = new com.alibaba.qwen.code.managedagent.persistence.JdbcChannelDeliveryRepository(jdbc); String deliveryId = delivery.path("deliveryId").asText(); - ledger.findOrCreate(new com.alibaba.qwen.code.managedagent.store.ChannelDeliveryRepository.ChannelDelivery( + ledger.findOrCreate(new com.alibaba.qwen.code.managedagent.persistence.ChannelDeliveryRepository.ChannelDelivery( TENANT, "race-channel", deliveryId, "seg-1", 0, "planned", null, 0, 0)); var oldClaim = instances.claim(TENANT, "race-channel", deliveryId, sessionId); ledger.transition(TENANT, "race-channel", deliveryId, "planned", "sending", null, oldClaim.claimGeneration()); @@ -1010,17 +1010,17 @@ class ManagedExtensionRecordStoreTest { ObjectNode unknown = delivery.deepCopy(); ((ObjectNode) unknown.path("run")).put("state", "waiting"); ((ObjectNode) unknown.path("run").path("delivery")).put("state", "unknown"); - var stale = journal.requestDomain(com.alibaba.qwen.code.managedagent.store.ChannelInstanceStore.reconciliationOperationId(oldClaim), + var stale = journal.requestDomain(com.alibaba.qwen.code.managedagent.persistence.ChannelInstanceStore.reconciliationOperationId(oldClaim), "channel_delivery", unknown, List.of(), 4000); long before = jdbc.queryForObject("SELECT COUNT(*) FROM ma_session_journal_tx WHERE tenant_id=? AND session_id=?", Long.class, TENANT, sessionId); var newClaim = instances.touchClaim(TENANT, "race-channel", deliveryId); - assertThatThrownBy(() -> journal.commit(stale)).isInstanceOf(ApiException.class) - .satisfies(error -> assertThat(((ApiException) error).getCode()).isEqualTo("channel_claim_stale")); + assertThatThrownBy(() -> journal.commit(stale)).isInstanceOf(ManagedAgentException.class) + .satisfies(error -> assertThat(((ManagedAgentException) error).getCode()).isEqualTo("channel_claim_stale")); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_session_journal_tx WHERE tenant_id=? AND session_id=?", Long.class, TENANT, sessionId)).isEqualTo(before); assertThat(records.listRecords(TENANT, sessionId, "channel_delivery").getFirst().path("run").path("delivery").path("state").asText()).isEqualTo("sending"); assertThat(ledger.transition(TENANT, "race-channel", deliveryId, "sending", "unknown", null, oldClaim.claimGeneration())).isNull(); assertThat(instances.reserveReconciliation(newClaim)).isTrue(); - var current = journal.requestDomain(com.alibaba.qwen.code.managedagent.store.ChannelInstanceStore.reconciliationOperationId(newClaim), + var current = journal.requestDomain(com.alibaba.qwen.code.managedagent.persistence.ChannelInstanceStore.reconciliationOperationId(newClaim), "channel_delivery", unknown, List.of(), 4000); journal.commit(current); journal.committed(current); @@ -1714,7 +1714,7 @@ class ManagedExtensionRecordStoreTest { sessionId); long revisions = revisions(sessionId); assertThatThrownBy(commit).as(label) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getCode()).as(label).isEqualTo(code); // A line the authority cannot read is a bad request; a // Stage H rule that refuses a revision is a conflict. @@ -1847,7 +1847,7 @@ class ManagedExtensionRecordStoreTest { .put("digest", data.digest()); CommitTransactionRequest missing = journal.requestDomain("configure-result", "mcp_configuration", configured, List.of(), 1000); - assertThatThrownBy(() -> journal.commit(missing)).isInstanceOf(ApiException.class); + assertThatThrownBy(() -> journal.commit(missing)).isInstanceOf(ManagedAgentException.class); assertThat(revisions(sessionId)).isEqualTo(2); commitDomain(journal, "configure-result", "mcp_configuration", configured, List.of(data)); assertThat(records.listRecords(TENANT, sessionId, "mcp_configuration")) @@ -1855,7 +1855,7 @@ class ManagedExtensionRecordStoreTest { assertThat(records.readRecordResource(TENANT, sessionId, ref).isEmpty()).isTrue(); assertThat(records.listRecords("other-tenant", sessionId, "mcp_configuration")).isEmpty(); assertThatThrownBy(() -> records.readRecordResource("other-tenant", sessionId, ref)) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); ObjectNode conflictingPin = configuration.deepCopy(); conflictingPin.put("configurationId", "configure-2"); conflictingPin.withObject("/run").put("effectId", "configure-2"); @@ -1892,7 +1892,7 @@ class ManagedExtensionRecordStoreTest { ObjectNode ref = registration.withObject("/catalogRef"); ref.put("digest", data.digest()); assertThatThrownBy(() -> journal.commit(journal.requestDomain("missing-catalog", - "hook_registration", registration, List.of(), 1000))).isInstanceOf(ApiException.class); + "hook_registration", registration, List.of(), 1000))).isInstanceOf(ManagedAgentException.class); commitDomain(journal, "register-admitted", "hook_registration", registration, List.of(data)); ObjectNode execution = fixtures.get("templates").get("hook_execution").deepCopy(); execution.set("planRef", ref.deepCopy()); @@ -1913,7 +1913,7 @@ class ManagedExtensionRecordStoreTest { ObjectNode missing = execution.deepCopy(); missing.withObject("/" + field).put("resourceId", "missing"); assertThatThrownBy(() -> journal.commit(journal.requestDomain("missing-" + field, - "hook_execution", missing, List.of(), 1000))).isInstanceOf(ApiException.class); + "hook_execution", missing, List.of(), 1000))).isInstanceOf(ManagedAgentException.class); } commitDomain(journal, "execute-intent", "hook_execution", execution, List.of()); ObjectNode another = execution.deepCopy(); @@ -2097,7 +2097,7 @@ class ManagedExtensionRecordStoreTest { execution.putNull("onceKey"); for (List incomplete : List.of(List.of(plan, first, second), List.of(plan, manifest, first))) { assertThatThrownBy(() -> journal.commit(journal.requestDomain("missing-messages", "hook_execution", - execution, incomplete, 1000))).isInstanceOf(ApiException.class); + execution, incomplete, 1000))).isInstanceOf(ManagedAgentException.class); assertThat(revisions(sessionId)).isEqualTo(3); assertThat(rows("ma_resource", sessionId)).isEqualTo(resourcesBefore); } @@ -2118,7 +2118,7 @@ class ManagedExtensionRecordStoreTest { invalid.set("planRef", hookRef(badPlan)); assertThatThrownBy(() -> journal.commit(journal.requestDomain("mismatched-messages", "hook_execution", invalid, List.of(badPlan, badManifest, first, second), 1000))) - .isInstanceOf(ApiException.class).hasMessageContaining("does not match"); + .isInstanceOf(ManagedAgentException.class).hasMessageContaining("does not match"); assertThat(revisions(sessionId)).isEqualTo(3); assertThat(rows("ma_resource", sessionId)).isEqualTo(resourcesBefore); } @@ -2142,7 +2142,7 @@ class ManagedExtensionRecordStoreTest { smallExecution.withObject("/run").put("effectId", "small"); smallExecution.set("planRef", hookRef(smallPlan)); assertThatThrownBy(() -> journal.commit(journal.requestDomain("small-missing", "hook_execution", - smallExecution, List.of(smallPlan), 1000))).isInstanceOf(ApiException.class); + smallExecution, List.of(smallPlan), 1000))).isInstanceOf(ManagedAgentException.class); commitDomain(journal, "small-valid", "hook_execution", smallExecution, List.of(smallPlan, small)); assertThat(sessionStore.readResource(TENANT, WORKSPACE, sessionId, small.resourceId(), "extension-writer-token-0123456789").bytes()).isEqualTo("[]".getBytes(StandardCharsets.UTF_8)); @@ -2243,7 +2243,7 @@ class ManagedExtensionRecordStoreTest { } assertThatThrownBy(() -> events.appendStateChange(TENANT, sessionId, taskId, "running", "ready", 0)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo( ManagedTaskEventStore.CODE_BACKLOG_FULL)); @@ -2301,7 +2301,7 @@ class ManagedExtensionRecordStoreTest { String cursor = ManagedTaskEventStore.encodeCursor(TENANT, sessionId, taskId, 2); assertThatThrownBy(() -> service.queryWebShellTaskEvents(TENANT, TENANT, sessionId, taskId, cursor, 10)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getCode()).isEqualTo("cursor_expired"); }); } @@ -2347,7 +2347,7 @@ class ManagedExtensionRecordStoreTest { "/payload/recordRef")).put("resourceId", "missing-body-1"), records -> records))).isInstanceOfSatisfying( - ApiException.class, error -> { + ManagedAgentException.class, error -> { assertThat(error.getCode()).isEqualTo( ManagedSessionStoreModels.ERROR_RESOURCE_MISSING); assertThat(error.getStatus()).isEqualTo( @@ -2372,7 +2372,7 @@ class ManagedExtensionRecordStoreTest { shifted, shifted.length, TENANT, corruptId); assertThatThrownBy(() -> corruptJournal.commitMonitor("corrupt-2", chain().get(1).required("monitorRun"), 2_000)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getCode()).isEqualTo( "managed_session_resource_corrupt"); assertThat(error.getStatus()).isEqualTo( @@ -2393,7 +2393,7 @@ class ManagedExtensionRecordStoreTest { TENANT, foreignId); assertThatThrownBy(() -> foreignJournal.commitMonitor("foreign-2", chain().get(1).required("monitorRun"), 2_000)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getCode()).isEqualTo( "managed_session_not_found"); assertThat(error.getStatus()) diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedHookAdmissionIndexTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedHookAdmissionIndexTest.java index cf09d59c10a..a914c99decb 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedHookAdmissionIndexTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedHookAdmissionIndexTest.java @@ -4,9 +4,9 @@ import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitResource; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitResource; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.fasterxml.jackson.databind.node.ObjectNode; import org.h2.jdbcx.JdbcDataSource; @@ -98,7 +98,7 @@ class ManagedHookAdmissionIndexTest { history.commit( "replanned", "hook_execution", replanned, List.of(plan))) .as("replanned") - .isInstanceOf(ApiException.class) + .isInstanceOf(ManagedAgentException.class) .hasMessageContaining("unique ordinals"); assertThat(revisions(jdbc, sessionId)).isEqualTo(committed); @@ -278,7 +278,7 @@ class ManagedHookAdmissionIndexTest { assertThatThrownBy(() -> history.commit(commandId, "hook_execution", execution, List.of())) .as(commandId) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo(ManagedExtensionRecordStore.ERROR_REJECTED)) diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedHookRecordContractTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedHookRecordContractTest.java index f8da7ed90c1..00931f27852 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedHookRecordContractTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedHookRecordContractTest.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords.InvalidRecordException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords.InvalidRecordException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedMaterializationDeferTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedMaterializationDeferTest.java index ad6f2ff70e7..9d8dbfa9c86 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedMaterializationDeferTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedMaterializationDeferTest.java @@ -1,9 +1,9 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.MaterializationTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.MaterializationTarget; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; import com.fasterxml.jackson.databind.ObjectMapper; import org.flywaydb.core.Flyway; import org.h2.jdbcx.JdbcDataSource; @@ -34,7 +34,7 @@ class ManagedMaterializationDeferTest { + ";MODE=MySQL;DB_CLOSE_DELAY=-1;DATABASE_TO_LOWER=TRUE"); Flyway.configure().dataSource(dataSource) .locations("classpath:db/managed-schema").load().migrate(); - JdbcTemplate jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource); + JdbcTemplate jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource); jdbc.update("INSERT INTO ma_session (tenant_id," + " session_id, agent_id, status, gmt_create," + " gmt_modified) VALUES (?, ?, ?, ?," @@ -80,7 +80,7 @@ class ManagedMaterializationDeferTest { + ";MODE=MySQL;DB_CLOSE_DELAY=-1;DATABASE_TO_LOWER=TRUE"); Flyway.configure().dataSource(dataSource) .locations("classpath:db/managed-schema").load().migrate(); - JdbcTemplate jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource); + JdbcTemplate jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource); for (int i = 0; i < 3; i++) { String session = "session-" + i; jdbc.update("INSERT INTO ma_session (tenant_id," diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedMcpRecordContractTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedMcpRecordContractTest.java index 4a151bcbf35..d0c5f3c5ed0 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedMcpRecordContractTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedMcpRecordContractTest.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords.InvalidRecordException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords.InvalidRecordException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedModelContextTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedModelContextTest.java index 8026012bb4f..1f2a39e3596 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedModelContextTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedModelContextTest.java @@ -1,19 +1,19 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellModelContext; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.service.HarnessCoordinator; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentService; -import com.alibaba.qwen.code.managedagent.service.RequestDigests; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitResource; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitTransactionRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellModelContext; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitResource; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitTransactionRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.session.HarnessCoordinator; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.fasterxml.jackson.databind.JsonNode; @@ -225,7 +225,7 @@ class ManagedModelContextTest { } }); assertThatThrownBy(() -> transactions.execute(status -> journal.commit(request))) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_session_record", Integer.class)).isZero(); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_resource", Integer.class)).isZero(); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_session_journal_tx", Integer.class)).isEqualTo(1); @@ -282,7 +282,7 @@ class ManagedModelContextTest { assertThat(service.listWebShellSessions(TENANT, "reader", null, 100).data()) .singleElement().satisfies(session -> assertThat(session.modelContext()).isEqualTo(context("summary"))); assertThatThrownBy(() -> service.getWebShellSession(TENANT, "stranger", "summary")) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); assertThat(service.listWebShellSessions(TENANT, "stranger", null, 100).data()).isEmpty(); assertThat(json.valueToTree(service.getWebShellSession(TENANT, "reader", "summary")) .path("modelContext").path("modelId").textValue()).isEqualTo("actual-model"); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedModelSelectionTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedModelSelectionTest.java index ad015c8873b..1fede32f8ed 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedModelSelectionTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedModelSelectionTest.java @@ -1,20 +1,20 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.daemon.SubmitHarnessTurn; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellModelChangeResult; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellModelSelection; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.service.HarnessCoordinator; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentService; -import com.alibaba.qwen.code.managedagent.service.RequestDigests; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.AcquireWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionLineage; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellModelChangeResult; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellModelSelection; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionLineage; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.AcquireWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.session.HarnessCoordinator; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; import com.fasterxml.jackson.databind.ObjectMapper; @@ -130,7 +130,7 @@ class ManagedModelSelectionTest { assertThat(store.findModelSelections(tenant, List.of(session)).get(session)) .isEqualTo(new WebShellModelSelection("model-b", 2)); assertThatThrownBy(() -> change("actor", "first", "model-b", 0)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("idempotency_conflict")); } @@ -224,7 +224,7 @@ class ManagedModelSelectionTest { start.await(); try { return Long.toString(change("actor", UUID.randomUUID().toString(), "model-a", 0).modelSelection().revision()); - } catch (ApiException conflict) { + } catch (ManagedAgentException conflict) { return conflict.getCode(); } }; @@ -238,7 +238,7 @@ class ManagedModelSelectionTest { @Test void aSelectionCommittedDuringSummaryReadCannotReviveThePreviousContext() { String scope = ManagedSessionStore.sessionScopeKey(tenant, session); - String record = com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection.recordKey(session, + String record = com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection.recordKey(session, "hosted_context_usage", "latest"); byte[] bytes = "{\"version\":1,\"model\":\"model-a\",\"attempts\":[{\"promptTokenCount\":12,\"contextWindowSize\":100}]}" .getBytes(java.nio.charset.StandardCharsets.UTF_8); @@ -264,7 +264,7 @@ class ManagedModelSelectionTest { @Test void switchingClearsOnlyTheLatestUsageProjectionAndNeverReplaysTheClear() { String scope = ManagedSessionStore.sessionScopeKey(tenant, session); - String record = com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection.recordKey(session, + String record = com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection.recordKey(session, "hosted_context_usage", "latest"); jdbc.update("INSERT INTO ma_session_record (session_scope_key,record_key,tenant_id,workspace_id," + "session_id,domain,record_id,revision,record_resource_id,gmt_create,settled_at)" @@ -316,7 +316,7 @@ class ManagedModelSelectionTest { private TransactionTemplate transaction() { return new TransactionTemplate(manager); } private void assertCode(Runnable action, String code) { - assertThatThrownBy(action::run).isInstanceOfSatisfying(ApiException.class, + assertThatThrownBy(action::run).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo(code)); } } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedOperationSchemaUpgradeTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedOperationSchemaUpgradeTest.java index 90c222724fe..8681c72b6aa 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedOperationSchemaUpgradeTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedOperationSchemaUpgradeTest.java @@ -1,9 +1,9 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedRenameReconciliationMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedRenameReconciliationMySqlIT.java index 3965e98178a..e3ce3fb3029 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedRenameReconciliationMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedRenameReconciliationMySqlIT.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.IsolatedManagedSchemaMySqlTestDatabase; +import com.alibaba.qwen.code.managedagent.persistence.IsolatedManagedSchemaMySqlTestDatabase; import org.junit.jupiter.api.AfterEach; import javax.sql.DataSource; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedRenameReconciliationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedRenameReconciliationTest.java index 4f205ba50a2..148c8fbc35b 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedRenameReconciliationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedRenameReconciliationTest.java @@ -1,16 +1,16 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.AcceptanceVerdict; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ParkedOperation; -import com.alibaba.qwen.code.managedagent.store.StoreModels.RenameDelivery; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionMutationCommand; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels.AcceptanceVerdict; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ParkedOperation; +import com.alibaba.qwen.code.managedagent.model.StoreModels.RenameDelivery; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionMutationCommand; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.fasterxml.jackson.databind.ObjectMapper; @@ -482,7 +482,7 @@ class ManagedRenameReconciliationTest { private static void refused(Runnable call, String code) { assertThatThrownBy(call::run).isInstanceOfSatisfying( - ApiException.class, error -> { + ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()).isEqualTo(code); }); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedRuntimeRetentionRaceTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedRuntimeRetentionRaceTest.java index ac374c9b26b..221fe4ae6bd 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedRuntimeRetentionRaceTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedRuntimeRetentionRaceTest.java @@ -1,12 +1,11 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ManagedRuntimeRetentionGuard; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiRegistration; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiReservationStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceOperatorRecoveryStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceTestStorage; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.persistence.ManagedRuntimeRetentionGuard; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiRegistration; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiReservationStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceOperatorRecoveryStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceTestStorage; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeRetention; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; @@ -20,6 +19,7 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeSession; import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.ObjectMapper; import org.flywaydb.core.Flyway; import org.h2.jdbcx.JdbcDataSource; @@ -211,7 +211,7 @@ class ManagedRuntimeRetentionRaceTest { this.source = source; this.reference = reference; Flyway.configure().dataSource(source).locations("classpath:db/managed-schema").load().migrate(); - jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(source); + jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(source); WorkspaceTestStorage.register(jdbc, "tenant", "storage"); var manager = new DataSourceTransactionManager(source); if (reference == Reference.PUBLICATION || reference == Reference.CSI_RETIREMENT) { diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSchemaJournalAtomicityTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSchemaJournalAtomicityTest.java index aed17539176..35e5192cff7 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSchemaJournalAtomicityTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSchemaJournalAtomicityTest.java @@ -1,9 +1,9 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitResource; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitResource; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.JsonNodeFactory; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSchemaJournalMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSchemaJournalMySqlIT.java index 22020e32a52..7d9e9561120 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSchemaJournalMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSchemaJournalMySqlIT.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.IsolatedManagedSchemaMySqlTestDatabase; +import com.alibaba.qwen.code.managedagent.persistence.IsolatedManagedSchemaMySqlTestDatabase; import org.junit.jupiter.api.AfterEach; import javax.sql.DataSource; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionCommandRecordContractTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionCommandRecordContractTest.java index 70c75be4fc6..a8b8e03ce8c 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionCommandRecordContractTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionCommandRecordContractTest.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords.InvalidRecordException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords.InvalidRecordException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionLifecycleTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionLifecycleTest.java index 33e5cf18323..cfa89a1ca96 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionLifecycleTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionLifecycleTest.java @@ -2,21 +2,21 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.daemon.DaemonHttpException; import com.alibaba.qwen.code.managedagent.ManagedAgentServerIntegrationTest.FixtureHarness; -import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.api.AuthenticatedTenantActor; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentService; -import com.alibaba.qwen.code.managedagent.service.RequestDigests; -import com.alibaba.qwen.code.managedagent.service.RuntimeWarmer; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.AcquireWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.SealWriterRequest; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionMutationKind; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionMutationKind; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.AcquireWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.SealWriterRequest; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import com.fasterxml.jackson.databind.JsonNode; @@ -433,7 +433,7 @@ class ManagedSessionLifecycleTest { ManagedAgentService subject = new ManagedAgentService(store, new RequestDigests(), null, available, null); assertThatThrownBy(() -> subject.renameSession(tenant, null, "rename-closing", sessionId, "blocked")) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()).isEqualTo("session_operation_active"); }); @@ -492,7 +492,7 @@ class ManagedSessionLifecycleTest { assertThatThrownBy(() -> store.beginSessionMutation(tenant, "RENAME_SESSION", "key", "other-digest", target, SessionMutationKind.RENAME)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("idempotency_conflict")); } harness.rename(tenant, sessionId, "renamed"); @@ -550,7 +550,7 @@ class ManagedSessionLifecycleTest { harness.setAvailable(false); try { assertThatThrownBy(() -> subject.renameSession(tenant, null, "superseded", sessionId, "title")) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus().value()).isEqualTo(expectedStatus); assertThat(error.getCode()).isEqualTo(expectedStatus == 409 ? "session_mutation_superseded" : "hosted_harness_unavailable"); @@ -570,7 +570,7 @@ class ManagedSessionLifecycleTest { ManagedAgentService subject = new ManagedAgentService(store, new RequestDigests(), null, unavailable, null); assertThatThrownBy(() -> subject.renameSession(tenant, null, "refused", sessionId, "new title")) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.SERVICE_UNAVAILABLE); assertThat(error.getCode()).isEqualTo(disabled ? "hosted_harness_disabled" : "hosted_harness_unavailable"); @@ -597,12 +597,12 @@ class ManagedSessionLifecycleTest { var held = jdbc.queryForMap("SELECT target_revision, attempt_count, phase FROM ma_operation WHERE operation_kind = 'RENAME'" + " AND tenant_id = ? AND session_id = ?", tenant, sessionId); assertThat(held.get("phase")).isEqualTo("PREPARING"); - var candidate = new com.alibaba.qwen.code.managedagent.store.StoreModels.RenameDelivery(tenant, sessionId, + var candidate = new com.alibaba.qwen.code.managedagent.model.StoreModels.RenameDelivery(tenant, sessionId, "inline", "new title", ((Number) held.get("target_revision")).longValue(), ((Number) held.get("attempt_count")).intValue()); assertThat(store.claimRename(candidate, "peer", Duration.ofMinutes(1))).isEmpty(); assertThatThrownBy(() -> subject.renameSession(tenant, null, "inline", sessionId, "new title")) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getStatus()).isEqualTo(HttpStatus.SERVICE_UNAVAILABLE)); assertThat(store.findCommand(tenant, "RENAME_SESSION", "inline").orElseThrow().status()).isEqualTo("PENDING"); return new HarnessConnector.Attachment(FixtureHarness.BOOT_ID); @@ -668,9 +668,9 @@ class ManagedSessionLifecycleTest { var second = store.beginSessionRename(tenant, "k2", "digest-b", sessionId, "B"); store.completeSessionRename(tenant, "k2", sessionId, "B", boot, second.renameRevision()); assertThatThrownBy(() -> store.completeSessionRename(tenant, "k1", sessionId, "A", boot, first.renameRevision())) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("session_mutation_superseded")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("session_mutation_superseded")); assertThatThrownBy(() -> store.beginSessionRename(tenant, "k1", "digest-a", sessionId, "A")) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("session_mutation_superseded")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("session_mutation_superseded")); assertThat(store.requireSession(tenant, sessionId).title()).isEqualTo("B"); var latest = store.beginSessionRename(tenant, "k3", "digest-c", sessionId, "A"); assertThat(latest.renameRevision()).isGreaterThan(second.renameRevision()); @@ -683,7 +683,7 @@ class ManagedSessionLifecycleTest { store.retryRename(latestDelivery, "latest-owner", 0); assertThatThrownBy(() -> store.beginOperation(tenant, sessionId, OperationKind.CLOSE, "", "close", "close-digest")) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("session_operation_active")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("session_operation_active")); var candidate = store.deliverableRenames(Long.MAX_VALUE).stream() .filter(delivery -> delivery.sessionId().equals(sessionId)).findFirst().orElseThrow(); var claimed = store.claimRename(candidate, "replica-b", Duration.ofMinutes(1)).orElseThrow(); @@ -735,7 +735,7 @@ class ManagedSessionLifecycleTest { assertThatThrownBy(() -> store.completeSessionMutation(tenant, "RENAME_SESSION", "k1", sessionId, SessionMutationKind.RENAME, "A", bootId)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("session_mutation_superseded")); assertThat(store.requireSession(tenant, sessionId).title()).isEqualTo("B"); @@ -840,7 +840,7 @@ class ManagedSessionLifecycleTest { assertThatThrownBy(() -> store.beginSessionMutation(tenant, "RENAME_SESSION", "other", "other-digest", sessionId, SessionMutationKind.RENAME)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("session_operation_active")); } @@ -864,7 +864,7 @@ class ManagedSessionLifecycleTest { }).when(faulted).requireSession(tenant, sessionId); } else if ("completion".equals(phase)) { doThrow(new IllegalStateException("completion unavailable")) - .when(faulted).completeSessionRename(any(com.alibaba.qwen.code.managedagent.store.StoreModels.RenameDelivery.class), + .when(faulted).completeSessionRename(any(com.alibaba.qwen.code.managedagent.model.StoreModels.RenameDelivery.class), anyString(), anyString()); } else { doThrow(new IllegalStateException("cleanup unavailable")) @@ -889,7 +889,7 @@ class ManagedSessionLifecycleTest { try { assertThatThrownBy(() -> subject.renameSession(tenant, null, "key", sessionId, "renamed")) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.SERVICE_UNAVAILABLE); assertThat(error.getCode()).isEqualTo("hosted_harness_unavailable"); }); @@ -937,7 +937,7 @@ class ManagedSessionLifecycleTest { .noneMatch(delivery -> sessionId.equals(delivery.sessionId())); try { assertThatThrownBy(() -> subject.renameSession(tenant, null, "key", sessionId, "renamed")) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); } finally { harness.setAvailable(true); } @@ -946,7 +946,7 @@ class ManagedSessionLifecycleTest { // Reconcile the original Harness result, retaining its owner and generation. assertThat(harness.title(sessionId)).isEqualTo("renamed"); var original = jdbc.queryForMap("SELECT " + ManagedSchemaProjection.OPERATION.columns() + " FROM ma_operation WHERE operation_kind = 'RENAME' AND tenant_id = ? AND session_id = ?", tenant, sessionId); - var delivery = new com.alibaba.qwen.code.managedagent.store.StoreModels.RenameDelivery(tenant, sessionId, + var delivery = new com.alibaba.qwen.code.managedagent.model.StoreModels.RenameDelivery(tenant, sessionId, "key", "renamed", ((Number) original.get("target_revision")).longValue(), ((Number) original.get("attempt_count")).intValue(), ((Number) original.get("claim_generation")).longValue()); new TransactionTemplate(transactionManager).execute(ignored -> store.completeSessionRename(delivery, @@ -979,7 +979,7 @@ class ManagedSessionLifecycleTest { new IllegalStateException("completion unavailable"); // The rename flow persists through the dedicated completion call; a // store fault there used to surface as a bare 503 with no log line. - doThrow(failure).when(faulted).completeSessionRename(any(com.alibaba.qwen.code.managedagent.store.StoreModels.RenameDelivery.class), + doThrow(failure).when(faulted).completeSessionRename(any(com.alibaba.qwen.code.managedagent.model.StoreModels.RenameDelivery.class), anyString(), anyString()); ManagedAgentService subject = new ManagedAgentService(faulted, new RequestDigests(), null, harness, null); @@ -994,7 +994,7 @@ class ManagedSessionLifecycleTest { try { assertThatThrownBy(() -> subject.renameSession(tenant, null, "key", sessionId, "renamed")) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getCode()) .isEqualTo("hosted_harness_unavailable"); assertThat(error.getCause()).isSameAs(failure); @@ -1031,7 +1031,7 @@ class ManagedSessionLifecycleTest { try { assertThatThrownBy(() -> subject.renameSession(tenant, null, "key", sessionId, "renamed")) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getCode()) .isEqualTo("hosted_harness_unavailable"); assertThat(error.getCause()) diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionMessageRecordContractTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionMessageRecordContractTest.java index 8a47855b753..b4e144255b3 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionMessageRecordContractTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionMessageRecordContractTest.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords.InvalidRecordException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords.InvalidRecordException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionMessageStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionMessageStoreTest.java index 8f3e880d1dc..36eccf42601 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionMessageStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionMessageStoreTest.java @@ -1,12 +1,12 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentService; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitResource; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitTransactionRequest; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitResource; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitTransactionRequest; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -595,7 +595,7 @@ class ManagedSessionMessageStoreTest { String message, ThrowingCallable commit) { long revisions = revisions(sessionId); assertThatThrownBy(commit).as(label) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getCode()).as(label).isEqualTo(code); if (message != null) { assertThat(error.getStatus()).as(label) diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionOperationMigrationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionOperationMigrationTest.java index 405bbbf1bf3..c5d604f10ff 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionOperationMigrationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionOperationMigrationTest.java @@ -1,9 +1,9 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.fasterxml.jackson.databind.ObjectMapper; import org.h2.jdbcx.JdbcDataSource; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionOperationStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionOperationStoreTest.java index cedbf1d8db8..88ed517dec8 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionOperationStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionOperationStoreTest.java @@ -1,15 +1,15 @@ package com.alibaba.qwen.code.managedagent; -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.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationTarget; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationTarget; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; @@ -206,7 +206,7 @@ class ManagedSessionOperationStoreTest { // and the open-operation barrier blocks the delete. assertThatThrownBy(() -> store.beginOperation(TENANT, sessionId, OperationKind.DELETE, "", "delete", "digest")) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("session_operation_active")); } @@ -432,7 +432,7 @@ class ManagedSessionOperationStoreTest { "close", "digest-a"); assertThatThrownBy(() -> store.beginOperation(TENANT, sessionId, OperationKind.CLOSE, "", "close", "digest-b")) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("idempotency_conflict")); } @@ -470,7 +470,7 @@ class ManagedSessionOperationStoreTest { assertThat(operation(store, sessionId, operation.operationId()).state()).isEqualTo("UNKNOWN"); assertThat(store.beginOperation(TENANT, sessionId, OperationKind.CLOSE, "", "close", "digest").replayed()).isTrue(); assertThatThrownBy(() -> store.beginOperation(TENANT, sessionId, OperationKind.DELETE, "", "delete", "digest")) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); } private ManagedAgentStore store() { diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionOwnerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionOwnerTest.java index dd31d728759..e979c48dc1e 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionOwnerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionOwnerTest.java @@ -1,9 +1,9 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.ObjectMapper; import org.flywaydb.core.Flyway; @@ -27,7 +27,7 @@ class ManagedSessionOwnerTest { source.setURL("jdbc:h2:mem:session-owner-" + UUID.randomUUID() + ";MODE=MySQL;DB_CLOSE_DELAY=-1;DATABASE_TO_LOWER=TRUE"); Flyway.configure().dataSource(source).locations("classpath:db/managed-schema").load().migrate(); - JdbcTemplate jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(source); + JdbcTemplate jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(source); jdbc.update("INSERT INTO ma_workspace (tenant_id," + " workspace_id, workspace_generation, storage_id," + " display_name, config_ref, policy_ref, state) VALUES" diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionStoreBindingTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionStoreBindingTest.java index 6bdeabb47d8..7970946a135 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionStoreBindingTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionStoreBindingTest.java @@ -1,8 +1,8 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; -import com.alibaba.qwen.code.managedagent.store.WriterCredentialPolicy; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.security.WriterCredentialPolicy; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionStoreContractFixtureTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionStoreContractFixtureTest.java index d9d11d895a1..c759d4a2e6f 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionStoreContractFixtureTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionStoreContractFixtureTest.java @@ -1,8 +1,8 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionStoreIntegrationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionStoreIntegrationTest.java index 30e73a6d3ed..12ae8143135 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionStoreIntegrationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionStoreIntegrationTest.java @@ -1,14 +1,14 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore.TaskRow; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore.TaskRow; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; @@ -175,7 +175,7 @@ class ManagedSessionStoreIntegrationTest { jdbc.update("UPDATE ma_resource SET inline_bytes = ? WHERE tenant_id = ? AND session_id = ? AND resource_id = ?", "[]".getBytes(StandardCharsets.UTF_8), TENANT, session, published.resourceId()); org.assertj.core.api.Assertions.assertThatThrownBy(() -> sessionStore.readResource(TENANT, - WORKSPACE, session, published.resourceId(), TOKEN_A)).isInstanceOfSatisfying(com.alibaba.qwen.code.managedagent.api.ApiException.class, + WORKSPACE, session, published.resourceId(), TOKEN_A)).isInstanceOfSatisfying(com.alibaba.qwen.code.managedagent.exception.ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_resource_corrupt")); org.assertj.core.api.Assertions.assertThatThrownBy(() -> sessionStore.publishAgentSkills(TENANT, WORKSPACE, session, skills)).isInstanceOf(RuntimeException.class); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionStoreProcessFixtureMain.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionStoreProcessFixtureMain.java index 7c64db40f10..3e103520965 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionStoreProcessFixtureMain.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedSessionStoreProcessFixtureMain.java @@ -1,15 +1,15 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.AcquireWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitReceipt; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitResource; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitTransactionRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.RestoreHead; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.StoredResource; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.WriterGrant; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.AcquireWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitReceipt; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitResource; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitTransactionRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.RestoreHead; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.StoredResource; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.WriterGrant; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DataSourceTransactionManager; @@ -49,7 +49,7 @@ public final class ManagedSessionStoreProcessFixtureMain { TransactionTemplate transactions = new TransactionTemplate( new DataSourceTransactionManager(dataSource)); ManagedSessionStore store = new ManagedSessionStore( - new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource)); + new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource)); String action = required("D1_PROCESS_ACTION"); switch (action) { case "commit-and-crash" -> commitAndCrash(store, transactions); @@ -74,8 +74,8 @@ public final class ManagedSessionStoreProcessFixtureMain { try { receipt = inTransaction(transactions, () -> store.commit(TENANT, SESSION, TOKEN_A, genesis())); - } catch (ApiException error) { - JdbcTemplate jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(new DriverManagerDataSource( + } catch (ManagedAgentException error) { + JdbcTemplate jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(new DriverManagerDataSource( required("D1_MYSQL_URL"), required("D1_MYSQL_USER"), System.getenv().getOrDefault("D1_MYSQL_PASSWORD", ""))); Map head = jdbc.queryForMap( @@ -119,7 +119,7 @@ public final class ManagedSessionStoreProcessFixtureMain { inTransaction(transactions, () -> store.commit(TENANT, SESSION, TOKEN_A, staleTurn())); - } catch (ApiException error) { + } catch (ManagedAgentException error) { require(ManagedSessionStoreModels.ERROR_WRITER_CONFLICT .equals(error.getCode()), "the stale writer returned an unexpected error"); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTaskCancelOperationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTaskCancelOperationTest.java index a490a230cfd..267027f9d73 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTaskCancelOperationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTaskCancelOperationTest.java @@ -1,21 +1,21 @@ package com.alibaba.qwen.code.managedagent; -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.AgentStateStore.TaskCancelOutcome; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.AcceptanceVerdict; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationAdmission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationTarget; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ParkedOperation; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels.AcceptanceVerdict; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationAdmission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ParkedOperation; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore.TaskCancelOutcome; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; @@ -343,7 +343,7 @@ class ManagedTaskCancelOperationTest { competition.executeWithoutResult(ignored -> begin(key, "digest-" + key, RUNNING_CHILD)); outcomes.add("admitted"); - } catch (ApiException error) { + } catch (ManagedAgentException error) { outcomes.add(error.getCode()); } catch (Exception error) { outcomes.add(error.getClass().getSimpleName()); @@ -568,7 +568,7 @@ class ManagedTaskCancelOperationTest { private static void refused(Runnable call, HttpStatus status, String code) { assertThatThrownBy(call::run).isInstanceOfSatisfying( - ApiException.class, error -> { + ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(status); assertThat(error.getCode()).isEqualTo(code); }); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTaskEventJournalTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTaskEventJournalTest.java index e90ddb37b3f..21239770460 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTaskEventJournalTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTaskEventJournalTest.java @@ -1,10 +1,10 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedTaskEventStore; -import com.alibaba.qwen.code.managedagent.store.ManagedTaskEventStore.EventPage; -import com.alibaba.qwen.code.managedagent.store.ManagedTaskEventStore.TaskEvent; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedTaskEventStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedTaskEventStore.EventPage; +import com.alibaba.qwen.code.managedagent.persistence.ManagedTaskEventStore.TaskEvent; import com.fasterxml.jackson.databind.JsonNode; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -168,7 +168,7 @@ class ManagedTaskEventJournalTest { events.expireThrough(TENANT, sessionId, taskId, outputSequence - 1); assertThatThrownBy(() -> events.expireThrough(TENANT, sessionId, taskId, outputSequence)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()) .isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()).isEqualTo( @@ -210,7 +210,7 @@ class ManagedTaskEventJournalTest { // ...and the next accepted event is a refusal, never a silent drop. assertThatThrownBy(() -> events.appendStateChange(TENANT, sessionId, taskId, "running", "ready", 0)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo( ManagedTaskEventStore.CODE_BACKLOG_FULL)); // Archival plus an explicit expiry reopens admission. @@ -274,12 +274,12 @@ class ManagedTaskEventJournalTest { .doesNotHaveDuplicates(); assertThatThrownBy(() -> events.appendArtifact(TENANT, sessionId, taskId, "artifact-100", 100)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo( ManagedTaskEventStore.CODE_ADMISSION_REFUSED)); assertThatThrownBy(() -> events.appendArtifact(TENANT, sessionId, taskId, "artifact-0", 101)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo( ManagedTaskEventStore.CODE_ADMISSION_REFUSED)); // No reference aged out to admit another. @@ -294,13 +294,13 @@ class ManagedTaskEventJournalTest { String taskId = "task_" + "cc".repeat(32); assertThatThrownBy(() -> events.appendOutput(TENANT, plain, taskId, "x", false, null, null, null, null, 0)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo( ManagedTaskEventStore.CODE_ADMISSION_REFUSED)); // Includes a task whose output would go only to Artifacts. assertThatThrownBy(() -> events.appendArtifact(TENANT, plain, taskId, "artifact-1", 0)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo( ManagedTaskEventStore.CODE_ADMISSION_REFUSED)); String deleting = session(true); @@ -309,7 +309,7 @@ class ManagedTaskEventJournalTest { deleting); assertThatThrownBy(() -> events.appendOutput(TENANT, deleting, taskId, "x", false, null, null, null, null, 0)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo( ManagedTaskEventStore.CODE_ADMISSION_REFUSED)); } @@ -320,22 +320,22 @@ class ManagedTaskEventJournalTest { String taskId = "task_" + "dd".repeat(32); assertThatThrownBy(() -> events.appendOutput(TENANT, sessionId, taskId, "", false, null, null, null, null, 0)) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); assertThatThrownBy(() -> events.appendOutput(TENANT, sessionId, taskId, "x".repeat(16385), false, null, null, null, null, 0)) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); events.appendOutput(TENANT, sessionId, taskId, "x".repeat(16384), true, null, null, null, null, 0); // The segment identity is all or nothing, with a half-open range. assertThatThrownBy(() -> events.appendOutput(TENANT, sessionId, taskId, "x", false, "capture-1", null, 0L, 1L, 0)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo( ManagedTaskEventStore.CODE_SEGMENT_CONFLICT)); assertThatThrownBy(() -> events.appendOutput(TENANT, sessionId, taskId, "x", false, "capture-1", "stdout", 1L, 1L, 0)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo( ManagedTaskEventStore.CODE_SEGMENT_CONFLICT)); } @@ -354,18 +354,18 @@ class ManagedTaskEventJournalTest { // An overlap or duplication against the published space refuses. assertThatThrownBy(() -> events.appendOutput(TENANT, sessionId, taskId, "zz", true, "capture-1", "stdout", 2L, 5L, 3)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo( ManagedTaskEventStore.CODE_SEGMENT_CONFLICT)); assertThatThrownBy(() -> events.appendOutput(TENANT, sessionId, taskId, "abcd", true, "capture-1", "stdout", 0L, 4L, 4)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo( ManagedTaskEventStore.CODE_SEGMENT_CONFLICT)); // A gap against the continuous space refuses as well. assertThatThrownBy(() -> events.appendOutput(TENANT, sessionId, taskId, "zz", true, "capture-1", "stdout", 10L, 12L, 5)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo( ManagedTaskEventStore.CODE_SEGMENT_CONFLICT)); // What committed joins: each stream's ranges are continuous and diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTeamRecordContractTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTeamRecordContractTest.java index c701a11b711..adcd911163e 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTeamRecordContractTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTeamRecordContractTest.java @@ -1,8 +1,8 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecords.InvalidRecordException; -import com.alibaba.qwen.code.managedagent.store.ManagedTeamRecords; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecords.InvalidRecordException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedTeamRecords; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTeamStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTeamStoreTest.java index 05a5c5bd889..21d44237360 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTeamStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTeamStoreTest.java @@ -1,10 +1,10 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitResource; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitResource; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; @@ -426,7 +426,7 @@ class ManagedTeamStoreTest { String message, ThrowingCallable commit) { long revisions = revisions(sessionId); assertThatThrownBy(commit).as(label) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getCode()).as(label).isEqualTo(code); if (message != null) { assertThat(error.getStatus()).as(label) diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedToolDetailsMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedToolDetailsMySqlIT.java index bc12e42fe16..1b59c5e87f6 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedToolDetailsMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedToolDetailsMySqlIT.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.IsolatedManagedSchemaMySqlTestDatabase; +import com.alibaba.qwen.code.managedagent.persistence.IsolatedManagedSchemaMySqlTestDatabase; import org.junit.jupiter.api.AfterEach; import javax.sql.DataSource; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTurnCommandOperationMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTurnCommandOperationMySqlIT.java index 38d12aec37e..598ae567b3f 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTurnCommandOperationMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTurnCommandOperationMySqlIT.java @@ -1,9 +1,9 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.IsolatedManagedSchemaMySqlTestDatabase; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.Admission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.Admission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.persistence.IsolatedManagedSchemaMySqlTestDatabase; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTurnCommandOperationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTurnCommandOperationTest.java index bf71b8e27e0..6c9abaed1dc 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTurnCommandOperationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTurnCommandOperationTest.java @@ -1,17 +1,17 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.AcceptanceVerdict; -import com.alibaba.qwen.code.managedagent.store.StoreModels.Admission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.HarnessEvent; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ParkedOperation; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ProjectedEvent; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels.AcceptanceVerdict; +import com.alibaba.qwen.code.managedagent.model.StoreModels.Admission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.HarnessEvent; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ParkedOperation; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ProjectedEvent; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.fasterxml.jackson.databind.ObjectMapper; @@ -530,7 +530,7 @@ class ManagedTurnCommandOperationTest { private static void refused(Runnable call, HttpStatus status, String code) { assertThatThrownBy(call::run).isInstanceOfSatisfying( - ApiException.class, error -> { + ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(status); assertThat(error.getCode()).isEqualTo(code); }); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTurnQueryTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTurnQueryTest.java index 4f9c77da0e6..f55b2225a22 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTurnQueryTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedTurnQueryTest.java @@ -3,9 +3,9 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.api.AuthenticatedTenantActor; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedWorkspaceAdmissionTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedWorkspaceAdmissionTest.java index ed86917020e..17a56b5ab8a 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedWorkspaceAdmissionTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedWorkspaceAdmissionTest.java @@ -1,26 +1,26 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.daemon.DaemonHttpException; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.CommandAdmission; -import com.alibaba.qwen.code.managedagent.api.ApiModels.InputBlock; import com.alibaba.qwen.code.managedagent.api.AuthenticatedTenantActor; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector.Attachment; import com.alibaba.qwen.code.managedagent.harness.UnavailableHarnessConnector; -import com.alibaba.qwen.code.managedagent.service.HarnessCoordinator; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentService; -import com.alibaba.qwen.code.managedagent.service.RequestDigests; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionMutationKind; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceToolProfiles; +import com.alibaba.qwen.code.managedagent.model.ApiModels.CommandAdmission; +import com.alibaba.qwen.code.managedagent.model.ApiModels.InputBlock; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionMutationKind; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.session.HarnessCoordinator; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; @@ -158,7 +158,7 @@ class ManagedWorkspaceAdmissionTest { var projection = new ManagedAgentService(admitted, new RequestDigests(), mock(HarnessCoordinator.class), new UnavailableHarnessConnector(), registry); assertThat(projection.getPublicSession(tenant, "actor-a", first.sessionId()).capabilities().foregroundShell()).isNull(); - var lineage = new com.alibaba.qwen.code.managedagent.store.StoreModels.SessionLineage( + var lineage = new com.alibaba.qwen.code.managedagent.model.StoreModels.SessionLineage( first.sessionId(), first.sessionId(), "member-run", 1); var child = transaction.execute(status -> admitted.insertChildSessionCommand(tenant, first.sessionId(), "member-create", "member-digest", "member", List.of(), null, lineage)); @@ -169,7 +169,7 @@ class ManagedWorkspaceAdmissionTest { jdbc.update("UPDATE ma_turn SET status = 'COMPLETED' WHERE tenant_id = ? AND session_id = ?", tenant, first.sessionId()); var close = transaction.execute(status -> admitted.beginWorkspaceLifecycle(tenant, first.sessionId(), - com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind.CLOSE, + com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind.CLOSE, "actor-a", "actor-digest", "close-lead", "close-digest", true, 0)); assertThat(close.operation().lifecycleProtocolVersion()).isZero(); } @@ -198,7 +198,7 @@ class ManagedWorkspaceAdmissionTest { assertThatThrownBy(() -> new TransactionTemplate(transactionManager).execute(status -> defensive.insertInternalTeamLeadSessionCommand(tenant, "actor-a", "internal", "digest", null, new WorkspaceSelection("ws-lead", ".")))) - .isInstanceOfAny(ApiException.class, com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException.class); + .isInstanceOfAny(ManagedAgentException.class, com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException.class); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_session WHERE tenant_id = ?", Integer.class, tenant)).isZero(); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_request_receipt WHERE namespace = 'SESSION_CREATE_ACTOR' AND tenant_id = ?", @@ -305,7 +305,7 @@ class ManagedWorkspaceAdmissionTest { @Override public boolean isWorkspaceFilesAvailable() { return true; } }; - var coordinator = mock(com.alibaba.qwen.code.managedagent.service.HarnessCoordinator.class); + var coordinator = mock(com.alibaba.qwen.code.managedagent.session.HarnessCoordinator.class); ManagedAgentService admitted = new ManagedAgentService(enabled, new RequestDigests(), coordinator, harness, registry); List input = List.of(new InputBlock("text", "go")); var original = transaction.execute(status -> admitted.submitTurn(tenant, "actor-a", "original", session, input)); @@ -319,9 +319,9 @@ class ManagedWorkspaceAdmissionTest { assertThat(transaction.execute(status -> stopped.submitTurn(tenant, "actor-a", "original", session, input)).turnId()) .isEqualTo(original.turnId()); assertThatThrownBy(() -> transaction.execute(status -> stopped.submitTurn(tenant, "actor-a", "fresh", session, input))) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_unavailable")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_unavailable")); assertThatThrownBy(() -> stopped.submitTurn(tenant, "reader", "original", session, input)) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); var capabilities = stopped.getWebShellSession(tenant, "actor-a", session).capabilities(); assertThat(capabilities.workspaceTurns()).isTrue(); assertThat(capabilities.foregroundShell()).isFalse(); @@ -336,14 +336,14 @@ class ManagedWorkspaceAdmissionTest { Integer.class, tenant, session)).isEqualTo(1); for (String state : List.of("ACTIVE", "CLOSED", "ARCHIVED")) { jdbc.update("UPDATE ma_session SET status = ? WHERE tenant_id = ? AND session_id = ?", state, tenant, session); - for (var kind : List.of(com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind.CLOSE, - com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind.ARCHIVE, - com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind.DELETE)) { + for (var kind : List.of(com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind.CLOSE, + com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind.ARCHIVE, + com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind.DELETE)) { assertThatThrownBy(() -> transaction.execute(status -> disabled.beginWorkspaceLifecycle(tenant, session, - kind, "actor-a", digest, state + kind, digest, true, 1))).isInstanceOf(ApiException.class); + kind, "actor-a", digest, state + kind, digest, true, 1))).isInstanceOf(ManagedAgentException.class); } assertThatThrownBy(() -> transaction.execute(status -> disabled.unarchiveWorkspaceSession(tenant, session, - "actor-a", "unarchive-" + state, digest))).isInstanceOf(ApiException.class); + "actor-a", "unarchive-" + state, digest))).isInstanceOf(ManagedAgentException.class); var read = stopped.getPublicSession(tenant, "actor-a", session).capabilities(); assertThat(read.sessionArchive()).isFalse(); assertThat(read.sessionUnarchive()).isFalse(); @@ -769,7 +769,7 @@ class ManagedWorkspaceAdmissionTest { .andExpect(status().isNotFound()); assertThatThrownBy(() -> service.renameSession(tenant, "actor-a", "invalid-rename", sessionId, "")) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("session_not_found")); } @@ -824,20 +824,20 @@ class ManagedWorkspaceAdmissionTest { transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.submitTurn(tenant, "actor-b", "submit", sessionId, input)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_unavailable"))); transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.submitTurn(tenant, "actor-b", "submit", sessionId, List.of(new InputBlock("text", "other")))) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_unavailable"))); transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.submitTurn(tenant, "actor-c", "submit", sessionId, input)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("session_not_found"))); } @@ -918,13 +918,13 @@ class ManagedWorkspaceAdmissionTest { transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.renameSession(tenant, "actor-b", "rename", sessionId, "new title")) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("session_not_found"))); transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.renameSession(tenant, "actor-c", "rename", sessionId, "new title")) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("session_not_found"))); } @@ -1004,7 +1004,7 @@ class ManagedWorkspaceAdmissionTest { transaction.executeWithoutResult(status -> assertThatThrownBy( () -> service.renameSession(tenant, "actor-z", key, sessionId, title)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()) .isEqualTo(HttpStatus.NOT_FOUND); assertThat(error.getCode()) @@ -1051,7 +1051,7 @@ class ManagedWorkspaceAdmissionTest { transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.renameSession(tenant, "actor-b", "rename", sessionY, "new title")) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getCode()) .isEqualTo("idempotency_conflict"); assertThat(error.getStatus()) @@ -1105,7 +1105,7 @@ class ManagedWorkspaceAdmissionTest { transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.renameSession(tenant, "actor-b", "rename", sessionId, "new title")) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()) .isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) @@ -1163,7 +1163,7 @@ class ManagedWorkspaceAdmissionTest { transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.renameSession(tenant, "actor-b", "rename", sessionId, "other title")) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()) .isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) @@ -1195,7 +1195,7 @@ class ManagedWorkspaceAdmissionTest { .workspace().getWorkspaceId()).isEqualTo("ws-b"); assertThatThrownBy(() -> store.replayWorkspaceSessionCommand(tenant, "actor-a", "key", "sha256:" + "b".repeat(64))) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("idempotency_conflict")); } @@ -1221,7 +1221,7 @@ class ManagedWorkspaceAdmissionTest { assertThatThrownBy(() -> upgraded.insertWorkspaceSessionCommand( tenant, "actor-a", "new-key", digest, "qwen-code", "1", null, List.of(), null, selection)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("unsupported_feature")); } @@ -1237,7 +1237,7 @@ class ManagedWorkspaceAdmissionTest { assertThatThrownBy(() -> store.insertWorkspaceSessionCommand( tenant, "actor-a", "nonempty", "digest", "qwen-code", null, null, input, "payload", selection)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_unavailable")); var created = store.insertWorkspaceSessionCommand(tenant, "actor-a", @@ -1246,24 +1246,24 @@ class ManagedWorkspaceAdmissionTest { String sessionId = created.sessionId(); assertThatThrownBy(() -> store.insertTurnCommand(tenant, "SUBMIT", "turn", "digest", sessionId, input, "payload")) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_unavailable")); assertThatThrownBy(() -> store.insertCancelCommand(tenant, "CANCEL", "cancel", "digest", sessionId, "turn-id")) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_unavailable")); assertThatThrownBy(() -> store.beginSessionMutation(tenant, "RENAME", "rename", "digest", sessionId, SessionMutationKind.RENAME)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_unavailable")); assertThatThrownBy(() -> store.completeSessionMutation(tenant, "RENAME", "rename", sessionId, SessionMutationKind.RENAME, "new title", "boot")) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_unavailable")); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM" + " ma_turn WHERE tenant_id = ?", @@ -1383,7 +1383,7 @@ class ManagedWorkspaceAdmissionTest { gated.beginSessionMutation(tenant, "UNARCHIVE_SESSION", "unarchive-1", digest, sessionId, SessionMutationKind.UNARCHIVE))) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_unavailable")); // Rename is the one lifecycle-adjacent mutation the enabled store @@ -1455,7 +1455,7 @@ class ManagedWorkspaceAdmissionTest { assertThatThrownBy(() -> enabled.submitTurn(tenant, "actor-a", "later", driftedId, List.of(new InputBlock("text", "go")))) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_unavailable")); // The same shape on the frozen profile with the qwen-code agent @@ -1529,7 +1529,7 @@ class ManagedWorkspaceAdmissionTest { transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.renameSession(tenant, "actor-a", "rename-1", sessionId, "first")) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()) .isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) @@ -1543,7 +1543,7 @@ class ManagedWorkspaceAdmissionTest { transaction.executeWithoutResult(status -> assertThatThrownBy(() -> gated.beginWorkspaceClose(tenant, sessionId, "actor-a", "actor-digest", "close-while-rename-pending", digest, true)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("session_operation_active"))); assertThat(jdbc.queryForObject("SELECT state FROM ma_request_receipt WHERE namespace = 'SESSION_COMMAND'" + " AND tenant_id = ? AND operation = 'RENAME_SESSION' AND idempotency_key = ?", @@ -1564,7 +1564,7 @@ class ManagedWorkspaceAdmissionTest { transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.renameSession(tenant, "actor-a", "rename-2", sessionId, "second")) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_unavailable"))); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_request_receipt WHERE namespace = 'SESSION_COMMAND'" + " AND tenant_id = ? AND operation = 'RENAME_SESSION' AND idempotency_key = ?", @@ -1644,7 +1644,7 @@ class ManagedWorkspaceAdmissionTest { transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.renameSession(tenant, "actor-a", "rename-1", sessionId, "first")) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()) .isEqualTo(HttpStatus.SERVICE_UNAVAILABLE); assertThat(error.getCode()) @@ -1708,7 +1708,7 @@ class ManagedWorkspaceAdmissionTest { workspace, digest, "qwen-code", null, null, input, digest, new WorkspaceSelection(workspace, ".")))); assertThat(thrown).as(workspace) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { // The store's message, not the registry's "Workspace is // unavailable.", ties the refusal to the store guard. assertThat(error.getMessage()).isEqualTo( @@ -1841,7 +1841,7 @@ class ManagedWorkspaceAdmissionTest { "legacy-digest", "qwen-code", null, null, List.of(), null); } return "created"; - } catch (ApiException error) { + } catch (ManagedAgentException error) { return error.getCode(); } })).toList(); @@ -2320,7 +2320,7 @@ class ManagedWorkspaceAdmissionTest { } private static void assertRefused(ThrowingCallable call, String code) { - assertThatThrownBy(call).isInstanceOfSatisfying(ApiException.class, + assertThatThrownBy(call).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo(code)); } @@ -2328,7 +2328,7 @@ class ManagedWorkspaceAdmissionTest { String expected) { assertThatThrownBy(() -> store.insertWorkspaceSessionCommand(tenant, "actor-a", "key", "digest", "qwen-code", null, null, List.of(), null, - selection)).isInstanceOfSatisfying(ApiException.class, error -> + selection)).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo(expected)); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedWorkspaceRolesMigrationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedWorkspaceRolesMigrationTest.java index b9b6f319ee7..1d4f3a9f981 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedWorkspaceRolesMigrationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ManagedWorkspaceRolesMigrationTest.java @@ -1,10 +1,10 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.fasterxml.jackson.databind.ObjectMapper; import org.h2.jdbcx.JdbcDataSource; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/PublicationJournalFixture.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/PublicationJournalFixture.java index 8d25e5b869e..e6ad3270785 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/PublicationJournalFixture.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/PublicationJournalFixture.java @@ -1,12 +1,11 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationContract; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiRegistration; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiReservationStore; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationContract; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiRegistration; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiReservationStore; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; @@ -18,6 +17,7 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeScope; import com.alibaba.qwen.code.runtimebroker.RuntimeSession; import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -75,7 +75,7 @@ public final class PublicationJournalFixture { private PublicationJournalFixture(DataSource source, boolean journalHeadAuthorization) { - jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(source); + jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(source); manager = new DataSourceTransactionManager(source); sessions = new ManagedSessionStore(jdbc); bindings = new JdbcRuntimeBindingRepository(source, diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/RuntimeBrokerBracketKeyBindingTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/RuntimeBrokerBracketKeyBindingTest.java index 796d7d8e5e6..d2acb9f5ea8 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/RuntimeBrokerBracketKeyBindingTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/RuntimeBrokerBracketKeyBindingTest.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import org.junit.jupiter.api.Test; import org.springframework.boot.context.properties.bind.Binder; import org.springframework.boot.env.YamlPropertySourceLoader; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/RuntimeBrokerConfigurationIntegrationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/RuntimeBrokerConfigurationIntegrationTest.java index b4801825717..ecc285d9533 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/RuntimeBrokerConfigurationIntegrationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/RuntimeBrokerConfigurationIntegrationTest.java @@ -1,15 +1,15 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; -import com.alibaba.qwen.code.managedagent.service.RuntimeWarmer; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRepository; -import com.alibaba.qwen.code.runtimebroker.SecretProtector; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRepository; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.security.SecretProtector; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/RuntimeBrokerDefaultOnTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/RuntimeBrokerDefaultOnTest.java index 952d7f620af..540b27c5ba5 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/RuntimeBrokerDefaultOnTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/RuntimeBrokerDefaultOnTest.java @@ -1,8 +1,8 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; -import com.alibaba.qwen.code.managedagent.service.RuntimeWarmer; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/RuntimeBrokerFlywaySchemaTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/RuntimeBrokerFlywaySchemaTest.java index 558d3d586c7..94df801b7b8 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/RuntimeBrokerFlywaySchemaTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/RuntimeBrokerFlywaySchemaTest.java @@ -1,9 +1,9 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.runtimebroker.JdbcRepositoryContract; -import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBrokerSchema; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; +import com.alibaba.qwen.code.runtimebroker.managedschema.JdbcRuntimeBrokerSchema; import org.assertj.core.api.SoftAssertions; import org.flywaydb.core.Flyway; import org.flywaydb.core.api.MigrationVersion; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/SessionMessageRelayStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/SessionMessageRelayStoreTest.java index d0db6829fd6..82f867221fa 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/SessionMessageRelayStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/SessionMessageRelayStoreTest.java @@ -1,10 +1,10 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore.JournalTurns; -import com.alibaba.qwen.code.managedagent.store.SessionMessageRelayStore; -import com.alibaba.qwen.code.managedagent.store.SessionMessageRelayStore.MessageRow; -import com.alibaba.qwen.code.managedagent.store.SessionMessageRelayStore.PendingMessage; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore.JournalTurns; +import com.alibaba.qwen.code.managedagent.persistence.SessionMessageRelayStore; +import com.alibaba.qwen.code.managedagent.persistence.SessionMessageRelayStore.MessageRow; +import com.alibaba.qwen.code.managedagent.persistence.SessionMessageRelayStore.PendingMessage; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -70,8 +70,8 @@ class SessionMessageRelayStoreTest { + " first_sequence)" + " VALUES (?, ?, ?, 'workspace', ?, ?, ?," + " 'h', 1, ?, 'session', ?, ?, ?)", - com.alibaba.qwen.code.managedagent.store.ManagedSessionStore.sessionScopeKey(TENANT, sessionId), - com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection.recordKey(sessionId, domain, recordId), TENANT, sessionId, domain, + com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore.sessionScopeKey(TENANT, sessionId), + com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection.recordKey(sessionId, domain, recordId), TENANT, sessionId, domain, recordId, resource, state, sequence, sequence); } @@ -87,7 +87,7 @@ class SessionMessageRelayStoreTest { } private void session(String sessionId, String status) { - String scope = com.alibaba.qwen.code.managedagent.store.ManagedSessionStore.sessionScopeKey(TENANT, sessionId); + String scope = com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore.sessionScopeKey(TENANT, sessionId); jdbc.update("INSERT INTO ma_session (tenant_id, session_id, tenant_key, session_key, session_scope_key, agent_id, status," + " gmt_create, gmt_modified) VALUES (?, ?, ?, ?, ?, 'qwen-code', ?, 0, 0)" + " ON DUPLICATE KEY UPDATE status = VALUES(status)", TENANT, sessionId, @@ -96,7 +96,7 @@ class SessionMessageRelayStoreTest { } private void resource(String sessionId, String resourceId, byte[] bytes) { - String scope = com.alibaba.qwen.code.managedagent.store.ManagedSessionStore.sessionScopeKey(TENANT, sessionId); + String scope = com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore.sessionScopeKey(TENANT, sessionId); jdbc.update("INSERT INTO ma_resource (resource_key, session_scope_key, tenant_id, workspace_id, session_id, resource_id, kind, schema_version, byte_length, sha256, storage_kind, inline_bytes, publish_command_id, state, gmt_create) VALUES (?, ?, ?, 'workspace', ?, ?, 'managed-message', 1, ?, ?, 'MYSQL_INLINE', ?, 'command', 'REFERENCED', " + ManagedSchemaTime.SQL_NOW + ")", com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys.key(scope, resourceId), scope, TENANT, sessionId, resourceId, bytes.length, "a".repeat(64), bytes); @@ -331,7 +331,7 @@ class SessionMessageRelayStoreTest { message(sender, "msg_a_second", "planned", outbound("to_child", "r")); jdbc.update("UPDATE ma_session_record SET gmt_create = 5" + " WHERE session_scope_key = ?", - com.alibaba.qwen.code.managedagent.store.ManagedSessionStore + com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore .sessionScopeKey(TENANT, sender)); assertThat(store.findPendingMessages("owner-a", 1_000, 50).stream() .filter(entry -> entry.senderSessionId().equals(sender)) @@ -475,8 +475,8 @@ class SessionMessageRelayStoreTest { + " VALUES (?, ?, ?, 'workspace', ?," + " 'session_message', 'msg_x', 'h', 1, 'missing'," + " 'session', 'planned', 1)", - com.alibaba.qwen.code.managedagent.store.ManagedSessionStore.sessionScopeKey(TENANT, parent), - com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection.recordKey(parent, "session_message", "msg_x"), TENANT, parent); + com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore.sessionScopeKey(TENANT, parent), + com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection.recordKey(parent, "session_message", "msg_x"), TENANT, parent); assertThatThrownBy(() -> records.edgeMessages(TENANT, parent, "run-1", UUID.randomUUID().toString())) .isInstanceOf(IllegalStateException.class); 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 4ce35c6fde2..1f3525c3cfd 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 @@ -7,17 +7,17 @@ import com.alibaba.qwen.code.managedagent.api.SurfaceRegistry.RuleClass; import com.alibaba.qwen.code.managedagent.api.SurfaceRegistry.Surface; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; import com.alibaba.qwen.code.managedagent.api.ToolPublicationController; +import com.alibaba.qwen.code.managedagent.artifact.ManagedArtifactPolicy; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.service.ManagedArtifactPolicy; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedToolResultStore; -import com.alibaba.qwen.code.managedagent.store.SshWorkspaceStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationAdmissionStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationDataStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationObjectStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationStore; -import com.alibaba.qwen.code.managedagent.store.WriterCredentialPolicy; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedToolResultStore; +import com.alibaba.qwen.code.managedagent.persistence.SshWorkspaceStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationAdmissionStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationDataStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationStore; +import com.alibaba.qwen.code.managedagent.security.WriterCredentialPolicy; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRepository; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; @@ -266,7 +266,7 @@ class SurfaceAdmissionAcceptanceTest { + " VALUES (?, ?, ?, 'ws', ?, 'child_run'," + " 'run-retained', ?, 1, 'resource-retained'," + " 'child_agent', 'running', 'session', 'planned', 1)", - com.alibaba.qwen.code.managedagent.store.ManagedSessionStore + com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore .sessionScopeKey(tenant, session), recordKey, tenant, session, "f".repeat(64)); String key = nextKey(); @@ -318,13 +318,12 @@ class SurfaceAdmissionAcceptanceTest { + " 'run-settled', ?, 1, 'resource-settled'," + " 'child_agent', 'completed', 'session'," + " 'consumed', 1, 2)", - com.alibaba.qwen.code.managedagent.store.ManagedSessionStore + com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore .sessionScopeKey(tenant, session), recordKey, tenant, session, "b".repeat(64)); // The task view reads a child task's committed body for its child // Session link (#13746 F2), so the list probes need one. - String scope = com.alibaba.qwen.code.managedagent.store - .ManagedSessionStore.sessionScopeKey(tenant, session); + String scope = com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore.sessionScopeKey(tenant, session); byte[] body = "{\"childSessionId\":null}".getBytes( StandardCharsets.UTF_8); jdbc.update("INSERT INTO ma_resource (resource_key," @@ -1733,7 +1732,7 @@ class SurfaceAdmissionAcceptanceTest { jdbc.update("INSERT INTO ma_session_record (record_kind, session_scope_key, record_key, domain, record_id, revision, tenant_id," + " session_id, action_id, action_version, state, options_json, gmt_create)" + " VALUES ('ACTION', ?, ?, 'action', ?, 1, ?, ?, ?, 1, 'requested', ?, 0)", - com.alibaba.qwen.code.managedagent.store.ManagedSessionStore.sessionScopeKey(tenant, session), + com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore.sessionScopeKey(tenant, session), com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys.key(tenant, session, "action", action), action, tenant, session, action, JSON.writeValueAsString(Map.of("expiresAt", System.currentTimeMillis() + 3_600_000L, @@ -1816,17 +1815,15 @@ class SurfaceAdmissionAcceptanceTest { */ @Bean @Primary - com.alibaba.qwen.code.managedagent.store.ManagedToolResultProjector + com.alibaba.qwen.code.managedagent.persistence.ManagedToolResultProjector acceptanceProjector( ManagedToolResultStore store, JdbcTemplate jdbc, org.springframework.beans.factory.ObjectProvider< ToolPublicationDataStore> publications, - com.alibaba.qwen.code.managedagent.store - .ManagedArtifactReader reader, + com.alibaba.qwen.code.managedagent.persistence.ManagedArtifactReader reader, ManagedArtifactPolicy acceptancePolicy, ManagedAgentProperties properties) { - return new com.alibaba.qwen.code.managedagent.store - .ManagedToolResultProjector(store, jdbc, publications, + return new com.alibaba.qwen.code.managedagent.persistence.ManagedToolResultProjector(store, jdbc, publications, reader, acceptancePolicy, properties) { @Override public void tick() { @@ -1890,7 +1887,7 @@ class SurfaceAdmissionAcceptanceTest { } static java.util.Map reservedRegistration( - com.alibaba.qwen.code.managedagent.store.SshWorkspaceStore.Intent intent, String tenant) { + com.alibaba.qwen.code.managedagent.persistence.SshWorkspaceStore.Intent intent, String tenant) { java.util.Map identity = java.util.Map.of("root", "/work/project", "hostId", "host-" + tenant, "device", "1", "inode", "2", "birthTime", "3"); var marker = new java.util.LinkedHashMap(identity); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationConfigurationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationConfigurationTest.java index df11f251e23..d6c53244dd7 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationConfigurationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationConfigurationTest.java @@ -1,12 +1,12 @@ package com.alibaba.qwen.code.managedagent; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.managedagent.config.AliyunToolPublicationStorageAutoConfiguration; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.config.ToolPublicationConfiguration; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationDataStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationObjectStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationDataStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationStore; import org.junit.jupiter.api.Test; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationContractTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationContractTest.java index 101ce95321c..c04bcc2b9fa 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationContractTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationContractTest.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationContract; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationContract; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationLifecycleMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationLifecycleMySqlIT.java index 555ea6d9461..0dccba6932f 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationLifecycleMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationLifecycleMySqlIT.java @@ -1,16 +1,16 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitResource; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitTransactionRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationAdmissionStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationDataStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationObjectStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitResource; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitTransactionRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationAdmissionStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationDataStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationLockOrderMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationLockOrderMySqlIT.java index 9b992711581..90be6fe6d69 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationLockOrderMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationLockOrderMySqlIT.java @@ -1,29 +1,29 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.AcquireWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitResource; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitTransactionRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.SealWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationAdmissionStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationDataStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationObjectStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationRetentionStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiRegistration; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiReservationStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiSessionMain; -import com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.AcquireWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitResource; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitTransactionRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.SealWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationAdmissionStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationDataStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationRetentionStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiRegistration; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiReservationStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiSessionMain; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.CsiFilesRetirementProfile; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeLease; import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; import com.alibaba.qwen.code.runtimebroker.RuntimeResourceHandle; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.flywaydb.core.Flyway; @@ -253,7 +253,7 @@ class ToolPublicationLockOrderMySqlIT { var source = new OwnerPauseDataSource(new DriverManagerDataSource( url.replaceFirst("/[^/?]+(?=\\?|$)", "/" + schema), user, password)); Flyway.configure().dataSource(source).locations("classpath:db/managed-schema").load().migrate(); - var jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(source); + var jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(source); var manager = new DataSourceTransactionManager(source); var registration = new WorkspaceCsiRegistration("tenant", "storage", "cluster", "ns", "pvc", "pvc-uid", "pv", "pv-uid", "disk.csi.example.com", "volume", "backend", @@ -326,13 +326,13 @@ class ToolPublicationLockOrderMySqlIT { assertThatThrownBy(() -> owner.get(30, TimeUnit.SECONDS)) .as("The retention owner is the deadlock victim at its root wait") .isInstanceOf(ExecutionException.class) - .cause().isInstanceOfSatisfying(ApiException.class, error -> { + .cause().isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus().value()).isEqualTo(503); assertThat(error.getCode()).isEqualTo("tenant_guard_contended"); }); assertThatThrownBy(() -> subject.get(30, TimeUnit.SECONDS)) .isInstanceOf(ExecutionException.class) - .cause().isInstanceOfSatisfying(ApiException.class, error -> + .cause().isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("csi_finalize_required")); assertThat(source.subjectPlacementLocks.get()) .as("Sealed CSI writer walked root → placement → retention" diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationStoreTest.java index 6d536742b73..1c7b85292a4 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/ToolPublicationStoreTest.java @@ -4,23 +4,23 @@ import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.artifact.ManagedArtifactPolicy; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.service.ManagedArtifactPolicy; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedArtifactReader; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; -import com.alibaba.qwen.code.managedagent.store.ManagedToolResultProjector; -import com.alibaba.qwen.code.managedagent.store.ManagedToolResultStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationAdmissionStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationContract; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationDataStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationObjectStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiRegistration; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiReservationStore; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedArtifactReader; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ManagedToolResultProjector; +import com.alibaba.qwen.code.managedagent.persistence.ManagedToolResultStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationAdmissionStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationContract; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationDataStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiRegistration; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiReservationStore; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; @@ -154,7 +154,7 @@ class ToolPublicationStoreTest { void localReservationWaitsForLifecyclePlacementBeforeLockingBrokerRows() throws Exception { try (var pool = Executors.newSingleThreadExecutor()) { var publisher = new TransactionTemplate(manager).execute(status -> { - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.lockPlacement(jdbc, "tenant-1"); + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.lockPlacement(jdbc, "tenant-1"); String tenantKey = ToolPublicationContract.sha256("tenant-1".getBytes(StandardCharsets.UTF_8)); jdbc.update("INSERT INTO ma_tenant_guard (tenant_key, tenant_id, guard_domain) VALUES (?, ?, 'output_publication')" + " ON DUPLICATE KEY UPDATE tenant_key = tenant_key", tenantKey, "tenant-1"); @@ -683,7 +683,7 @@ class ToolPublicationStoreTest { } else { replacement.publishSegment(key, "pub-1", PUBLICATION_TOKEN, "original", "stdout", 0, bytes, null); } - }).isInstanceOfSatisfying(ApiException.class, error -> + }).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_tool_publication_operation_expired")); var recoveryStarted = jdbc.queryForObject("SELECT " + ManagedSchemaTime.SQL_NOW + "", java.sql.Timestamp.class); assertThat(replacement.recoverOperation(key, "pub-1", PUBLICATION_TOKEN, "original") @@ -732,7 +732,7 @@ class ToolPublicationStoreTest { String.class)).isEqualTo("RETURNED"); release.countDown(); assertThatThrownBy(() -> old.get(10, java.util.concurrent.TimeUnit.SECONDS)) - .hasCauseInstanceOf(ApiException.class); + .hasCauseInstanceOf(ManagedAgentException.class); JsonNode receipt = terminal ? replacement.finish(key, "pub-1", PUBLICATION_TOKEN, "original", bytes) : replacement.publishSegment(key, "pub-1", PUBLICATION_TOKEN, "original", "stdout", 0, bytes, null); @@ -832,8 +832,8 @@ class ToolPublicationStoreTest { release.countDown(); assertThatThrownBy(() -> old.get(10, java.util.concurrent.TimeUnit.SECONDS)) .satisfies(error -> { - assertThat(error.getCause()).isInstanceOf(ApiException.class); - assertThat(((ApiException) error.getCause()).getCode()).isEqualTo(expired + assertThat(error.getCause()).isInstanceOf(ManagedAgentException.class); + assertThat(((ManagedAgentException) error.getCause()).getCode()).isEqualTo(expired ? "managed_tool_publication_operation_expired" : "managed_tool_publication_claim_expired"); }); @@ -1230,7 +1230,7 @@ class ToolPublicationStoreTest { ToolPublicationContract.readJson(verification.toString().getBytes(StandardCharsets.UTF_8)))) .isEqualTo(committed); assertThatThrownBy(() -> admissions.verifyReceipt(key, "wrong-writer-token", verification)) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); ObjectNode wrongSequence = verification.deepCopy().put("historyRevision", receiptSequence + 1); assertThatThrownBy(() -> admissions.verifyReceipt(key, WRITER_TOKEN, wrongSequence)) .hasMessageContaining("sequence conflicts"); @@ -1241,7 +1241,7 @@ class ToolPublicationStoreTest { return; } if ("intact".equals(damage) || large) { - com.alibaba.qwen.code.managedagent.store.WorkspaceRecoveryReaderAssertions.verifyOriginalPublication( + com.alibaba.qwen.code.managedagent.persistence.WorkspaceRecoveryReaderAssertions.verifyOriginalPublication( jdbc, bucket, key, admission, manifestRef, receiptSequence, firstSegment.getBytes(StandardCharsets.UTF_8)); } if (!"intact".equals(damage) && !large) { @@ -1478,7 +1478,7 @@ class ToolPublicationStoreTest { byte[] abc = "abc".getBytes(StandardCharsets.UTF_8); assertThatThrownBy(() -> data.publishSegment(key, "pub-1", PUBLICATION_TOKEN, "bad-digest", "stdout", 0, abc, digest("other"))) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_tool_result_digest_mismatch")); data.publishSegment(key, "pub-1", PUBLICATION_TOKEN, "segment-0", "stdout", 0, abc, digest("abc")); data.publishSegment(key, "pub-1", PUBLICATION_TOKEN, "segment-1", "stderr", 0, abc, digest("abc")); @@ -1487,20 +1487,20 @@ class ToolPublicationStoreTest { .hasMessageContaining("operation conflicts"); assertThatThrownBy(() -> data.publishSegment(key, "pub-1", PUBLICATION_TOKEN, "other-segment", "stdout", 0, "abd".getBytes(StandardCharsets.UTF_8), null)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_tool_result_conflict")); assertThatThrownBy(() -> data.seal(key, "pub-1", PUBLICATION_TOKEN, "missing-segment", "stdout", 2, 3, digest("abc"))) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_tool_result_conflict")); assertThatThrownBy(() -> data.seal(key, "pub-1", PUBLICATION_TOKEN, "wrong-length", "stdout", 1, 4, digest("abc"))) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_tool_result_digest_mismatch")); data.seal(key, "pub-1", PUBLICATION_TOKEN, "seal-correct", "stdout", 1, 3, digest("abc")); assertThatThrownBy(() -> data.seal(key, "pub-1", PUBLICATION_TOKEN, "seal-conflict", "stdout", 1, 3, digest("abd"))) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_tool_result_conflict")); } @@ -1631,7 +1631,7 @@ class ToolPublicationStoreTest { verificationTime[0] = jdbc.queryForObject("SELECT " + ManagedSchemaTime.SQL_NOW + "", java.sql.Timestamp.class) .getTime() / 1000 * 1000; // Advance verification time with fixture reads, excluding JDBC latency. - JdbcTemplate verificationJdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(jdbc.getDataSource()) { + JdbcTemplate verificationJdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(jdbc.getDataSource()) { @Override public T queryForObject(String sql, Class type) { if (("SELECT " + ManagedSchemaTime.SQL_NOW).equals(sql) && type == java.sql.Timestamp.class) { @@ -1674,7 +1674,7 @@ class ToolPublicationStoreTest { store.apply(request("reserve").put("captureBytes", captureBytes), WRITER_TOKEN, PUBLICATION_TOKEN); boolean[] slow = {false}; int[] metadataQueries = {0}; - JdbcTemplate metadataJdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(jdbc.getDataSource()) { + JdbcTemplate metadataJdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(jdbc.getDataSource()) { @Override public List query(String sql, org.springframework.jdbc.core.RowMapper mapper, Object... arguments) { @@ -2143,7 +2143,7 @@ class ToolPublicationStoreTest { jdbc.update("DELETE FROM ma_session_journal_tx WHERE tenant_id = X'74656e616e742d31'" + " AND session_id = X'73657373696f6e2d31' AND journal_revision = 3"); assertThatThrownBy(() -> store.apply(request("renew"), WRITER_TOKEN, PUBLICATION_TOKEN)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getCode()) .isEqualTo("managed_session_journal_corrupt"); assertThat(error.getStatus().is5xxServerError()).isTrue(); @@ -2167,7 +2167,7 @@ class ToolPublicationStoreTest { + " X'74656e616e742d31' AND session_id = X'73657373696f6e2d31' AND" + " journal_revision = 3"); assertThatThrownBy(() -> store.apply(request("renew"), WRITER_TOKEN, PUBLICATION_TOKEN)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getCode()) .isEqualTo("managed_session_journal_corrupt"); assertThat(error.getStatus().is5xxServerError()).isTrue(); @@ -2184,7 +2184,7 @@ class ToolPublicationStoreTest { + " X'74656e616e742d31' AND session_id = X'73657373696f6e2d31' AND" + " journal_revision = 1"); assertThatThrownBy(() -> store.apply(request("renew"), WRITER_TOKEN, PUBLICATION_TOKEN)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getCode()) .isEqualTo("managed_session_journal_corrupt"); assertThat(error.getStatus().is5xxServerError()).isTrue(); @@ -2596,12 +2596,12 @@ class ToolPublicationStoreTest { } private static void assertRefused(ThrowingCallable reservation, boolean retained, String limit) { - assertThatThrownBy(reservation).isInstanceOfSatisfying(ApiException.class, + assertThatThrownBy(reservation).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertRefusal(error, retained, limit)); } // A refusal that used bytes alone cause is a 409; any other is a 429. - private static void assertRefusal(ApiException error, boolean retained, String limit) { + private static void assertRefusal(ManagedAgentException error, boolean retained, String limit) { assertThat(error.getStatus()).isEqualTo(retained ? HttpStatus.CONFLICT : HttpStatus.TOO_MANY_REQUESTS); assertThat(error.getCode()).isEqualTo(retained ? "managed_tool_publication_retention_exhausted" : "managed_tool_publication_capacity_exhausted"); @@ -2644,7 +2644,7 @@ class ToolPublicationStoreTest { store = new ToolPublicationStore(jdbc, manager, sessions, executions, bindings, new ToolPublicationStore.Capacity(CAPTURE_BYTES * 2, 2 * ALLOCATION - 1, 10 * ALLOCATION, 10)); assertThatThrownBy(() -> store.apply(secondRequest, WRITER_TOKEN, PUBLICATION_TOKEN)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertRefusal(error, true, "session_bytes"); assertThat(error.getDetails()).containsEntry("admits", 0L); }); @@ -2655,7 +2655,7 @@ class ToolPublicationStoreTest { store = new ToolPublicationStore(jdbc, manager, sessions, executions, bindings, new ToolPublicationStore.Capacity(CAPTURE_BYTES * 2, ALLOCATION, 10 * ALLOCATION, 10)); assertThatThrownBy(() -> store.apply(secondRequest, WRITER_TOKEN, PUBLICATION_TOKEN)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertRefusal(error, true, "session_bytes"); assertThat(error.getDetails()).containsEntry("admits", 0L); }); @@ -2707,7 +2707,7 @@ class ToolPublicationStoreTest { long admits) { store = new ToolPublicationStore(jdbc, manager, sessions, executions, bindings, capacity); assertThatThrownBy(() -> store.apply(request, WRITER_TOKEN, PUBLICATION_TOKEN)).isInstanceOfSatisfying( - ApiException.class, error -> { + ManagedAgentException.class, error -> { assertRefusal(error, false, limit); assertThat(error.getDetails()).containsEntry("admits", admits); }); @@ -2800,8 +2800,8 @@ class ToolPublicationStoreTest { outcomes = List.of(one.get(), two.get()); } assertThat(outcomes.stream().filter(JsonNode.class::isInstance).count()).isEqualTo(1); - assertThat(outcomes).filteredOn(ApiException.class::isInstance).singleElement() - .satisfies(error -> assertRefusal((ApiException) error, false, "tenant_bytes")); + assertThat(outcomes).filteredOn(ManagedAgentException.class::isInstance).singleElement() + .satisfies(error -> assertRefusal((ManagedAgentException) error, false, "tenant_bytes")); String winner = jdbc.queryForObject("SELECT publication_id FROM ma_output_capture", String.class); ObjectNode loser = "pub-1".equals(winner) ? secondRequest : firstRequest; ObjectNode fence = request("fence").put("publicationId", winner); @@ -2820,7 +2820,7 @@ class ToolPublicationStoreTest { start.await(); try { return store.apply(request, WRITER_TOKEN, PUBLICATION_TOKEN); - } catch (ApiException error) { + } catch (ManagedAgentException error) { return error; } } @@ -3256,9 +3256,9 @@ class ToolPublicationStoreTest { + " FALSE WHERE tenant_id = X'74656e616e742d31' AND session_id =" + " X'73657373696f6e2d31'"); fixture.jdbc().update("UPDATE ma_output_capture SET retention_state = 'RETIRING'"); - var retention = new com.alibaba.qwen.code.managedagent.store.ToolPublicationRetentionStore(fixture.jdbc(), fixture.manager()); + var retention = new com.alibaba.qwen.code.managedagent.persistence.ToolPublicationRetentionStore(fixture.jdbc(), fixture.manager()); assertThat(retention.observe(Duration.ZERO)).singleElement() - .extracting(com.alibaba.qwen.code.managedagent.store.ToolPublicationRetentionStore.Candidate::blocker).isEqualTo("resource_referenced"); + .extracting(com.alibaba.qwen.code.managedagent.persistence.ToolPublicationRetentionStore.Candidate::blocker).isEqualTo("resource_referenced"); } @Test @@ -3445,7 +3445,7 @@ class ToolPublicationStoreTest { fixture.jdbc().update( "UPDATE ma_operation SET state='PENDING', available_at=0 WHERE" + " operation_kind = 'TOOL_RESULT_PROJECTION'"); - JdbcTemplate projectionJdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(fixture.jdbc().getDataSource()) { + JdbcTemplate projectionJdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(fixture.jdbc().getDataSource()) { @Override public T queryForObject(String sql, Class type) { if (("SELECT " + ManagedSchemaTime.SQL_NOW).equals(sql) && type == java.sql.Timestamp.class) { diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceCreationProcessFixtureMain.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceCreationProcessFixtureMain.java index c1992ce053d..48c666d7cf4 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceCreationProcessFixtureMain.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceCreationProcessFixtureMain.java @@ -1,9 +1,9 @@ package com.alibaba.qwen.code.managedagent; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.Admission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.Admission; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.jdbc.core.JdbcTemplate; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionCloseMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionCloseMySqlIT.java index 81ac298439b..bae85f30211 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionCloseMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionCloseMySqlIT.java @@ -1,17 +1,17 @@ package com.alibaba.qwen.code.managedagent; -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.ManagedActionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.AcquireWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.RenewWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.SealWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationAdmission; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationAdmission; +import com.alibaba.qwen.code.managedagent.persistence.ManagedActionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.AcquireWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.RenewWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.SealWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; @@ -138,7 +138,7 @@ class WorkspaceSessionCloseMySqlIT { assertThat(journal.hasLiveWriter(tenant, another)).isTrue(); assertThatThrownBy(() -> transaction(() -> journal.acquireWriter(tenant, another, "b".repeat(32), new AcquireWriterRequest("workspace", "replacement", 60_000L)))) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_not_writable")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_not_writable")); transaction(() -> journal.sealWriter(tenant, another, TOKEN, new SealWriterRequest("workspace", "original", generation))); assertThat(journal.hasLiveWriter(tenant, another)).isFalse(); @@ -299,13 +299,13 @@ class WorkspaceSessionCloseMySqlIT { private static Object outcome(Supplier operation) { try { return operation.get(); - } catch (ApiException rejected) { + } catch (ManagedAgentException rejected) { return rejected; } } private static void assertCode(Object result, String code) { - assertThat(result).isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo(code)); + assertThat(result).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo(code)); } private T transaction(Supplier work) { diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionCloseTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionCloseTest.java index b191656b525..e0efe7d7e1c 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionCloseTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionCloseTest.java @@ -1,20 +1,20 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.api.AuthenticatedTenantActor; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; import com.alibaba.qwen.code.managedagent.harness.UnavailableHarnessConnector; -import com.alibaba.qwen.code.managedagent.service.RuntimeWarmer; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.AcquireWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.SealWriterRequest; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.AcquireWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.SealWriterRequest; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -70,7 +70,7 @@ class WorkspaceSessionCloseTest { await().untilAsserted(() -> assertThat(runtime.fenced).containsKey(session)); assertThat(store.requireSession(tenant, session).status()).isEqualTo("CLOSING"); assertThatThrownBy(() -> journal.acquireWriter(tenant, session, "a".repeat(43), - new AcquireWriterRequest("ws", "writer", 10_000L))).isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_lifecycle_active")); + new AcquireWriterRequest("ws", "writer", 10_000L))).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_lifecycle_active")); mvc.perform(post("/api/agent/web-shell/v1/sessions/close").header(TenantContextFilter.HEADER, tenant) .principal(actor(tenant, "owner")).contentType(MediaType.APPLICATION_JSON) .content("{\"sessionId\":\"" + session + "\",\"idempotencyKey\":\"close\"}")) @@ -216,12 +216,12 @@ class WorkspaceSessionCloseTest { @Bean @Primary HarnessConnector uninitializedHarness() { return new UnavailableHarnessConnector() { public boolean supportsLifecycle() { return true; } - public void detachLifecycle(com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord operation) {} + public void detachLifecycle(com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord operation) {} }; } @Bean @Primary CloseRuntime closeRuntime() { return new CloseRuntime(); } @Bean @Primary ManagedAgentStore closeStore(JdbcTemplate jdbc, ObjectMapper mapper, - com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry registry) { + com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry registry) { var properties = new com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties(); properties.getHarness().setWorkspaceFilesEnabled(true); return new ManagedAgentStore(jdbc, mapper, java.time.Clock.systemUTC(), ignored -> {}, registry, properties); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionRetentionMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionRetentionMySqlIT.java index b83f16d6f61..928c4b30ff1 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionRetentionMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionRetentionMySqlIT.java @@ -1,19 +1,19 @@ package com.alibaba.qwen.code.managedagent; -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.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.AcquireWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.RenewWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.SealWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedToolResultStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationRetentionStore; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.AcquireWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.RenewWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.SealWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedToolResultStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationRetentionStore; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; @@ -119,7 +119,7 @@ class WorkspaceSessionRetentionMySqlIT { assertThat(count("ma_request_receipt", "namespace = 'SESSION_COMMAND' AND operation = 'UNARCHIVE_WORKSPACE_SESSION'")).isEqualTo(1); assertThat(count("ma_public_event", "event_type = 'session.unarchived'")).isEqualTo(1); assertThatThrownBy(() -> transaction(() -> first.unarchiveWorkspaceSession(tenant, session, OWNER, "key", "changed"))) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("idempotency_conflict")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("idempotency_conflict")); assertThat(first.requireSession(tenant, session).status()).isEqualTo("CLOSED"); } @@ -199,7 +199,7 @@ class WorkspaceSessionRetentionMySqlIT { assertThat(retention.observe(Duration.ZERO)).singleElement().extracting(ToolPublicationRetentionStore.Candidate::blocker).isEqualTo("recovery_protected"); assertThatThrownBy(() -> transaction(() -> new ManagedSessionStore(jdbc).acquireWriter(tenant, session, TOKEN, new AcquireWriterRequest("workspace", "new-writer", 60_000L)))) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("tool_output_session_retired")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("tool_output_session_retired")); } @Test @@ -265,7 +265,7 @@ class WorkspaceSessionRetentionMySqlIT { try { return transaction(() -> new ManagedSessionStore(jdbc).acquireWriter(tenant, session, TOKEN, new AcquireWriterRequest("workspace", "late", 60_000L))); - } catch (ApiException rejected) { + } catch (ManagedAgentException rejected) { return rejected; } }); @@ -275,7 +275,7 @@ class WorkspaceSessionRetentionMySqlIT { release.countDown(); assertThat(holder.get(5, TimeUnit.SECONDS)).isTrue(); assertThat(completed.get(5, TimeUnit.SECONDS)).isTrue(); - assertThat(writer.get(5, TimeUnit.SECONDS)).isInstanceOfSatisfying(ApiException.class, + assertThat(writer.get(5, TimeUnit.SECONDS)).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("tool_output_session_retired")); assertThat(projected.get(5, TimeUnit.SECONDS)).isFalse(); } finally { @@ -326,7 +326,7 @@ class WorkspaceSessionRetentionMySqlIT { try { return transaction(() -> new ManagedSessionStore(jdbc).renewWriter(tenant, session, TOKEN, new RenewWriterRequest("workspace", "writer", 1, 60_000L))); - } catch (ApiException rejected) { + } catch (ManagedAgentException rejected) { return rejected; } }); @@ -335,7 +335,7 @@ class WorkspaceSessionRetentionMySqlIT { release.countDown(); assertThat(holder.get(5, TimeUnit.SECONDS)).isTrue(); assertThat(completed.get(5, TimeUnit.SECONDS)).isTrue(); - assertThat(renewal.get(5, TimeUnit.SECONDS)).isInstanceOfSatisfying(ApiException.class, + assertThat(renewal.get(5, TimeUnit.SECONDS)).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("tool_output_session_retired")); } finally { release.countDown(); @@ -366,14 +366,14 @@ class WorkspaceSessionRetentionMySqlIT { var completed = pool.submit(() -> { try { return transaction(() -> store.completeOperation(tenant, session, deletion.operationId(), "delete-worker", deletion.claimGeneration(), false)); - } catch (ApiException rejected) { + } catch (ManagedAgentException rejected) { return rejected; } }); assertThrows(TimeoutException.class, () -> completed.get(100, TimeUnit.MILLISECONDS)); release.countDown(); assertThat(renewal.get(5, TimeUnit.SECONDS)).isTrue(); - assertThat(completed.get(5, TimeUnit.SECONDS)).isInstanceOfSatisfying(ApiException.class, + assertThat(completed.get(5, TimeUnit.SECONDS)).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_writer_active")); } finally { release.countDown(); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionRetentionTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionRetentionTest.java index 2164812330e..8c3aa499b29 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionRetentionTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/WorkspaceSessionRetentionTest.java @@ -1,24 +1,24 @@ package com.alibaba.qwen.code.managedagent; -import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.api.AuthenticatedTenantActor; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; import com.alibaba.qwen.code.managedagent.harness.UnavailableHarnessConnector; -import com.alibaba.qwen.code.managedagent.service.RuntimeWarmer; -import com.alibaba.qwen.code.managedagent.service.SessionLifecycleCoordinator; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.AcquireWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.SealWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.AcquireWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.SealWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.session.SessionLifecycleCoordinator; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; @@ -74,7 +74,7 @@ class WorkspaceSessionRetentionTest { @Autowired SessionLifecycleCoordinator lifecycle; @Autowired ManagedWorkspaceRegistry registry; @Autowired HarnessConnector harness; - @Autowired com.alibaba.qwen.code.managedagent.service.HarnessCoordinator coordinator; + @Autowired com.alibaba.qwen.code.managedagent.session.HarnessCoordinator coordinator; @ParameterizedTest @CsvSource({"ACTIVE, hosted-workspace-shell/1", @@ -94,8 +94,8 @@ class WorkspaceSessionRetentionTest { properties.getHarness().setWorkspaceFilesEnabled(true); properties.getHarness().setWorkspaceShellEnabled(true); var enabled = new ManagedAgentStore(jdbc, mapper, Clock.systemUTC(), ignored -> {}, registry, properties); - var projection = new com.alibaba.qwen.code.managedagent.service.ManagedAgentService(enabled, - new com.alibaba.qwen.code.managedagent.service.RequestDigests(), coordinator, harness, registry); + var projection = new com.alibaba.qwen.code.managedagent.session.ManagedAgentService(enabled, + new com.alibaba.qwen.code.managedagent.model.RequestDigests(), coordinator, harness, registry); org.springframework.test.util.ReflectionTestUtils.setField(projection, "runtimeWarmer", runtime); assertThat(projection.getPublicSession(tenant, "owner", session).capabilities().sessionClose()).isTrue(); assertThat(projection.getWebShellSession(tenant, "owner", session).capabilities().sessionDelete()).isTrue(); @@ -198,7 +198,7 @@ class WorkspaceSessionRetentionTest { request(post(PUBLIC + session + "/unarchive"), tenant, "owner", "unarchive") .andExpect(status().isOk()).andExpect(jsonPath("$.status").value("archived")); assertThatThrownBy(() -> journal.acquireWriter(tenant, session, "b".repeat(43), - new AcquireWriterRequest("ws", "late", 60_000L))).isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_lifecycle_active")); + new AcquireWriterRequest("ws", "late", 60_000L))).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_lifecycle_active")); assertThat(count(tenant, session, "session.archived")).isEqualTo(2); assertThat(count(tenant, session, "session.unarchived")).isEqualTo(1); assertThat(runtime.calls.get(session)).isEqualTo(1); @@ -502,7 +502,7 @@ class WorkspaceSessionRetentionTest { @Bean @Primary HarnessConnector uninitializedHarness() { return new UnavailableHarnessConnector() { public boolean supportsLifecycle() { return true; } - public void detachLifecycle(com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord operation) {} + public void detachLifecycle(com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord operation) {} }; } @Bean @Primary OnceCloseRuntime retentionRuntime() { return new OnceCloseRuntime(); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/ApiExceptionHandlerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/ApiExceptionHandlerTest.java index d5bc282319f..7a0a46fbd0e 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/ApiExceptionHandlerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/ApiExceptionHandlerTest.java @@ -4,10 +4,11 @@ import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationStorageException; import com.alibaba.qwen.code.managedagent.config.InternalSurfaceConfiguration.RoutingFilter; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationStorageException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; @@ -42,7 +43,7 @@ import static org.assertj.core.api.Assertions.assertThat; class ApiExceptionHandlerTest { private static final String SECRET = "sk_live_PRIVATE_BODY_VALUE"; private static final String CONTRACT = - "com.alibaba.qwen.code.managedagent.store.ToolPublicationContract"; + "com.alibaba.qwen.code.managedagent.persistence.ToolPublicationContract"; @Test void reportsStorageAccessDeniedAsDefiniteRejectionWithoutProviderDetails() { @@ -71,7 +72,7 @@ class ApiExceptionHandlerTest { MockHttpServletResponse response = new MockHttpServletResponse(); response.setCommitted(true); - assertThat(new ApiExceptionHandler().api(new ApiException( + assertThat(new ApiExceptionHandler().api(new ManagedAgentException( HttpStatus.NOT_FOUND, "session_not_found", "gone"), new MockHttpServletRequest(), response)).isNull(); assertThat(new ApiExceptionHandler().runtime(new RuntimeBrokerException( @@ -340,7 +341,7 @@ class ApiExceptionHandlerTest { frame(CONTRACT, "id", 383), frame(CONTRACT, "token", 402), frame(CONTRACT, "request", 112), - frame("com.alibaba.qwen.code.managedagent.store.ToolPublicationStore", "reserve", 50), + frame("com.alibaba.qwen.code.managedagent.persistence.ToolPublicationStore", "reserve", 50), frame("com.alibaba.qwen.code.managedagent.api.ToolPublicationController", "grant", 73), frame("com.alibaba.qwen.code.managedagent.api.TenantContextFilter", "doFilterInternal", 60), }); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/SurfaceRegistryGateTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/SurfaceRegistryGateTest.java index 69c349e45cf..7fb7ffcfacd 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/SurfaceRegistryGateTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/SurfaceRegistryGateTest.java @@ -1,9 +1,9 @@ package com.alibaba.qwen.code.managedagent.api; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationAdmissionStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationDataStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationAdmissionStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationDataStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationStore; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/TenantContextFilterTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/TenantContextFilterTest.java index ea5be1b2266..51427c5af67 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/TenantContextFilterTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/TenantContextFilterTest.java @@ -1,5 +1,7 @@ package com.alibaba.qwen.code.managedagent.api; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.TenantContext; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.ServletException; import org.junit.jupiter.api.Test; @@ -57,7 +59,7 @@ class TenantContextFilterTest { TenantContext context = (TenantContext) request.getAttribute( TenantContextFilter.ATTRIBUTE); assertThatThrownBy(context::requireActorId) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("actor_required")); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/ToolPublicationControllerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/ToolPublicationControllerTest.java index 816aea9d1a0..2a5d4c28f4e 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/ToolPublicationControllerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/ToolPublicationControllerTest.java @@ -1,15 +1,16 @@ package com.alibaba.qwen.code.managedagent.api; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.AcquireWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationAdmissionStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationDataStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationObjectStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationStore; -import com.alibaba.qwen.code.managedagent.store.WriterCredentialPolicy; +import com.alibaba.qwen.code.managedagent.model.TenantContext; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.AcquireWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationAdmissionStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationDataStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationStore; +import com.alibaba.qwen.code.managedagent.security.WriterCredentialPolicy; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRepository; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AliyunToolPublicationObjectStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/artifact/AliyunToolPublicationObjectStoreTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AliyunToolPublicationObjectStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/artifact/AliyunToolPublicationObjectStoreTest.java index 3b11a746623..2ddb407e49a 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AliyunToolPublicationObjectStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/artifact/AliyunToolPublicationObjectStoreTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.artifact; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSException; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedArtifactServiceTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/artifact/ManagedArtifactServiceTest.java similarity index 92% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedArtifactServiceTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/artifact/ManagedArtifactServiceTest.java index 03a2f9eef8d..57fbd26c6e0 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedArtifactServiceTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/artifact/ManagedArtifactServiceTest.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.artifact; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -42,7 +42,7 @@ class ManagedArtifactServiceTest { void preservesAsciiSyntaxAndInvalidRangeErrorsEvenForEmptyArtifacts(String range) { for (long size : new long[] {0, 9}) { assertThatThrownBy(() -> ManagedArtifactService.select(range, size)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.BAD_REQUEST); assertThat(error.getCode()).isEqualTo("invalid_range"); assertThat(error.getMessage()).isEqualTo("Invalid byte range."); @@ -54,7 +54,7 @@ class ManagedArtifactServiceTest { @ValueSource(strings = {"bytes=0-1,2-3", "bytes=0-1,", "bytes=,0-1", "bytes=,", ","}) void refusesEveryCommaBeforeParsingRanges(String range) { assertThatThrownBy(() -> ManagedArtifactService.select(range, 0)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.BAD_REQUEST); assertThat(error.getCode()).isEqualTo("unsupported_range"); }); @@ -66,7 +66,7 @@ class ManagedArtifactServiceTest { "items=0-1", "bytes=0-1,4-5", "bytes=9223372036854775808-", "bytes=0-1048576", "bytes=0-", "bytes=-1048577"}) { assertThatThrownBy(() -> ManagedArtifactService.select(range, 2_000_000)) - .as(range).isInstanceOfSatisfying(ApiException.class, + .as(range).isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.BAD_REQUEST); String code = @@ -88,7 +88,7 @@ class ManagedArtifactServiceTest { void distinguishesEmptyAndUnsatisfiableRanges() { for (String range : new String[] {"bytes=0-0", "bytes=0-", "bytes=-1"}) { assertThatThrownBy(() -> ManagedArtifactService.select(range, 0)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE); assertThat(error.getCode()).isEqualTo("range_not_satisfiable"); @@ -96,7 +96,7 @@ class ManagedArtifactServiceTest { } for (String range : new String[] {"bytes=9-", "bytes=99-100", "bytes=-0"}) { assertThatThrownBy(() -> ManagedArtifactService.select(range, 9)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE); assertThat(error.getCode()).isEqualTo("range_not_satisfiable"); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/AutomationScannerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/automation/AutomationScannerTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/AutomationScannerTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/automation/AutomationScannerTest.java index 7f9bb183b84..8ba7cab8c28 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/AutomationScannerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/automation/AutomationScannerTest.java @@ -1,22 +1,24 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.automation; import com.alibaba.qwen.code.daemon.DaemonException; import com.alibaba.qwen.code.managedagent.AutomationHarnessFake; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.AutomationDefinitionRequest; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicAutomation; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicAutomationRun; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicList; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore.OccurrenceView; -import com.alibaba.qwen.code.managedagent.store.AutomationLedgerStore.ScheduleRow; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.model.ApiModels.AutomationDefinitionRequest; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicAutomation; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicAutomationRun; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicList; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore.OccurrenceView; +import com.alibaba.qwen.code.managedagent.persistence.AutomationLedgerStore.ScheduleRow; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -376,7 +378,7 @@ class AutomationScannerTest { assertThat(fake.fires()).isEqualTo(1); assertThatThrownBy(() -> service.run(tenant, ACTOR, automation.id(), "manual-2")) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()).isEqualTo("automation_run_skipped"); }); @@ -419,7 +421,7 @@ class AutomationScannerTest { assertThatThrownBy(() -> service.create(tenant, ACTOR, "create-1", new AutomationDefinitionRequest(sessionId, "Other", "0 2 * * *", "UTC", "Run it.", null, null, null, null, null))) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("idempotency_conflict")); String id = created.body().id(); var revised = service.update(tenant, ACTOR, id, "update-1", @@ -440,10 +442,10 @@ class AutomationScannerTest { assertThatThrownBy(() -> service.update(tenant, READER, id, "update-3", new AutomationDefinitionRequest(null, "Reader", null, null, null, null, null, null, null, null))) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getStatus()).isEqualTo(HttpStatus.FORBIDDEN)); assertThatThrownBy(() -> service.get(tenant, "stranger", id)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getStatus()).isEqualTo(HttpStatus.NOT_FOUND)); var retired = service.retire(tenant, ACTOR, id, "retire-1"); assertThat(retired.body().state()).isEqualTo("retired"); @@ -452,7 +454,7 @@ class AutomationScannerTest { assertThatThrownBy(() -> service.update(tenant, ACTOR, id, "update-4", new AutomationDefinitionRequest(null, null, "0 3 * * *", null, null, null, null, null, null, null))) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("automation_retired")); clock.set(T0 + 25 * 3_600_000L); assertThat(scanner.tick(clock.get())).isEqualTo(0); @@ -526,7 +528,7 @@ class AutomationScannerTest { assertThat(second.data().getFirst().id()) .isNotIn(first.data().stream().map(PublicAutomation::id).toList()); assertThatThrownBy(() -> service.list(tenant, ACTOR, "!!", 2)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("invalid_cursor")); String automationId = second.data().getFirst().id(); clock.set(T0 + 3 * MINUTE + 1_000); @@ -768,7 +770,7 @@ class AutomationScannerTest { // first actor's answer. assertThatThrownBy(() -> service.create(tenant, READER, "shared-key", request)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()).isEqualTo("idempotency_conflict"); }); @@ -791,7 +793,7 @@ class AutomationScannerTest { // the pre-relay claim is the only ledger trace, and no mirror. fake.failAfterNextDefineCommit = new DaemonException("connection lost"); assertThatThrownBy(() -> service.create(tenant, ACTOR, keyA, requestA)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()) .isEqualTo(HttpStatus.SERVICE_UNAVAILABLE); assertThat(error.getCode()) @@ -847,7 +849,7 @@ class AutomationScannerTest { fake.failAfterNextRetireCommit = new DaemonException("connection lost"); assertThatThrownBy( () -> service.retire(tenant, ACTOR, created.id(), keyR)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("automation_operation_unknown")); // The journal published retirement before the answer was lost; @@ -893,7 +895,7 @@ class AutomationScannerTest { assertThatThrownBy( () -> service.update(tenant, ACTOR, automationId, keyU, requestU)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("automation_operation_unknown")); // The pre-relay claim survived the lost answer, still unanswered. @@ -936,7 +938,7 @@ class AutomationScannerTest { fake.failAfterNextRetireCommit = new DaemonException("connection lost"); assertThatThrownBy( () -> service.retire(tenant, ACTOR, first.id(), key)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("automation_operation_unknown")); // The same key against another target is a different request: the @@ -944,7 +946,7 @@ class AutomationScannerTest { // ledger never retires that definition's mirror. assertThatThrownBy( () -> service.retire(tenant, ACTOR, second.id(), key)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) .isEqualTo("idempotency_conflict"); @@ -1017,7 +1019,7 @@ class AutomationScannerTest { assertThat(stranger.hasMore()).isFalse(); for (String hiddenId : hiddenIds) { assertThatThrownBy(() -> service.get(tenant, READER, hiddenId)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("automation_not_found")); } @@ -1032,7 +1034,7 @@ class AutomationScannerTest { clock.get()); assertThat(fence).isPositive(); assertThatThrownBy(() -> service.run(tenant, ACTOR, id, "busy-1")) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()).isEqualTo("automation_busy"); }); @@ -1057,7 +1059,7 @@ class AutomationScannerTest { String id = automation.id(); fake.failNextFire = new DaemonException("connection lost"); assertThatThrownBy(() -> service.run(tenant, ACTOR, id, "lost-1")) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()) .isEqualTo(HttpStatus.SERVICE_UNAVAILABLE); assertThat(error.getCode()) @@ -1079,7 +1081,7 @@ class AutomationScannerTest { // A claim nobody asks about again is re-driven by the scanner. fake.failNextFire = new DaemonException("connection lost"); assertThatThrownBy(() -> service.run(tenant, ACTOR, id, "lost-2")) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("automation_operation_unknown")); clock.addAndGet(11_000); @@ -1092,7 +1094,7 @@ class AutomationScannerTest { // the claim for the scanner too. connector.unavailable = true; assertThatThrownBy(() -> service.run(tenant, ACTOR, id, "lost-3")) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("automation_unavailable")); connector.unavailable = false; @@ -1451,7 +1453,7 @@ class AutomationScannerTest { + " WHERE namespace='AUTOMATION' AND tenant_id = ? AND idempotency_key = ?", tenant, key); assertThatThrownBy( () -> service.retire(tenant, ACTOR, automation.id(), key)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) .isEqualTo("automation_operation_conflict"); @@ -1484,7 +1486,7 @@ class AutomationScannerTest { new AutomationDefinitionRequest(otherSession, "Goal 2", "15 3 * * *", "UTC", "Run that.", null, "skip", "none", null, true))) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) .isEqualTo("automation_operation_conflict"); @@ -1509,7 +1511,7 @@ class AutomationScannerTest { // projection are durable while the response receipt is unsettled. fake.failAfterNextDefineCommit = new DaemonException("connection lost"); assertThatThrownBy(() -> service.create(tenant, ACTOR, keyA, requestA)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("automation_operation_unknown")); assertThat(ledger.findSchedule(tenant, scheduleId)).isPresent(); @@ -1527,7 +1529,7 @@ class AutomationScannerTest { new AutomationDefinitionRequest(otherSession, "Goal 2", "15 3 * * *", "UTC", "Run that.", null, null, null, null, null))) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) .isEqualTo("idempotency_conflict"); @@ -1557,7 +1559,7 @@ class AutomationScannerTest { new AutomationDefinitionRequest(sessionId, "Goal", "0 2 * * *", "UTC", "Run it.", null, null, null, null, null))) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) .isEqualTo("idempotency_conflict"); @@ -1596,7 +1598,7 @@ class AutomationScannerTest { new AutomationDefinitionRequest(sessionId, "Goal", "0 2 * * *", "UTC", "Run it.", "per_run", null, null, null, true))) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) .isEqualTo("automation_mode_disabled"); @@ -1628,7 +1630,7 @@ class AutomationScannerTest { fake.failNextMutation = AutomationHarnessFake.refusal(400, "invalid_automation_operation"); assertThatThrownBy(() -> service.create(tenant, ACTOR, key, requestA)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()) .isEqualTo(HttpStatus.BAD_REQUEST); assertThat(error.getCode()) @@ -1648,7 +1650,7 @@ class AutomationScannerTest { new AutomationDefinitionRequest(otherSession, "Goal 2", "15 3 * * *", "UTC", "Run that.", null, null, null, null, null))) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) .isEqualTo("idempotency_conflict"); @@ -1678,7 +1680,7 @@ class AutomationScannerTest { fake.failNextMutation = AutomationHarnessFake.refusal(409, "hosted_session_already_attached"); assertThatThrownBy(() -> service.create(tenant, ACTOR, key, requestA)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) .isEqualTo("hosted_session_already_attached"); @@ -1696,7 +1698,7 @@ class AutomationScannerTest { new AutomationDefinitionRequest(otherSession, "Goal 2", "15 3 * * *", "UTC", "Run that.", null, null, null, null, null))) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) .isEqualTo("idempotency_conflict"); @@ -1724,7 +1726,7 @@ class AutomationScannerTest { fake.failNextMutation = AutomationHarnessFake.refusal(409, "automation_count_limit"); assertThatThrownBy(() -> service.create(tenant, ACTOR, key, requestA)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("automation_count_limit")); assertThat(ledger.findCommand(tenant, key).orElseThrow().resultJson()) @@ -1740,7 +1742,7 @@ class AutomationScannerTest { new AutomationDefinitionRequest(otherSession, "Goal 2", "15 3 * * *", "UTC", "Run that.", null, null, null, null, null))) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) .isEqualTo("idempotency_conflict"); @@ -1765,7 +1767,7 @@ class AutomationScannerTest { "automation_mode_disabled"); assertThatThrownBy( () -> service.run(tenant, ACTOR, automation.id(), "manual-def")) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) .isEqualTo("automation_run_skipped"); @@ -1802,7 +1804,7 @@ class AutomationScannerTest { assertThatThrownBy( () -> service.update(tenant, ACTOR, automation.id(), key, moved)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) .isEqualTo("idempotency_conflict"); @@ -1816,7 +1818,7 @@ class AutomationScannerTest { null, null, null, null); assertThatThrownBy(() -> service.create(tenant, ACTOR, "key-" + UUID.randomUUID(), unicode)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()) .isEqualTo(HttpStatus.BAD_REQUEST); assertThat(error.getCode()) @@ -1843,7 +1845,7 @@ class AutomationScannerTest { null, null, null); assertThatThrownBy(() -> service.create(tenant, ACTOR, "key-" + UUID.randomUUID(), body)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) .isEqualTo("automation_unavailable"); @@ -1855,7 +1857,7 @@ class AutomationScannerTest { false, clock::get); assertThatThrownBy(() -> offStore.create(tenant, ACTOR, "key-" + UUID.randomUUID(), body)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) .isEqualTo("automation_unavailable"); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/CronSlotsTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/automation/CronSlotsTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/CronSlotsTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/automation/CronSlotsTest.java index 67cb5b0c24c..714ffd42dba 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/CronSlotsTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/automation/CronSlotsTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.automation; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AgentDefinitionExtensionsTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/catalog/AgentDefinitionExtensionsTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AgentDefinitionExtensionsTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/catalog/AgentDefinitionExtensionsTest.java index 8cde7d682b8..972870bf383 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AgentDefinitionExtensionsTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/catalog/AgentDefinitionExtensionsTest.java @@ -1,6 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.catalog; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -131,7 +132,7 @@ class AgentDefinitionExtensionsTest { } private static void assertRefused(String field, Runnable operation) { - assertThatThrownBy(operation::run).isInstanceOfSatisfying(ApiException.class, error -> { + assertThatThrownBy(operation::run).isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus().value()).isEqualTo(409); assertThat(error.getCode()).isEqualTo("agent_definition_unsupported"); assertThat(error.getDetails()).containsEntry("field", field); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentDefinitionServiceTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/catalog/ManagedAgentDefinitionServiceTest.java similarity index 85% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentDefinitionServiceTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/catalog/ManagedAgentDefinitionServiceTest.java index 63d19070f76..54ccff0d83a 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentDefinitionServiceTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/catalog/ManagedAgentDefinitionServiceTest.java @@ -1,12 +1,13 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.catalog; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.AgentDefinitionRequest; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentDefinitionService.Result; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore.Admission; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore.ConcurrentWriteException; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore.DefinitionRevision; +import com.alibaba.qwen.code.managedagent.catalog.ManagedAgentDefinitionService.Result; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.ApiModels.AgentDefinitionRequest; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore.Admission; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore.ConcurrentWriteException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore.DefinitionRevision; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -93,7 +94,7 @@ class ManagedAgentDefinitionServiceTest { assertThatThrownBy(() -> service.update("tenant", AGENT_ID, "key", REQUEST)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) .isEqualTo("agent_revision_conflict"); @@ -114,7 +115,7 @@ class ManagedAgentDefinitionServiceTest { "The Idempotency-Key was used by a concurrent request.")); } when(store.replayCommitted("tenant", "key", update ? UPDATE_DIGEST : CREATE_DIGEST)) - .thenThrow(new ApiException(HttpStatus.CONFLICT, + .thenThrow(new ManagedAgentException(HttpStatus.CONFLICT, "idempotency_conflict", "different request")); assertThatThrownBy(() -> { @@ -124,7 +125,7 @@ class ManagedAgentDefinitionServiceTest { service.create("tenant", "key", REQUEST); } }) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()) .isEqualTo("idempotency_conflict"); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedHookCatalogServiceTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/catalog/ManagedHookCatalogServiceTest.java similarity index 87% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedHookCatalogServiceTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/catalog/ManagedHookCatalogServiceTest.java index 54e7e1b4da6..83d0055ac2c 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedHookCatalogServiceTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/catalog/ManagedHookCatalogServiceTest.java @@ -1,7 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.catalog; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import org.junit.jupiter.api.Test; @@ -55,8 +56,8 @@ class ManagedHookCatalogServiceTest { @Test void authorizesBeforeReadingRecordsOrResources() { when(sessions.requireReadableSession("tenant", "actor", "session")) - .thenThrow(new ApiException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found.")); - assertThatThrownBy(() -> service.get("tenant", "actor", "session")).isInstanceOf(ApiException.class); + .thenThrow(new ManagedAgentException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found.")); + assertThatThrownBy(() -> service.get("tenant", "actor", "session")).isInstanceOf(ManagedAgentException.class); verifyNoInteractions(records); } } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedMcpCatalogServiceTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/catalog/ManagedMcpCatalogServiceTest.java similarity index 92% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedMcpCatalogServiceTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/catalog/ManagedMcpCatalogServiceTest.java index b55df2a6542..35606d6c80c 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedMcpCatalogServiceTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/catalog/ManagedMcpCatalogServiceTest.java @@ -1,7 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.catalog; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -86,8 +87,8 @@ class ManagedMcpCatalogServiceTest { @Test void authorizesBeforeReadingAnyRecordsOrResources() { when(sessions.requireReadableSession("tenant", "actor", "session")) - .thenThrow(new ApiException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found.")); - assertThatThrownBy(() -> service.get("tenant", "actor", "session")).isInstanceOf(ApiException.class); + .thenThrow(new ManagedAgentException(HttpStatus.NOT_FOUND, "session_not_found", "The Session was not found.")); + assertThatThrownBy(() -> service.get("tenant", "actor", "session")).isInstanceOf(ManagedAgentException.class); verifyNoInteractions(records); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedChannelServiceTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/channel/ManagedChannelServiceTest.java similarity index 94% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedChannelServiceTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/channel/ManagedChannelServiceTest.java index 8cbd9821cd8..b4ae56c734b 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedChannelServiceTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/channel/ManagedChannelServiceTest.java @@ -1,26 +1,27 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.channel; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicChannel; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicChannelDelivery; -import com.alibaba.qwen.code.managedagent.api.ApiModels.PublicList; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.ChannelPolicy; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.ClaimResponse; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.ClaimedDelivery; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.DeliveryView; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.InboundAdmission; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.InboundAttachment; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.InboundEventRequest; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.ReceiptRequest; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.RegisterChannelRequest; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.ResendResponse; -import com.alibaba.qwen.code.managedagent.api.ChannelAdapterModels.RouteScope; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.ChannelPolicy; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.ClaimResponse; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.ClaimedDelivery; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.DeliveryView; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.InboundAdmission; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.InboundAttachment; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.InboundEventRequest; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.ReceiptRequest; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.RegisterChannelRequest; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.ResendResponse; +import com.alibaba.qwen.code.managedagent.channel.ChannelAdapterModels.RouteScope; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.ChannelDeliveryRepository; -import com.alibaba.qwen.code.managedagent.store.ChannelInstanceStore; -import com.alibaba.qwen.code.managedagent.store.JdbcChannelDeliveryRepository; -import com.alibaba.qwen.code.managedagent.store.JdbcChannelRouteRepository; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicChannel; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicChannelDelivery; +import com.alibaba.qwen.code.managedagent.model.ApiModels.PublicList; +import com.alibaba.qwen.code.managedagent.persistence.ChannelDeliveryRepository; +import com.alibaba.qwen.code.managedagent.persistence.ChannelInstanceStore; +import com.alibaba.qwen.code.managedagent.persistence.JdbcChannelDeliveryRepository; +import com.alibaba.qwen.code.managedagent.persistence.JdbcChannelRouteRepository; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; @@ -275,7 +276,7 @@ class ManagedChannelServiceTest { service.submitInbound(TENANT, channel, event(1, "1700:60", "one")); assertThatThrownBy(() -> service.submitInbound(TENANT, channel, event(2, "1800:1", "two"))) - .isInstanceOf(ApiException.class) + .isInstanceOf(ManagedAgentException.class) .hasMessageContaining("account generation"); // A re-key is registered first; then the old generation is stale. service.register(TENANT, channel, register(2)); @@ -284,22 +285,22 @@ class ManagedChannelServiceTest { assertThat(rolled.replayed()).isFalse(); assertThatThrownBy(() -> service.submitInbound(TENANT, channel, event(1, "1700:61", "late"))) - .isInstanceOf(ApiException.class) - .extracting(e -> ((ApiException) e).getCode()) + .isInstanceOf(ManagedAgentException.class) + .extracting(e -> ((ManagedAgentException) e).getCode()) .isEqualTo("channel_generation_stale"); assertThatThrownBy(() -> service.register(TENANT, channel, register(1))) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); service.disconnect(TENANT, channel); assertThatThrownBy(() -> service.submitInbound(TENANT, channel, event(2, "1800:2", "three"))) - .isInstanceOf(ApiException.class) - .extracting(e -> ((ApiException) e).getCode()) + .isInstanceOf(ManagedAgentException.class) + .extracting(e -> ((ManagedAgentException) e).getCode()) .isEqualTo("channel_disconnected"); assertThatThrownBy(() -> service.submitInbound(TENANT, "missing", event(1, "1", "x"))) - .isInstanceOf(ApiException.class) - .extracting(e -> ((ApiException) e).getCode()) + .isInstanceOf(ManagedAgentException.class) + .extracting(e -> ((ManagedAgentException) e).getCode()) .isEqualTo("channel_not_found"); } @@ -349,8 +350,8 @@ class ManagedChannelServiceTest { .providerReceipt()).isEqualTo(""); assertThatThrownBy(() -> service.getDelivery(TENANT, ACTOR, channel, "missing")) - .isInstanceOf(ApiException.class) - .extracting(e -> ((ApiException) e).getCode()) + .isInstanceOf(ManagedAgentException.class) + .extracting(e -> ((ManagedAgentException) e).getCode()) .isEqualTo("delivery_not_found"); } @@ -431,7 +432,7 @@ class ManagedChannelServiceTest { harness.submitErrors.add(refused); assertThatThrownBy(() -> service.submitInbound(TENANT, channel, event(1, "1700:98", "hello"))) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()) .isEqualTo(org.springframework.http.HttpStatus .BAD_REQUEST); @@ -457,7 +458,7 @@ class ManagedChannelServiceTest { + "\"code\":\"channel_operation_conflict\"}")); assertThatThrownBy(() -> service.submitInbound(TENANT, channel, event(1, "1700:97", "hello"))) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()) .isEqualTo(org.springframework.http.HttpStatus .SERVICE_UNAVAILABLE); @@ -466,7 +467,7 @@ class ManagedChannelServiceTest { }); assertThatThrownBy(() -> service.submitInbound(TENANT, channel, event(1, "1700:97", "hello"))) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()) .isEqualTo(org.springframework.http.HttpStatus .CONFLICT); @@ -495,7 +496,7 @@ class ManagedChannelServiceTest { ".", new ChannelPolicy("email", "allowlist", List.of("alice@example.com"), "followup")); assertThatThrownBy(() -> service.register(TENANT, channel, moved)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()) .isEqualTo(org.springframework.http.HttpStatus .CONFLICT); @@ -704,7 +705,7 @@ class ManagedChannelServiceTest { harness.throwDaemonOnceOnSubmit = true; assertThatThrownBy(() -> service.submitInbound(TENANT, channel, event(1, "1700:99", "hello"))) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()) .isEqualTo(org.springframework.http.HttpStatus .SERVICE_UNAVAILABLE); @@ -850,18 +851,18 @@ class ManagedChannelServiceTest { .isEmpty(); assertThatThrownBy(() -> service.listDeliveries(TENANT, "stranger", channel, null, 20)) - .isInstanceOf(ApiException.class) - .extracting(e -> ((ApiException) e).getCode()) + .isInstanceOf(ManagedAgentException.class) + .extracting(e -> ((ManagedAgentException) e).getCode()) .isEqualTo("channel_not_found"); assertThatThrownBy(() -> service.listChannels(TENANT, ACTOR, "!!", 20)) - .isInstanceOf(ApiException.class) - .extracting(e -> ((ApiException) e).getCode()) + .isInstanceOf(ManagedAgentException.class) + .extracting(e -> ((ManagedAgentException) e).getCode()) .isEqualTo("invalid_cursor"); assertThatThrownBy(() -> service.listChannels(TENANT, ACTOR, null, 0)) - .isInstanceOf(ApiException.class) - .extracting(e -> ((ApiException) e).getCode()) + .isInstanceOf(ManagedAgentException.class) + .extracting(e -> ((ManagedAgentException) e).getCode()) .isEqualTo("invalid_limit"); } @@ -913,7 +914,7 @@ class ManagedChannelServiceTest { + " VALUES (?, ?, ?, ?, ?, 'channel_delivery', ?, ?," + " 1, ?, NULL, NULL, 'channel', 'planned', ?)", scopeKey(sessionId), - com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection + com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection .recordKey(sessionId, "channel_delivery", deliveryId), TENANT, WORKSPACE, sessionId, deliveryId, "d".repeat(64), resourceId, clock.get()); @@ -961,11 +962,11 @@ class ManagedChannelServiceTest { } } - private List routes() { + private List routes() { return new JdbcChannelRouteRepository(jdbc).listByChannel(TENANT, channel, null, 100).routes(); } - private com.alibaba.qwen.code.managedagent.store.ChannelRouteRepository.ChannelRoute route(String eventId) { + private com.alibaba.qwen.code.managedagent.persistence.ChannelRouteRepository.ChannelRoute route(String eventId) { return routes().stream().filter(route -> eventId.equals(route.platformEventId())).findFirst().orElseThrow(); } @@ -978,7 +979,7 @@ class ManagedChannelServiceTest { } private static String scopeKey(String sessionId) { - return com.alibaba.qwen.code.managedagent.store.ManagedSessionStore.sessionScopeKey(TENANT, sessionId); + return com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore.sessionScopeKey(TENANT, sessionId); } /** Answers the channel operations the way the hosted funnel does. */ diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/EventTransportConfigurationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/EventTransportConfigurationTest.java index a5f4dc56357..156f0c08ebc 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/EventTransportConfigurationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/EventTransportConfigurationTest.java @@ -1,14 +1,14 @@ package com.alibaba.qwen.code.managedagent.config; +import com.alibaba.qwen.code.managedagent.event.EventTransport; +import com.alibaba.qwen.code.managedagent.event.EventTransportConsumer; +import com.alibaba.qwen.code.managedagent.event.JournalEventTransport; +import com.alibaba.qwen.code.managedagent.event.LiteTopicEventTransport; +import com.alibaba.qwen.code.managedagent.event.LiteTopicPublicEventTransport; +import com.alibaba.qwen.code.managedagent.event.MessageMaterializer; +import com.alibaba.qwen.code.managedagent.event.TransportWakeActivator; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.service.EventTransportConsumer; -import com.alibaba.qwen.code.managedagent.service.LiteTopicEventTransport; -import com.alibaba.qwen.code.managedagent.service.LiteTopicPublicEventTransport; -import com.alibaba.qwen.code.managedagent.service.MessageMaterializer; -import com.alibaba.qwen.code.managedagent.service.TransportWakeActivator; -import com.alibaba.qwen.code.managedagent.store.EventTransport; -import com.alibaba.qwen.code.managedagent.store.JournalEventTransport; -import com.alibaba.qwen.code.managedagent.store.TransportConsumerStore; +import com.alibaba.qwen.code.managedagent.persistence.TransportConsumerStore; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.rocketmq.client.apis.ClientException; import org.apache.rocketmq.client.apis.ClientServiceProvider; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/JavaDurableAdmissionConfigurationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/JavaDurableAdmissionConfigurationTest.java index b492bfb2307..71024cdc141 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/JavaDurableAdmissionConfigurationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/JavaDurableAdmissionConfigurationTest.java @@ -1,7 +1,7 @@ package com.alibaba.qwen.code.managedagent.config; -import com.alibaba.qwen.code.managedagent.service.JavaDurableAdmission; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.session.JavaDurableAdmission; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.runner.ApplicationContextRunner; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/ManagedAgentPropertiesTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/ManagedAgentPropertiesTest.java index 6e83c284e84..b8099332317 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/ManagedAgentPropertiesTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/ManagedAgentPropertiesTest.java @@ -1,12 +1,12 @@ package com.alibaba.qwen.code.managedagent.config; -import com.alibaba.qwen.code.managedagent.service.ActionResponseCoordinator; -import com.alibaba.qwen.code.managedagent.service.ChildResultRelay; -import com.alibaba.qwen.code.managedagent.service.HarnessCoordinator; -import com.alibaba.qwen.code.managedagent.service.MessageMaterializer; -import com.alibaba.qwen.code.managedagent.service.SessionLifecycleCoordinator; -import com.alibaba.qwen.code.managedagent.service.WakeRecovery; -import com.alibaba.qwen.code.managedagent.store.ManagedToolResultProjector; +import com.alibaba.qwen.code.managedagent.event.MessageMaterializer; +import com.alibaba.qwen.code.managedagent.persistence.ManagedToolResultProjector; +import com.alibaba.qwen.code.managedagent.session.ActionResponseCoordinator; +import com.alibaba.qwen.code.managedagent.session.HarnessCoordinator; +import com.alibaba.qwen.code.managedagent.session.SessionLifecycleCoordinator; +import com.alibaba.qwen.code.managedagent.session.WakeRecovery; +import com.alibaba.qwen.code.managedagent.workspace.ChildResultRelay; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.context.properties.EnableConfigurationProperties; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/ManagedSchemaConfigurationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/ManagedSchemaConfigurationTest.java index 6407645f5cd..e8dc842d963 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/ManagedSchemaConfigurationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/ManagedSchemaConfigurationTest.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.managedagent.config; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import org.flywaydb.core.Flyway; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/ManagedSessionJsonConfigurationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/ManagedSessionJsonConfigurationTest.java index b7b14fd048a..9a82a4827be 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/ManagedSessionJsonConfigurationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/ManagedSessionJsonConfigurationTest.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.managedagent.config; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitTransactionRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitTransactionRequest; import com.fasterxml.jackson.core.exc.StreamConstraintsException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/RuntimeBrokerConfigurationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/RuntimeBrokerConfigurationTest.java index 0ab0154acfb..13ab46470e9 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/RuntimeBrokerConfigurationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/RuntimeBrokerConfigurationTest.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.managedagent.config; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; import org.junit.jupiter.api.Test; import org.mockito.Mockito; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/RuntimeRetentionConfigurationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/RuntimeRetentionConfigurationTest.java index 33414f43dcf..0ba8d8bb555 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/RuntimeRetentionConfigurationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/RuntimeRetentionConfigurationTest.java @@ -1,13 +1,13 @@ package com.alibaba.qwen.code.managedagent.config; -import com.alibaba.qwen.code.managedagent.service.RuntimeRetentionJob; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeRetentionJob; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRepository; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import org.h2.jdbcx.JdbcDataSource; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/ToolPublicationStorageConfigurationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/ToolPublicationStorageConfigurationTest.java index 17ef2b208c1..20ebbb3eee6 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/ToolPublicationStorageConfigurationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/config/ToolPublicationStorageConfigurationTest.java @@ -1,11 +1,11 @@ package com.alibaba.qwen.code.managedagent.config; -import com.alibaba.qwen.code.managedagent.store.AliyunToolPublicationObjectStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationCollector; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationDataStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationObjectStore; -import com.alibaba.qwen.code.managedagent.store.WriterCredentialPolicy; +import com.alibaba.qwen.code.managedagent.artifact.AliyunToolPublicationObjectStore; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationCollector; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationDataStore; +import com.alibaba.qwen.code.managedagent.security.WriterCredentialPolicy; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRepository; import com.aliyun.oss.OSS; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/CompositeCommittedEventPublisherTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/CompositeCommittedEventPublisherTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/CompositeCommittedEventPublisherTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/CompositeCommittedEventPublisherTest.java index 55c993f2f92..c3fde712a94 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/CompositeCommittedEventPublisherTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/CompositeCommittedEventPublisherTest.java @@ -1,10 +1,9 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.event; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; -import com.alibaba.qwen.code.managedagent.store.CommittedEventPublisher; -import com.alibaba.qwen.code.managedagent.store.EventTransport; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.session.SessionEventHub; import org.junit.jupiter.api.Test; import org.slf4j.LoggerFactory; import org.springframework.boot.test.context.runner.ApplicationContextRunner; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/EventTransportConsumerMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/EventTransportConsumerMySqlIT.java similarity index 87% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/EventTransportConsumerMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/EventTransportConsumerMySqlIT.java index a01920b7bfd..bfe4b666646 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/EventTransportConsumerMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/EventTransportConsumerMySqlIT.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.event; -import com.alibaba.qwen.code.managedagent.store.IsolatedManagedSchemaMySqlTestDatabase; +import com.alibaba.qwen.code.managedagent.persistence.IsolatedManagedSchemaMySqlTestDatabase; import org.junit.jupiter.api.AfterAll; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.test.context.DynamicPropertyRegistry; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/EventTransportConsumerSqlTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/EventTransportConsumerSqlTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/EventTransportConsumerSqlTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/EventTransportConsumerSqlTest.java index 12ebedc6190..4f298dfb6be 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/EventTransportConsumerSqlTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/EventTransportConsumerSqlTest.java @@ -1,10 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.event; +import com.alibaba.qwen.code.managedagent.event.EventTransportConsumer.MaterializeOutcome; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.service.EventTransportConsumer.MaterializeOutcome; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelope; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelopes; -import com.alibaba.qwen.code.managedagent.store.TransportConsumerStore; +import com.alibaba.qwen.code.managedagent.persistence.TransportConsumerStore; import com.alibaba.qwen.code.runtimebroker.CsiFilesRetirementProfile; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; @@ -49,7 +47,7 @@ import static org.mockito.Mockito.when; // The scheduled pass would race the notices this test hands over. "qwen.managed-agent.events.materialize-interval=1h" }) -class EventTransportConsumerSqlTest { +public class EventTransportConsumerSqlTest { private static final String TENANT = "tenant-transport"; private static final String WORKSPACE = "workspace-transport"; private static final String DIGEST = "c".repeat(64); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/EventTransportConsumerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/EventTransportConsumerTest.java similarity index 94% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/EventTransportConsumerTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/EventTransportConsumerTest.java index 58a2c57930d..7995e3f3b65 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/EventTransportConsumerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/EventTransportConsumerTest.java @@ -1,10 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.event; -import com.alibaba.qwen.code.managedagent.service.EventTransportConsumer.MaterializeOutcome; -import com.alibaba.qwen.code.managedagent.service.TransportWakeActivator.Outcome; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelope; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelopes; -import com.alibaba.qwen.code.managedagent.store.TransportConsumerStore; +import com.alibaba.qwen.code.managedagent.event.EventTransportConsumer.MaterializeOutcome; +import com.alibaba.qwen.code.managedagent.event.TransportWakeActivator.Outcome; +import com.alibaba.qwen.code.managedagent.persistence.TransportConsumerStore; import org.apache.rocketmq.client.apis.consumer.ConsumeResult; import org.apache.rocketmq.client.apis.message.MessageView; import org.junit.jupiter.api.BeforeEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/EventTransportNodeMain.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/EventTransportNodeMain.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/EventTransportNodeMain.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/EventTransportNodeMain.java index 9df30e954cb..fff50646e63 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/EventTransportNodeMain.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/EventTransportNodeMain.java @@ -1,12 +1,11 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.event; import com.alibaba.qwen.code.managedagent.ManagedAgentServerApplication; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelope; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelopes; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; -import com.alibaba.qwen.code.managedagent.store.TransportConsumerStore; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.persistence.TransportConsumerStore; +import com.alibaba.qwen.code.managedagent.session.OwnerSubscriptions; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.rocketmq.client.apis.ClientServiceProvider; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/LiteTopicEventTransportTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/LiteTopicEventTransportTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/LiteTopicEventTransportTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/LiteTopicEventTransportTest.java index 64a0b67c27a..6b83984ecf6 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/LiteTopicEventTransportTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/LiteTopicEventTransportTest.java @@ -1,7 +1,5 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.event; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelope; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelopes; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.rocketmq.client.apis.ClientServiceProvider; import org.apache.rocketmq.client.apis.message.Message; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/LiteTopicPublicEventTransportTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/LiteTopicPublicEventTransportTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/LiteTopicPublicEventTransportTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/LiteTopicPublicEventTransportTest.java index d87fde4a1af..d6d611ca05b 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/LiteTopicPublicEventTransportTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/LiteTopicPublicEventTransportTest.java @@ -1,8 +1,6 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.event; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelope; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelopes; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.rocketmq.client.apis.ClientServiceProvider; import org.apache.rocketmq.client.apis.message.Message; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedEventEnvelopesTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/ManagedEventEnvelopesTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedEventEnvelopesTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/ManagedEventEnvelopesTest.java index 739559ce2d0..b53631b9456 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedEventEnvelopesTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/ManagedEventEnvelopesTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.event; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/MessageMaterializerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/MessageMaterializerTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/MessageMaterializerTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/MessageMaterializerTest.java index e1ffbf45373..8f18af9243d 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/MessageMaterializerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/MessageMaterializerTest.java @@ -1,8 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.event; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.MaterializationResult; -import com.alibaba.qwen.code.managedagent.store.StoreModels.MaterializationTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.MaterializationResult; +import com.alibaba.qwen.code.managedagent.model.StoreModels.MaterializationTarget; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import org.junit.jupiter.api.Test; import org.springframework.dao.DataAccessResourceFailureException; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/TransportWakeActivatorTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/TransportWakeActivatorTest.java similarity index 94% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/TransportWakeActivatorTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/TransportWakeActivatorTest.java index df252ccb778..f6dc309c242 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/TransportWakeActivatorTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/event/TransportWakeActivatorTest.java @@ -1,12 +1,11 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.event; import com.alibaba.qwen.code.managedagent.AutomationHarnessFake; +import com.alibaba.qwen.code.managedagent.event.TransportWakeActivator.LoadOutcome; +import com.alibaba.qwen.code.managedagent.event.TransportWakeActivator.Outcome; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.service.TransportWakeActivator.LoadOutcome; -import com.alibaba.qwen.code.managedagent.service.TransportWakeActivator.Outcome; -import com.alibaba.qwen.code.managedagent.store.ManagedEventEnvelope; -import com.alibaba.qwen.code.managedagent.store.TransportConsumerStore; -import com.alibaba.qwen.code.managedagent.store.TransportConsumerStore.WakeFence; +import com.alibaba.qwen.code.managedagent.persistence.TransportConsumerStore; +import com.alibaba.qwen.code.managedagent.persistence.TransportConsumerStore.WakeFence; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/harness/HostedHarnessCreateOrLoadPinningTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/harness/HostedHarnessCreateOrLoadPinningTest.java index 872149c5c69..e662a907994 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/harness/HostedHarnessCreateOrLoadPinningTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/harness/HostedHarnessCreateOrLoadPinningTest.java @@ -4,9 +4,9 @@ import com.alibaba.qwen.code.daemon.HarnessSessionRef; import com.alibaba.qwen.code.daemon.HostedHarnessCapabilities; import com.alibaba.qwen.code.daemon.HostedHarnessClient; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import com.fasterxml.jackson.databind.ObjectMapper; import com.sun.net.httpserver.HttpServer; import org.junit.jupiter.api.AfterEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/harness/QwenHostedHarnessColdCancelRegressionTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/harness/QwenHostedHarnessColdCancelRegressionTest.java index 89dd75345bd..53e2b14c5b1 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/harness/QwenHostedHarnessColdCancelRegressionTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/harness/QwenHostedHarnessColdCancelRegressionTest.java @@ -5,17 +5,17 @@ import com.alibaba.qwen.code.daemon.HarnessSessionRef; import com.alibaba.qwen.code.daemon.HostedHarnessCapabilities; import com.alibaba.qwen.code.daemon.HostedHarnessClient; import com.alibaba.qwen.code.daemon.LoadHarnessSession; -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.service.HarnessCoordinator; -import com.alibaba.qwen.code.managedagent.service.HarnessEventProjector; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentService; -import com.alibaba.qwen.code.managedagent.service.RequestDigests; -import com.alibaba.qwen.code.managedagent.store.ManagedActionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.persistence.ManagedActionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.session.HarnessCoordinator; +import com.alibaba.qwen.code.managedagent.session.HarnessEventProjector; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.fasterxml.jackson.databind.ObjectMapper; @@ -180,7 +180,7 @@ class QwenHostedHarnessColdCancelRegressionTest { coordinator, connector, registry); clearInvocations(client); assertThatThrownBy(() -> service.cancelTurn(tenant, "actor-a", "cancel-fresh", session, turn)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("session_not_found")); assertThat(store.findCommand(tenant, "CANCEL", "cancel-fresh")).isEmpty(); } finally { @@ -317,7 +317,7 @@ class QwenHostedHarnessColdCancelRegressionTest { String requestOwner = owner; assertThatThrownBy(() -> fixture.connector().recoverManagedFailureCancellation( requestTenant, requestSession, requestTurn, requestOwner)) - .isInstanceOfAny(RuntimeBrokerException.class, ApiException.class); + .isInstanceOfAny(RuntimeBrokerException.class, ManagedAgentException.class); verifyNoInteractions(fixture.client()); assertThat(failedEvents(fixture)).isZero(); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/harness/QwenHostedHarnessConnectorTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/harness/QwenHostedHarnessConnectorTest.java index 80d9bc110dd..88fa291e807 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/harness/QwenHostedHarnessConnectorTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/harness/QwenHostedHarnessConnectorTest.java @@ -13,25 +13,25 @@ import com.alibaba.qwen.code.daemon.MutationOutcomeUnknownException; import com.alibaba.qwen.code.daemon.PromptReceipt; import com.alibaba.qwen.code.daemon.SessionCreationOutcomeUnknownException; import com.alibaba.qwen.code.daemon.SubmitHarnessTurn; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellApprovalSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ManagedActionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentDefinitionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.ToolResultResourceRef; -import com.alibaba.qwen.code.managedagent.store.SshWorkspaceStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.TurnRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.TurnSummary; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; -import com.alibaba.qwen.code.managedagent.store.WriterCredentialPolicy; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellApprovalSelection; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.TurnRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.TurnSummary; +import com.alibaba.qwen.code.managedagent.persistence.ManagedActionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentDefinitionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.ToolResultResourceRef; +import com.alibaba.qwen.code.managedagent.persistence.SshWorkspaceStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.security.WriterCredentialPolicy; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; -import com.alibaba.qwen.code.runtimebroker.SshRuntimeStorage; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.provisioning.SshRuntimeStorage; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/harness/QwenHostedHarnessNewSessionRegressionTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/harness/QwenHostedHarnessNewSessionRegressionTest.java index f7ef4c15ddc..a32827e6c1c 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/harness/QwenHostedHarnessNewSessionRegressionTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/harness/QwenHostedHarnessNewSessionRegressionTest.java @@ -6,9 +6,9 @@ import com.alibaba.qwen.code.daemon.HostedHarnessCapabilities; import com.alibaba.qwen.code.daemon.HostedHarnessClient; import com.alibaba.qwen.code.daemon.LoadHarnessSession; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import org.junit.jupiter.api.Test; import org.springframework.test.util.ReflectionTestUtils; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/RequestDigestsTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/model/RequestDigestsTest.java similarity index 95% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/RequestDigestsTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/model/RequestDigestsTest.java index cc55332e103..ab2500ac487 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/RequestDigestsTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/model/RequestDigestsTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.model; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AgentDefinitionCompilerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/AgentDefinitionCompilerTest.java similarity index 91% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AgentDefinitionCompilerTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/AgentDefinitionCompilerTest.java index 3fe4a77a61b..b1b04be00e2 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AgentDefinitionCompilerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/AgentDefinitionCompilerTest.java @@ -1,6 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; import org.junit.jupiter.api.Test; import java.util.List; @@ -76,7 +77,7 @@ class AgentDefinitionCompilerTest { assertThatThrownBy(() -> AgentDefinitionCompiler.compile(definition( hostedProfile("hosted-workspace-shell/1"), "{}"), true, "yolo", allowlist)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getDetails().get("field")) .isEqualTo("tools")); AgentDefinitionCompiler.Compiled compiled = @@ -95,7 +96,7 @@ class AgentDefinitionCompilerTest { hostedProfile(WorkspaceToolProfiles.INTERNAL_TEAM_LEAD), "{\"approval_mode\":\"" + mode + "\"}"), true, mode, List.of(WorkspaceToolProfiles.INTERNAL_TEAM_LEAD))) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getCode()).isEqualTo("agent_definition_unsupported"); assertThat(error.getDetails().get("field")).isEqualTo("tools"); }); @@ -116,7 +117,7 @@ class AgentDefinitionCompilerTest { void refusesContentThatCannotTakeEffect(String json, String field) { assertThatThrownBy(() -> AgentDefinitionCompiler.compile(json, false, "yolo", FILES_ONLY)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus().value()).isEqualTo(409); assertThat(error.getCode()) .isEqualTo("agent_definition_unsupported"); @@ -138,7 +139,7 @@ class AgentDefinitionCompilerTest { void boundSessionsRefuseAnythingButOneAllowlistedProfile(String tools) { assertThatThrownBy(() -> AgentDefinitionCompiler.compile( definition(tools, "{}"), true, "yolo", FILES_ONLY)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getDetails().get("field")) .isEqualTo("tools")); } @@ -148,7 +149,7 @@ class AgentDefinitionCompilerTest { assertThatThrownBy(() -> AgentDefinitionCompiler.compile(definition( hostedProfile("hosted-workspace-files/1"), "{}"), false, "yolo", FILES_ONLY)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getDetails().get("field")) .isEqualTo("tools")); } @@ -171,12 +172,12 @@ class AgentDefinitionCompilerTest { assertThatThrownBy(() -> AgentDefinitionCompiler.compile( accepted.replace("界\"", "界界\""), false, "yolo", FILES_ONLY, List.of("configured"))) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getDetails().get("field")) .isEqualTo("instructions")); assertThatThrownBy(() -> AgentDefinitionCompiler.compile(accepted, false, "yolo", FILES_ONLY, List.of())) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getDetails().get("field")) .isEqualTo("model")); } @@ -191,10 +192,10 @@ class AgentDefinitionCompilerTest { assertThat(AgentDefinitionCompiler.compile(configured, true, "yolo", List.of(WorkspaceToolProfiles.MCP)) .toolProfile()).isEqualTo(WorkspaceToolProfiles.MCP); assertThatThrownBy(() -> AgentDefinitionCompiler.compile(configured, true, "yolo", FILES_ONLY)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getDetails()).containsEntry("field", "tools")); assertThatThrownBy(() -> AgentDefinitionCompiler.compile(base, true, "yolo", List.of(WorkspaceToolProfiles.MCP))) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getDetails()).containsEntry("field", "mcp_servers")); } } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AgentStateStoreTransactionTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/AgentStateStoreTransactionTest.java similarity index 93% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AgentStateStoreTransactionTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/AgentStateStoreTransactionTest.java index 60887527711..aa6469c4e1a 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AgentStateStoreTransactionTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/AgentStateStoreTransactionTest.java @@ -1,5 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import org.junit.jupiter.api.Test; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.annotation.AnnotationTransactionAttributeSource; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AliyunToolPublicationReadRetryTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/AliyunToolPublicationReadRetryTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AliyunToolPublicationReadRetryTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/AliyunToolPublicationReadRetryTest.java index cffb24495b3..2d2f81d8cc5 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AliyunToolPublicationReadRetryTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/AliyunToolPublicationReadRetryTest.java @@ -1,5 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; +import com.alibaba.qwen.code.managedagent.artifact.AliyunToolPublicationObjectStore; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationStorageException; import com.aliyun.oss.ClientBuilderConfiguration; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AutomationCommandTimestampTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/AutomationCommandTimestampTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AutomationCommandTimestampTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/AutomationCommandTimestampTest.java index 7aa33cddf99..1088b6d7a21 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AutomationCommandTimestampTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/AutomationCommandTimestampTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AutomationLedgerStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/AutomationLedgerStoreTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AutomationLedgerStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/AutomationLedgerStoreTest.java index 708b66212cc..22af75a9635 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/AutomationLedgerStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/AutomationLedgerStoreTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -114,7 +114,7 @@ class AutomationLedgerStoreTest { @BeforeEach void openDataSource() { SimpleDriverDataSource raw = raw(); - this.jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate((DataSource) Proxy.newProxyInstance( + this.jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate((DataSource) Proxy.newProxyInstance( AutomationLedgerStoreTest.class.getClassLoader(), new Class[] {DataSource.class }, (proxy, method, args) -> { Object result = invoke(method, raw, args); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ChildWorkspaceStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ChildWorkspaceStoreTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ChildWorkspaceStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ChildWorkspaceStoreTest.java index fd764a8870d..d31a63d4a0d 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ChildWorkspaceStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ChildWorkspaceStoreTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ConsolidatedActionStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ConsolidatedActionStoreTest.java similarity index 94% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ConsolidatedActionStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ConsolidatedActionStoreTest.java index 4220e6802b6..05aeafbe9bd 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ConsolidatedActionStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ConsolidatedActionStoreTest.java @@ -1,9 +1,11 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.StoredResource; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.StoredResource; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; @@ -84,11 +86,11 @@ class ConsolidatedActionStoreTest { var first = admit("key1", "request1", response("allow")); assertThat(admit("key1", "request1", response("allow")).operation().operationId()).isEqualTo(first.operation().operationId()); assertThat(admit("key2", "request2", response("allow")).replayed()).isTrue(); - assertThatThrownBy(() -> admit("key3", "request3", response("deny"))).isInstanceOf(ApiException.class); - assertThatThrownBy(() -> admit("key1", "changed", response("allow"))).isInstanceOf(ApiException.class); + assertThatThrownBy(() -> admit("key3", "request3", response("deny"))).isInstanceOf(ManagedAgentException.class); + assertThatThrownBy(() -> admit("key1", "changed", response("allow"))).isInstanceOf(ManagedAgentException.class); jdbc.update("UPDATE ma_operation SET claim_owner='worker',claim_generation=2,claim_until=?,state='RUNNING',delivery_state='LEASED'", 0L); - assertThatThrownBy(() -> admit("key4", "request4", response("deny"))).isInstanceOf(ApiException.class); + assertThatThrownBy(() -> admit("key4", "request4", response("deny"))).isInstanceOf(ManagedAgentException.class); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_operation WHERE operation_kind='ACTION_RESPONSE'", Long.class)).isEqualTo(1); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_request_receipt WHERE namespace='ACTION_DECISION'", Long.class)).isEqualTo(1); } @@ -121,7 +123,7 @@ class ConsolidatedActionStoreTest { "session", null, "COMPLETED", null, true, 0); assertThatThrownBy(() -> transactions.execute(status -> actions.admit( "tenant", "session", "actor", "actor-digest", "response", "request", ACTION, response("allow"), 10))) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("action_forbidden")); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_operation", Long.class)).isZero(); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ConsolidatedChannelStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ConsolidatedChannelStoreTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ConsolidatedChannelStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ConsolidatedChannelStoreTest.java index 7f00d4d890b..9fc3d96526a 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ConsolidatedChannelStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ConsolidatedChannelStoreTest.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.store.ChannelDeliveryRepository.ChannelDelivery; +import com.alibaba.qwen.code.managedagent.persistence.ChannelDeliveryRepository.ChannelDelivery; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ConsolidatedStoreFixture.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ConsolidatedStoreFixture.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ConsolidatedStoreFixture.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ConsolidatedStoreFixture.java index 77226c0c3f9..08a84a82186 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ConsolidatedStoreFixture.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ConsolidatedStoreFixture.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.h2.jdbcx.JdbcDataSource; import org.springframework.jdbc.core.JdbcTemplate; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ConsolidatedTaskEventStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ConsolidatedTaskEventStoreTest.java similarity index 88% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ConsolidatedTaskEventStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ConsolidatedTaskEventStoreTest.java index f1177050752..61eaaa1abde 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ConsolidatedTaskEventStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ConsolidatedTaskEventStoreTest.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -38,12 +38,12 @@ class ConsolidatedTaskEventStoreTest { String task = "任务:child:1"; String cursor = ManagedTaskEventStore.encodeCursor("tenant", "session", task, 14); assertThat(ManagedTaskEventStore.decodeCursor("tenant", "session", task, cursor)).isEqualTo(14); - assertThatThrownBy(() -> ManagedTaskEventStore.decodeCursor("another", "session", task, cursor)).isInstanceOf(ApiException.class); - assertThatThrownBy(() -> ManagedTaskEventStore.decodeCursor("tenant", "another", task, cursor)).isInstanceOf(ApiException.class); - assertThatThrownBy(() -> ManagedTaskEventStore.decodeCursor("tenant", "session", task + " ", cursor)).isInstanceOf(ApiException.class); - assertThatThrownBy(() -> ManagedTaskEventStore.decodeCursor("tenant", "session", task, "x".repeat(129))).isInstanceOf(ApiException.class); + assertThatThrownBy(() -> ManagedTaskEventStore.decodeCursor("another", "session", task, cursor)).isInstanceOf(ManagedAgentException.class); + assertThatThrownBy(() -> ManagedTaskEventStore.decodeCursor("tenant", "another", task, cursor)).isInstanceOf(ManagedAgentException.class); + assertThatThrownBy(() -> ManagedTaskEventStore.decodeCursor("tenant", "session", task + " ", cursor)).isInstanceOf(ManagedAgentException.class); + assertThatThrownBy(() -> ManagedTaskEventStore.decodeCursor("tenant", "session", task, "x".repeat(129))).isInstanceOf(ManagedAgentException.class); String old = java.util.Base64.getUrlEncoder().encodeToString("tev1:task:14".getBytes(java.nio.charset.StandardCharsets.US_ASCII)); - assertThatThrownBy(() -> ManagedTaskEventStore.decodeCursor("tenant", "session", "task", old)).isInstanceOf(ApiException.class); + assertThatThrownBy(() -> ManagedTaskEventStore.decodeCursor("tenant", "session", "task", old)).isInstanceOf(ManagedAgentException.class); } @Test @@ -70,11 +70,11 @@ class ConsolidatedTaskEventStoreTest { long first = events.appendOutput("tenant", "session", "task", "chunk", false, "capture", "stdout", 0L, 1L, 1); assertThatThrownBy(() -> events.expireThrough("tenant", "session", "task", first)) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); assertThat(events.markOutputArchived("tenant", "session", "task", first)).isEqualTo(1); events.expireThrough("tenant", "session", "task", first); assertThatThrownBy(() -> events.appendOutput("tenant", "session", "task", "again", false, - "capture", "stdout", 0L, 1L, 2)).isInstanceOf(ApiException.class); + "capture", "stdout", 0L, 1L, 2)).isInstanceOf(ManagedAgentException.class); assertThat(events.positions("tenant", "session", "task").lastSequence()).isEqualTo(1); assertThat(events.appendOutput("tenant", "session", "task", "next", false, "capture", "stdout", 1L, 2L, 3)).isEqualTo(2); @@ -91,7 +91,7 @@ class ConsolidatedTaskEventStoreTest { new org.springframework.jdbc.datasource.DataSourceTransactionManager(jdbc.getDataSource())) .executeWithoutResult(status -> { assertThatThrownBy(() -> events.appendStateChange("tenant", "session", "task", "completed", "ready", 1000)) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); jdbc.update("UPDATE ma_session SET title=? WHERE tenant_id=? AND session_id=?", "committed-domain", "tenant", "session"); }); assertThat(jdbc.queryForObject("SELECT title FROM ma_session WHERE tenant_id=? AND session_id=?", String.class, @@ -111,7 +111,7 @@ class ConsolidatedTaskEventStoreTest { jdbc.update("UPDATE ma_session SET retired_at=1, retirement_generation=1 WHERE tenant_id=? AND session_id=?", "tenant", "session"); assertThatThrownBy(() -> events.appendArtifact("tenant", "session", "task", "artifact3", 3)) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); assertThat(events.positions("tenant", "session", "task").lastSequence()).isEqualTo(2); } } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/CsiRuntimeMarkerProbeTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/CsiRuntimeMarkerProbeTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/CsiRuntimeMarkerProbeTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/CsiRuntimeMarkerProbeTest.java index b19c51b5860..ed159f17618 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/CsiRuntimeMarkerProbeTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/CsiRuntimeMarkerProbeTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.JdbcCsiFilesRetirementGuard; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/EventIdentityTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/EventIdentityTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/EventIdentityTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/EventIdentityTest.java index e215e9616c0..c254e1aafa9 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/EventIdentityTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/EventIdentityTest.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.store.EventIdentity.Identity; +import com.alibaba.qwen.code.managedagent.persistence.EventIdentity.Identity; import org.junit.jupiter.api.Test; import java.nio.charset.StandardCharsets; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ExecutedQueryPlan.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ExecutedQueryPlan.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ExecutedQueryPlan.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ExecutedQueryPlan.java index e31f9cf7d9f..4c623bf8ffb 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ExecutedQueryPlan.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ExecutedQueryPlan.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ExecutedQueryPlanTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ExecutedQueryPlanTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ExecutedQueryPlanTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ExecutedQueryPlanTest.java index c7201475af7..8a832433167 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ExecutedQueryPlanTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ExecutedQueryPlanTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/FaultingExtensionRecordStore.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/FaultingExtensionRecordStore.java similarity index 88% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/FaultingExtensionRecordStore.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/FaultingExtensionRecordStore.java index e39182b0959..f6d0489c21f 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/FaultingExtensionRecordStore.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/FaultingExtensionRecordStore.java @@ -1,6 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.StoredResource; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.StoredResource; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import org.springframework.jdbc.core.JdbcTemplate; import java.util.function.Function; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/HostedWorkspaceConcurrencyIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/HostedWorkspaceConcurrencyIT.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/HostedWorkspaceConcurrencyIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/HostedWorkspaceConcurrencyIT.java index a1918d5490b..e6f70ea8440 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/HostedWorkspaceConcurrencyIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/HostedWorkspaceConcurrencyIT.java @@ -1,23 +1,23 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.RuntimeBroker.WorkspaceMount; -import com.alibaba.qwen.code.managedagent.service.EmbeddedRuntimeBroker; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; -import com.alibaba.qwen.code.runtimebroker.HttpRuntimeTransport; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.workspace.runtime.EmbeddedRuntimeBroker; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; -import com.alibaba.qwen.code.runtimebroker.LocalProcessRuntimeProvisioner; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; -import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerHttpServer; import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import com.alibaba.qwen.code.runtimebroker.transport.RuntimeBrokerHttpServer; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.h2.tools.Server; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/HostedWorkspaceStorageGuardMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/HostedWorkspaceStorageGuardMySqlIT.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/HostedWorkspaceStorageGuardMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/HostedWorkspaceStorageGuardMySqlIT.java index 1dcccd231e9..0d471ef4712 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/HostedWorkspaceStorageGuardMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/HostedWorkspaceStorageGuardMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.RuntimeBroker.WorkspaceMount; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/IsolatedManagedSchemaMySqlTestDatabase.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/IsolatedManagedSchemaMySqlTestDatabase.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/IsolatedManagedSchemaMySqlTestDatabase.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/IsolatedManagedSchemaMySqlTestDatabase.java index 1dabf4e8640..4224ea00dbb 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/IsolatedManagedSchemaMySqlTestDatabase.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/IsolatedManagedSchemaMySqlTestDatabase.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.springframework.jdbc.datasource.DriverManagerDataSource; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/LocalStorageAliasMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/LocalStorageAliasMySqlIT.java similarity index 75% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/LocalStorageAliasMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/LocalStorageAliasMySqlIT.java index 176011a7757..f3c8d66972d 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/LocalStorageAliasMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/LocalStorageAliasMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import javax.sql.DataSource; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/LocalStorageAliasTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/LocalStorageAliasTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/LocalStorageAliasTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/LocalStorageAliasTest.java index 45742540eec..207ca31e276 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/LocalStorageAliasTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/LocalStorageAliasTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.RuntimeBroker.WorkspaceMount; @@ -213,7 +213,7 @@ class LocalStorageAliasTest { void aSeededFailedBindingStillProtectsTheOtherAlias() { var source = java.util.Objects.requireNonNull(jdbc.getDataSource()); var repository = new JdbcRuntimeBindingRepository(source, - new com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector("test", new byte[32])); + new com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector("test", new byte[32])); var request = new com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest( new com.alibaba.qwen.code.runtimebroker.RuntimeScope("other-tenant", "workspace", "1", root.toString(), "sha256:" + "a".repeat(64), "workspace"), null, "local-process", "other-storage"); @@ -308,7 +308,7 @@ class LocalStorageAliasTest { void anUnknownBindingStateCannotCertifyAnotherAliasesPhysicalStop() { var source = java.util.Objects.requireNonNull(jdbc.getDataSource()); var repository = new JdbcRuntimeBindingRepository(source, - new com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector("test", new byte[32])); + new com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector("test", new byte[32])); var request = new com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest( new com.alibaba.qwen.code.runtimebroker.RuntimeScope("other-tenant", "workspace", "1", root.toString(), "sha256:" + "a".repeat(64), "workspace"), null, "local-process", "other-storage"); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedActionStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedActionStoreTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedActionStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedActionStoreTest.java index 9a79a119443..f21304b76f6 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedActionStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedActionStoreTest.java @@ -1,10 +1,11 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.StoredResource; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationAdmission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationAdmission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.StoredResource; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; @@ -341,9 +342,9 @@ class ManagedActionStoreTest { + " AND workspace_id = ?", TENANT, "workspace"); assertThatThrownBy(() -> admitAs("operator", "idem", "digest", response("allow"), 30)) - .isInstanceOf(ApiException.class) + .isInstanceOf(ManagedAgentException.class) .satisfies(error -> { - var refusal = (ApiException) error; + var refusal = (ManagedAgentException) error; assertThat(refusal.getStatus()).isEqualTo(HttpStatus.FORBIDDEN); assertThat(refusal.getCode()).isEqualTo("action_forbidden"); }); @@ -374,9 +375,9 @@ class ManagedActionStoreTest { when(agents.hasExecutionRegistryFacts(anyString(), anyString())).thenReturn(false); assertThatThrownBy(() -> admitAs("owner", "idem", "digest", response("allow"), 30)) - .isInstanceOf(ApiException.class) + .isInstanceOf(ManagedAgentException.class) .satisfies(error -> { - var refusal = (ApiException) error; + var refusal = (ManagedAgentException) error; assertThat(refusal.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(refusal.getCode()).isEqualTo("workspace_unavailable"); }); @@ -408,9 +409,9 @@ class ManagedActionStoreTest { + " AND workspace_id = ?", TENANT, "workspace"); assertThatThrownBy(() -> admitAs("operator", "idem", "digest", response("allow"), 3000)) - .isInstanceOf(ApiException.class) + .isInstanceOf(ManagedAgentException.class) .satisfies(error -> { - var refusal = (ApiException) error; + var refusal = (ManagedAgentException) error; assertThat(refusal.getStatus()).isEqualTo(HttpStatus.FORBIDDEN); assertThat(refusal.getCode()).isEqualTo("action_forbidden"); }); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedAgentCsiMutationMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedAgentCsiMutationMySqlIT.java similarity index 94% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedAgentCsiMutationMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedAgentCsiMutationMySqlIT.java index 3aeb80250f7..2ffd4b96129 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedAgentCsiMutationMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedAgentCsiMutationMySqlIT.java @@ -1,8 +1,8 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -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.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.CsiFilesRetirementProfile; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -44,13 +44,13 @@ class ManagedAgentCsiMutationMySqlIT { } String user = System.getProperty("mysql.user"); String password = System.getProperty("mysql.password", ""); - var admin = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(new DriverManagerDataSource(url, user, password)); + var admin = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(new DriverManagerDataSource(url, user, password)); String schema = "csi_collection_create_" + UUID.randomUUID().toString().replace("-", ""); admin.execute("CREATE DATABASE " + schema + " CHARACTER SET utf8mb4"); try { var data = new DriverManagerDataSource(url.replaceFirst("/[^/?]+(?=\\?|$)", "/" + schema), user, password); Flyway.configure().dataSource(data).locations("classpath:db/managed-schema").load().migrate(); - var jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(data); + var jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(data); String lockWaitQuery = lockWaitQuery(jdbc); var manager = new DataSourceTransactionManager(data); var json = new ObjectMapper(); @@ -109,7 +109,7 @@ class ManagedAgentCsiMutationMySqlIT { } var inserting = new CountDownLatch(1); var continueInsert = new CountDownLatch(1); - var creationJdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(data) { + var creationJdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(data) { @Override public int update(String sql, Object... args) { if (sql.startsWith("INSERT INTO ma_session ")) { @@ -172,13 +172,13 @@ class ManagedAgentCsiMutationMySqlIT { } String user = System.getProperty("mysql.user"); String password = System.getProperty("mysql.password", ""); - var admin = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(new DriverManagerDataSource(url, user, password)); + var admin = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(new DriverManagerDataSource(url, user, password)); String schema = "csi_managed_mutation_" + UUID.randomUUID().toString().replace("-", ""); admin.execute("CREATE DATABASE " + schema + " CHARACTER SET utf8mb4"); try { var data = new DriverManagerDataSource(url.replaceFirst("/[^/?]+(?=\\?|$)", "/" + schema), user, password); Flyway.configure().dataSource(data).locations("classpath:db/managed-schema").load().migrate(); - var jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(data); + var jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(data); String lockWaitQuery = lockWaitQuery(jdbc); var manager = new DataSourceTransactionManager(data); var json = new ObjectMapper(); @@ -248,8 +248,8 @@ class ManagedAgentCsiMutationMySqlIT { originalLock.rollback(); assertThatThrownBy(() -> mutation.get(5, TimeUnit.SECONDS)).isInstanceOf(ExecutionException.class) .satisfies(error -> { - assertThat(error.getCause()).isInstanceOf(ApiException.class); - var refusal = (ApiException) error.getCause(); + assertThat(error.getCause()).isInstanceOf(ManagedAgentException.class); + var refusal = (ManagedAgentException) error.getCause(); assertThat(refusal.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(refusal.getCode()).isEqualTo("csi_managed_mutation_unavailable"); }); @@ -275,13 +275,13 @@ class ManagedAgentCsiMutationMySqlIT { } String user = System.getProperty("mysql.user"); String password = System.getProperty("mysql.password", ""); - var admin = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(new DriverManagerDataSource(url, user, password)); + var admin = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(new DriverManagerDataSource(url, user, password)); String schema = "csi_warmed_writer_" + UUID.randomUUID().toString().replace("-", ""); admin.execute("CREATE DATABASE " + schema + " CHARACTER SET utf8mb4"); try { var data = new DriverManagerDataSource(url.replaceFirst("/[^/?]+(?=\\?|$)", "/" + schema), user, password); Flyway.configure().dataSource(data).locations("classpath:db/managed-schema").load().migrate(); - var jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(data); + var jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(data); var manager = new DataSourceTransactionManager(data); var json = new ObjectMapper(); var properties = new ManagedAgentProperties(); @@ -360,13 +360,13 @@ class ManagedAgentCsiMutationMySqlIT { } String user = System.getProperty("mysql.user"); String password = System.getProperty("mysql.password", ""); - var admin = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(new DriverManagerDataSource(url, user, password)); + var admin = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(new DriverManagerDataSource(url, user, password)); String schema = "csi_guard_bound_" + UUID.randomUUID().toString().replace("-", ""); admin.execute("CREATE DATABASE " + schema + " CHARACTER SET utf8mb4"); try { var data = new DriverManagerDataSource(url.replaceFirst("/[^/?]+(?=\\?|$)", "/" + schema), user, password); Flyway.configure().dataSource(data).locations("classpath:db/managed-schema").load().migrate(); - var jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(data); + var jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(data); var manager = new DataSourceTransactionManager(data); var json = new ObjectMapper(); var properties = new ManagedAgentProperties(); @@ -409,8 +409,8 @@ class ManagedAgentCsiMutationMySqlIT { })); assertThatThrownBy(() -> blocked.get(20, TimeUnit.SECONDS)).isInstanceOf(ExecutionException.class) .satisfies(error -> { - assertThat(error.getCause()).isInstanceOf(ApiException.class); - var refusal = (ApiException) error.getCause(); + assertThat(error.getCause()).isInstanceOf(ManagedAgentException.class); + var refusal = (ManagedAgentException) error.getCause(); assertThat(refusal.getStatus()).isEqualTo(HttpStatus.SERVICE_UNAVAILABLE); assertThat(refusal.getCode()).isEqualTo("tenant_guard_contended"); }); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedAgentStoreChildCreationFenceTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedAgentStoreChildCreationFenceTest.java similarity index 93% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedAgentStoreChildCreationFenceTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedAgentStoreChildCreationFenceTest.java index 7ea5e54760a..f3c34718de2 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedAgentStoreChildCreationFenceTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedAgentStoreChildCreationFenceTest.java @@ -1,8 +1,9 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -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.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.fasterxml.jackson.databind.ObjectMapper; @@ -100,8 +101,8 @@ class ManagedAgentStoreChildCreationFenceTest { void refusesToMintAfterTheTerminalVerdictLanded() { plantRun("run-settled", "cancelled", "failed"); assertThatThrownBy(() -> mint("run-settled")) - .isInstanceOf(ApiException.class) - .extracting(error -> ((ApiException) error).getCode()) + .isInstanceOf(ManagedAgentException.class) + .extracting(error -> ((ManagedAgentException) error).getCode()) .isEqualTo("child_run_settled"); // And no Session row was minted for it: the fence rolls the // whole transaction back, never a half-created child. diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedAgentTurnDeferralTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedAgentTurnDeferralTest.java similarity index 95% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedAgentTurnDeferralTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedAgentTurnDeferralTest.java index c7a88766c33..a5e2ca494df 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedAgentTurnDeferralTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedAgentTurnDeferralTest.java @@ -1,8 +1,8 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.StoreModels.Admission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.DispatchTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.Admission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.DispatchTarget; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.fasterxml.jackson.databind.ObjectMapper; import org.h2.jdbcx.JdbcDataSource; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedExtensionRecordLifecycleGateTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedExtensionRecordLifecycleGateTest.java similarity index 93% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedExtensionRecordLifecycleGateTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedExtensionRecordLifecycleGateTest.java index a3fb817652c..54946cf51a6 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedExtensionRecordLifecycleGateTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedExtensionRecordLifecycleGateTest.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -51,7 +51,7 @@ class ManagedExtensionRecordLifecycleGateTest { .getBytes(StandardCharsets.UTF_8); assertThatThrownBy(() -> records.hasNewLifecycleDispatch(TENANT, "session", ordinary, resourceId -> null)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_lifecycle_admission_closed")); } @@ -71,7 +71,7 @@ class ManagedExtensionRecordLifecycleGateTest { .getBytes(StandardCharsets.UTF_8); assertThatThrownBy(() -> records.hasNewLifecycleDispatch(TENANT, "session", foreign, resourceId -> null)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_lifecycle_admission_closed")); } @@ -89,7 +89,7 @@ class ManagedExtensionRecordLifecycleGateTest { byte[] team = domainEvent(domain).getBytes(StandardCharsets.UTF_8); assertThatThrownBy(() -> records.hasNewLifecycleDispatch(TENANT, "session", team, resourceId -> null)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_lifecycle_admission_closed")); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedExtensionRecordVerdictReconcileMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedExtensionRecordVerdictReconcileMySqlIT.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedExtensionRecordVerdictReconcileMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedExtensionRecordVerdictReconcileMySqlIT.java index 86460fb9d93..90d6968a705 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedExtensionRecordVerdictReconcileMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedExtensionRecordVerdictReconcileMySqlIT.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -106,7 +106,7 @@ class ManagedExtensionRecordVerdictReconcileMySqlIT { runId, verdict(null))) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> org.assertj.core.api.Assertions.assertThat( error.getCode()) diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedExtensionRecordVerdictReconcileTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedExtensionRecordVerdictReconcileTest.java similarity index 94% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedExtensionRecordVerdictReconcileTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedExtensionRecordVerdictReconcileTest.java index 14fa8518060..497ba647c69 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedExtensionRecordVerdictReconcileTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedExtensionRecordVerdictReconcileTest.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; @@ -92,7 +92,7 @@ class ManagedExtensionRecordVerdictReconcileTest { plantLineage(parent, "child-unnamed"); assertThatThrownBy(() -> records.reconcileNeverStartedVerdict( TENANT, parent, "child_run", "run-1", verdict(null))) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { // The wire code the Hosted writer classifies as a // rollbackable non-commit (R24) — never the generic // record rejection that latches write failures. @@ -110,7 +110,7 @@ class ManagedExtensionRecordVerdictReconcileTest { plantLineage(parent, "child-mis"); assertThatThrownBy(() -> records.reconcileNeverStartedVerdict( TENANT, parent, "child_run", "run-1", verdict("child-other"))) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> org.assertj.core.api.Assertions .assertThat(error.getCode()).isEqualTo( "child_run_lineage_minted")); @@ -124,7 +124,7 @@ class ManagedExtensionRecordVerdictReconcileTest { .doesNotThrowAnyException(); assertThatThrownBy(() -> records.reconcileNeverStartedVerdict( TENANT, parent, "child_run", "run-1", verdict("child-ghost"))) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> org.assertj.core.api.Assertions .assertThat(error.getCode()).isEqualTo( "child_run_lineage_minted")); 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/persistence/ManagedHostedRecoveryRecordsTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedHostedRecoveryRecordsTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedHostedRecoveryRecordsTest.java index 9979cb2cb3f..2b44936b092 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/persistence/ManagedHostedRecoveryRecordsTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedModelContextRetentionTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedModelContextRetentionTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedModelContextRetentionTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedModelContextRetentionTest.java index ae0de637b8b..abaae858433 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedModelContextRetentionTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedModelContextRetentionTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedReceiptScopeTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedReceiptScopeTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedReceiptScopeTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedReceiptScopeTest.java index 3c5a05c4da1..b40c5f3db36 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedReceiptScopeTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedReceiptScopeTest.java @@ -1,7 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedworkspace.WorkspaceActor; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedReceiptsTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedReceiptsTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedReceiptsTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedReceiptsTest.java index 91e655d8b9a..3f8c9f8bf4f 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedReceiptsTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedReceiptsTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedRuntimeRetentionGuardMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedRuntimeRetentionGuardMySqlIT.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedRuntimeRetentionGuardMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedRuntimeRetentionGuardMySqlIT.java index e866e20490b..220f189aa3e 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedRuntimeRetentionGuardMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedRuntimeRetentionGuardMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedRuntimeRetentionGuardTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedRuntimeRetentionGuardTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedRuntimeRetentionGuardTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedRuntimeRetentionGuardTest.java index 3e6e2a78381..da4270c264e 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedRuntimeRetentionGuardTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedRuntimeRetentionGuardTest.java @@ -1,6 +1,5 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeRetention; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; @@ -15,6 +14,7 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeSession; import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import org.flywaydb.core.Flyway; import org.h2.jdbcx.JdbcDataSource; import org.junit.jupiter.api.BeforeEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaBusinessMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaBusinessMySqlIT.java similarity index 91% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaBusinessMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaBusinessMySqlIT.java index a4671221faf..3f4cc30eb12 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaBusinessMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaBusinessMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.AfterEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaBusinessStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaBusinessStoreTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaBusinessStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaBusinessStoreTest.java index 37b1dd2f66f..45bcbeb747b 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaBusinessStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaBusinessStoreTest.java @@ -1,6 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.service.RequestDigests; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaJdbcTimeTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaJdbcTimeTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaJdbcTimeTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaJdbcTimeTest.java index 836cb5d2708..9c6a3ea02c9 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaJdbcTimeTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaJdbcTimeTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaLoadMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaLoadMySqlIT.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaLoadMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaLoadMySqlIT.java index 065fd10be1f..ac605f55e88 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaLoadMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaLoadMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaPublicationLoadMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaPublicationLoadMySqlIT.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaPublicationLoadMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaPublicationLoadMySqlIT.java index e2ac687476a..171d61b9278 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaPublicationLoadMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaPublicationLoadMySqlIT.java @@ -1,5 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.OperationKind; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaPublicationMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaPublicationMySqlIT.java similarity index 90% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaPublicationMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaPublicationMySqlIT.java index f3679d96762..93d3fc26d54 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaPublicationMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaPublicationMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.AfterEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaPublicationStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaPublicationStoreTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaPublicationStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaPublicationStoreTest.java index f19327b423e..975ce2e558d 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaPublicationStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaPublicationStoreTest.java @@ -1,6 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.managedagent.PublicationJournalFixture; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.fasterxml.jackson.databind.JsonNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaRelayLoadMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaRelayLoadMySqlIT.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaRelayLoadMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaRelayLoadMySqlIT.java index a2080cf5ccd..7d08f625907 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaRelayLoadMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaRelayLoadMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaSessionMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaSessionMySqlIT.java similarity index 89% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaSessionMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaSessionMySqlIT.java index 04db14df37b..fb9216eb998 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaSessionMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaSessionMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.AfterEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaSessionStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaSessionStoreTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaSessionStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaSessionStoreTest.java index abad46a58be..b02b73762c9 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSchemaSessionStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSchemaSessionStoreTest.java @@ -1,7 +1,8 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; import com.fasterxml.jackson.databind.ObjectMapper; @@ -100,7 +101,7 @@ public class ManagedSchemaSessionStoreTest { "digest", "same-private", "turn"))) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); } @Test @@ -131,7 +132,7 @@ public class ManagedSchemaSessionStoreTest { assertThat(store.findSnapshotPage(tenant, session, null, 0, 10).items()).hasSize(5); clock.advance(Duration.ofMinutes(31)); assertThatThrownBy(() -> store.findSnapshotPage(tenant, session, first.nextCursor(), 0, 2)) - .isInstanceOf(ApiException.class) + .isInstanceOf(ManagedAgentException.class) .hasMessageContaining("expired"); } @@ -431,7 +432,7 @@ public class ManagedSchemaSessionStoreTest { + "." + parts[1]; assertThatThrownBy(() -> store.findSnapshotPage(tenant, session, changed, 0, 1)) - .isInstanceOf(ApiException.class) + .isInstanceOf(ManagedAgentException.class) .hasMessageContaining("cursor"); assertThat(store.findSnapshotPage(tenant, session, cursor, 0, 1).items()) .extracting(StoreModels.ItemRecord::itemId) @@ -658,7 +659,7 @@ public class ManagedSchemaSessionStoreTest { var privateStore = new ManagedSessionStore(jdbc); assertThatThrownBy(() -> privateStore.restore(tenant, "workspace", session, token)) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_not_found")); var grant = diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionGuardConvoyIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionGuardConvoyIT.java similarity index 95% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionGuardConvoyIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionGuardConvoyIT.java index 52b7901d940..db78c5a9f3d 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionGuardConvoyIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionGuardConvoyIT.java @@ -1,18 +1,20 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.qwen.code.managedagent.ExtensionRecordJournal; import com.alibaba.qwen.code.managedagent.ManagedHookRecordContractTest; import com.alibaba.qwen.code.managedagent.MySqlLockProbe; import com.alibaba.qwen.code.managedagent.PublicationJournalFixture; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.AcquireWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.AuthorizeLifecycleRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.BlockRecoveryRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitResource; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.CommitTransactionRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.RenewWriterRequest; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.AcquireWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.AuthorizeLifecycleRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.BlockRecoveryRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitResource; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.CommitTransactionRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.RenewWriterRequest; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeLifecycleAuthority; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; @@ -202,10 +204,10 @@ class ManagedSessionGuardConvoyIT { .isInstanceOf(ExecutionException.class) .satisfies(error -> { var cause = error.getCause(); - assertThat(cause).isInstanceOf(ApiException.class); - assertThat(((ApiException) cause).getStatus()) + assertThat(cause).isInstanceOf(ManagedAgentException.class); + assertThat(((ManagedAgentException) cause).getStatus()) .isEqualTo(HttpStatus.SERVICE_UNAVAILABLE); - assertThat(((ApiException) cause).getCode()) + assertThat(((ManagedAgentException) cause).getCode()) .isEqualTo("tenant_guard_contended"); }); long commitElapsedMs = (System.nanoTime() - commitBefore) / 1_000_000; @@ -224,10 +226,10 @@ class ManagedSessionGuardConvoyIT { .isInstanceOf(java.util.concurrent.ExecutionException.class) .satisfies(error -> { var cause = error.getCause(); - assertThat(cause).isInstanceOf(ApiException.class); - assertThat(((ApiException) cause).getStatus()) + assertThat(cause).isInstanceOf(ManagedAgentException.class); + assertThat(((ManagedAgentException) cause).getStatus()) .isEqualTo(HttpStatus.SERVICE_UNAVAILABLE); - assertThat(((ApiException) cause).getCode()) + assertThat(((ManagedAgentException) cause).getCode()) .isEqualTo("tenant_guard_contended"); }); } @@ -247,10 +249,10 @@ class ManagedSessionGuardConvoyIT { .isInstanceOf(java.util.concurrent.ExecutionException.class) .satisfies(error -> { var cause = error.getCause(); - assertThat(cause).isInstanceOf(ApiException.class); - assertThat(((ApiException) cause).getStatus()) + assertThat(cause).isInstanceOf(ManagedAgentException.class); + assertThat(((ManagedAgentException) cause).getStatus()) .isEqualTo(HttpStatus.SERVICE_UNAVAILABLE); - assertThat(((ApiException) cause).getCode()) + assertThat(((ManagedAgentException) cause).getCode()) .isEqualTo("tenant_guard_contended"); }); } @@ -578,10 +580,10 @@ class ManagedSessionGuardConvoyIT { assertThatThrownBy(() -> transactions.executeWithoutResult(ignored -> store.acquireWriter(tenant, "victim", token, new AcquireWriterRequest(workspace, "writer-victim", 60_000L)))) - .isInstanceOf(ApiException.class) + .isInstanceOf(ManagedAgentException.class) .satisfies(error -> { - assertThat(((ApiException) error).getStatus()).isEqualTo(HttpStatus.CONFLICT); - assertThat(((ApiException) error).getCode()) + assertThat(((ManagedAgentException) error).getStatus()).isEqualTo(HttpStatus.CONFLICT); + assertThat(((ManagedAgentException) error).getCode()) .isEqualTo("managed_session_lifecycle_active"); }); transactions.executeWithoutResult(ignored -> store.acquireWriter(tenant, "neighbor", @@ -767,10 +769,10 @@ class ManagedSessionGuardConvoyIT { .isInstanceOf(ExecutionException.class) .satisfies(error -> { var cause = error.getCause(); - assertThat(cause).isInstanceOf(ApiException.class); - assertThat(((ApiException) cause).getStatus()) + assertThat(cause).isInstanceOf(ManagedAgentException.class); + assertThat(((ManagedAgentException) cause).getStatus()) .isEqualTo(HttpStatus.SERVICE_UNAVAILABLE); - assertThat(((ApiException) cause).getCode()) + assertThat(((ManagedAgentException) cause).getCode()) .isEqualTo("tenant_guard_contended"); }); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionGuardMappingTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionGuardMappingTest.java similarity index 89% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionGuardMappingTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionGuardMappingTest.java index 4e687a5320f..3c86a9e1fb8 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionGuardMappingTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionGuardMappingTest.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import org.junit.jupiter.api.Test; import org.springframework.dao.CannotAcquireLockException; import org.springframework.dao.DataAccessException; @@ -43,7 +43,7 @@ class ManagedSessionGuardMappingTest { throw failure; })) .as(failure.getClass().getSimpleName() + ": " + failure.getMessage()) - .isInstanceOfSatisfying(ApiException.class, this::requireGuardContended); + .isInstanceOfSatisfying(ManagedAgentException.class, this::requireGuardContended); } } @@ -58,7 +58,7 @@ class ManagedSessionGuardMappingTest { throw failure; })) .as(failure.getClass().getSimpleName()) - .isInstanceOfSatisfying(ApiException.class, this::requireGuardContended); + .isInstanceOfSatisfying(ManagedAgentException.class, this::requireGuardContended); } // An ordinary root wait is not a tenant-guard wait and keeps its // own failure. @@ -69,7 +69,7 @@ class ManagedSessionGuardMappingTest { assertThat(ManagedSessionStore.namedRootDeadlock(() -> true)).isTrue(); } - private void requireGuardContended(ApiException error) { + private void requireGuardContended(ManagedAgentException error) { assertThat(error.getStatus()).isEqualTo(HttpStatus.SERVICE_UNAVAILABLE); assertThat(error.getCode()).isEqualTo("tenant_guard_contended"); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionNativeReadTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionNativeReadTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionNativeReadTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionNativeReadTest.java index af68f5c0302..c4d7919098a 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionNativeReadTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionNativeReadTest.java @@ -1,7 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; @@ -9,6 +8,7 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeLease; import com.alibaba.qwen.code.runtimebroker.RuntimeResourceHandle; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.ObjectMapper; import org.flywaydb.core.Flyway; import org.junit.jupiter.api.AfterEach; @@ -62,7 +62,7 @@ class ManagedSessionNativeReadTest { + ";MODE=MySQL;DB_CLOSE_DELAY=-1;DATABASE_TO_LOWER=TRUE", "sa", ""); Flyway.configure().dataSource(raw).locations("classpath:db/managed-schema").load().migrate(); source = new FaultSource(raw); - jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(source); + jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(source); var manager = new DataSourceTransactionManager(source); transactions = new TransactionTemplate(manager); reservations = new WorkspaceCsiReservationStore(jdbc, manager, new ObjectMapper()); @@ -181,7 +181,7 @@ class ManagedSessionNativeReadTest { source.onFetch = () -> jdbc.update( "UPDATE ma_session_head SET writer_generation = 2, writer_id =" + " 'successor'"); - assertThatThrownBy(this::read).isInstanceOf(ApiException.class); + assertThatThrownBy(this::read).isInstanceOf(ManagedAgentException.class); assertThat(readReceipts().getFirst().get("state")).isEqualTo("RETURNED"); assertThat(verifiedAt()).isEqualTo(java.time.Instant.parse("2000-01-01T00:00:00Z").toEpochMilli()); } @@ -189,7 +189,7 @@ class ManagedSessionNativeReadTest { @Test void corruptReturnedBytesKeepKnownEndButNeverUpdateVerification() { source.onFetch = () -> jdbc.update("UPDATE ma_resource SET inline_bytes = ?", new byte[] {0}); - assertThatThrownBy(this::read).isInstanceOf(ApiException.class); + assertThatThrownBy(this::read).isInstanceOf(ManagedAgentException.class); assertThat(readReceipts().getFirst().get("state")).isEqualTo("RETURNED"); assertThat(verifiedAt()).isEqualTo(java.time.Instant.parse("2000-01-01T00:00:00Z").toEpochMilli()); } @@ -221,9 +221,9 @@ class ManagedSessionNativeReadTest { @Test void invalidCredentialAndWrongWorkspaceRefuseBeforeAdmission() { assertThatThrownBy(() -> store.readOwnerResource("tenant", "workspace", session, "resource", "x".repeat(32))) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); assertThatThrownBy(() -> store.readOwnerResource("tenant", "other-workspace", session, "resource", TOKEN)) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); assertThat(count("ma_request_receipt")).isZero(); assertThat(count("ma_read_lease")).isZero(); } @@ -324,7 +324,7 @@ class ManagedSessionNativeReadTest { } private static void assertCode(Runnable action, String code) { - assertThatThrownBy(action::run).isInstanceOfSatisfying(ApiException.class, + assertThatThrownBy(action::run).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo(code)); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionPhysicalFenceMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionPhysicalFenceMySqlIT.java similarity index 95% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionPhysicalFenceMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionPhysicalFenceMySqlIT.java index 4a279b47646..09c680fc597 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionPhysicalFenceMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionPhysicalFenceMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; @@ -32,7 +32,7 @@ class ManagedSessionPhysicalFenceMySqlIT extends ManagedSessionPhysicalFenceTest new ManagedSessionStoreModels .AcquireWriterRequest( "\ud800", "writer", 60_000L)))) - .isInstanceOf(com.alibaba.qwen.code.managedagent.api.ApiException.class); + .isInstanceOf(com.alibaba.qwen.code.managedagent.exception.ManagedAgentException.class); org.assertj.core.api.Assertions.assertThat( jdbc.queryForObject( "SELECT COUNT(*) FROM ma_session_head WHERE tenant_id = ?", diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionPhysicalFenceTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionPhysicalFenceTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionPhysicalFenceTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionPhysicalFenceTest.java index fb0d301723f..e6b9e68fd50 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionPhysicalFenceTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionPhysicalFenceTest.java @@ -1,5 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; +import com.alibaba.qwen.code.managedagent.model.StoreModels; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; @@ -325,7 +326,7 @@ class ManagedSessionPhysicalFenceTest { new ManagedWorkspaceRegistry(jdbc), new com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties()); var selection = - new com.alibaba.qwen.code.managedagent.api.WorkspaceSelection("workspace", "."); + new com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection("workspace", "."); var parent = transactions .execute( diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionReaderVersionTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionReaderVersionTest.java similarity index 93% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionReaderVersionTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionReaderVersionTest.java index 07430b76aa8..a568fdd31be 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionReaderVersionTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionReaderVersionTest.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -54,7 +54,7 @@ class ManagedSessionReaderVersionTest { } private static void assertUnsupported() { - var failure = assertThrows(ApiException.class, + var failure = assertThrows(ManagedAgentException.class, () -> ManagedSessionReaderVersion.requireReadable(2)); assertEquals(HttpStatus.CONFLICT, failure.getStatus()); assertEquals("managed_session_reader_version_unsupported", failure.getCode()); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionStoreCredentialTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionStoreCredentialTest.java similarity index 90% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionStoreCredentialTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionStoreCredentialTest.java index 30d8841a5b2..6508e0a5402 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionStoreCredentialTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionStoreCredentialTest.java @@ -1,7 +1,8 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.security.WriterCredentialPolicy; import org.flywaydb.core.Flyway; import org.h2.jdbcx.JdbcDataSource; import org.junit.jupiter.api.Test; @@ -41,7 +42,7 @@ class ManagedSessionStoreCredentialTest { policy.issue("tenant", "foreign-workspace", "session"), policy.issue("tenant", "workspace", "foreign-session")}) { assertThatThrownBy(() -> invokeWriterPath(store, route, token)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus().value()).isEqualTo(403); assertThat(error.getCode()).isEqualTo("writer_credential_invalid"); }); @@ -75,7 +76,7 @@ class ManagedSessionStoreCredentialTest { JdbcDataSource dataSource = new JdbcDataSource(); dataSource.setURL("jdbc:h2:mem:credential-check;MODE=MySQL"); ManagedSessionStore store = new ManagedSessionStore( - new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource)); + new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource)); ManagedAgentProperties properties = new ManagedAgentProperties(); properties.getSessionStore().setBindingKey(KEY); store.setCredentials(new WriterCredentialPolicy(properties)); @@ -83,7 +84,7 @@ class ManagedSessionStoreCredentialTest { assertThatThrownBy(() -> store.lockPublicationWriter("tenant", "workspace", "session", "writer", 1, "self-minted-token-self-minted-token-0")) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus().value()).isEqualTo(403); assertThat(error.getCode()) .isEqualTo("writer_credential_invalid"); @@ -98,7 +99,7 @@ class ManagedSessionStoreCredentialTest { Flyway.configure().dataSource(dataSource) .locations("classpath:db/managed-schema").load().migrate(); ManagedSessionStore store = new ManagedSessionStore( - new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource)); + new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource)); ManagedAgentProperties properties = new ManagedAgentProperties(); properties.getSessionStore().setBindingKey(KEY); WriterCredentialPolicy policy = new WriterCredentialPolicy(properties); @@ -110,7 +111,7 @@ class ManagedSessionStoreCredentialTest { store.lockPublicationWriter("tenant", "workspace", "session", "writer", 1, policy.issue("tenant", "workspace", "session")); - } catch (ApiException error) { + } catch (ManagedAgentException error) { assertThat(error.getCode()) .isNotEqualTo("writer_credential_invalid"); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSnapshotNumericPagingTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSnapshotNumericPagingTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSnapshotNumericPagingTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSnapshotNumericPagingTest.java index ae21642d218..2efbbc750e6 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSnapshotNumericPagingTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSnapshotNumericPagingTest.java @@ -1,6 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.model.StoreModels; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSnapshotPoolTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSnapshotPoolTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSnapshotPoolTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSnapshotPoolTest.java index fe09c6bffe6..2c039eedc76 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedSnapshotPoolTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSnapshotPoolTest.java @@ -1,8 +1,9 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.druid.pool.DruidDataSource; -import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; @@ -118,7 +119,7 @@ class ManagedSnapshotPoolTest { var view = new TransactionTemplate(manager); view.setReadOnly(true); assertThatThrownBy(() -> view.executeWithoutResult(status -> lease.checkReadView())) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("tool_output_read_expired")); } } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedToolResultCaptureTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedToolResultCaptureTest.java similarity index 95% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedToolResultCaptureTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedToolResultCaptureTest.java index a42a5b15993..9abeef0e959 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedToolResultCaptureTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedToolResultCaptureTest.java @@ -1,5 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedToolResultProjectorTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedToolResultProjectorTest.java similarity index 95% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedToolResultProjectorTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedToolResultProjectorTest.java index 1ad6d7f6e46..97716cee698 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedToolResultProjectorTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedToolResultProjectorTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.Test; @@ -22,8 +22,7 @@ class ManagedToolResultProjectorTest { factory.getBeanProvider(ToolPublicationDataStore.class), org.mockito.Mockito.mock(ManagedArtifactReader.class), org.mockito.Mockito.mock( - com.alibaba.qwen.code.managedagent.service - .ManagedArtifactPolicy.class), + com.alibaba.qwen.code.managedagent.artifact.ManagedArtifactPolicy.class), properties)); projector.tick(); org.mockito.Mockito.verifyNoInteractions(store); @@ -51,11 +50,10 @@ class ManagedToolResultProjectorTest { factory.getBeanProvider(ToolPublicationDataStore.class), org.mockito.Mockito.mock(ManagedArtifactReader.class), org.mockito.Mockito.mock( - com.alibaba.qwen.code.managedagent.service - .ManagedArtifactPolicy.class), + com.alibaba.qwen.code.managedagent.artifact.ManagedArtifactPolicy.class), properties); org.mockito.Mockito.when(store.claim()) - .thenThrow(new com.alibaba.qwen.code.managedagent.api.ApiException( + .thenThrow(new com.alibaba.qwen.code.managedagent.exception.ManagedAgentException( org.springframework.http.HttpStatus.SERVICE_UNAVAILABLE, "tenant_guard_contended", "Tenant guard is held")); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedWorkspaceRolesMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedWorkspaceRolesMySqlIT.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedWorkspaceRolesMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedWorkspaceRolesMySqlIT.java index d8cc1924020..2bbfd70fadb 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ManagedWorkspaceRolesMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ManagedWorkspaceRolesMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import org.junit.jupiter.api.AfterEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/O4FaultProcess.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/O4FaultProcess.java similarity index 95% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/O4FaultProcess.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/O4FaultProcess.java index 7a4d3c92ec9..77c0b0c19d3 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/O4FaultProcess.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/O4FaultProcess.java @@ -1,7 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.jdbc.datasource.DriverManagerDataSource; @@ -77,7 +77,7 @@ public final class O4FaultProcess { try { int count = input.read(new byte[1]); Files.writeString(root.resolve("result"), "returned:" + count); - } catch (ApiException error) { + } catch (ManagedAgentException error) { Files.writeString(root.resolve("result"), error.getCode()); } } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/O4FileObjects.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/O4FileObjects.java similarity index 92% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/O4FileObjects.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/O4FileObjects.java index 42dfb773f41..aa2919929c2 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/O4FileObjects.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/O4FileObjects.java @@ -1,4 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; + +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import java.io.IOException; import java.io.InputStream; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/O4MySqlDatabase.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/O4MySqlDatabase.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/O4MySqlDatabase.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/O4MySqlDatabase.java index 7a0de9fdcd4..140c1a68e88 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/O4MySqlDatabase.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/O4MySqlDatabase.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.druid.pool.DruidDataSource; import org.junit.jupiter.api.Assumptions; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/O4MySqlDatabaseTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/O4MySqlDatabaseTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/O4MySqlDatabaseTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/O4MySqlDatabaseTest.java index 32f5c472138..cb5246c2302 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/O4MySqlDatabaseTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/O4MySqlDatabaseTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/O4MySqlGate.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/O4MySqlGate.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/O4MySqlGate.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/O4MySqlGate.java index faeb34923fe..76a5790d426 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/O4MySqlGate.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/O4MySqlGate.java @@ -1,5 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; @@ -78,7 +79,7 @@ public class O4MySqlGate extends ToolPublicationCollectorTest { release.countDown(); deleting.get(10, TimeUnit.SECONDS); assertThatThrownBy(() -> writer.get(10, TimeUnit.SECONDS)) - .cause().isInstanceOfSatisfying(com.alibaba.qwen.code.managedagent.api.ApiException.class, + .cause().isInstanceOfSatisfying(com.alibaba.qwen.code.managedagent.exception.ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("tool_output_session_retired")); } finally { release.countDown(); @@ -132,7 +133,7 @@ public class O4MySqlGate extends ToolPublicationCollectorTest { assertThat(Files.exists(root.resolve("exact/one"))).isFalse(); jdbc.update("UPDATE ma_operation SET claim_until = (" + ManagedSchemaTime.SQL_NOW + " + -60000) WHERE operation_kind = 'OBJECT_PUT' AND scope_key = ?", scope); assertThatThrownBy(() -> retention.put(key, scope, "pub-1", "exact/one", new byte[] {7}, objects)) - .isInstanceOf(com.alibaba.qwen.code.managedagent.api.ApiException.class); + .isInstanceOf(com.alibaba.qwen.code.managedagent.exception.ManagedAgentException.class); assertThat(Files.exists(root.resolve("exact/one"))).isFalse(); assertThat(jdbc.queryForList("SELECT state FROM ma_operation WHERE operation_kind = 'OBJECT_PUT' AND scope_key = ?", String.class, scope)).containsExactly("IN_FLIGHT"); @@ -235,7 +236,7 @@ public class O4MySqlGate extends ToolPublicationCollectorTest { assertThatThrownBy(() -> retention.put(key, scope, "pub-1", "exact/one", new byte[] {7}, objects)) .isInstanceOf(IllegalStateException.class); assertThatThrownBy(() -> retention.put(key, scope, "pub-1", "exact/one", new byte[] {7}, objects)) - .isInstanceOf(com.alibaba.qwen.code.managedagent.api.ApiException.class); + .isInstanceOf(com.alibaba.qwen.code.managedagent.exception.ManagedAgentException.class); retire(); assertThat(collector(objects).runOnce()).isFalse(); } finally { diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/O4OssGate.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/O4OssGate.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/O4OssGate.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/O4OssGate.java index 926365a77b5..fdbde380be9 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/O4OssGate.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/O4OssGate.java @@ -1,5 +1,8 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; +import com.alibaba.qwen.code.managedagent.artifact.AliyunToolPublicationObjectStore; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationStorageException; import com.alibaba.qwen.code.managedagent.config.AliyunToolPublicationStorageAutoConfiguration; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.aliyun.oss.OSS; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ResidentWorkspacesTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ResidentWorkspacesTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ResidentWorkspacesTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ResidentWorkspacesTest.java index f4edeec7c77..265541bd805 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ResidentWorkspacesTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ResidentWorkspacesTest.java @@ -1,10 +1,11 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.RuntimeBroker.ResidentWorkspace; -import com.alibaba.qwen.code.managedagent.service.WorkspaceCsiResourceGuard.ProtectionIdentity; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.event.CommittedEventPublisher; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.workspace.runtime.WorkspaceCsiResourceGuard.ProtectionIdentity; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; @@ -24,6 +25,7 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeTransport; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -173,7 +175,7 @@ class ResidentWorkspacesTest { active(original, session); var before = storage.inspect(mapping.registration()); var source = jdbc.getDataSource(); - var reader = new com.alibaba.qwen.code.managedagent.service.ResidentAcceptanceSnapshot(jdbc, + var reader = new com.alibaba.qwen.code.managedagent.session.ResidentAcceptanceSnapshot(jdbc, new DataSourceTransactionManager(source), mapping, new ObjectMapper()); var snapshot = reader.capture(); assertThat(snapshot.path("tables").path("ma_session")).hasSize(1); @@ -187,7 +189,7 @@ class ResidentWorkspacesTest { assertThat(storage.inspect(mapping.registration())).isEqualTo(before); assertThatThrownBy(() -> transaction.execute(status -> reader.capture())) .isInstanceOf(IllegalStateException.class); - assertThatThrownBy(() -> new com.alibaba.qwen.code.managedagent.service.ResidentAcceptanceSnapshot(jdbc, + assertThatThrownBy(() -> new com.alibaba.qwen.code.managedagent.session.ResidentAcceptanceSnapshot(jdbc, new DataSourceTransactionManager(new DriverManagerDataSource("jdbc:h2:mem:foreign", "sa", "")), mapping, new ObjectMapper())) .isInstanceOf(IllegalArgumentException.class); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/SessionResourceCollectionCollectorTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/SessionResourceCollectionCollectorTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/SessionResourceCollectionCollectorTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/SessionResourceCollectionCollectorTest.java index 60a8e0f692d..8c5063e1a32 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/SessionResourceCollectionCollectorTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/SessionResourceCollectionCollectorTest.java @@ -1,7 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.OperationKind; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; @@ -779,7 +779,7 @@ public class SessionResourceCollectionCollectorTest extends ToolPublicationReten assertThat(collector(true, Duration.ZERO).runOnce()).isTrue(); assertThat(rows().getFirst().get("state")).isEqualTo("COLLECTED"); assertThatThrownBy(() -> sessions.readResource(tenant, "workspace-1", session, "collected", token)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getCode()).isEqualTo("tool_output_session_retired"); assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); }); @@ -950,7 +950,7 @@ public class SessionResourceCollectionCollectorTest extends ToolPublicationReten jdbc.update("UPDATE ma_resource SET inline_bytes = ?" + " WHERE session_scope_key = ? AND resource_id = X'74616d7065726564'", new byte[63], resScope); assertThatThrownBy(() -> sessions.readResource(tenant, "workspace-1", session, "tampered", token)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getCode()).isEqualTo("managed_session_resource_corrupt"); assertThat(error.getStatus()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); }); @@ -1274,7 +1274,7 @@ public class SessionResourceCollectionCollectorTest extends ToolPublicationReten var beforeLedger = ledger(); assertThatThrownBy(() -> collector.collect(claim)) .isInstanceOfSatisfying( - ApiException.class, + ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("csi_managed_mutation_unavailable")); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/SessionResourceCollectionMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/SessionResourceCollectionMySqlIT.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/SessionResourceCollectionMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/SessionResourceCollectionMySqlIT.java index 63e615c4101..dee60407b2d 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/SessionResourceCollectionMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/SessionResourceCollectionMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/SessionRowLockOrderTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/SessionRowLockOrderTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/SessionRowLockOrderTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/SessionRowLockOrderTest.java index 99b0fdbafef..3507b30d5f7 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/SessionRowLockOrderTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/SessionRowLockOrderTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.sun.source.tree.AssignmentTree; import com.sun.source.tree.BinaryTree; @@ -107,8 +107,8 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; // same-file parse can see, so the audit pins the order, not the // annotation. class SessionRowLockOrderTest { - private static final Path STORE_PACKAGE = Path.of("src", "main", "java", - "com", "alibaba", "qwen", "code", "managedagent", "store"); + private static final Path STORE_PACKAGE = Path.of("src", "main", "java") + .resolve(ManagedAgentStore.class.getPackageName().replace('.', '/')); private static final String MANAGED_AGENT_STORE = "ManagedAgentStore.java"; private static final String SESSION_TABLE = "ma_session"; private static final String TURN_TABLE = "ma_turn"; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/SshWorkspaceMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/SshWorkspaceMySqlIT.java similarity index 95% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/SshWorkspaceMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/SshWorkspaceMySqlIT.java index 04266e80b5d..48f0f3ab774 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/SshWorkspaceMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/SshWorkspaceMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import org.flywaydb.core.Flyway; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/SshWorkspaceStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/SshWorkspaceStoreTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/SshWorkspaceStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/SshWorkspaceStoreTest.java index 221e9b7cdaf..4b5825cdfd8 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/SshWorkspaceStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/SshWorkspaceStoreTest.java @@ -1,11 +1,12 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -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.config.SshRuntimeSettings; -import com.alibaba.qwen.code.managedagent.service.RequestDigests; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; @@ -18,6 +19,7 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -81,15 +83,15 @@ class SshWorkspaceStoreTest { @Test void rejectsActorReplayPayloadChangesAndPhysicalAliases() { var first = store.begin("tenant", "actor", "key", "mac", "/work/project", "Project"); - assertThatThrownBy(() -> store.get("tenant", "other", first.operationId())).isInstanceOf(ApiException.class); + assertThatThrownBy(() -> store.get("tenant", "other", first.operationId())).isInstanceOf(ManagedAgentException.class); assertThatThrownBy(() -> store.begin("tenant", "actor", "key", "mac", "/other", "Project")) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); var intent = store.claim("tenant", "actor", first.operationId(), "owner"); store.reserve(intent, "owner", registration(intent)); var second = store.begin("other-tenant", "actor", "another", "linux-alias", "/work/project", "Other"); var alias = store.claim("other-tenant", "actor", second.operationId(), "second"); assertThatThrownBy(() -> store.reserve(alias, "second", registration(alias))) - .isInstanceOf(ApiException.class).hasMessageContaining("already has an owner"); + .isInstanceOf(ManagedAgentException.class).hasMessageContaining("already has an owner"); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_storage_owner", Integer.class)).isEqualTo(1); } @@ -115,7 +117,7 @@ class SshWorkspaceStoreTest { assertThat(transaction.execute(ignored -> sessions.insertWorkspaceSessionCommand("tenant", "actor", "create", "digest", "qwen-code", null, null, input, "payload", selection)).sessionId()).isEqualTo(admitted.sessionId()); assertThatThrownBy(() -> transaction.execute(ignored -> sessions.insertWorkspaceSessionCommand("tenant", "actor", "another", "digest", - "qwen-code", null, null, input, "payload", selection))).isInstanceOf(ApiException.class); + "qwen-code", null, null, input, "payload", selection))).isInstanceOf(ManagedAgentException.class); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_session", Integer.class)).isEqualTo(1); jdbc.update("UPDATE ma_turn SET status = 'COMPLETED' WHERE tenant_id = ? AND session_id = ?", "tenant", admitted.sessionId()); assertThat(transaction.execute(ignored -> sessions.insertTurnCommand("tenant", "CREATE_TURN", "next-turn", "next-digest", @@ -144,7 +146,7 @@ class SshWorkspaceStoreTest { + "a".repeat(64) + "\"}]}", 1)); var input = prompted ? List.>of(Map.of("type", "text", "text", "Read")) : List.>of(); assertThatThrownBy(() -> transaction.execute(ignored -> sessions.insertWorkspaceSessionCommand("tenant", "actor", "unsupported", "digest", - agent, null, null, input, "payload", new WorkspaceSelection(intent.workspaceId(), ".")))).isInstanceOf(ApiException.class); + agent, null, null, input, "payload", new WorkspaceSelection(intent.workspaceId(), ".")))).isInstanceOf(ManagedAgentException.class); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_session", Integer.class)).isZero(); jdbc.update("INSERT INTO ma_workspace (tenant_id, workspace_id, workspace_generation, storage_id, display_name, config_ref, policy_ref, state)" + " VALUES ('tenant', 'local', 1, 'local', 'Local', ?, ?, 'ACTIVE')", WorkspaceExecutionProfile.CONFIG_REF, WorkspaceExecutionProfile.POLICY_REF); @@ -157,7 +159,7 @@ class SshWorkspaceStoreTest { "qwen-code", null, null, List.of(), null, new WorkspaceSelection(intent.workspaceId(), "."))); jdbc.update("UPDATE ma_session SET tool_profile = ? WHERE tenant_id = ? AND session_id = ?", WorkspaceToolProfiles.MCP, "tenant", remote.sessionId()); assertThatThrownBy(() -> transaction.execute(ignored -> sessions.insertTurnCommand("tenant", "CREATE_TURN", "unsupported-turn", "digest", - remote.sessionId(), List.of(Map.of("type", "text", "text", "Read")), "payload", "actor"))).isInstanceOf(ApiException.class); + remote.sessionId(), List.of(Map.of("type", "text", "text", "Read")), "payload", "actor"))).isInstanceOf(ManagedAgentException.class); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_turn WHERE tenant_id = ? AND session_id = ?", Integer.class, "tenant", remote.sessionId())).isZero(); } @@ -187,7 +189,7 @@ class SshWorkspaceStoreTest { store.fail(intent, "old", "ssh_runtime_unavailable", true); var retry = store.claim("tenant", "actor", operation.operationId(), "new"); assertThat(retry.registration()).isEqualTo(registration(intent)); - assertThatThrownBy(() -> store.complete(intent, "old")).isInstanceOf(ApiException.class); + assertThatThrownBy(() -> store.complete(intent, "old")).isInstanceOf(ManagedAgentException.class); store.reserve(retry, "new", registration(intent)); store.complete(retry, "new"); jdbc.update("UPDATE ma_storage SET fence_operation_id = ? WHERE alias_key = ?", "fence", @@ -353,7 +355,7 @@ class SshWorkspaceStoreTest { + com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime.SQL_NOW + " - 1000"); store.fail(intent, "expired", "network_timeout", false); assertThat(store.get("tenant", "actor", operation.operationId()).status()).isEqualTo("running"); - assertThatThrownBy(() -> store.reserve(intent, "expired", registration(intent))).isInstanceOf(ApiException.class); + assertThatThrownBy(() -> store.reserve(intent, "expired", registration(intent))).isInstanceOf(ManagedAgentException.class); assertThat(store.claim("tenant", "actor", operation.operationId(), "next")).isNotNull(); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/StoreFaultGate.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/StoreFaultGate.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/StoreFaultGate.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/StoreFaultGate.java index e6d1b262cfc..cbbf9928cfe 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/StoreFaultGate.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/StoreFaultGate.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.StoredResource; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.StoredResource; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/StoreModelsTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/StoreModelsTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/StoreModelsTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/StoreModelsTest.java index 84f111a56f3..269cc88a81c 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/StoreModelsTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/StoreModelsTest.java @@ -1,7 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.store.StoreModels.CommandRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.CommandRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationAcknowledgementMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationAcknowledgementMySqlIT.java similarity index 91% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationAcknowledgementMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationAcknowledgementMySqlIT.java index 3de6bd7a069..9f64ee38f97 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationAcknowledgementMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationAcknowledgementMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.AfterEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationAcknowledgementTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationAcknowledgementTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationAcknowledgementTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationAcknowledgementTest.java index 9717ca79440..2a98f675f41 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationAcknowledgementTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationAcknowledgementTest.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; @@ -15,6 +15,7 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeTransport; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationAsyncVerificationMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationAsyncVerificationMySqlIT.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationAsyncVerificationMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationAsyncVerificationMySqlIT.java index 075372727bf..74042ca1926 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationAsyncVerificationMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationAsyncVerificationMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.AfterEach; import org.springframework.jdbc.core.JdbcTemplate; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationAsyncVerificationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationAsyncVerificationTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationAsyncVerificationTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationAsyncVerificationTest.java index 3f7ef68d712..b39fb5f584d 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationAsyncVerificationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationAsyncVerificationTest.java @@ -1,12 +1,15 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.managedagent.PublicationJournalFixture; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationStorageException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.security.WriterCredentialPolicy; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -405,7 +408,7 @@ public class ToolPublicationAsyncVerificationTest { assertThat(status("prefix").path("state").asText()).isEqualTo("PENDING"); assertThat(verifier.runOnce()).isFalse(); assertThatThrownBy(() -> publish("next", 1, "later")) - .isInstanceOf(ApiException.class).hasMessageContaining("busy"); + .isInstanceOf(ManagedAgentException.class).hasMessageContaining("busy"); due("prefix"); assertThat(verifier.runOnce()).isTrue(); } @@ -456,7 +459,7 @@ public class ToolPublicationAsyncVerificationTest { void transientVerificationErrorsRetryBeforeAndAfterClaim(boolean beforeClaim, String code) { data = replacement(Duration.ofMinutes(5), Duration.ofSeconds(2)); publish("retry", 0, "bytes"); - var error = new ApiException(HttpStatus.CONFLICT, code, "Temporary contention"); + var error = new ManagedAgentException(HttpStatus.CONFLICT, code, "Temporary contention"); if (beforeClaim) { var grants = spy(fixture.store); doThrow(error).doCallRealMethod().when(grants) diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationCollectorMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationCollectorMySqlIT.java similarity index 89% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationCollectorMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationCollectorMySqlIT.java index 41c2fcaffdd..c04461543b5 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationCollectorMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationCollectorMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.AfterEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationCollectorTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationCollectorTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationCollectorTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationCollectorTest.java index fbd2f18ebf8..f7fb42323be 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationCollectorTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationCollectorTest.java @@ -1,6 +1,9 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.OperationKind; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; @@ -712,8 +715,8 @@ public class ToolPublicationCollectorTest extends ToolPublicationRetentionStoreT .managedToolOutputScheduler(new org.springframework.boot.task.ThreadPoolTaskSchedulerBuilder())); context.registerBean("collector", ToolPublicationCollector.class, () -> collector(objects)); context.registerBean("materializer", - com.alibaba.qwen.code.managedagent.service.MessageMaterializer.class, - () -> new com.alibaba.qwen.code.managedagent.service.MessageMaterializer( + com.alibaba.qwen.code.managedagent.event.MessageMaterializer.class, + () -> new com.alibaba.qwen.code.managedagent.event.MessageMaterializer( state)); try { context.refresh(); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationRetentionClockFixtureMain.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationRetentionClockFixtureMain.java similarity index 95% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationRetentionClockFixtureMain.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationRetentionClockFixtureMain.java index eb25709da77..fedbd01eb52 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationRetentionClockFixtureMain.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationRetentionClockFixtureMain.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.jdbc.core.JdbcTemplate; @@ -43,7 +43,7 @@ public final class ToolPublicationRetentionClockFixtureMain { assertThat(jdbc.queryForObject("SELECT CAST(writer_lease_until AS SIGNED) - (" + ManagedSchemaTime.SQL_NOW + ") FROM ma_session_head WHERE tenant_id = ? AND session_id = ?", Long.class, tenant, session)) .isBetween(58_000L, 60_000L); assertThatThrownBy(() -> retire(jdbc, tx, tenant, session)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_writer_active")); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_session WHERE retired_at IS NOT NULL" + " AND tenant_id = ?", Integer.class, tenant)).isZero(); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationRetentionStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationRetentionStoreTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationRetentionStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationRetentionStoreTest.java index 10ce3691a9f..b6641d1fb63 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/ToolPublicationRetentionStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/ToolPublicationRetentionStoreTest.java @@ -1,7 +1,9 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract.OperationKind; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; @@ -92,12 +94,12 @@ public class ToolPublicationRetentionStoreTest { retire(); assertThat(jdbc.queryForObject("SELECT retired_at FROM ma_session WHERE tenant_id = ? AND retired_at IS NOT NULL", Long.class, tenant)).isEqualTo(first); - assertThatThrownBy(() -> retention.read(key)).isInstanceOfSatisfying(ApiException.class, + assertThatThrownBy(() -> retention.read(key)).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("tool_output_session_retired")); var sessions = new ManagedSessionStore(jdbc); assertThatThrownBy(() -> tx.executeWithoutResult(status -> sessions.acquireWriter(tenant, session, "a".repeat(32), new ManagedSessionStoreModels.AcquireWriterRequest("workspace-1", "writer", 60000L)))) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); } @Test @@ -107,9 +109,9 @@ public class ToolPublicationRetentionStoreTest { ToolPublicationRetentionStore.hash(tenant)); try (var replacement = retention.read(key)) { replacement.check(); - assertThatThrownBy(old::check).isInstanceOf(ApiException.class); + assertThatThrownBy(old::check).isInstanceOf(ManagedAgentException.class); retire(); - assertThatThrownBy(replacement::check).isInstanceOf(ApiException.class); + assertThatThrownBy(replacement::check).isInstanceOf(ManagedAgentException.class); assertThat(blocker()).isEqualTo("reader_active"); } } @@ -120,7 +122,7 @@ public class ToolPublicationRetentionStoreTest { void readLeasePinsTheObservedRetirementGenerationAndRequiresItsRoot() { try (var first = retention.read(key)) { jdbc.update("UPDATE ma_session SET retirement_generation = 7 WHERE tenant_id = ? AND session_id = ?", tenant, session); - assertThatThrownBy(first::check).isInstanceOf(ApiException.class); + assertThatThrownBy(first::check).isInstanceOf(ManagedAgentException.class); } try (var next = retention.read(key)) { next.check(); @@ -130,7 +132,7 @@ public class ToolPublicationRetentionStoreTest { ToolPublicationRetentionStore.now(jdbc) + 60_000, ToolPublicationRetentionStore.hash(tenant)); next.check(); jdbc.update("DELETE FROM ma_session WHERE tenant_id = ? AND session_id = ?", tenant, session); - assertThatThrownBy(next::check).isInstanceOf(ApiException.class); + assertThatThrownBy(next::check).isInstanceOf(ManagedAgentException.class); } } @@ -160,7 +162,7 @@ public class ToolPublicationRetentionStoreTest { jdbc.update("UPDATE ma_read_lease SET expires_at = 0 WHERE tenant_key = ?", ToolPublicationRetentionStore.hash(tenant)); resume.countDown(); - assertThatThrownBy(() -> result.get(10, TimeUnit.SECONDS)).hasCauseInstanceOf(ApiException.class); + assertThatThrownBy(() -> result.get(10, TimeUnit.SECONDS)).hasCauseInstanceOf(ManagedAgentException.class); } } @@ -177,7 +179,7 @@ public class ToolPublicationRetentionStoreTest { jdbc.update("UPDATE ma_read_lease SET expires_at = 0 WHERE tenant_key = ?", ToolPublicationRetentionStore.hash(tenant)); assertThatThrownBy(() -> retention.open(scope, "pub-1", "object", objects, original::check)) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); assertThat(opens).hasValue(0); } } @@ -201,7 +203,7 @@ public class ToolPublicationRetentionStoreTest { retire(); assertThat(blocker()).isNull(); assertThatThrownBy(() -> retention.put(key, scope, "pub-1", "exact-key", new byte[] {1}, objects)) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); assertThat(objects.bytes).containsKey("exact-key"); assertThat(jdbc.queryForObject("SELECT capture_held_bytes FROM ma_output_capture WHERE scope_key = ?", Long.class, scope)).isEqualTo(1000); @@ -276,7 +278,7 @@ public class ToolPublicationRetentionStoreTest { objects.bytes.put("exact-key", invalid); } assertThatThrownBy(() -> retention.put(key, scope, "pub-1", "exact-key", new byte[] {1, 2}, objects)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("tool_output_put_unresolved")); } objects.bytes.remove("exact-key"); @@ -350,7 +352,7 @@ public class ToolPublicationRetentionStoreTest { "a".repeat(32), new ManagedSessionStoreModels.AcquireWriterRequest("workspace-1", "writer", 60000L)))); release.countDown(); deletion.get(10, TimeUnit.SECONDS); - assertThatThrownBy(() -> acquisition.get(10, TimeUnit.SECONDS)).hasCauseInstanceOf(ApiException.class); + assertThatThrownBy(() -> acquisition.get(10, TimeUnit.SECONDS)).hasCauseInstanceOf(ManagedAgentException.class); } } @@ -373,7 +375,7 @@ public class ToolPublicationRetentionStoreTest { var claim = tx.execute(status -> publicStore.claimOperation(tenant, session, operation.operationId(), "worker", Duration.ofMinutes(1)).orElseThrow()); assertThatThrownBy(() -> tx.execute(status -> publicStore.completeOperation(tenant, session, operation.operationId(), - "worker", claim.claimGeneration(), false))).isInstanceOf(ApiException.class); + "worker", claim.claimGeneration(), false))).isInstanceOf(ManagedAgentException.class); assertThat(publicStore.requireSession(tenant, session).status()).isEqualTo("DELETING"); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_session WHERE retired_at IS NOT NULL AND tenant_id = ?", Long.class, tenant)).isZero(); @@ -387,7 +389,7 @@ public class ToolPublicationRetentionStoreTest { assertThat(jdbc.queryForObject("SELECT state FROM ma_session_head WHERE tenant_id = ?", String.class, tenant)).isEqualTo("DELETED"); assertThatThrownBy(() -> sessions.restore(tenant, "workspace-1", session, "a".repeat(32))) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); assertThat(tx.execute(status -> publicStore.beginOperation(tenant, session, StoreModels.OperationKind.DELETE, "actor", "delete", "digest").operation().operationId())).isEqualTo(operation.operationId()); } @@ -397,7 +399,7 @@ public class ToolPublicationRetentionStoreTest { var sessions = new ManagedSessionStore(jdbc); tx.executeWithoutResult(status -> sessions.acquireWriter(tenant, session, "a".repeat(32), new ManagedSessionStoreModels.AcquireWriterRequest("workspace-1", "writer", 60000L))); - assertThatThrownBy(this::retire).isInstanceOf(ApiException.class); + assertThatThrownBy(this::retire).isInstanceOf(ManagedAgentException.class); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_session WHERE retired_at IS NOT NULL AND tenant_id = ?", Long.class, tenant)).isZero(); assertThat(new ManagedAgentProperties().getToolPublication().isGcEnabled()).isFalse(); @@ -467,7 +469,7 @@ public class ToolPublicationRetentionStoreTest { tx.executeWithoutResult(status -> sessions.acquireWriter(tenant, session, "a".repeat(32), new ManagedSessionStoreModels.AcquireWriterRequest("workspace-1", "writer", 60000L))); assertThatThrownBy(() -> sessions.readResource(tenant, "workspace-1", session, "resource-1", "b".repeat(32))) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); assertThat(admissions).hasValue(0); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WakeRecoveryMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WakeRecoveryMySqlIT.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WakeRecoveryMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WakeRecoveryMySqlIT.java index 86da2fda192..a3ebf7fbe5c 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WakeRecoveryMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WakeRecoveryMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WakeRecoveryStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WakeRecoveryStoreTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WakeRecoveryStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WakeRecoveryStoreTest.java index 7dc242ff262..6ab198c8d51 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WakeRecoveryStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WakeRecoveryStoreTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; 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/persistence/WorkspaceCreationStoreTest.java similarity index 94% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCreationStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCreationStoreTest.java index 5a9ca300ed9..6c62844e2bf 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/persistence/WorkspaceCreationStoreTest.java @@ -1,8 +1,8 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -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.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; @@ -118,13 +118,13 @@ class WorkspaceCreationStoreTest { jdbc.update("UPDATE ma_storage_owner SET holder_key = 'already-held'"); assertThat(store(guard).create("tenant", "actor", "Held", "held")).isEqualTo(created); assertThatThrownBy(() -> store(guard).create("tenant", "actor", "Different", "held")) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("idempotency_conflict")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("idempotency_conflict")); jdbc.update("DELETE FROM ma_workspace_access"); assertThatThrownBy(() -> store(guard).create("tenant", "actor", "Held", "held")) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_not_found")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_not_found")); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_workspace_access", Integer.class)).isZero(); jdbc.update("DELETE FROM ma_workspace"); - assertThatThrownBy(() -> store(guard).create("tenant", "actor", "Held", "held")).isInstanceOf(ApiException.class); + assertThatThrownBy(() -> store(guard).create("tenant", "actor", "Held", "held")).isInstanceOf(ManagedAgentException.class); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_workspace", Integer.class)).isZero(); } @@ -151,11 +151,11 @@ class WorkspaceCreationStoreTest { void validatesNamesAndDisabledConfiguration() { for (String name : List.of(" ", "a\nb", "x".repeat(129))) { assertThatThrownBy(() -> store(guard).create("tenant", "actor", name, UUID.randomUUID().toString())) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); } properties.getRuntimeBroker().setWorkspaceCreationRoot(""); assertThat(store(guard).enabled()).isFalse(); - assertThatThrownBy(() -> store(guard).create("tenant", "actor", "Name", "key")).isInstanceOf(ApiException.class); + assertThatThrownBy(() -> store(guard).create("tenant", "actor", "Name", "key")).isInstanceOf(ManagedAgentException.class); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_request_receipt", Integer.class)).isZero(); } @@ -228,14 +228,14 @@ class WorkspaceCreationStoreTest { 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, + parent.workspaceId(), ".")).isInstanceOfSatisfying(ManagedAgentException.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); + parent.workspaceId(), "existing-project")).isInstanceOf(ManagedAgentException.class); } @Test @@ -252,22 +252,22 @@ class WorkspaceCreationStoreTest { 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) + .isInstanceOfAny(ManagedAgentException.class, RuntimeBrokerException.class) .hasFieldOrPropertyWithValue("code", code); assertThatThrownBy(() -> store(guard).create("tenant", "actor", "Unsafe", "unsafe-" + path, - parent.workspaceId(), path)).isInstanceOfAny(ApiException.class, RuntimeBrokerException.class) + parent.workspaceId(), path)).isInstanceOfAny(ManagedAgentException.class, RuntimeBrokerException.class) .hasFieldOrPropertyWithValue("code", code); } assertThatThrownBy(() -> store(guard).directories("other", "actor", parent.workspaceId(), ".")) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); assertThatThrownBy(() -> store(guard).directories("tenant", "other", parent.workspaceId(), ".")) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.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); + .isInstanceOf(ManagedAgentException.class); assertThatThrownBy(() -> store(guard).create("tenant", "actor", "Refused", "role-" + role, - parent.workspaceId(), "project")).isInstanceOf(ApiException.class); + parent.workspaceId(), "project")).isInstanceOf(ManagedAgentException.class); } assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_workspace", Integer.class)).isEqualTo(1); } @@ -316,9 +316,9 @@ class WorkspaceCreationStoreTest { .isInstanceOfSatisfying(RuntimeBrokerException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_unavailable")); assertThatThrownBy(() -> store(guard).directories("tenant", "actor", parent.workspaceId(), ".")) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); assertThatThrownBy(() -> store(guard).create("tenant", "actor", "Remote", "remote-selection", - parent.workspaceId(), ".")).isInstanceOf(ApiException.class); + parent.workspaceId(), ".")).isInstanceOf(ManagedAgentException.class); assertThat(jdbc.queryForObject("SELECT COUNT(*) FROM ma_workspace", Integer.class)).isEqualTo(1); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiCheckpointMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiCheckpointMySqlIT.java similarity index 89% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiCheckpointMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiCheckpointMySqlIT.java index aa1aa072517..37f3b0a0e88 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiCheckpointMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiCheckpointMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.AfterEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiCheckpointSnapshotStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiCheckpointSnapshotStoreTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiCheckpointSnapshotStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiCheckpointSnapshotStoreTest.java index 5b81bb266a3..8753e6bd5e0 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiCheckpointSnapshotStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiCheckpointSnapshotStoreTest.java @@ -1,6 +1,5 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; @@ -15,6 +14,7 @@ import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiHostedFilesTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiHostedFilesTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiHostedFilesTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiHostedFilesTest.java index 149b0930939..3948066b942 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiHostedFilesTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiHostedFilesTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.io.TempDir; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiHostedMainTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiHostedMainTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiHostedMainTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiHostedMainTest.java index fa2e686fbdf..5ea3d9dcacc 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiHostedMainTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiHostedMainTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.fasterxml.jackson.core.StreamReadFeature; import com.fasterxml.jackson.databind.DeserializationFeature; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiNativeActivationGateTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiNativeActivationGateTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiNativeActivationGateTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiNativeActivationGateTest.java index 908489134bb..bb2c9bf4088 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiNativeActivationGateTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiNativeActivationGateTest.java @@ -1,9 +1,8 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -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.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.CsiFilesRetirementProfile; import com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; @@ -18,6 +17,7 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeSession; import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -75,7 +75,7 @@ class WorkspaceCsiNativeActivationGateTest { var source = new DriverManagerDataSource("jdbc:h2:mem:csi-native-" + UUID.randomUUID() + ";MODE=MySQL;DB_CLOSE_DELAY=-1;DATABASE_TO_LOWER=TRUE", "sa", ""); Flyway.configure().dataSource(source).locations("classpath:db/managed-schema").load().migrate(); - jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(source); + jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(source); var manager = new DataSourceTransactionManager(source); transaction = new TransactionTemplate(manager); transaction.setTimeout(10); @@ -127,7 +127,7 @@ class WorkspaceCsiNativeActivationGateTest { var before = allRows(); assertThatThrownBy(() -> transaction.execute(status -> journal.lockPublicationWriter( "tenant", "workspace", sessionId, writerId, 1, token))) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(org.springframework.http.HttpStatus.CONFLICT); assertThat(error.getCode()).isEqualTo("csi_managed_mutation_unavailable"); }); @@ -320,7 +320,7 @@ class WorkspaceCsiNativeActivationGateTest { .getBytes(java.nio.charset.StandardCharsets.UTF_8), admission -> {}), ManagedSessionStoreModels.CommitTransactionRequest.class); assertThatThrownBy(() -> transaction.execute(status -> journal.commit("tenant", sessionId, token, oversized))) - .isInstanceOf(com.alibaba.qwen.code.managedagent.api.ApiException.class) + .isInstanceOf(com.alibaba.qwen.code.managedagent.exception.ManagedAgentException.class) .hasMessage("Resources larger than 64 KiB require the disabled OSS storage path."); assertThat(authorityRows()).isEqualTo(before); assertThat(commit(5).replayed()).isFalse(); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiReservationMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiReservationMySqlIT.java similarity index 91% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiReservationMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiReservationMySqlIT.java index 0dec262cf8c..fc507e41ef2 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiReservationMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiReservationMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.AfterEach; import org.springframework.jdbc.datasource.DriverManagerDataSource; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiReservationStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiReservationStoreTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiReservationStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiReservationStoreTest.java index 716c92fa79a..804256fa389 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiReservationStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiReservationStoreTest.java @@ -1,6 +1,5 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; @@ -17,6 +16,7 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRetirementStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRetirementStoreTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRetirementStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRetirementStoreTest.java index 2ef307e2f71..77727d2d534 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRetirementStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRetirementStoreTest.java @@ -1,6 +1,5 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; @@ -15,6 +14,7 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRuntimeConstructionFixture.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRuntimeConstructionFixture.java similarity index 90% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRuntimeConstructionFixture.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRuntimeConstructionFixture.java index 997555fe2e0..f8563e8f584 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRuntimeConstructionFixture.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRuntimeConstructionFixture.java @@ -1,7 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.CsiFilesRetirementProfile; import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; import com.fasterxml.jackson.databind.ObjectMapper; @@ -18,7 +18,7 @@ public final class WorkspaceCsiRuntimeConstructionFixture { } public static RuntimeProvisionRequest create(DataSource source, WorkspaceCsiRegistration registration) { - var jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(source); + var jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(source); var manager = new DataSourceTransactionManager(source); var json = new ObjectMapper(); jdbc.update( diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRuntimeMainTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRuntimeMainTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRuntimeMainTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRuntimeMainTest.java index af5b6f4be6e..f6b15efc251 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiRuntimeMainTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiRuntimeMainTest.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.service.WorkspaceCsiResourceGuard; +import com.alibaba.qwen.code.managedagent.workspace.runtime.WorkspaceCsiResourceGuard; import com.fasterxml.jackson.core.StreamReadFeature; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiSessionGuardTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiSessionGuardTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiSessionGuardTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiSessionGuardTest.java index d06b358388e..3918b64941f 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiSessionGuardTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiSessionGuardTest.java @@ -1,9 +1,9 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -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.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.CsiFilesRetirementProfile; import com.alibaba.qwen.code.runtimebroker.JdbcCsiFilesRetirementGuard; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; @@ -18,6 +18,7 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeScope; import com.alibaba.qwen.code.runtimebroker.RuntimeSession; import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.ObjectMapper; import org.flywaydb.core.Flyway; import org.junit.jupiter.api.BeforeEach; @@ -62,7 +63,7 @@ class WorkspaceCsiSessionGuardTest { var source = new DriverManagerDataSource("jdbc:h2:mem:csi-guard-" + UUID.randomUUID() + ";MODE=MySQL;DB_CLOSE_DELAY=-1;DATABASE_TO_LOWER=TRUE", "sa", ""); Flyway.configure().dataSource(source).locations("classpath:db/managed-schema").load().migrate(); - jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(source); + jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(source); var manager = new DataSourceTransactionManager(source); transaction = new TransactionTemplate(manager); transaction.setTimeout(10); @@ -401,7 +402,7 @@ class WorkspaceCsiSessionGuardTest { } private static void assertApiCode(Runnable action, String code) { - assertThatThrownBy(action::run).isInstanceOfSatisfying(ApiException.class, + assertThatThrownBy(action::run).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo(code)); } } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiSessionMainTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiSessionMainTest.java similarity index 94% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiSessionMainTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiSessionMainTest.java index 29785b273e2..7bc5b9fe176 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiSessionMainTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiSessionMainTest.java @@ -1,12 +1,15 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.service.HarnessCoordinator; -import com.alibaba.qwen.code.managedagent.service.ManagedAgentService; -import com.alibaba.qwen.code.managedagent.service.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.session.HarnessCoordinator; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.CsiFilesRetirementProfile; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; @@ -71,7 +74,7 @@ class WorkspaceCsiSessionMainTest { source = new DriverManagerDataSource("jdbc:h2:mem:csi-create-" + UUID.randomUUID() + ";MODE=MySQL;DB_CLOSE_DELAY=-1;DATABASE_TO_LOWER=TRUE", "sa", ""); Flyway.configure().dataSource(source).locations("classpath:db/managed-schema").load().migrate(); - jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(source); + jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(source); manager = new DataSourceTransactionManager(source); properties = new ManagedAgentProperties(); properties.setAgentRevision("reviewed-agent/1"); @@ -147,13 +150,13 @@ class WorkspaceCsiSessionMainTest { .insertChildSessionCommand("tenant", original.sessionId(), "child", "digest", "child", List.of(), null, new StoreModels.SessionLineage(original.sessionId(), original.sessionId(), "child-run", 1)))) - .isInstanceOf(ApiException.class) - .satisfies(error -> assertThat(((ApiException) error).getCode()) + .isInstanceOf(ManagedAgentException.class) + .satisfies(error -> assertThat(((ManagedAgentException) error).getCode()) .isEqualTo("child_parent_unavailable")); assertThatThrownBy(() -> new TransactionTemplate(manager).execute(status -> store() .replayChildSessionCommand("tenant", original.sessionId(), "child", "digest"))) - .isInstanceOf(ApiException.class) - .satisfies(error -> assertThat(((ApiException) error).getCode()) + .isInstanceOf(ManagedAgentException.class) + .satisfies(error -> assertThat(((ManagedAgentException) error).getCode()) .isEqualTo("child_parent_unavailable")); assertThat(jdbc.queryForList("SELECT " + ManagedSchemaProjection.SESSION.columns() + " FROM ma_session")) .usingRecursiveComparison().isEqualTo(before); @@ -185,8 +188,8 @@ class WorkspaceCsiSessionMainTest { harness, new ManagedWorkspaceRegistry(jdbc)); assertThatThrownBy(() -> service.createChildSession("tenant", original.sessionId(), "child-run", "audit", "inspect")) - .isInstanceOf(ApiException.class) - .satisfies(error -> assertThat(((ApiException) error).getCode()) + .isInstanceOf(ManagedAgentException.class) + .satisfies(error -> assertThat(((ManagedAgentException) error).getCode()) .isEqualTo("child_parent_unavailable")); verify(harness, never()).isWorkspaceFilesAvailable(); verify(childStore, never()) @@ -242,8 +245,8 @@ class WorkspaceCsiSessionMainTest { assertThatThrownBy(() -> create(request("rejected"))).isInstanceOf(RuntimeBrokerException.class) .hasMessage("Workspace CSI admission is unavailable."); } else { - assertThatThrownBy(() -> create(request("rejected"))).isInstanceOf(ApiException.class) - .satisfies(error -> assertThat(((ApiException) error).getCode()) + assertThatThrownBy(() -> create(request("rejected"))).isInstanceOf(ManagedAgentException.class) + .satisfies(error -> assertThat(((ManagedAgentException) error).getCode()) .isIn("workspace_unavailable", "workspace_not_found", "workspace_forbidden")); } assertEmpty( @@ -262,8 +265,8 @@ class WorkspaceCsiSessionMainTest { } var wrongRevision = new WorkspaceCsiSessionMain.Request(registration, "actor", "rejected", "unsupported", null, new WorkspaceSelection("workspace", ".")); - assertThatThrownBy(() -> create(wrongRevision)).isInstanceOf(ApiException.class) - .satisfies(error -> assertThat(((ApiException) error).getCode()).isEqualTo("unsupported_feature")); + assertThatThrownBy(() -> create(wrongRevision)).isInstanceOf(ManagedAgentException.class) + .satisfies(error -> assertThat(((ManagedAgentException) error).getCode()).isEqualTo("unsupported_feature")); assertEmpty("ma_session", "ma_request_receipt"); } @@ -273,12 +276,12 @@ class WorkspaceCsiSessionMainTest { var before = jdbc.queryForMap("SELECT " + ManagedSchemaProjection.SESSION.columns() + " FROM ma_session"); var changed = new WorkspaceCsiSessionMain.Request(registration, "actor", "replay", null, "different", new WorkspaceSelection("workspace", ".")); - assertThatThrownBy(() -> create(changed)).isInstanceOf(ApiException.class) - .satisfies(error -> assertThat(((ApiException) error).getCode()).isEqualTo("idempotency_conflict")); + assertThatThrownBy(() -> create(changed)).isInstanceOf(ManagedAgentException.class) + .satisfies(error -> assertThat(((ManagedAgentException) error).getCode()).isEqualTo("idempotency_conflict")); assertThat(json.valueToTree(jdbc.queryForMap("SELECT " + ManagedSchemaProjection.SESSION.columns() + " FROM ma_session"))).isEqualTo(json.valueToTree(before)); jdbc.update("UPDATE ma_session SET runtime_request_key = ?", "a".repeat(64)); - assertThatThrownBy(() -> create(request("replay"))).isInstanceOf(ApiException.class) - .satisfies(error -> assertThat(((ApiException) error).getCode()).isEqualTo("workspace_unavailable")); + assertThatThrownBy(() -> create(request("replay"))).isInstanceOf(ManagedAgentException.class) + .satisfies(error -> assertThat(((ManagedAgentException) error).getCode()).isEqualTo("workspace_unavailable")); assertThat(count("ma_session")).isEqualTo(1); assertThat(count("ma_public_event")).isEqualTo(1); assertThat(first.sessionId()).isEqualTo(jdbc.queryForObject("SELECT session_id FROM ma_session", String.class)); @@ -304,8 +307,8 @@ class WorkspaceCsiSessionMainTest { void cannotJoinAnUnboundCommandOrCallerTransaction() { new TransactionTemplate(manager).executeWithoutResult(status -> store().insertSessionCommand("tenant", "actor", "CREATE_SESSION", "unbound", "sha256:" + "a".repeat(64), "qwen-code", null, null, List.of(), null)); - assertThatThrownBy(() -> create(request("unbound"))).isInstanceOf(ApiException.class) - .satisfies(error -> assertThat(((ApiException) error).getCode()).isEqualTo("idempotency_conflict")); + assertThatThrownBy(() -> create(request("unbound"))).isInstanceOf(ManagedAgentException.class) + .satisfies(error -> assertThat(((ManagedAgentException) error).getCode()).isEqualTo("idempotency_conflict")); assertThat(count("ma_session")).isEqualTo(1); new TransactionTemplate(manager).executeWithoutResult(status -> assertThatThrownBy(() -> create(request("new"))) .isInstanceOf(IllegalStateException.class).hasMessage("Private CSI CREATE requires a fresh transaction")); @@ -647,8 +650,8 @@ class WorkspaceCsiSessionMainTest { } private static void assertPrivateRefusal(org.assertj.core.api.ThrowableAssert.ThrowingCallable operation) { - assertThatThrownBy(operation).isInstanceOf(ApiException.class).satisfies(error -> { - var refusal = (ApiException) error; + assertThatThrownBy(operation).isInstanceOf(ManagedAgentException.class).satisfies(error -> { + var refusal = (ManagedAgentException) error; assertThat(refusal.getCode()).isEqualTo("csi_managed_mutation_unavailable"); assertThat(refusal.getStatus()).isEqualTo(org.springframework.http.HttpStatus.CONFLICT); }); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiSqlWorkerMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiSqlWorkerMySqlIT.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiSqlWorkerMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiSqlWorkerMySqlIT.java index 895a54ed48d..ef4338f3fea 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiSqlWorkerMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiSqlWorkerMySqlIT.java @@ -1,20 +1,20 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; -import com.alibaba.qwen.code.runtimebroker.HttpRuntimeTransport; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; -import com.alibaba.qwen.code.runtimebroker.ManagedCsiFilesProtocol; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; -import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerHttpServer; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; import com.alibaba.qwen.code.runtimebroker.RuntimeProvisioner; import com.alibaba.qwen.code.runtimebroker.RuntimeResourceHandle; import com.alibaba.qwen.code.runtimebroker.WorkspaceCsiRuntimeIdentity; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedCsiFilesProtocol; +import com.alibaba.qwen.code.runtimebroker.transport.RuntimeBrokerHttpServer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.sun.net.httpserver.HttpExchange; @@ -316,7 +316,7 @@ class WorkspaceCsiSqlWorkerMySqlIT { } catch (java.io.IOException ignored) { exchange.close(); } - } catch (ApiException refusal) { + } catch (ManagedAgentException refusal) { try { respond(exchange, refusal.getStatus().value(), Map.of("error", Map.of("code", refusal.getCode(), "message", refusal.getMessage()))); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiWorkerAckMainTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiWorkerAckMainTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiWorkerAckMainTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiWorkerAckMainTest.java index c98190f7a68..9c8a4b6a84c 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiWorkerAckMainTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiWorkerAckMainTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.fasterxml.jackson.databind.JsonNode; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiWorkerAckStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiWorkerAckStoreTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiWorkerAckStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiWorkerAckStoreTest.java index 3743d26d845..5adb53dec23 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceCsiWorkerAckStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceCsiWorkerAckStoreTest.java @@ -1,11 +1,12 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeTransport; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; 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/persistence/WorkspaceDirectorySelectionMySqlIT.java similarity index 89% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceDirectorySelectionMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceDirectorySelectionMySqlIT.java index 5c16333aca9..72ef392061a 100644 --- 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/persistence/WorkspaceDirectorySelectionMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.AfterEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceFileMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceFileMySqlIT.java similarity index 89% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceFileMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceFileMySqlIT.java index 095838054e4..1aa0054cf70 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceFileMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceFileMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.AfterEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceFileStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceFileStoreTest.java similarity index 89% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceFileStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceFileStoreTest.java index 9e4d671c64a..b17e285aa31 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceFileStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceFileStoreTest.java @@ -1,10 +1,10 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.service.SshWorkspaceService; -import com.alibaba.qwen.code.runtimebroker.WorkspaceFileProcess; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.workspace.SshWorkspaceService; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; +import com.alibaba.qwen.code.runtimebroker.provisioning.WorkspaceFileProcess; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.digest.DigestUtils; import org.junit.jupiter.api.BeforeEach; @@ -75,10 +75,10 @@ class WorkspaceFileStoreTest { void disabledDeploymentRefusesQueryAndReadBeforeFileIo() { try (var process = mockStatic(WorkspaceFileProcess.class)) { properties.getHarness().setWorkspaceFilesEnabled(false); - assertThatThrownBy(this::query).isInstanceOfSatisfying(ApiException.class, + assertThatThrownBy(this::query).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_files_disabled")); assertThatThrownBy(() -> files.read("tenant", "actor", workspace, ".", "a.txt", "old")) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_files_disabled")); process.verifyNoInteractions(); } @@ -110,7 +110,7 @@ class WorkspaceFileStoreTest { jdbc.update("DELETE FROM ma_workspace_access"); return result(); }); - assertThatThrownBy(this::query).isInstanceOfSatisfying(ApiException.class, + assertThatThrownBy(this::query).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_not_found")); } } @@ -119,11 +119,11 @@ class WorkspaceFileStoreTest { void hidesStrangersAndRejectsReadersBeforeFileIo() { try (var process = mockStatic(WorkspaceFileProcess.class)) { assertThatThrownBy(() -> files.query("tenant", "stranger", workspace, ".", ".", "", null)) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_not_found")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_not_found")); assertThatThrownBy(() -> files.query("other-tenant", "actor", workspace, ".", ".", "", null)) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); jdbc.update("UPDATE ma_workspace_access SET role = 'READER'"); - assertThatThrownBy(this::query).isInstanceOfSatisfying(ApiException.class, + assertThatThrownBy(this::query).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_forbidden")); process.verifyNoInteractions(); } @@ -136,11 +136,11 @@ class WorkspaceFileStoreTest { jdbc.update("UPDATE ma_workspace SET workspace_generation = workspace_generation + 1"); return result(); }); - assertThatThrownBy(this::query).isInstanceOfSatisfying(ApiException.class, + assertThatThrownBy(this::query).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_file_scope_changed")); process.clearInvocations(); jdbc.update("UPDATE ma_storage SET storage_kind = 'CSI'"); - assertThatThrownBy(this::query).isInstanceOfSatisfying(ApiException.class, + assertThatThrownBy(this::query).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_files_unsupported")); process.verifyNoInteractions(); } @@ -153,9 +153,9 @@ class WorkspaceFileStoreTest { String revision = query().scopeRevision(); jdbc.update("UPDATE ma_workspace SET workspace_generation = workspace_generation + 1"); assertThatThrownBy(() -> files.read("tenant", "actor", workspace, ".", "a.txt", revision)) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_file_scope_changed")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_file_scope_changed")); jdbc.update("UPDATE ma_storage SET fence_operation_id = 'migration'"); - assertThatThrownBy(this::query).isInstanceOf(ApiException.class); + assertThatThrownBy(this::query).isInstanceOf(ManagedAgentException.class); jdbc.update("UPDATE ma_storage SET fence_operation_id = NULL"); process.when(() -> WorkspaceFileProcess.read(anyString(), anyString(), any())).thenReturn(Map.of("qwenVersion", "old")); process.when(WorkspaceFileProcess::unsupported).thenCallRealMethod(); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceLifecycleMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceLifecycleMySqlIT.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceLifecycleMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceLifecycleMySqlIT.java index 4734d91c9ca..b2862214464 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceLifecycleMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceLifecycleMySqlIT.java @@ -1,12 +1,12 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.managedagent.ExtensionRecordJournal; import com.alibaba.qwen.code.managedagent.ManagedHookRecordContractTest; import com.alibaba.qwen.code.managedagent.MySqlLockProbe; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.AcquireWriterRequest; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels.AuthorizeLifecycleRequest; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.AcquireWriterRequest; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels.AuthorizeLifecycleRequest; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; import com.fasterxml.jackson.databind.node.ObjectNode; import org.junit.jupiter.api.AfterEach; @@ -147,13 +147,13 @@ class WorkspaceLifecycleMySqlIT extends WorkspaceLifecycleStoreTest { fixture.transactions.executeWithoutResult(ignored -> journal.authorizeOrdinary("tenant", fixture.session, "w".repeat(32), legacy)); execution.authorizeLegacyClose(fixture.store.requireSession("tenant", fixture.session)); assertThatThrownBy(() -> fixture.transactions.executeWithoutResult(ignored -> journal.authorizeOrdinary( - "tenant", fixture.session, "w".repeat(32), ordinary))).isInstanceOfSatisfying(ApiException.class, + "tenant", fixture.session, "w".repeat(32), ordinary))).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_lifecycle_active")); fixture.jdbc.update("UPDATE ma_operation SET claim_until = " + ManagedSchemaTime.SQL_NOW + " - 1000 WHERE operation_id = ?", id); assertThat(fixture.transactions.execute(ignored -> WorkspaceLifecycleStore.legacyClose(fixture.jdbc, "tenant", fixture.session))) .isFalse(); assertThatThrownBy(() -> fixture.transactions.executeWithoutResult(ignored -> journal.authorizeOrdinary( - "tenant", fixture.session, "w".repeat(32), legacy))).isInstanceOfSatisfying(ApiException.class, + "tenant", fixture.session, "w".repeat(32), legacy))).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_lifecycle_active")); assertThatThrownBy(() -> execution.authorizeLegacyClose(fixture.store.requireSession("tenant", fixture.session))) .hasMessageContaining("unavailable"); @@ -196,7 +196,7 @@ class WorkspaceLifecycleMySqlIT extends WorkspaceLifecycleStoreTest { } return fixture.admit(OperationKind.DELETE); }); - assertThat(queued.get().get(5, TimeUnit.SECONDS)).isInstanceOf(ApiException.class); + assertThat(queued.get().get(5, TimeUnit.SECONDS)).isInstanceOf(ManagedAgentException.class); } assertThat(fixture.jdbc.queryForObject("SELECT COUNT(*) FROM ma_session_head WHERE head_kind = 'MANAGED_SESSION'", Integer.class)).isZero(); } @@ -317,7 +317,7 @@ class WorkspaceLifecycleMySqlIT extends WorkspaceLifecycleStoreTest { WorkspaceLifecycleStore.requireIdleJournal(fixture.jdbc, fixture.json, "tenant", fixture.session); } - }).isInstanceOfSatisfying(ApiException.class, error -> + }).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("turn_active")); } finally { txManager.rollback(snapshot); @@ -337,7 +337,7 @@ class WorkspaceLifecycleMySqlIT extends WorkspaceLifecycleStoreTest { "tenant", fixture.session); assertThatThrownBy(() -> fixture.transactions.executeWithoutResult(ignored -> WorkspaceLifecycleStore.requireIdleJournal(fixture.jdbc, fixture.json, "tenant", fixture.session))) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_lifecycle_journal_unverified")); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceLifecycleStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceLifecycleStoreTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceLifecycleStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceLifecycleStoreTest.java index 2a8bc7971b4..c3982e8ac46 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceLifecycleStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceLifecycleStoreTest.java @@ -1,13 +1,13 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.managedagent.ExtensionRecordJournal; import com.alibaba.qwen.code.managedagent.ManagedHookRecordContractTest; -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.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; @@ -23,6 +23,7 @@ import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; @@ -131,7 +132,7 @@ class WorkspaceLifecycleStoreTest { assertThat(fixture.jdbc.queryForObject("SELECT journal_revision FROM ma_session_head", Long.class)) .isEqualTo(revision + 1); } else { - assertThatThrownBy(commit::run).isInstanceOfSatisfying(ApiException.class, error -> { + assertThatThrownBy(commit::run).isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.CONFLICT); assertThat(error.getCode()).isEqualTo(accepted && batch ? "managed_session_extension_record_rejected" : draining ? "workspace_lifecycle_claim_fenced" : authority && !replacement @@ -259,7 +260,7 @@ class WorkspaceLifecycleStoreTest { List.of(resource)); assertThatThrownBy(() -> fixture.transactions.execute(ignored -> journal.commit("tenant", fixture.session, "w".repeat(32), request, "authority".equals(mode) ? WorkspaceLifecycleStore.authority(operation) : null))) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.BAD_REQUEST); assertThat(error.getCode()).isEqualTo(ManagedSessionStoreModels.ERROR_INVALID_REQUEST); }); @@ -687,12 +688,12 @@ class WorkspaceLifecycleStoreTest { try { fixture.store.beginWorkspaceLifecycle("tenant", fixture.session, OperationKind.CLOSE, "owner", "a".repeat(64), "close-failed-turn", "digest", true, 1); - } catch (ApiException refusal) { + } catch (ManagedAgentException refusal) { assertThat(fixture.jdbc.queryForList("SELECT operation_key FROM ma_operation", String.class)) .containsExactlyInAnyOrderElementsOf(operations); throw refusal; } - })).isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("turn_active")); + })).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("turn_active")); assertThat(fixture.jdbc.queryForList("SELECT operation_key FROM ma_operation", String.class)) .containsExactlyInAnyOrderElementsOf(operations); assertThat(fixture.store.findTurn("tenant", fixture.session, turn).orElseThrow().status()).isEqualTo("FAILED"); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMaintenanceLinuxAcceptanceMain.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMaintenanceLinuxAcceptanceMain.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMaintenanceLinuxAcceptanceMain.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMaintenanceLinuxAcceptanceMain.java index 1678549e730..b8d6cae4d18 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMaintenanceLinuxAcceptanceMain.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMaintenanceLinuxAcceptanceMain.java @@ -1,8 +1,8 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.RuntimeBroker.WorkspaceMount; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMigrationMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMigrationMySqlIT.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMigrationMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMigrationMySqlIT.java index 97ec656fcae..8871da11781 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMigrationMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMigrationMySqlIT.java @@ -1,7 +1,8 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMigrationStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMigrationStoreTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMigrationStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMigrationStoreTest.java index f47d2566d4c..7beaf0d0610 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceMigrationStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceMigrationStoreTest.java @@ -1,8 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.RuntimeBroker.WorkspaceMount; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; import com.alibaba.qwen.code.runtimebroker.InMemoryRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; @@ -12,6 +11,7 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeScope; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import com.fasterxml.jackson.databind.node.ObjectNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceNativeAcceptanceMain.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceNativeAcceptanceMain.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceNativeAcceptanceMain.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceNativeAcceptanceMain.java index 9270d3bf4cb..07d13c99307 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceNativeAcceptanceMain.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceNativeAcceptanceMain.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import java.nio.file.Files; import java.nio.file.Path; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceProfileLifecycleMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceProfileLifecycleMySqlIT.java similarity index 95% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceProfileLifecycleMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceProfileLifecycleMySqlIT.java index c15dfb1d230..0d10148fa6e 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceProfileLifecycleMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceProfileLifecycleMySqlIT.java @@ -1,5 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.springframework.jdbc.core.JdbcTemplate; @@ -84,7 +86,7 @@ class WorkspaceProfileLifecycleMySqlIT extends WorkspaceProfileLifecycleTest { : journal.acquireWriter("tenant", f.session, "r".repeat(32), new ManagedSessionStoreModels.AcquireWriterRequest("workspace", "recovery", 60_000L), WorkspaceLifecycleStore.authority(operation))); - } catch (com.alibaba.qwen.code.managedagent.api.ApiException conflict) { + } catch (com.alibaba.qwen.code.managedagent.exception.ManagedAgentException conflict) { org.assertj.core.api.Assertions.assertThat(conflict.getCode()).isEqualTo("managed_session_writer_conflict"); return null; } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceProfileLifecycleTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceProfileLifecycleTest.java similarity index 93% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceProfileLifecycleTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceProfileLifecycleTest.java index 5e6d18d0b03..f862af8ed06 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceProfileLifecycleTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceProfileLifecycleTest.java @@ -1,12 +1,13 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.managedagent.ExtensionRecordJournal; import com.alibaba.qwen.code.managedagent.ManagedHookRecordContractTest; import com.alibaba.qwen.code.managedagent.PublicationJournalFixture; -import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeLifecycleAuthority; import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; @@ -70,14 +71,14 @@ class WorkspaceProfileLifecycleTest { var journal = new ManagedSessionStore(f.jdbc); var request = new ManagedSessionStoreModels.AcquireWriterRequest("workspace", "cleanup", 60_000L); assertThatThrownBy(() -> f.transactions.execute(ignored -> journal.acquireWriter("tenant", f.session, "w".repeat(32), request))) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); assertThatThrownBy(() -> f.transactions.execute(ignored -> journal.acquireWriter("tenant", f.session, "w".repeat(32), request, - WorkspaceLifecycleStore.authority(first)))).isInstanceOf(ApiException.class); + WorkspaceLifecycleStore.authority(first)))).isInstanceOf(ManagedAgentException.class); var writer = f.transactions.execute(ignored -> journal.acquireWriter("tenant", f.session, "w".repeat(32), request, current)); assertThat(writer.writerGeneration()).isPositive(); assertThatThrownBy(() -> f.transactions.execute(ignored -> journal.renewWriter("tenant", f.session, "w".repeat(32), new ManagedSessionStoreModels.RenewWriterRequest("workspace", "cleanup", writer.writerGeneration(), 60_000L)))) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); } @ParameterizedTest @@ -94,16 +95,16 @@ class WorkspaceProfileLifecycleTest { java.sql.Timestamp.from(java.time.Instant.parse("2000-01-01T00:00:00Z"))); assertThatThrownBy(() -> f.transactions.execute(ignored -> journal.renewWriter("tenant", f.session, token, renew, WorkspaceLifecycleStore.authority(first)))) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_writer_conflict")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_writer_conflict")); f.transactions.executeWithoutResult(ignored -> f.lifecycle.recoverEffects(first)); f.jdbc.update("UPDATE ma_operation SET claim_until = 946684800000 WHERE operation_kind IN ('CLOSE', 'ARCHIVE', 'DELETE')"); var current = f.transactions.execute(ignored -> f.store.claimOperation("tenant", f.session, first.operationId(), "server-2", Duration.ofSeconds(30)).orElseThrow()); assertThatThrownBy(() -> f.transactions.execute(ignored -> journal.renewWriter("tenant", f.session, token, renew))) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_lifecycle_claim_fenced")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_lifecycle_claim_fenced")); assertThatThrownBy(() -> f.transactions.execute(ignored -> journal.renewWriter("tenant", f.session, token, renew, WorkspaceLifecycleStore.authority(first)))) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_lifecycle_claim_fenced")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_lifecycle_claim_fenced")); var renewed = f.transactions.execute(ignored -> journal.renewWriter("tenant", f.session, token, renew, WorkspaceLifecycleStore.authority(current))); assertThat(renewed.writerGeneration()).isEqualTo(writer.writerGeneration()); @@ -116,7 +117,7 @@ class WorkspaceProfileLifecycleTest { assertThat(replacement.writerGeneration()).isGreaterThan(writer.writerGeneration()); assertThatThrownBy(() -> f.transactions.execute(ignored -> journal.renewWriter("tenant", f.session, token, renew, WorkspaceLifecycleStore.authority(current)))) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_writer_conflict")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_writer_conflict")); } @Test @@ -135,7 +136,7 @@ class WorkspaceProfileLifecycleTest { assertThatThrownBy(() -> f.transactions.execute(ignored -> journal.renewWriter("tenant", f.session, "w".repeat(32), new ManagedSessionStoreModels.RenewWriterRequest("workspace", "resident", writer.writerGeneration(), 60_000L), WorkspaceLifecycleStore.authority(operation)))) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_writer_conflict")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_writer_conflict")); } @ParameterizedTest @@ -153,19 +154,19 @@ class WorkspaceProfileLifecycleTest { new ManagedSessionStoreModels.SealWriterRequest("workspace", "original", original.writerGeneration()), authority)); var recovery = new ManagedSessionStoreModels.AcquireWriterRequest("workspace", "cleanup", 60_000L); assertThatThrownBy(() -> f.transactions.execute(ignored -> journal.acquireWriter("tenant", f.session, token, recovery))) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); assertThatThrownBy(() -> f.transactions.execute(ignored -> journal.acquireWriter("tenant", f.session, token, recovery, new RuntimeLifecycleAuthority(operation.operationId(), operation.claimGeneration() + 1)))) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); var next = f.transactions.execute(ignored -> journal.acquireWriter("tenant", f.session, token, recovery, authority)); assertThat(next.writerGeneration()).isEqualTo(original.writerGeneration() + 1); assertThat(next.journalRevision()).isEqualTo(original.journalRevision()); assertThatThrownBy(() -> f.transactions.execute(ignored -> journal.renewWriter("tenant", f.session, token, new ManagedSessionStoreModels.RenewWriterRequest("workspace", "original", original.writerGeneration(), 60_000L), authority))) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_writer_conflict")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("managed_session_writer_conflict")); assertThatThrownBy(() -> f.transactions.execute(ignored -> journal.renewWriter("tenant", f.session, token, new ManagedSessionStoreModels.RenewWriterRequest("workspace", "cleanup", next.writerGeneration(), 60_000L)))) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); } @ParameterizedTest @@ -192,7 +193,7 @@ class WorkspaceProfileLifecycleTest { var op = admit(f, WorkspaceToolProfiles.MCP, OperationKind.DELETE); assertThat(f.transactions.execute(ignored -> f.lifecycle.recoverEffects(op))).isNull(); assertThatThrownBy(() -> f.transactions.executeWithoutResult(ignored -> f.lifecycle.requireSettledExecutions(op))) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_close_execution_unsettled")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_close_execution_unsettled")); assertThat(f.jdbc.queryForObject("SELECT COUNT(*) FROM ma_session WHERE retired_at IS NOT NULL", Integer.class)).isZero(); } @@ -210,7 +211,7 @@ class WorkspaceProfileLifecycleTest { beans.getBeanProvider(ManagedToolResultStore.class)); assertThatThrownBy(() -> f.transactions.executeWithoutResult(ignored -> verifier.verifyResources(operation, java.util.List.of(binding), WorkspaceToolProfiles.SHELL))) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_lifecycle_resources_unsettled")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_lifecycle_resources_unsettled")); assertThat(f.store.requireSession("tenant", f.session).status()).isEqualTo("CLOSING"); } @@ -258,7 +259,7 @@ class WorkspaceProfileLifecycleTest { if (java.util.List.of("read_file", "write_file", "edit", "glob").contains(mode)) { verify.run(); } else { - assertThatThrownBy(verify::run).isInstanceOf(ApiException.class); + assertThatThrownBy(verify::run).isInstanceOf(ManagedAgentException.class); } } @@ -306,8 +307,8 @@ class WorkspaceProfileLifecycleTest { Runnable verifyPublications = () -> f.transactions.executeWithoutResult(ignored -> verifier.verifyPublications(operation)); Runnable verifyResources = () -> f.transactions.executeWithoutResult(ignored -> verifier.verifyResources(operation, java.util.List.of(publication.bindings.findById("binding-1")), WorkspaceToolProfiles.SHELL)); - assertThatThrownBy(verifyPublications::run).isInstanceOf(ApiException.class); - assertThatThrownBy(verifyResources::run).isInstanceOf(ApiException.class); + assertThatThrownBy(verifyPublications::run).isInstanceOf(ManagedAgentException.class); + assertThatThrownBy(verifyResources::run).isInstanceOf(ManagedAgentException.class); assertThat(publication.store.apply(publication.request("close_not_started"), PublicationJournalFixture.WRITER_TOKEN, null) .path("state").asText()).isEqualTo("NOT_STARTED"); assertThat(f.jdbc.queryForObject("SELECT producer_phase FROM ma_output_capture WHERE tenant_id = ?", String.class, "tenant-1")).isEqualTo("OPEN"); @@ -315,15 +316,15 @@ class WorkspaceProfileLifecycleTest { verifyResources.run(); for (String mutation : java.util.List.of("state = 'FENCED'", "producer_phase = 'FINISHING'", "quarantined = TRUE", "terminal_resource_id = 'unexpected'")) { f.jdbc.update("UPDATE ma_output_capture SET " + mutation + " WHERE tenant_id = ?", "tenant-1"); - assertThatThrownBy(verifyPublications::run).isInstanceOf(ApiException.class); - assertThatThrownBy(verifyResources::run).isInstanceOf(ApiException.class); + assertThatThrownBy(verifyPublications::run).isInstanceOf(ManagedAgentException.class); + assertThatThrownBy(verifyResources::run).isInstanceOf(ManagedAgentException.class); f.jdbc.update("UPDATE ma_output_capture SET state = 'NOT_STARTED', producer_phase = 'OPEN', quarantined = FALSE, terminal_resource_id = NULL WHERE tenant_id = ?", "tenant-1"); } var conflicting = publication.binding.deepCopy().put("runtimeBindingId", "other-binding"); f.jdbc.update("UPDATE ma_output_capture SET binding_json = ?, binding_digest = ? WHERE tenant_id = ?", conflicting.toString(), ToolPublicationContract.bindingDigest(conflicting), "tenant-1"); - assertThatThrownBy(verifyPublications::run).isInstanceOf(ApiException.class); - assertThatThrownBy(verifyResources::run).isInstanceOf(ApiException.class); + assertThatThrownBy(verifyPublications::run).isInstanceOf(ManagedAgentException.class); + assertThatThrownBy(verifyResources::run).isInstanceOf(ManagedAgentException.class); } @ParameterizedTest @@ -433,10 +434,10 @@ class WorkspaceProfileLifecycleTest { + " 'READY', 1024, 1024, 1024, 'REFERENCED', 'outcome', 1, 1)", "s".repeat(64), "t".repeat(64), f.session, "e".repeat(64), "b".repeat(64), "h".repeat(64)); f.jdbc.update("UPDATE ma_resource SET storage_kind = 'TOOL_PUBLICATION', inline_bytes = NULL WHERE resource_id = X'6f7574636f6d65'"); - assertThatThrownBy(() -> verifier.verifyPublications(operation)).isInstanceOf(ApiException.class); + assertThatThrownBy(() -> verifier.verifyPublications(operation)).isInstanceOf(ManagedAgentException.class); verify.run(); f.jdbc.update("UPDATE ma_output_capture SET quarantined = TRUE WHERE publication_id = X'7075622d31'"); - assertThatThrownBy(verify::run).isInstanceOf(ApiException.class); + assertThatThrownBy(verify::run).isInstanceOf(ManagedAgentException.class); return; } if ("missing_seal".equals(mode)) { @@ -444,16 +445,16 @@ class WorkspaceProfileLifecycleTest { f.jdbc.update("DELETE FROM ma_resource WHERE resource_id = ?", sealId); } if (java.util.List.of("wrong_identity", "missing_seal", "open", "receipt", "wrong_digest", "missing_input_digest", "invalid_input_digest").contains(mode)) { - assertThatThrownBy(verify::run).isInstanceOf(ApiException.class); + assertThatThrownBy(verify::run).isInstanceOf(ManagedAgentException.class); return; } verify.run(); f.jdbc.update("UPDATE ma_resource SET sha256 = ? WHERE resource_id = X'6d616e6966657374'", "0".repeat(64)); - assertThatThrownBy(verify::run).isInstanceOf(ApiException.class); + assertThatThrownBy(verify::run).isInstanceOf(ManagedAgentException.class); f.jdbc.update("UPDATE ma_resource SET sha256 = ? WHERE resource_id = X'6d616e6966657374'", manifestRef.path("digest").asText()); verify.run(); f.jdbc.update("DELETE FROM ma_resource WHERE resource_id = X'6d616e6966657374'"); - assertThatThrownBy(verify::run).isInstanceOf(ApiException.class); + assertThatThrownBy(verify::run).isInstanceOf(ManagedAgentException.class); } @ParameterizedTest @@ -538,10 +539,10 @@ class WorkspaceProfileLifecycleTest { f.transactions.executeWithoutResult(ignored -> verifier.verifyResources(operation, java.util.List.of(binding), WorkspaceToolProfiles.SHELL)); f.jdbc.update("DELETE FROM ma_resource WHERE resource_id = X'6d616e6966657374'"); assertThatThrownBy(() -> f.transactions.executeWithoutResult(ignored -> verifier.verifyResources(operation, - java.util.List.of(binding), WorkspaceToolProfiles.SHELL))).isInstanceOf(ApiException.class); + java.util.List.of(binding), WorkspaceToolProfiles.SHELL))).isInstanceOf(ManagedAgentException.class); if ("publication".equals(mode)) { f.jdbc.update("DELETE FROM ma_session_record WHERE domain = 'child_run'"); - assertThatThrownBy(() -> verifier.verifyPublications(operation)).isInstanceOf(ApiException.class); + assertThatThrownBy(() -> verifier.verifyPublications(operation)).isInstanceOf(ManagedAgentException.class); } } @@ -564,7 +565,7 @@ class WorkspaceProfileLifecycleTest { f.jdbc.update("UPDATE ma_session_journal_tx SET record_bytes = ?", records.getBytes(java.nio.charset.StandardCharsets.UTF_8)); if (activated) { assertThatThrownBy(() -> admit(f, WorkspaceToolProfiles.SHELL, OperationKind.CLOSE)) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("turn_active")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("turn_active")); } else { assertThat(admit(f, WorkspaceToolProfiles.SHELL, OperationKind.CLOSE)).isNotNull(); } @@ -585,7 +586,7 @@ class WorkspaceProfileLifecycleTest { WorkspaceLifecycleStore.authority(operation)); assertThat(resourcePhase).isEqualTo(resources); assertThatThrownBy(() -> records.hasNewLifecycleDispatch("tenant", f.session, bytes, ignored -> null, true, resourcePhase)) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_lifecycle_admission_closed")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_lifecycle_admission_closed")); } } @@ -602,10 +603,10 @@ class WorkspaceProfileLifecycleTest { @ValueSource(strings = {"hosted-workspace-shell/2", "hosted-workspace-mcp/2"}) void rejectsUnsupportedProfilesBeforeWritingAnOperation(String profile) { var f = fixture(); - assertThatThrownBy(() -> admit(f, profile, OperationKind.CLOSE)).isInstanceOf(ApiException.class); + assertThatThrownBy(() -> admit(f, profile, OperationKind.CLOSE)).isInstanceOf(ManagedAgentException.class); assertThatThrownBy(() -> f.transactions.execute(ignored -> f.store.beginWorkspaceLifecycle("tenant", f.session, OperationKind.CLOSE, "owner", "a".repeat(64), "legacy", "digest", true, 0))) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_unavailable")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_unavailable")); assertThat(f.jdbc.queryForObject("SELECT COUNT(*) FROM ma_operation", Integer.class)).isZero(); } @@ -631,7 +632,7 @@ class WorkspaceProfileLifecycleTest { f.transactions.execute(ignored -> journal.commit(request)); assertThat(admit(f, WorkspaceToolProfiles.SHELL, OperationKind.DELETE).lifecycleProtocolVersion()).isEqualTo(2); assertThatThrownBy(() -> f.transactions.execute(ignored -> journal.commit(request))) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("workspace_lifecycle_claim_fenced")); } } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceQueryScaleMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceQueryScaleMySqlIT.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceQueryScaleMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceQueryScaleMySqlIT.java index d3c553b1303..8651acc769f 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceQueryScaleMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceQueryScaleMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; @@ -79,7 +79,7 @@ class WorkspaceQueryScaleMySqlIT { jdbc.update("INSERT INTO ma_workspace (tenant_id, workspace_id, workspace_generation, storage_id, display_name, config_ref, policy_ref, state)" + " VALUES ('other-tenant', 'other-workspace', 1, 'other-storage', 'Workspace', 'config', 'policy', 'ACTIVE')"); var repository = new com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository(database.source(), - new com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector("test", new byte[32])); + new com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector("test", new byte[32])); var request = new com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest( new com.alibaba.qwen.code.runtimebroker.RuntimeScope("other-tenant", "other-workspace", "1", "/scale", "sha256:" + "a".repeat(64), "workspace"), null, "local-process", "other-storage"); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceRecoveryMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceRecoveryMySqlIT.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceRecoveryMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceRecoveryMySqlIT.java index ed75671a095..9fd8ef821bc 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceRecoveryMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceRecoveryMySqlIT.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceRecoveryReaderAssertions.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceRecoveryReaderAssertions.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceRecoveryReaderAssertions.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceRecoveryReaderAssertions.java index a713b1f7c8b..8b75dd32566 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceRecoveryReaderAssertions.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceRecoveryReaderAssertions.java @@ -1,5 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import org.springframework.jdbc.core.JdbcTemplate; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceRecoveryStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceRecoveryStoreTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceRecoveryStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceRecoveryStoreTest.java index c9679d406ee..dfe35ec0d6b 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceRecoveryStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceRecoveryStoreTest.java @@ -1,9 +1,10 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.catalog.AgentDefinitionExtensions; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.RuntimeBroker.WorkspaceMount; -import com.alibaba.qwen.code.managedagent.service.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceSchemaConsolidationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceSchemaConsolidationTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceSchemaConsolidationTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceSchemaConsolidationTest.java index e623d5c6a90..4e69ff69003 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceSchemaConsolidationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceSchemaConsolidationTest.java @@ -1,5 +1,6 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; +import com.alibaba.qwen.code.managedagent.model.StoreModels; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; @@ -211,7 +212,7 @@ class WorkspaceSchemaConsolidationTest { jdbc.batchUpdate("INSERT INTO ma_resource_ref (session_scope_key, owner_kind, owner_key, owner_revision, resource_key, tenant_id, workspace_id, session_id, journal_revision, resource_id, gmt_create) VALUES (?, ?, ?, 1, ?, 'tenant', 'root', 'session', ?, ?, " + ManagedSchemaTime.SQL_NOW + ")", roots); var catalog = new WorkspaceCsiCheckpointSnapshotStore(jdbc.getDataSource(), new com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository(jdbc.getDataSource(), - new com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector("test", new byte[32])), new ObjectMapper()); + new com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector("test", new byte[32])), new ObjectMapper()); var key = new ObjectMapper().createObjectNode().put("tenantId", "tenant").put("workspaceId", "root").put("sessionId", "session"); try (var connection = jdbc.getDataSource().getConnection()) { connection.setTransactionIsolation(java.sql.Connection.TRANSACTION_REPEATABLE_READ); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceStorageGuardTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceStorageGuardTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceStorageGuardTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceStorageGuardTest.java index 43ed19b0ffa..d7f00d01572 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceStorageGuardTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceStorageGuardTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.daemon.HarnessSessionRef; import com.alibaba.qwen.code.daemon.HostedHarnessCapabilities; @@ -6,7 +6,8 @@ import com.alibaba.qwen.code.daemon.HostedHarnessClient; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.RuntimeBroker.WorkspaceMount; import com.alibaba.qwen.code.managedagent.harness.QwenHostedHarnessConnector; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceTestStorage.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceTestStorage.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceTestStorage.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceTestStorage.java index a8e92c8f8ca..e30111edde4 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WorkspaceTestStorage.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/persistence/WorkspaceTestStorage.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.persistence; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WriterCredentialPolicyTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/security/WriterCredentialPolicyTest.java similarity index 87% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WriterCredentialPolicyTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/security/WriterCredentialPolicyTest.java index 18637c2ac52..5241e34ef45 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/store/WriterCredentialPolicyTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/security/WriterCredentialPolicyTest.java @@ -1,7 +1,7 @@ -package com.alibaba.qwen.code.managedagent.store; +package com.alibaba.qwen.code.managedagent.security; -import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -59,19 +59,19 @@ class WriterCredentialPolicyTest { token)).doesNotThrowAnyException(); assertThatThrownBy(() -> policy.require("tenant", "workspace", "session", "self-minted-token-self-minted-token-0")) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus().value()).isEqualTo(403); assertThat(error.getCode()) .isEqualTo("writer_credential_invalid"); }); assertThatThrownBy(() -> policy.require("tenant", "workspace", - "other", token)).isInstanceOf(ApiException.class); + "other", token)).isInstanceOf(ManagedAgentException.class); assertThatThrownBy(() -> policy.require("tenant", "other-workspace", - "session", token)).isInstanceOf(ApiException.class); + "session", token)).isInstanceOf(ManagedAgentException.class); assertThatThrownBy(() -> policy.require("other", "workspace", - "session", token)).isInstanceOf(ApiException.class); + "session", token)).isInstanceOf(ManagedAgentException.class); assertThatThrownBy(() -> policy.require("tenant", "workspace", - "session", null)).isInstanceOf(ApiException.class); + "session", null)).isInstanceOf(ManagedAgentException.class); } private static WriterCredentialPolicy policy(String key) { diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ActionResponseCoordinatorTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ActionResponseCoordinatorTest.java similarity index 89% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ActionResponseCoordinatorTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ActionResponseCoordinatorTest.java index 364b46576c3..a2eb2765842 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ActionResponseCoordinatorTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ActionResponseCoordinatorTest.java @@ -1,9 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.harness.UnavailableHarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ManagedActionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedActionStore; import org.junit.jupiter.api.Test; import java.time.Clock; @@ -35,7 +34,7 @@ class ActionResponseCoordinatorTest { } @org.junit.jupiter.api.Test void disabledHarnessDoesNotScanRenameDeliveries() { - var store = org.mockito.Mockito.mock(com.alibaba.qwen.code.managedagent.store.AgentStateStore.class); + var store = org.mockito.Mockito.mock(com.alibaba.qwen.code.managedagent.session.AgentStateStore.class); var executor = org.mockito.Mockito.mock(java.util.concurrent.ExecutorService.class); var coordinator = new SessionRenameCoordinator(store, new com.alibaba.qwen.code.managedagent.harness.UnavailableHarnessConnector(), diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/AdmittedTurnRetryTerminalStateTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/AdmittedTurnRetryTerminalStateTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/AdmittedTurnRetryTerminalStateTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/AdmittedTurnRetryTerminalStateTest.java index 1831b6a59ad..3b87226352e 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/AdmittedTurnRetryTerminalStateTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/AdmittedTurnRetryTerminalStateTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.daemon.DaemonHttpException; import com.alibaba.qwen.code.daemon.DaemonProtocolException; @@ -9,10 +9,10 @@ import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector.Attachment; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector.SourceEvent; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector.SourceStream; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.TurnRecord; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.TurnRecord; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ChildWorktreeGitVersionTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ChildWorktreeGitVersionTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ChildWorktreeGitVersionTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ChildWorktreeGitVersionTest.java index 3af0c061b8c..80f7f38380d 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ChildWorktreeGitVersionTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ChildWorktreeGitVersionTest.java @@ -1,5 +1,6 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; +import com.alibaba.qwen.code.managedagent.workspace.ChildWorktreeGit; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.DisabledOnOs; import org.junit.jupiter.api.condition.OS; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/CoordinatorTestSupport.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/CoordinatorTestSupport.java similarity index 94% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/CoordinatorTestSupport.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/CoordinatorTestSupport.java index 2cfd6339991..5dca0797af7 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/CoordinatorTestSupport.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/CoordinatorTestSupport.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/EventStreams.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/EventStreams.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/EventStreams.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/EventStreams.java index 4c08946ab49..e280fc86864 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/EventStreams.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/EventStreams.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/HarnessCoordinatorTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/HarnessCoordinatorTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/HarnessCoordinatorTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/HarnessCoordinatorTest.java index 876c1a235d3..8313208cb06 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/HarnessCoordinatorTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/HarnessCoordinatorTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.spi.ILoggingEvent; @@ -18,12 +18,12 @@ import com.alibaba.qwen.code.managedagent.harness.HarnessConnector.SourceStream; import com.alibaba.qwen.code.managedagent.harness.HarnessDisabledException; import com.alibaba.qwen.code.managedagent.harness.HostedHarnessRecoveryDeclinedException; import com.alibaba.qwen.code.managedagent.harness.UnavailableHarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.DispatchTarget; -import com.alibaba.qwen.code.managedagent.store.StoreModels.HarnessEvent; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.TurnRecord; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.model.StoreModels.DispatchTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.HarnessEvent; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.TurnRecord; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/Issue13181QueryBudgetTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/Issue13181QueryBudgetTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/Issue13181QueryBudgetTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/Issue13181QueryBudgetTest.java index 94aa193fe1b..374340310e0 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/Issue13181QueryBudgetTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/Issue13181QueryBudgetTest.java @@ -1,18 +1,19 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.managedagent.PublicationJournalFixture; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStoreModels; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.MaterializationTarget; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationDataStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationObjectStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationVerifier; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels.MaterializationTarget; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationDataStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationVerifier; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; @@ -1938,7 +1939,7 @@ class Issue13181QueryBudgetTest { Flyway.configure().dataSource(raw).locations("classpath:db/managed-schema").load().migrate(); ledger = new QueryLedger(raw); dataSource = ledger.dataSource(); - jdbc = new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource); + jdbc = new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource); manager = new DataSourceTransactionManager(dataSource); tx = new TransactionTemplate(manager); ManagedWorkspaceRegistry registry = diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentReplayOutageTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedAgentReplayOutageTest.java similarity index 85% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentReplayOutageTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedAgentReplayOutageTest.java index 384c078f33f..a921f1015c6 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentReplayOutageTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedAgentReplayOutageTest.java @@ -1,15 +1,16 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.api.ApiModels.CommandAdmission; -import com.alibaba.qwen.code.managedagent.api.ApiModels.InputBlock; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.harness.UnavailableHarnessConnector; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.Admission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.DispatchTarget; -import com.alibaba.qwen.code.managedagent.store.StoreModels.TurnRecord; +import com.alibaba.qwen.code.managedagent.model.ApiModels.CommandAdmission; +import com.alibaba.qwen.code.managedagent.model.ApiModels.InputBlock; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels.Admission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.DispatchTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.TurnRecord; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.fasterxml.jackson.databind.ObjectMapper; import org.h2.jdbcx.JdbcDataSource; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentServiceChildWorkspaceTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedAgentServiceChildWorkspaceTest.java similarity index 92% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentServiceChildWorkspaceTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedAgentServiceChildWorkspaceTest.java index d9a1f52c38b..d58d68cf9eb 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentServiceChildWorkspaceTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedAgentServiceChildWorkspaceTest.java @@ -1,9 +1,9 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.api.ApiException; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import org.junit.jupiter.api.BeforeEach; @@ -73,7 +73,7 @@ class ManagedAgentServiceChildWorkspaceTest { @Test void aRunWithoutAChildWorkspaceRefusesTheIsolatedCreation() { assertThatThrownBy(() -> service.createChildSession(TENANT, PARENT, RUN, "audit", "look", true)) - .isInstanceOfSatisfying(ApiException.class, + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("child_workspace_not_ready")); verify(store, never()).insertChildSessionCommand(anyString(), anyString(), anyString(), anyString(), anyString(), anyList(), any(), any(StoreModels.SessionLineage.class), anyString()); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentServiceWorkflowChildTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedAgentServiceWorkflowChildTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentServiceWorkflowChildTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedAgentServiceWorkflowChildTest.java index 3f67f3d4841..988828cba26 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentServiceWorkflowChildTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedAgentServiceWorkflowChildTest.java @@ -1,10 +1,10 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.daemon.SubmitHarnessTurn; -import com.alibaba.qwen.code.managedagent.api.ApiModels; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels; +import com.alibaba.qwen.code.managedagent.model.ApiModels; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import org.junit.jupiter.api.BeforeEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentSessionCapabilitiesTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedAgentSessionCapabilitiesTest.java similarity index 88% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentSessionCapabilitiesTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedAgentSessionCapabilitiesTest.java index 6bf6dc387cd..146e5885bf5 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentSessionCapabilitiesTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedAgentSessionCapabilitiesTest.java @@ -1,11 +1,12 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionPage; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; -import com.alibaba.qwen.code.managedagent.store.WorkspaceToolProfiles; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionPage; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceToolProfiles; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.CsiFilesRetirementProfile; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import org.junit.jupiter.params.ParameterizedTest; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentWorkspaceReplayTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedAgentWorkspaceReplayTest.java similarity index 95% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentWorkspaceReplayTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedAgentWorkspaceReplayTest.java index 8f58b7aa219..14f4d52eee4 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedAgentWorkspaceReplayTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedAgentWorkspaceReplayTest.java @@ -1,18 +1,19 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.InputBlock; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector.Attachment; import com.alibaba.qwen.code.managedagent.harness.UnavailableHarnessConnector; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedArtifactReader; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.DispatchTarget; -import com.alibaba.qwen.code.managedagent.store.StoreModels.TurnRecord; +import com.alibaba.qwen.code.managedagent.model.ApiModels.InputBlock; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels.DispatchTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.TurnRecord; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedArtifactReader; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract; @@ -212,14 +213,14 @@ class ManagedAgentWorkspaceReplayTest { transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.submitTurn(tenant, "actor-b", "submit", sessionId, input)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_unavailable"))); // ...and a fresh key keeps the honest refusal. transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.submitTurn(tenant, "actor-a", "submit-fresh", sessionId, input)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_unavailable"))); } @@ -382,7 +383,7 @@ class ManagedAgentWorkspaceReplayTest { private void assertNotFound(ThrowableAssert.ThrowingCallable call) { transaction.executeWithoutResult(status -> assertThatThrownBy(call) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()) .isEqualTo(HttpStatus.NOT_FOUND); assertThat(error.getCode()).isEqualTo("session_not_found"); @@ -458,14 +459,14 @@ class ManagedAgentWorkspaceReplayTest { transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.cancelTurn(tenant, "actor-b", "cancel", sessionId, turnId)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_unavailable"))); // ...and a fresh key keeps the honest refusal. transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.cancelTurn(tenant, "actor-a", "cancel-fresh", sessionId, turnId)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_unavailable"))); } @@ -518,13 +519,13 @@ class ManagedAgentWorkspaceReplayTest { transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.submitTurn(tenant, "actor-c", "submit-b", sessionId, input)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_unavailable"))); transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.renameSession(tenant, "actor-c", "rename-b", sessionId, "his title")) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_unavailable"))); } @@ -585,13 +586,13 @@ class ManagedAgentWorkspaceReplayTest { transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.renameSession(tenant, "actor-c", "rename-b", sessionId, "other title")) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("idempotency_conflict"))); transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.renameSession(tenant, "actor-r", "rename-b", sessionId, "his title")) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("session_operation_forbidden"))); } @@ -628,13 +629,13 @@ class ManagedAgentWorkspaceReplayTest { transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.submitTurn(tenant, "actor-r", "reader-live", sessionId, input)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo( "session_operation_forbidden"))); transaction.executeWithoutResult(status -> assertThatThrownBy(() -> service.submitTurn(tenant, "actor-c", "submit", sessionId, input)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_unavailable"))); jdbc.update("UPDATE ma_session SET status = 'DELETED'," @@ -706,7 +707,7 @@ class ManagedAgentWorkspaceReplayTest { () -> submitService.submitTurn(tenant, "actor-c", "submit-race", sessionId, input)); assertThat(submitAnswer).isInstanceOfSatisfying( - ApiException.class, error -> assertThat(error.getCode()) + ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_unavailable")); Object cancelAnswer = raceSecondCaller(threads, cancelGate, @@ -720,7 +721,7 @@ class ManagedAgentWorkspaceReplayTest { () -> cancelService.cancelTurn(tenant, "actor-c", "cancel-race", sessionId, racedTurn.get())); assertThat(cancelAnswer).isInstanceOfSatisfying( - ApiException.class, error -> assertThat(error.getCode()) + ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_unavailable")); // The rename twin: the in-store COMPLETED read-back arm must @@ -737,7 +738,7 @@ class ManagedAgentWorkspaceReplayTest { () -> renameService.renameSession(tenant, "actor-c", "rename-race", sessionId, "raced title")); assertThat(renameAnswer).isInstanceOfSatisfying( - ApiException.class, error -> assertThat(error.getCode()) + ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_unavailable")); } finally { submitGate.through.countDown(); @@ -780,7 +781,7 @@ class ManagedAgentWorkspaceReplayTest { () -> renameService.renameSession(tenant, "actor-c", "rename-race", sessionId, "raced title")); assertThat(answer).isInstanceOfSatisfying( - ApiException.class, error -> assertThat(error.getCode()) + ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("workspace_unavailable")); // The leaked claim never happened: the recorder's command is // still PENDING and its delivery never handed out an attempt. @@ -837,7 +838,7 @@ class ManagedAgentWorkspaceReplayTest { Future racerDone = threads.submit(() -> { try { return transaction.execute(status -> racer.get()); - } catch (ApiException error) { + } catch (ManagedAgentException error) { return error; } }); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedEventReplayTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedEventReplayTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedEventReplayTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedEventReplayTest.java index 61ba40b18fa..3ef36aaf62a 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedEventReplayTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedEventReplayTest.java @@ -1,10 +1,10 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.api.ApiModels.SessionResyncRequired; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellResyncRequired; import com.alibaba.qwen.code.managedagent.api.TenantContextFilter; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ReplayWindow; +import com.alibaba.qwen.code.managedagent.model.ApiModels.SessionResyncRequired; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellResyncRequired; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ReplayWindow; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedEventStreamServiceTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedEventStreamServiceTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedEventStreamServiceTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedEventStreamServiceTest.java index f676d20f169..bf3908c2cdd 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedEventStreamServiceTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedEventStreamServiceTest.java @@ -1,13 +1,12 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.WebShellEvent; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ReplayWindow; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.ApiModels.WebShellEvent; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ReplayWindow; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -44,7 +43,7 @@ class ManagedEventStreamServiceTest { ManagedAgentService agentService = new ManagedAgentService(store, null, null, null, mock(ManagedWorkspaceRegistry.class)); assertThatThrownBy(() -> agentService.streamEvents(SESSION, -1)) - .isInstanceOfSatisfying(ApiException.class, error -> { + .isInstanceOfSatisfying(ManagedAgentException.class, error -> { assertThat(error.getStatus()).isEqualTo(HttpStatus.BAD_REQUEST); assertThat(error.getCode()).isEqualTo("invalid_event_cursor"); }); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedInputAttachmentTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedInputAttachmentTest.java similarity index 92% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedInputAttachmentTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedInputAttachmentTest.java index d5f66e3665c..65d07e2bee2 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ManagedInputAttachmentTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ManagedInputAttachmentTest.java @@ -1,12 +1,13 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.InputBlock; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.model.ApiModels.InputBlock; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.fasterxml.jackson.databind.ObjectMapper; import org.h2.jdbcx.JdbcDataSource; @@ -70,7 +71,7 @@ class ManagedInputAttachmentTest { }); assertThatThrownBy(() -> service.createSession("tenant", "create", "qwen-code", null, null, null, List.of(new InputBlock("input_file", "different contents", "text/markdown", null, "notes 1.md")))) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("idempotency_conflict")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("idempotency_conflict")); } @Test @@ -126,14 +127,14 @@ class ManagedInputAttachmentTest { assertThatThrownBy(() -> service.createSession("tenant", "too-large", "qwen-code", null, null, null, List.of(new InputBlock("input_file", "界".repeat(ManagedInputAttachments.MAX_INPUT_BYTES / 3), "text/plain", null, "a.txt")))) - .isInstanceOfSatisfying(ApiException.class, error -> assertThat(error.getCode()).isEqualTo("input_too_large")); + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo("input_too_large")); } @ParameterizedTest @MethodSource("invalidBlocks") void refusesUnsupportedShapesBeforeAnyAdmission(InputBlock block) { assertThatThrownBy(() -> service.createSession("tenant", UUID.randomUUID().toString(), "qwen-code", - null, null, null, List.of(block))).isInstanceOf(ApiException.class); + null, null, null, List.of(block))).isInstanceOf(ManagedAgentException.class); } static Stream invalidBlocks() { diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/MessageProjectionGapHealTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/MessageProjectionGapHealTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/MessageProjectionGapHealTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/MessageProjectionGapHealTest.java index 97c3852864e..4b3f19ba10f 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/MessageProjectionGapHealTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/MessageProjectionGapHealTest.java @@ -1,15 +1,16 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.EventIdentity; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels; +import com.alibaba.qwen.code.managedagent.event.MessageMaterializer; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.persistence.EventIdentity; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/OperationReconcilerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/OperationReconcilerTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/OperationReconcilerTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/OperationReconcilerTest.java index b8b32739192..af23eb319d5 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/OperationReconcilerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/OperationReconcilerTest.java @@ -1,14 +1,13 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore.TaskTarget; -import com.alibaba.qwen.code.managedagent.store.StoreModels.AcceptanceVerdict; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ParkedOperation; +import com.alibaba.qwen.code.managedagent.model.StoreModels.AcceptanceVerdict; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ParkedOperation; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore.TaskTarget; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/OperationRetryTerminalStateTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/OperationRetryTerminalStateTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/OperationRetryTerminalStateTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/OperationRetryTerminalStateTest.java index ea36bb9d757..cb8a40c80bb 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/OperationRetryTerminalStateTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/OperationRetryTerminalStateTest.java @@ -1,20 +1,21 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.daemon.DaemonHttpException; import com.alibaba.qwen.code.daemon.DaemonProtocolException; import com.alibaba.qwen.code.daemon.HostedHarnessCapabilityMismatchException; import com.alibaba.qwen.code.daemon.HostedHarnessGenerationException; -import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore; -import com.alibaba.qwen.code.managedagent.store.ManagedActionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedActionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.workspace.ChildLifecycleAdmissions; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import com.fasterxml.jackson.databind.JsonNode; @@ -122,7 +123,7 @@ class OperationRetryTerminalStateTest { when(runtimeWarmer.supportsWorkspaceClose(BOUND_WORKSPACE)).thenReturn(true); when(harness.supportsLifecycle(TOOL_PROFILE)).thenReturn(true); coordinator.setWorkspaceLifecycleStore(mock( - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.class)); + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.class)); } try { coordinator.dispatch("tenant", "session", "op-close"); @@ -874,9 +875,9 @@ class OperationRetryTerminalStateTest { when(sessionStore.hasLiveWriter("tenant", "session")) .thenReturn(false); when(runtimeWarmer.supportsWorkspaceClose(BOUND_WORKSPACE)).thenReturn(true); - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore lifecycle = mock( - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.class); + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.class); // The settle's effects are already durable — saved by a previous // attempt — so the Harness did settle the lifecycle. when(lifecycle.recoverEffects(any(OperationRecord.class))) @@ -1002,9 +1003,9 @@ class OperationRetryTerminalStateTest { when(sessionStore.hasLiveWriter("tenant", "session")) .thenReturn(false); when(runtimeWarmer.supportsWorkspaceClose(BOUND_WORKSPACE)).thenReturn(true); - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore lifecycle = mock( - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.class); + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.class); when(harness.supportsLifecycle(TOOL_PROFILE)).thenReturn(true); // No durable receipt yet: the Harness is asked, and answers — then // the receipt write refuses. @@ -1013,7 +1014,7 @@ class OperationRetryTerminalStateTest { when(harness.settleLifecycle(any(OperationRecord.class))) .thenReturn(new ObjectMapper().createObjectNode() .put("settled", true)); - doThrow(com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore + doThrow(com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore .blocked("workspace_lifecycle_hooks_unsettled")) .when(lifecycle).saveEffects(any(OperationRecord.class), any(JsonNode.class)); @@ -1196,9 +1197,9 @@ class OperationRetryTerminalStateTest { when(runtimeWarmer.supportsWorkspaceClose(BOUND_WORKSPACE)).thenReturn(true); when(sessionStore.hasLiveWriter("tenant", "session")) .thenReturn(false); - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore lifecycle = mock( - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.class); + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.class); // No durable receipt, so the settle calls the Harness; the Harness // answered 200 but the receipt failed to decode — the client marks // it as answered. @@ -1270,9 +1271,9 @@ class OperationRetryTerminalStateTest { when(runtimeWarmer.supportsWorkspaceClose(BOUND_WORKSPACE)).thenReturn(true); when(sessionStore.hasLiveWriter("tenant", "session")) .thenReturn(false); - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore lifecycle = mock( - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.class); + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.class); // The store synthesized and persisted the receipt with zero Harness // contact — the Session was never booted there. when(lifecycle.recoverEffects(any())).thenReturn( @@ -1341,9 +1342,9 @@ class OperationRetryTerminalStateTest { when(runtimeWarmer.supportsWorkspaceClose(BOUND_WORKSPACE)).thenReturn(true); when(sessionStore.hasLiveWriter("tenant", "session")) .thenReturn(false); - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore lifecycle = mock( - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.class); + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.class); // The store synthesized and persisted the receipt from the journal // alone — no Harness contact — and it carries the store's own marker. when(lifecycle.recoverEffects(any())).thenReturn( @@ -1411,9 +1412,9 @@ class OperationRetryTerminalStateTest { when(runtimeWarmer.supportsWorkspaceClose(BOUND_WORKSPACE)).thenReturn(true); when(sessionStore.hasLiveWriter("tenant", "session")) .thenReturn(false); - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore lifecycle = mock( - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.class); + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.class); when(lifecycle.recoverEffects(any())).thenReturn( new ObjectMapper().createObjectNode() .put("storeSynthesized", true)); @@ -1573,7 +1574,7 @@ class OperationRetryTerminalStateTest { Clock.systemUTC(), new ManagedAgentProperties()); coordinator.setWorkspaceLifecycleStore(mock( - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.class)); + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.class)); try { coordinator.dispatch("tenant", "session", "op-close"); @@ -1639,7 +1640,7 @@ class OperationRetryTerminalStateTest { Clock.systemUTC(), new ManagedAgentProperties()); coordinator.setWorkspaceLifecycleStore(mock( - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.class)); + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.class)); try { coordinator.dispatch("tenant", "session", "op-close"); @@ -1697,7 +1698,7 @@ class OperationRetryTerminalStateTest { Clock.systemUTC(), new ManagedAgentProperties()); coordinator.setWorkspaceLifecycleStore(mock( - com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.class)); + com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.class)); try { coordinator.dispatch("tenant", "session", "op-close"); @@ -1739,7 +1740,7 @@ class OperationRetryTerminalStateTest { // The writer the retirement waits on is still live. when(sessionStore.hasLiveWriter("tenant", "session")) .thenReturn(true); - doThrow(new ApiException(HttpStatus.CONFLICT, + doThrow(new ManagedAgentException(HttpStatus.CONFLICT, "managed_session_writer_active", "Session deletion is waiting for its writer to stop.")) .when(store).completeOperation(eq("tenant"), eq("session"), diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/OwnerSubscriptionsTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/OwnerSubscriptionsTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/OwnerSubscriptionsTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/OwnerSubscriptionsTest.java index ccbabb5dbc7..be53a5e75f0 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/OwnerSubscriptionsTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/OwnerSubscriptionsTest.java @@ -1,8 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector.AttachedSession; -import com.alibaba.qwen.code.managedagent.store.TransportConsumerStore; +import com.alibaba.qwen.code.managedagent.persistence.TransportConsumerStore; import org.apache.rocketmq.client.apis.ClientException; import org.apache.rocketmq.client.apis.consumer.LitePushConsumer; import org.junit.jupiter.api.BeforeEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ReplayFloorAdvancerBacklogTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ReplayFloorAdvancerBacklogTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ReplayFloorAdvancerBacklogTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ReplayFloorAdvancerBacklogTest.java index 8cbb65a93ed..f9e396b56d1 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ReplayFloorAdvancerBacklogTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ReplayFloorAdvancerBacklogTest.java @@ -1,7 +1,7 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ReplayFloorAdvancerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ReplayFloorAdvancerTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ReplayFloorAdvancerTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ReplayFloorAdvancerTest.java index b8a30d181c2..f392ff0452f 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ReplayFloorAdvancerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ReplayFloorAdvancerTest.java @@ -1,9 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ReplayFloorTarget; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ReplayFloorTarget; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ReplayFloorRetractionTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ReplayFloorRetractionTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ReplayFloorRetractionTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ReplayFloorRetractionTest.java index 0affa620b5d..6ba811b603b 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ReplayFloorRetractionTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ReplayFloorRetractionTest.java @@ -1,7 +1,7 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.api.ApiModels.SessionResyncRequired; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.model.ApiModels.SessionResyncRequired; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ReplayFloorSchedulerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ReplayFloorSchedulerTest.java similarity index 93% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ReplayFloorSchedulerTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ReplayFloorSchedulerTest.java index 17303eeb2bc..b32e219a87a 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ReplayFloorSchedulerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ReplayFloorSchedulerTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import org.junit.jupiter.api.Test; import org.springframework.scheduling.annotation.Scheduled; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ResidentAcceptanceSnapshot.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ResidentAcceptanceSnapshot.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ResidentAcceptanceSnapshot.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ResidentAcceptanceSnapshot.java index 6eee975023d..44929651d88 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ResidentAcceptanceSnapshot.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/ResidentAcceptanceSnapshot.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.RuntimeBroker.ResidentWorkspace; import com.fasterxml.jackson.databind.JsonNode; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SessionEventHubPinningTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/SessionEventHubPinningTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SessionEventHubPinningTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/SessionEventHubPinningTest.java index 504a0272416..ba8747046f6 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SessionEventHubPinningTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/SessionEventHubPinningTest.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SessionEventHubTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/SessionEventHubTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SessionEventHubTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/SessionEventHubTest.java index ff04d5b7e1e..201ee89237f 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SessionEventHubTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/SessionEventHubTest.java @@ -1,6 +1,6 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.store.StoreModels.EventRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.EventRecord; import org.junit.jupiter.api.Test; import java.time.Duration; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SessionLifecycleCoordinatorTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/SessionLifecycleCoordinatorTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SessionLifecycleCoordinatorTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/SessionLifecycleCoordinatorTest.java index 31326822b1f..a8bfdaff1dd 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SessionLifecycleCoordinatorTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/SessionLifecycleCoordinatorTest.java @@ -1,17 +1,19 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; import com.alibaba.qwen.code.managedagent.harness.UnavailableHarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.workspace.ChildLifecycleAdmissions; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; @@ -53,12 +55,12 @@ class SessionLifecycleCoordinatorTest { "hosted-workspace-mcp/1,runtime_admission_closed,false" }) void onlyMcpIdentityFailureCanRecoverOriginalStoppedResources(String profile, String code, boolean recovery) throws Exception { - var store = Mockito.mock(com.alibaba.qwen.code.managedagent.store.AgentStateStore.class); + var store = Mockito.mock(com.alibaba.qwen.code.managedagent.session.AgentStateStore.class); var session = Mockito.mock(StoreModels.SessionRecord.class); Mockito.when(session.workspace()).thenReturn(Mockito.mock(com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding.class)); Mockito.when(session.toolProfile()).thenReturn(profile); Mockito.when(store.requireSession("tenant", "session")).thenReturn(session); - var lifecycle = Mockito.mock(com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.class); + var lifecycle = Mockito.mock(com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.class); var operation = new StoreModels.OperationRecord("tenant", "session", "operation", OperationKind.DELETE, "digest", "DELIVERING", "ACCEPTED", "DRAINING", "ACTIVE", "receipt", "server", 1, 1, null, 2); Mockito.when(lifecycle.recoverEffects(operation)).thenReturn(new ObjectMapper().createObjectNode().put("neverInitialized", false)); @@ -69,7 +71,7 @@ class SessionLifecycleCoordinatorTest { var warmer = Mockito.mock(RuntimeWarmer.class); Mockito.when(warmer.supportsWorkspaceClose()).thenReturn(true); Mockito.when(warmer.supportsWorkspaceClose(session.workspace())).thenReturn(true); - var authority = com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.authority(operation); + var authority = com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.authority(operation); Mockito.when(warmer.recoverStoppedWorkspaceResources("tenant", "session", authority)).thenReturn(CompletableFuture.completedFuture(null)); Mockito.when(warmer.closeWorkspace("tenant", "session")).thenReturn(CompletableFuture.completedFuture(null)); var relay = Mockito.mock(ChildResultRelayStore.class); @@ -106,7 +108,7 @@ class SessionLifecycleCoordinatorTest { @org.junit.jupiter.params.ParameterizedTest @org.junit.jupiter.params.provider.CsvSource({"0,true", "0,false", "1,true", "1,false"}) void settlesOnlyWhenTheSelectedBindingSupportsClose(int protocol, boolean supported) throws Exception { - var store = Mockito.mock(com.alibaba.qwen.code.managedagent.store.AgentStateStore.class); + var store = Mockito.mock(com.alibaba.qwen.code.managedagent.session.AgentStateStore.class); var session = Mockito.mock(StoreModels.SessionRecord.class); var workspace = new com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding( "tenant", "workspace", 1, "storage", ".", "config", 1); @@ -119,7 +121,7 @@ class SessionLifecycleCoordinatorTest { Mockito.when(warmer.closeWorkspace("tenant", "session")).thenReturn(CompletableFuture.completedFuture(null)); var operation = new StoreModels.OperationRecord("tenant", "session", "operation", OperationKind.CLOSE, "digest", "DELIVERING", "ACCEPTED", "DRAINING", "ACTIVE", "receipt", "server", 1, 1, null, protocol); - var lifecycle = Mockito.mock(com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore.class); + var lifecycle = Mockito.mock(com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore.class); Mockito.when(lifecycle.recoverEffects(operation)).thenReturn(new ObjectMapper().createObjectNode().put("neverInitialized", true)); var relay = Mockito.mock(ChildResultRelayStore.class); Mockito.when(relay.findLiveScopes("tenant", "session")).thenReturn(List.of()); @@ -151,7 +153,7 @@ class SessionLifecycleCoordinatorTest { com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException.class, failure -> assertThat(failure.getCode()).isEqualTo("workspace_close_identity_unverified")); } else { - assertThat(error.getCause()).isInstanceOfSatisfying(com.alibaba.qwen.code.managedagent.api.ApiException.class, + assertThat(error.getCause()).isInstanceOfSatisfying(com.alibaba.qwen.code.managedagent.exception.ManagedAgentException.class, failure -> assertThat(failure.getCode()).isEqualTo("workspace_close_identity_unverified")); } Mockito.verify(warmer, Mockito.never()).closeWorkspace(Mockito.anyString(), Mockito.anyString()); @@ -163,7 +165,7 @@ class SessionLifecycleCoordinatorTest { } private static ChildLifecycleAdmissions admissions( - com.alibaba.qwen.code.managedagent.store.AgentStateStore store, + com.alibaba.qwen.code.managedagent.session.AgentStateStore store, RuntimeWarmer warmer) { return new ChildLifecycleAdmissions(store, new RequestDigests(), warmer); @@ -310,7 +312,7 @@ class SessionLifecycleCoordinatorTest { var transactions = new TransactionTemplate(new DataSourceTransactionManager(world.jdbc.getDataSource())); assertThatThrownBy(() -> transactions.execute(ignored -> world.store.beginWorkspaceLifecycle( "tenant", world.child, OperationKind.CLOSE, "child:" + world.session, "actor", "spoof", "digest", true))) - .isInstanceOf(com.alibaba.qwen.code.managedagent.api.ApiException.class); + .isInstanceOf(com.alibaba.qwen.code.managedagent.exception.ManagedAgentException.class); world.jdbc.update("DELETE FROM ma_workspace_access WHERE tenant_id = ?", "tenant"); var admitted = transactions.execute(ignored -> world.store.beginChildClose("tenant", world.session, world.child, "run-1", "actor", "child-close-run-1", "digest", true)); @@ -320,7 +322,7 @@ class SessionLifecycleCoordinatorTest { world.child, "run-1", "actor", "child-close-run-1", "digest", true)).replayed()).isTrue(); assertThatThrownBy(() -> transactions.execute(ignored -> world.store.beginChildClose("tenant", world.session, world.child, "wrong-run", "actor", "spoof", "digest", true))) - .isInstanceOf(com.alibaba.qwen.code.managedagent.api.ApiException.class); + .isInstanceOf(com.alibaba.qwen.code.managedagent.exception.ManagedAgentException.class); } // #14387: a Turn parked by the recovery-blocked mark is evidence, not @@ -381,8 +383,8 @@ class SessionLifecycleCoordinatorTest { + " 'workspace', ?, 'child_run', 'run-1', 'h', 1," + " 'res-run-1', '" + taskKind + "', 'running', 'session'," + " 'planned', 1)", - com.alibaba.qwen.code.managedagent.store.ManagedSessionStore.sessionScopeKey("tenant", session), - com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection.recordKey(session, "child_run", "run-1"), session); + com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore.sessionScopeKey("tenant", session), + com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection.recordKey(session, "child_run", "run-1"), session); byte[] bytes = resourceBody.getBytes(StandardCharsets.UTF_8); jdbc.update("INSERT INTO ma_resource" + " (resource_key, session_scope_key, tenant_id, workspace_id," @@ -392,9 +394,9 @@ class SessionLifecycleCoordinatorTest { + " VALUES (?, ?, 'tenant', 'workspace', ?," + " 'res-run-1', 'managed-input', 1, ?," + " '" + "b".repeat(64) + "', 'MYSQL_INLINE', ?, 'command', 'REFERENCED', " + ManagedSchemaTime.SQL_NOW + ")", - com.alibaba.qwen.code.managedagent.store.ManagedSessionStore.resourceKey( - com.alibaba.qwen.code.managedagent.store.ManagedSessionStore.sessionScopeKey("tenant", session), "res-run-1"), - com.alibaba.qwen.code.managedagent.store.ManagedSessionStore.sessionScopeKey("tenant", session), session, bytes.length, bytes); + com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore.resourceKey( + com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore.sessionScopeKey("tenant", session), "res-run-1"), + com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore.sessionScopeKey("tenant", session), session, bytes.length, bytes); } private String childCloseOperation(World world) { @@ -650,8 +652,8 @@ class SessionLifecycleCoordinatorTest { + " VALUES (?, ?, 'tenant'," + " 'workspace', ?, 'team_state', 'team-1', 'h', 2," + " 'res-team-1', 1)", - com.alibaba.qwen.code.managedagent.store.ManagedSessionStore.sessionScopeKey("tenant", world.session), - com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection.recordKey(world.session, "team_state", "team-1"), world.session); + com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore.sessionScopeKey("tenant", world.session), + com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection.recordKey(world.session, "team_state", "team-1"), world.session); var harness = new CascadingHarness(true, false); try (var executor = Executors.newSingleThreadExecutor()) { var coordinator = new SessionLifecycleCoordinator(world.store, @@ -693,7 +695,7 @@ class SessionLifecycleCoordinatorTest { world.jdbc.update("UPDATE ma_session SET status =" + " 'CLOSED' WHERE session_id = ?", world.child); } - var workspaces = new com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore( + var workspaces = new com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore( world.jdbc, new DataSourceTransactionManager( world.jdbc.getDataSource())); if (!"shared".equals(start)) { @@ -1673,8 +1675,8 @@ class SessionLifecycleCoordinatorTest { + " VALUES (?, ?, 'tenant', 'workspace', ?," + " 'session_message', 'msg_1:message', 'h', 1," + " 'res-msg-1', 1)", - com.alibaba.qwen.code.managedagent.store.ManagedSessionStore.sessionScopeKey("tenant", world.child), - com.alibaba.qwen.code.managedagent.store.ManagedExtensionProjection.recordKey(world.child, "session_message", "msg_1:message"), + com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore.sessionScopeKey("tenant", world.child), + com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionProjection.recordKey(world.child, "session_message", "msg_1:message"), world.child); byte[] journal = ("{\"subtype\":\"managed_session_event_v1\"," + "\"managedSession\":{\"kind\":\"input.accepted\"," diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SessionLifecycleProtocolChoiceTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/SessionLifecycleProtocolChoiceTest.java similarity index 91% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SessionLifecycleProtocolChoiceTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/SessionLifecycleProtocolChoiceTest.java index 50d00876d6e..f62fb0df730 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SessionLifecycleProtocolChoiceTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/SessionLifecycleProtocolChoiceTest.java @@ -1,10 +1,11 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationAdmission; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationAdmission; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SessionLifecycleServiceResumeTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/SessionLifecycleServiceResumeTest.java similarity index 94% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SessionLifecycleServiceResumeTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/SessionLifecycleServiceResumeTest.java index 1f009cc6fb1..798ffb6f524 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SessionLifecycleServiceResumeTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/SessionLifecycleServiceResumeTest.java @@ -1,14 +1,16 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -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.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.WorkspaceLifecycleStore; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.RequestDigests; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceLifecycleStore; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; @@ -165,7 +167,7 @@ class SessionLifecycleServiceResumeTest { // is still refused by the open-operation barrier. assertThatThrownBy(() -> service.admitPublic(TENANT, "owner", "delete-3", sessionId, OperationKind.DELETE)) - .isInstanceOfSatisfying(ApiException.class, error -> + .isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()) .isEqualTo("session_operation_active")); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SessionMessageRelayTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/SessionMessageRelayTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SessionMessageRelayTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/SessionMessageRelayTest.java index 53685fcd713..c588e61f06e 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SessionMessageRelayTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/SessionMessageRelayTest.java @@ -1,12 +1,12 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.daemon.DaemonHttpException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore; -import com.alibaba.qwen.code.managedagent.store.SessionMessageRelayStore; -import com.alibaba.qwen.code.managedagent.store.SessionMessageRelayStore.Lineage; -import com.alibaba.qwen.code.managedagent.store.SessionMessageRelayStore.MessageRow; -import com.alibaba.qwen.code.managedagent.store.SessionMessageRelayStore.PendingMessage; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore; +import com.alibaba.qwen.code.managedagent.persistence.SessionMessageRelayStore; +import com.alibaba.qwen.code.managedagent.persistence.SessionMessageRelayStore.Lineage; +import com.alibaba.qwen.code.managedagent.persistence.SessionMessageRelayStore.MessageRow; +import com.alibaba.qwen.code.managedagent.persistence.SessionMessageRelayStore.PendingMessage; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/TaskCancelCoordinatorTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/TaskCancelCoordinatorTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/TaskCancelCoordinatorTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/TaskCancelCoordinatorTest.java index 06e73e27a52..c98dc2b5ec0 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/TaskCancelCoordinatorTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/TaskCancelCoordinatorTest.java @@ -1,19 +1,18 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore.TaskCancelOutcome; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore; -import com.alibaba.qwen.code.managedagent.store.ManagedExtensionRecordStore.TaskTarget; -import com.alibaba.qwen.code.managedagent.store.StoreModels.AcceptanceVerdict; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationKind; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ParkedOperation; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.model.StoreModels.AcceptanceVerdict; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationKind; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ParkedOperation; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedExtensionRecordStore.TaskTarget; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore.TaskCancelOutcome; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.AfterEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WakeRecoveryTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/WakeRecoveryTest.java similarity index 95% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WakeRecoveryTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/WakeRecoveryTest.java index 10310f26f0f..de13e1d90a2 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WakeRecoveryTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/WakeRecoveryTest.java @@ -1,10 +1,10 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore; -import com.alibaba.qwen.code.managedagent.store.WakeRecoveryStore; -import com.alibaba.qwen.code.managedagent.store.WakeRecoveryStore.Candidate; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore; +import com.alibaba.qwen.code.managedagent.persistence.WakeRecoveryStore; +import com.alibaba.qwen.code.managedagent.persistence.WakeRecoveryStore.Candidate; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRecoveryTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/WorkspaceRecoveryTest.java similarity index 79% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRecoveryTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/WorkspaceRecoveryTest.java index 68393c09256..a48a103202c 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRecoveryTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/session/WorkspaceRecoveryTest.java @@ -1,7 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.session; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.workspace.runtime.WorkspaceRecoveryContract; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ChildResultRelayTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/ChildResultRelayTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ChildResultRelayTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/ChildResultRelayTest.java index 5ae480dd3f7..e499669b4e9 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ChildResultRelayTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/ChildResultRelayTest.java @@ -1,15 +1,16 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace; import com.alibaba.qwen.code.daemon.DaemonHttpException; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.ApiModels.CommandAdmission; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.alibaba.qwen.code.managedagent.harness.HarnessConnector; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore.PendingChild; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore.RelayRow; -import com.alibaba.qwen.code.managedagent.store.ChildResultRelayStore.TurnLine; -import com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore; +import com.alibaba.qwen.code.managedagent.model.ApiModels.CommandAdmission; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore.PendingChild; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore.RelayRow; +import com.alibaba.qwen.code.managedagent.persistence.ChildResultRelayStore.TurnLine; +import com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; import com.fasterxml.jackson.databind.ObjectMapper; @@ -1836,8 +1837,8 @@ class ChildResultRelayTest { row.updatedAt(), row.workspaceMode()); } - private static ApiException refusal(String code) { - return new ApiException(org.springframework.http.HttpStatus.CONFLICT, + private static ManagedAgentException refusal(String code) { + return new ManagedAgentException(org.springframework.http.HttpStatus.CONFLICT, code, code); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ChildWorkspaceServiceTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/ChildWorkspaceServiceTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ChildWorkspaceServiceTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/ChildWorkspaceServiceTest.java index 7ccf57b3c56..1c0c8414c65 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ChildWorkspaceServiceTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/ChildWorkspaceServiceTest.java @@ -1,13 +1,13 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace; -import com.alibaba.qwen.code.managedagent.api.ApiException; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; -import com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore; -import com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore.Row; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceToolProfiles; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels; +import com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore; +import com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore.Row; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.session.ManagedAgentService; +import com.alibaba.qwen.code.managedagent.workspace.runtime.RuntimeWarmer; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; @@ -39,7 +39,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; -import static com.alibaba.qwen.code.managedagent.service.ChildWorktreeGitTest.plain; +import static com.alibaba.qwen.code.managedagent.workspace.ChildWorktreeGitTest.plain; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assumptions.assumeTrue; @@ -1290,7 +1290,7 @@ class ChildWorkspaceServiceTest { private StoreModels.SessionRecord createSession(String cwd) { String tenant = "tenant-" + UUID.randomUUID(); tenants.add(tenant); - com.alibaba.qwen.code.managedagent.store.WorkspaceTestStorage.register(jdbc, tenant, "storage"); + com.alibaba.qwen.code.managedagent.persistence.WorkspaceTestStorage.register(jdbc, tenant, "storage"); jdbc.update("INSERT INTO ma_workspace (tenant_id, workspace_id, workspace_generation," + " storage_id, display_name, config_ref, policy_ref, state) VALUES (?, 'workspace', 1," + " 'storage', 'Workspace', ?, ?, 'ACTIVE')", tenant, WorkspaceExecutionProfile.CONFIG_REF, @@ -1362,11 +1362,11 @@ class ChildWorkspaceServiceTest { } private static String storageKey(ContextBinding binding) throws Exception { - return com.alibaba.qwen.code.managedagent.store.WorkspaceTestStorage.key(binding.getTenantId(), binding.getStorageId()); + return com.alibaba.qwen.code.managedagent.persistence.WorkspaceTestStorage.key(binding.getTenantId(), binding.getStorageId()); } private static void assertApi(Runnable call, String code) { - assertThatThrownBy(call::run).isInstanceOfSatisfying(ApiException.class, + assertThatThrownBy(call::run).isInstanceOfSatisfying(ManagedAgentException.class, error -> assertThat(error.getCode()).isEqualTo(code)); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ChildWorktreeGitTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/ChildWorktreeGitTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ChildWorktreeGitTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/ChildWorktreeGitTest.java index 1e421e3b43c..ec0313671d4 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ChildWorktreeGitTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/ChildWorktreeGitTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SshWorkspaceServiceTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/SshWorkspaceServiceTest.java similarity index 93% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SshWorkspaceServiceTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/SshWorkspaceServiceTest.java index c6e0db64071..3cad4987142 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/SshWorkspaceServiceTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/SshWorkspaceServiceTest.java @@ -1,14 +1,14 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace; -import com.alibaba.qwen.code.managedagent.api.ApiException; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.config.SshRuntimeSettings; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.SshWorkspaceStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.AcceptanceVerdict; -import com.alibaba.qwen.code.managedagent.store.StoreModels.ParkedOperation; -import com.alibaba.qwen.code.runtimebroker.SshConnectionManager; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; +import com.alibaba.qwen.code.managedagent.model.StoreModels.AcceptanceVerdict; +import com.alibaba.qwen.code.managedagent.model.StoreModels.ParkedOperation; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.SshWorkspaceStore; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; +import com.alibaba.qwen.code.runtimebroker.provisioning.SshConnectionManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.jdbc.datasource.DataSourceTransactionManager; @@ -52,12 +52,12 @@ class SshWorkspaceServiceTest { try (var service = new SshWorkspaceService(properties, store, connections)) { assertThat(service.list("tenant", "actor").supported()).isFalse(); assertThatThrownBy(() -> service.check("tenant", "actor", "mac", "/work/project")) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); properties.getRuntimeBroker().getSsh().setEnabled(true); assertThat(service.list("tenant", "actor").data()).hasSize(1); assertThat(service.list("tenant", "other").data()).isEmpty(); assertThatThrownBy(() -> service.create("tenant", "other", "mac", "/work/project", "Project", "key")) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); } } @@ -96,10 +96,10 @@ class SshWorkspaceServiceTest { assertThat(service.create("tenant", "actor", "mac", "/work/project", "Project", "key").operationId()) .isEqualTo(operation.operationId()); assertThatThrownBy(() -> service.create("tenant", "actor", "mac", "/other", "Project", "key")) - .isInstanceOf(ApiException.class).hasMessageContaining("another request"); + .isInstanceOf(ManagedAgentException.class).hasMessageContaining("another request"); assertThatThrownBy(() -> service.create("tenant", "actor", "mac", "/work/project", "Project", "new-key")) - .isInstanceOf(ApiException.class); - assertThatThrownBy(() -> service.get("tenant", "other", operationId)).isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); + assertThatThrownBy(() -> service.get("tenant", "other", operationId)).isInstanceOf(ManagedAgentException.class); } } @@ -109,7 +109,7 @@ class SshWorkspaceServiceTest { when(connections.bootstrap(any(), any())).thenReturn(Map.of("qwenVersion", "old")); try (var service = new SshWorkspaceService(properties, store, connections)) { assertThatThrownBy(() -> service.check("tenant", "actor", "mac", "/work/project")) - .isInstanceOf(ApiException.class).hasMessageContaining("pinned version"); + .isInstanceOf(ManagedAgentException.class).hasMessageContaining("pinned version"); } } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/WorkspaceSelectionTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/WorkspaceSelectionTest.java similarity index 77% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/WorkspaceSelectionTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/WorkspaceSelectionTest.java index bf4852a0458..743ced2a939 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/api/WorkspaceSelectionTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/WorkspaceSelectionTest.java @@ -1,5 +1,6 @@ -package com.alibaba.qwen.code.managedagent.api; +package com.alibaba.qwen.code.managedagent.workspace; +import com.alibaba.qwen.code.managedagent.exception.ManagedAgentException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; @@ -31,29 +32,29 @@ class WorkspaceSelectionTest { assertThat(new WorkspaceSelection("ws-a", "😀".repeat(1024)) .cwdRelative()).hasSize(2048); assertThatThrownBy(() -> new WorkspaceSelection("ws-a", "../etc")) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); for (String path : new String[] {"😀".repeat(1025), "a\u0085b", "a" + Character.MIN_HIGH_SURROGATE}) { assertThatThrownBy(() -> new WorkspaceSelection("ws-a", path)) - .isInstanceOf(ApiException.class) - .extracting(error -> ((ApiException) error).getCode()) + .isInstanceOf(ManagedAgentException.class) + .extracting(error -> ((ManagedAgentException) error).getCode()) .isEqualTo("invalid_cwd"); } assertThatThrownBy(() -> new WorkspaceSelection("", ".")) - .isInstanceOf(ApiException.class); + .isInstanceOf(ManagedAgentException.class); assertThat(new WorkspaceSelection("a".repeat(128), ".").workspaceId()) .hasSize(128); for (String id : new String[] {"ws-😀", "ws a", "ws/../x", "ws\0a", "a".repeat(129), "ws-\uD800", "ws-\uDC00", "ws-\uD800x", "ws-\uD800\uD800\uDC00"}) { assertThatThrownBy(() -> new WorkspaceSelection(id, ".")) - .isInstanceOf(ApiException.class) - .extracting(error -> ((ApiException) error).getCode()) + .isInstanceOf(ManagedAgentException.class) + .extracting(error -> ((ManagedAgentException) error).getCode()) .isEqualTo("invalid_request"); JsonNode object = mapper.createObjectNode().put("workspace_id", id); assertThatThrownBy(() -> WorkspaceSelection.parse(object, - false)).isInstanceOf(ApiException.class); + false)).isInstanceOf(ManagedAgentException.class); } } @@ -67,8 +68,8 @@ class WorkspaceSelectionTest { "{\"workspace_id\":\"ws-a\",\"root\":\"/tmp\"}" }) { assertThatThrownBy(() -> parse(json, false)) - .isInstanceOf(ApiException.class) - .extracting(error -> ((ApiException) error).getCode()) + .isInstanceOf(ManagedAgentException.class) + .extracting(error -> ((ManagedAgentException) error).getCode()) .isEqualTo("invalid_request"); } } @@ -83,14 +84,14 @@ class WorkspaceSelectionTest { mapper.createObjectNode().put("workspace_id", "ws-a") .put("cwd_relative", path)); assertThatThrownBy(() -> parse(json, false)) - .isInstanceOf(ApiException.class) - .extracting(error -> ((ApiException) error).getCode()) + .isInstanceOf(ManagedAgentException.class) + .extracting(error -> ((ManagedAgentException) error).getCode()) .isEqualTo("invalid_cwd"); } assertThatThrownBy(() -> parse(""" {"workspace_id":"ws-a","cwd_relative":null} - """, false)).isInstanceOf(ApiException.class) - .extracting(error -> ((ApiException) error).getCode()) + """, false)).isInstanceOf(ManagedAgentException.class) + .extracting(error -> ((ManagedAgentException) error).getCode()) .isEqualTo("invalid_cwd"); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/HostedWorkspaceRecoveryWorkerIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/HostedWorkspaceRecoveryWorkerIT.java similarity index 91% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/HostedWorkspaceRecoveryWorkerIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/HostedWorkspaceRecoveryWorkerIT.java index f0c13d73418..86662dd97cf 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/HostedWorkspaceRecoveryWorkerIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/HostedWorkspaceRecoveryWorkerIT.java @@ -1,9 +1,16 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; import com.alibaba.qwen.code.runtimebroker.*; +import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; +import com.alibaba.qwen.code.runtimebroker.RuntimeRecoveryEvidence; +import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; +import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalRebootTestSupport; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; import org.junit.jupiter.api.io.TempDir; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ResidentHostedRuntimeFixture.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/ResidentHostedRuntimeFixture.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ResidentHostedRuntimeFixture.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/ResidentHostedRuntimeFixture.java index 7613cd6f0c7..fb71be64ebe 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ResidentHostedRuntimeFixture.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/ResidentHostedRuntimeFixture.java @@ -1,15 +1,13 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.AgentStateStore; -import com.alibaba.qwen.code.managedagent.store.ResidentWorkspaces; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationDataStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiReservationStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; -import com.alibaba.qwen.code.runtimebroker.HttpRuntimeTransport; +import com.alibaba.qwen.code.managedagent.persistence.ResidentWorkspaces; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationDataStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiReservationStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.session.AgentStateStore; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; -import com.alibaba.qwen.code.runtimebroker.LocalProcessRuntimeProvisioner; import com.alibaba.qwen.code.runtimebroker.ResidentWorkspaceProfile; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; @@ -23,6 +21,8 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeResourceHandle; import com.alibaba.qwen.code.runtimebroker.RuntimeScope; import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRepository; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ResidentWorkspaceProvisionerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/ResidentWorkspaceProvisionerTest.java similarity index 94% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ResidentWorkspaceProvisionerTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/ResidentWorkspaceProvisionerTest.java index b62521a768b..0f84117c75e 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/ResidentWorkspaceProvisionerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/ResidentWorkspaceProvisionerTest.java @@ -1,14 +1,13 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ResidentWorkspaces; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiRegistration; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ResidentWorkspaces; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiRegistration; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; import com.alibaba.qwen.code.runtimebroker.InMemoryRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.InMemoryToolExecutionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; -import com.alibaba.qwen.code.runtimebroker.KubernetesHttpRuntimeClient; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.RuntimeLease; import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; @@ -16,6 +15,7 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; import com.alibaba.qwen.code.runtimebroker.RuntimeScope; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.provisioning.KubernetesHttpRuntimeClient; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/RuntimeRecoveryCoordinatorTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/RuntimeRecoveryCoordinatorTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/RuntimeRecoveryCoordinatorTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/RuntimeRecoveryCoordinatorTest.java index d79e211c149..8b178802997 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/RuntimeRecoveryCoordinatorTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/RuntimeRecoveryCoordinatorTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/RuntimeRetentionJobTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/RuntimeRetentionJobTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/RuntimeRetentionJobTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/RuntimeRetentionJobTest.java index eae1d91fdbf..28c7e9f2bce 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/RuntimeRetentionJobTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/RuntimeRetentionJobTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.config.RuntimeRetentionConfiguration; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiResourceGuardTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiResourceGuardTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiResourceGuardTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiResourceGuardTest.java index 2c62ab08e79..5dbfbc7dd89 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiResourceGuardTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiResourceGuardTest.java @@ -1,8 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiRegistration; -import com.alibaba.qwen.code.runtimebroker.KubernetesRuntimeClient; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiRegistration; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.provisioning.KubernetesRuntimeClient; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiRuntimeIdentityTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiRuntimeIdentityTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiRuntimeIdentityTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiRuntimeIdentityTest.java index 36529ebf682..e1c43bd6415 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiRuntimeIdentityTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiRuntimeIdentityTest.java @@ -1,12 +1,9 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiRegistration; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiReservationStore; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiRegistration; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiReservationStore; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; -import com.alibaba.qwen.code.runtimebroker.KubernetesRuntimeClient; -import com.alibaba.qwen.code.runtimebroker.ManagedCsiProtocol; import com.alibaba.qwen.code.runtimebroker.RuntimeAttestation; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; @@ -20,6 +17,9 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeTransport; import com.alibaba.qwen.code.runtimebroker.WorkspaceCsiRuntimeIdentity; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; +import com.alibaba.qwen.code.runtimebroker.provisioning.KubernetesRuntimeClient; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedCsiProtocol; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; @@ -124,10 +124,10 @@ class WorkspaceCsiRuntimeIdentityTest { WorkspaceCsiRuntimeIdentity.verify(original); assertThat(WorkspaceCsiRuntimeIdentity.expectedPod(original).get("uid")).isEqualTo(UID); assertThat(WorkspaceCsiRuntimeIdentity.boot(original).get("version")).isEqualTo(3); - com.alibaba.qwen.code.managedagent.service.WorkspaceCsiRuntimeIdentity.verify(original); - assertThat(com.alibaba.qwen.code.managedagent.service.WorkspaceCsiRuntimeIdentity.expectedPod(original)) + com.alibaba.qwen.code.managedagent.workspace.runtime.WorkspaceCsiRuntimeIdentity.verify(original); + assertThat(com.alibaba.qwen.code.managedagent.workspace.runtime.WorkspaceCsiRuntimeIdentity.expectedPod(original)) .isEqualTo(WorkspaceCsiRuntimeIdentity.expectedPod(original)); - assertThat(com.alibaba.qwen.code.managedagent.service.WorkspaceCsiRuntimeIdentity.boot(original)) + assertThat(com.alibaba.qwen.code.managedagent.workspace.runtime.WorkspaceCsiRuntimeIdentity.boot(original)) .isEqualTo(WorkspaceCsiRuntimeIdentity.boot(original)); assertThat(new String(WorkspaceCsiRuntimeIdentity.bytes(handle.getValue()), StandardCharsets.UTF_8)) .doesNotContain(original.getProvisionSeed().getToken()); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiRuntimeProvisionerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiRuntimeProvisionerTest.java similarity index 93% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiRuntimeProvisionerTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiRuntimeProvisionerTest.java index 2157d257f16..8027e8d4168 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceCsiRuntimeProvisionerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceCsiRuntimeProvisionerTest.java @@ -1,10 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiRegistration; -import com.alibaba.qwen.code.managedagent.store.WorkspaceCsiReservationStore; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; -import com.alibaba.qwen.code.runtimebroker.HttpRuntimeTransport; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiRegistration; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceCsiReservationStore; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; @@ -14,6 +12,8 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; import com.alibaba.qwen.code.runtimebroker.RuntimeScope; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRecoveryCommandTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRecoveryCommandTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRecoveryCommandTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRecoveryCommandTest.java index d1117ea66ba..c432bd4022a 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRecoveryCommandTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRecoveryCommandTest.java @@ -1,4 +1,4 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRecoveryContract.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRecoveryContract.java similarity index 93% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRecoveryContract.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRecoveryContract.java index 44ed7a8e7ef..ee8a5758fca 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRecoveryContract.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRecoveryContract.java @@ -1,11 +1,26 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceOperatorRecoveryStore; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceOperatorRecoveryStore; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.*; +import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; +import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; +import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; +import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeLease; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeRecoveryEvidence; +import com.alibaba.qwen.code.runtimebroker.RuntimeResourceHandle; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.RuntimeSession; +import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; +import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; +import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import org.springframework.jdbc.core.JdbcTemplate; import javax.sql.DataSource; @@ -213,7 +228,7 @@ public final class WorkspaceRecoveryContract { // names the original storage. Its live claim survives the later // registry change; that change cannot authorize a new child. // Unique per run: the contract may run twice against one database. - var childStore = new com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore(jdbc, + var childStore = new com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore(jdbc, new org.springframework.jdbc.datasource.DataSourceTransactionManager(source)); var admitted = childStore.admit(fixture.tenant, fixture.session.sessionId(), UUID.randomUUID().toString(), fixture.session.workspace(), System.currentTimeMillis()); @@ -310,7 +325,7 @@ public final class WorkspaceRecoveryContract { bindings = new JdbcRuntimeBindingRepository(source, new AesGcmSecretProtector("test", new byte[32])); sessions = new JdbcRuntimeSessionRepository(source); executions = new JdbcToolExecutionRepository(source); - com.alibaba.qwen.code.managedagent.store.WorkspaceTestStorage.register(jdbc, tenant, "storage"); + com.alibaba.qwen.code.managedagent.persistence.WorkspaceTestStorage.register(jdbc, tenant, "storage"); jdbc.update("INSERT INTO ma_workspace (tenant_id, workspace_id, workspace_generation," + " storage_id, display_name, config_ref, policy_ref, state) VALUES (?, 'workspace', 1, 'storage'," + " 'Workspace', ?, ?, 'ACTIVE')", tenant, WorkspaceExecutionProfile.CONFIG_REF, WorkspaceExecutionProfile.POLICY_REF); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeInstallProbeTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeInstallProbeTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeInstallProbeTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeInstallProbeTest.java index 039067d3b41..2cc4ced3a79 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeInstallProbeTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeInstallProbeTest.java @@ -1,8 +1,8 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeResolutionPivotTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeResolutionPivotTest.java similarity index 91% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeResolutionPivotTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeResolutionPivotTest.java index c5698f8daa0..32d7869de0d 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeResolutionPivotTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeResolutionPivotTest.java @@ -1,12 +1,12 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate; -import com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry; -import com.alibaba.qwen.code.managedagent.store.StoreModels.OperationRecord; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.model.StoreModels.OperationRecord; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate; +import com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeTest.java index 5b25a232bb0..2a7c85bea7c 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeTest.java @@ -1,15 +1,13 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; -import com.alibaba.qwen.code.managedagent.api.WorkspaceSelection; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties.RuntimeBroker.WorkspaceMount; -import com.alibaba.qwen.code.managedagent.store.ManagedAgentStore; -import com.alibaba.qwen.code.managedagent.store.StoreModels.SessionRecord; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceOperatorRecoveryStore; -import com.alibaba.qwen.code.managedagent.store.WorkspaceStorageGuard; -import com.alibaba.qwen.code.runtimebroker.AesGcmSecretProtector; -import com.alibaba.qwen.code.runtimebroker.HttpRuntimeTransport; +import com.alibaba.qwen.code.managedagent.model.StoreModels.SessionRecord; +import com.alibaba.qwen.code.managedagent.persistence.ManagedAgentStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceOperatorRecoveryStore; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageGuard; +import com.alibaba.qwen.code.managedagent.workspace.WorkspaceSelection; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; @@ -29,6 +27,8 @@ import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -459,7 +459,7 @@ class WorkspaceRuntimeTest { void authorizationRefusesAnUnverifiedPhysicalMount() { SessionRecord session = createSession("storage", "."); WorkspaceStorageGuard guard = mock(WorkspaceStorageGuard.class); - var checked = new WorkspaceExecutionStore(new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource), + var checked = new WorkspaceExecutionStore(new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource), new DataSourceTransactionManager(dataSource), guard); doThrow(WorkspaceExecutionStore.unavailable()).when(guard).verify(session.workspace()); assertUnavailable(() -> checked.authorize(session)); @@ -570,7 +570,7 @@ class WorkspaceRuntimeTest { var binding = session.workspace(); RuntimeSessionRecord first = holder(session, "first"); RuntimeSessionRecord second = holder(session, "second"); - var otherClient = new WorkspaceExecutionStore(new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource), new DataSourceTransactionManager(dataSource)); + var otherClient = new WorkspaceExecutionStore(new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource), new DataSourceTransactionManager(dataSource)); CyclicBarrier start = new CyclicBarrier(2); try (var pool = Executors.newFixedThreadPool(2)) { var one = pool.submit(() -> contend(authority, binding, first, start)); @@ -951,7 +951,7 @@ class WorkspaceRuntimeTest { var runtimeSession = fixture.record().getSession(); authority.claim(session.workspace(), fixture.record()); WorkspaceStorageGuard guard = mock(WorkspaceStorageGuard.class); - var checked = new WorkspaceExecutionStore(new com.alibaba.qwen.code.managedagent.store.ManagedSchemaJdbcTemplate(dataSource), + var checked = new WorkspaceExecutionStore(new com.alibaba.qwen.code.managedagent.persistence.ManagedSchemaJdbcTemplate(dataSource), new DataSourceTransactionManager(dataSource), guard); doThrow(WorkspaceExecutionStore.unavailable()).when(guard).verify(session.workspace()); var transport = new WorkspaceRuntimeTransport(fixture.http(), resolver(session, temp.toRealPath()), @@ -959,7 +959,7 @@ class WorkspaceRuntimeTest { assertUnavailable(() -> transport.control(fixture.lease(), runtimeSession, mcpControl(session, "mcp-configure"))); verify(fixture.http(), never()).control(any(), any(), any()); jdbc.update("DELETE FROM ma_workspace_access WHERE tenant_id = ?", session.tenantId()); - String storageKey = com.alibaba.qwen.code.managedagent.store.WorkspaceTestStorage.key(session.tenantId(), session.workspace().getStorageId()); + String storageKey = com.alibaba.qwen.code.managedagent.persistence.WorkspaceTestStorage.key(session.tenantId(), session.workspace().getStorageId()); var originalHolder = jdbc.queryForMap("SELECT " + ManagedSchemaProjection.STORAGE_OWNER.columns() + " FROM ma_storage_owner WHERE storage_key = ?", storageKey); when(fixture.http().control(any(), any(), any())).thenReturn(CompletableFuture.completedFuture(Map.of("state", "settled"))); for (String kind : List.of("mcp-status", "mcp-cancel", "mcp-release")) { @@ -1039,7 +1039,7 @@ class WorkspaceRuntimeTest { var closeProperties = new ManagedAgentProperties(); closeProperties.getHarness().setWorkspaceFilesEnabled(true); var closeStore = new ManagedAgentStore(jdbc, new ObjectMapper(), java.time.Clock.systemUTC(), ignored -> {}, - new com.alibaba.qwen.code.managedagent.store.ManagedWorkspaceRegistry(jdbc), closeProperties); + new com.alibaba.qwen.code.managedagent.persistence.ManagedWorkspaceRegistry(jdbc), closeProperties); new TransactionTemplate(new DataSourceTransactionManager(dataSource)).execute(status -> { var admittedClose = closeStore.beginWorkspaceClose(session.tenantId(), session.sessionId(), "actor", "actor", "close", "digest", true); return closeStore.claimOperation(session.tenantId(), session.sessionId(), admittedClose.operation().operationId(), @@ -1206,7 +1206,7 @@ class WorkspaceRuntimeTest { void childWorkspaceMaintenanceAndToolTurnsExcludeEachOther() throws Exception { SessionRecord session = createSession("storage", "."); RuntimeSessionRecord turn = holder(session, UUID.randomUUID().toString()); - var childStore = new com.alibaba.qwen.code.managedagent.store.ChildWorkspaceStore(jdbc, + var childStore = new com.alibaba.qwen.code.managedagent.persistence.ChildWorkspaceStore(jdbc, new DataSourceTransactionManager(dataSource)); var child = childStore.admit(session.tenantId(), session.sessionId(), "run", session.workspace(), System.currentTimeMillis()); var claimed = childStore.claim(child, "worker", System.currentTimeMillis(), 60_000); @@ -1263,7 +1263,7 @@ class WorkspaceRuntimeTest { private SessionRecord createSession(String storage, String cwd) { String tenant = "tenant-" + UUID.randomUUID(); - com.alibaba.qwen.code.managedagent.store.WorkspaceTestStorage.register(jdbc, tenant, storage); + com.alibaba.qwen.code.managedagent.persistence.WorkspaceTestStorage.register(jdbc, tenant, storage); jdbc.update("INSERT INTO ma_workspace (tenant_id, workspace_id, workspace_generation," + " storage_id, display_name, config_ref, policy_ref, state) VALUES (?, 'workspace', 1, ?," + " 'Workspace', ?, ?, 'ACTIVE')", tenant, storage, WorkspaceExecutionProfile.CONFIG_REF, WorkspaceExecutionProfile.POLICY_REF); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeTransportTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeTransportTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeTransportTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeTransportTest.java index a043f6a1f0d..bb26accff24 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/service/WorkspaceRuntimeTransportTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/managedagent/workspace/runtime/WorkspaceRuntimeTransportTest.java @@ -1,8 +1,6 @@ -package com.alibaba.qwen.code.managedagent.service; +package com.alibaba.qwen.code.managedagent.workspace.runtime; -import com.alibaba.qwen.code.managedagent.store.WorkspaceExecutionStore; -import com.alibaba.qwen.code.runtimebroker.HttpRuntimeTransport; -import com.alibaba.qwen.code.runtimebroker.ManagedCsiProtocol; +import com.alibaba.qwen.code.managedagent.persistence.WorkspaceExecutionStore; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; @@ -17,6 +15,8 @@ import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRepository; import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedCsiProtocol; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/BrokerProcess.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/BrokerProcess.java index 8a9671bb7f7..714f40ac38f 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/BrokerProcess.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/BrokerProcess.java @@ -2,6 +2,8 @@ package com.alibaba.qwen.code.runtimebroker; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; +import com.alibaba.qwen.code.runtimebroker.provisioning.FaultGateBroker; + import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ContextInstallationFaultGateTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ContextInstallationFaultGateTest.java index e32d4ac4745..fab8fe514ac 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ContextInstallationFaultGateTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ContextInstallationFaultGateTest.java @@ -1,15 +1,15 @@ package com.alibaba.qwen.code.runtimebroker; -import static com.alibaba.qwen.code.runtimebroker.FaultGateRig.HARNESS; -import static com.alibaba.qwen.code.runtimebroker.FaultGateRig.SESSION; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -18,12 +18,14 @@ import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; + +import static com.alibaba.qwen.code.runtimebroker.FaultGateRig.HARNESS; +import static com.alibaba.qwen.code.runtimebroker.FaultGateRig.SESSION; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * FG5: faults around W0c context installation. Every Broker places the diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/CsiNativeReadContinuationProofTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/CsiNativeReadContinuationProofTest.java index 2ccc6979116..c1dcd676c1b 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/CsiNativeReadContinuationProofTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/CsiNativeReadContinuationProofTest.java @@ -1,14 +1,12 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; - import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.transport.CsiNativeReadbackProtocol; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; +import org.junit.jupiter.api.Test; + import java.io.IOException; import java.util.Base64; import java.util.HashMap; @@ -16,7 +14,11 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; class CsiNativeReadContinuationProofTest { private static final ObjectMapper JSON = new ObjectMapper(); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/CsiNativeToolReservationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/CsiNativeToolReservationTest.java index 2a5d12e1ef1..f193bb74bd4 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/CsiNativeToolReservationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/CsiNativeToolReservationTest.java @@ -1,11 +1,7 @@ package com.alibaba.qwen.code.runtimebroker; +import com.alibaba.qwen.code.runtimebroker.managedschema.JdbcRuntimeBrokerSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -23,6 +19,10 @@ import java.util.Map; import java.util.Set; import java.util.UUID; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + /** Tuple-validation units only; the supplied prefix does not prove native SQL admission. */ class CsiNativeToolReservationTest { private static final ObjectMapper JSON = new ObjectMapper(); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/CsiRetirementSealTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/CsiRetirementSealTest.java index 973cec2a8eb..ed9af62ff3f 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/CsiRetirementSealTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/CsiRetirementSealTest.java @@ -1,16 +1,18 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.jupiter.api.Test; import java.net.URI; import java.time.Duration; import java.time.Instant; import java.util.Map; import java.util.UUID; -import org.h2.jdbcx.JdbcDataSource; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; class CsiRetirementSealTest { @Test diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/DelegatingBindingRepository.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/DelegatingBindingRepository.java index 0390f49cdf8..12e39ed330d 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/DelegatingBindingRepository.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/DelegatingBindingRepository.java @@ -8,10 +8,10 @@ import java.util.List; * double only overrides the calls it instruments. New interface methods land * here once instead of in every double. */ -abstract class DelegatingBindingRepository implements RuntimeBindingRepository { +public abstract class DelegatingBindingRepository implements RuntimeBindingRepository { protected final RuntimeBindingRepository delegate; - DelegatingBindingRepository(RuntimeBindingRepository delegate) { + public DelegatingBindingRepository(RuntimeBindingRepository delegate) { this.delegate = delegate; } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/DispatchAuthorizationEvidenceTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/DispatchAuthorizationEvidenceTest.java index 5e2ddae3786..283ab9c081b 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/DispatchAuthorizationEvidenceTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/DispatchAuthorizationEvidenceTest.java @@ -1,11 +1,10 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Proxy; @@ -15,10 +14,13 @@ import java.time.Instant; import java.util.Map; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; -import org.h2.jdbcx.JdbcDataSource; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class DispatchAuthorizationEvidenceTest { @ParameterizedTest diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/DriverManagerDataSource.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/DriverManagerDataSource.java index 80b3d3a626f..484d55eeb75 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/DriverManagerDataSource.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/DriverManagerDataSource.java @@ -1,19 +1,20 @@ package com.alibaba.qwen.code.runtimebroker; +import javax.sql.DataSource; + import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.logging.Logger; -import javax.sql.DataSource; -final class DriverManagerDataSource implements DataSource { +public final class DriverManagerDataSource implements DataSource { private final String url; private final String user; private final String password; - DriverManagerDataSource(String url, String user, String password) { + public DriverManagerDataSource(String url, String user, String password) { this.url = url; this.user = user; this.password = password; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ExecutionTakeoverContract.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ExecutionTakeoverContract.java index 6d0e447c5f0..bbee57139d2 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ExecutionTakeoverContract.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ExecutionTakeoverContract.java @@ -1,6 +1,6 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.*; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedHoldFamily; import java.time.Duration; import java.time.Instant; @@ -10,6 +10,8 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import static org.junit.jupiter.api.Assertions.*; + final class ExecutionTakeoverContract { private ExecutionTakeoverContract() { } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FakeAttestationWorkerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FakeAttestationWorkerTest.java index b0f074d734d..830ea1384b2 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FakeAttestationWorkerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FakeAttestationWorkerTest.java @@ -1,14 +1,11 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assumptions.assumeTrue; - +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisionerTest; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; +import org.junit.jupiter.api.Test; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -23,7 +20,12 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assumptions.assumeTrue; /** * Pins the fake worker that the provisioner tests start to both closed boot diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FakeKubernetesRuntimeClient.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FakeKubernetesRuntimeClient.java index 2fa60cde2bd..69fe580a319 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FakeKubernetesRuntimeClient.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FakeKubernetesRuntimeClient.java @@ -1,6 +1,8 @@ package com.alibaba.qwen.code.runtimebroker; import com.alibaba.fastjson2.JSON; +import com.alibaba.qwen.code.runtimebroker.provisioning.KubernetesRuntimeClient; + import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -8,14 +10,14 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.function.Consumer; -final class FakeKubernetesRuntimeClient implements KubernetesRuntimeClient { - final Map> objects = new LinkedHashMap<>(); - int reads; - int creates; - String loseCreateReply; - String podIp = "10.42.0.8"; - RuntimeBrokerException readFailure; - Consumer> podCreated = ignored -> { }; +public final class FakeKubernetesRuntimeClient implements KubernetesRuntimeClient { + public final Map> objects = new LinkedHashMap<>(); + public int reads; + public int creates; + public String loseCreateReply; + public String podIp = "10.42.0.8"; + public RuntimeBrokerException readFailure; + public Consumer> podCreated = ignored -> { }; @Override public synchronized CompletionStage> get(String resource, String namespace, String name) { @@ -57,12 +59,12 @@ final class FakeKubernetesRuntimeClient implements KubernetesRuntimeClient { return CompletableFuture.completedFuture(object); } - Map object(String resource) { + public Map object(String resource) { return objects.entrySet().stream().filter(entry -> entry.getKey().startsWith(resource + "/")) .map(Map.Entry::getValue).findFirst().orElseThrow(); } - void remove(String resource) { + public void remove(String resource) { objects.keySet().removeIf(key -> key.startsWith(resource + "/")); } @@ -75,7 +77,7 @@ final class FakeKubernetesRuntimeClient implements KubernetesRuntimeClient { } @SuppressWarnings("unchecked") - static Map map(Object value) { + public static Map map(Object value) { return (Map) value; } } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FaultGateControlTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FaultGateControlTest.java index b2c819e67c9..91b9a8dd68b 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FaultGateControlTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FaultGateControlTest.java @@ -1,18 +1,20 @@ package com.alibaba.qwen.code.runtimebroker; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + import static com.alibaba.qwen.code.runtimebroker.FaultGateRig.HARNESS; import static com.alibaba.qwen.code.runtimebroker.FaultGateRig.SESSION; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; - /** FG1: the rig itself, proven by a run with no fault injected. */ @Tag("fault-gate") class FaultGateControlTest { diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FaultGateRig.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FaultGateRig.java index 7a233497ac2..2cc18e1f206 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FaultGateRig.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FaultGateRig.java @@ -2,6 +2,12 @@ package com.alibaba.qwen.code.runtimebroker; import com.alibaba.fastjson2.JSON; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import org.h2.tools.Server; + +import javax.sql.DataSource; + import java.io.IOException; import java.io.UncheckedIOException; import java.nio.charset.StandardCharsets; @@ -28,8 +34,6 @@ import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.function.Predicate; import java.util.function.Supplier; -import javax.sql.DataSource; -import org.h2.tools.Server; /** * The multi-process rig behind the Stage F fault gates (FG1). A gate starts diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FaultGateTransport.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FaultGateTransport.java index ea675d45de0..d45a587944f 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FaultGateTransport.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FaultGateTransport.java @@ -1,6 +1,8 @@ package com.alibaba.qwen.code.runtimebroker; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; + import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.UUID; @@ -17,17 +19,17 @@ import java.util.concurrent.CompletionStage; * Release closes provider admission before that gate. These calls use * {@link HttpRuntimeTransport}, with its receipt checks. */ -final class FaultGateTransport implements RuntimeTransport { +public final class FaultGateTransport implements RuntimeTransport { private final HttpRuntimeTransport runtime; private final ContextBinding context; private final RuntimeBindingRepository bindings; private final RuntimeSessionRepository sessions; - FaultGateTransport(HttpRuntimeTransport runtime) { + public FaultGateTransport(HttpRuntimeTransport runtime) { this(runtime, null, null, null); } - FaultGateTransport(HttpRuntimeTransport runtime, ContextBinding context, + public FaultGateTransport(HttpRuntimeTransport runtime, ContextBinding context, RuntimeBindingRepository bindings, RuntimeSessionRepository sessions) { this.runtime = runtime; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/Issue13183AdversarialTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/Issue13183AdversarialTest.java index 8868e145d8d..89e77ba2a79 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/Issue13183AdversarialTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/Issue13183AdversarialTest.java @@ -1,20 +1,21 @@ package com.alibaba.qwen.code.runtimebroker; -import static com.alibaba.qwen.code.runtimebroker.Issue13183RegressionTest.SCOPE; -import static com.alibaba.qwen.code.runtimebroker.Issue13183RegressionTest.dataSource; -import static com.alibaba.qwen.code.runtimebroker.Issue13183RegressionTest.protector; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; - import com.alibaba.qwen.code.runtimebroker.Issue13183RegressionTest.AttestingTransport; import com.alibaba.qwen.code.runtimebroker.Issue13183RegressionTest.ReclaimProvisioner; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisionerTest; +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocolTest; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import org.junit.jupiter.api.Test; + +import javax.sql.DataSource; + import java.net.URI; import java.nio.file.Files; import java.nio.file.Path; -import java.util.List; import java.time.Duration; import java.time.Instant; +import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -26,9 +27,13 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; -import javax.sql.DataSource; -import org.junit.jupiter.api.Test; +import static com.alibaba.qwen.code.runtimebroker.Issue13183RegressionTest.SCOPE; +import static com.alibaba.qwen.code.runtimebroker.Issue13183RegressionTest.dataSource; +import static com.alibaba.qwen.code.runtimebroker.Issue13183RegressionTest.protector; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; /** * Adversarial stress: two independent repository stacks over one database diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/Issue13183RegressionTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/Issue13183RegressionTest.java index 6863389a67f..88f615b64b1 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/Issue13183RegressionTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/Issue13183RegressionTest.java @@ -1,12 +1,19 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assumptions.assumeTrue; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisionerTest; +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocolTest; +import com.alibaba.qwen.code.runtimebroker.provisioning.StaticRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.security.SecretProtector; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import com.alibaba.qwen.code.runtimebroker.transport.RuntimeBrokerHttpServer; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledOnOs; +import org.junit.jupiter.api.condition.OS; + +import javax.sql.DataSource; import java.io.IOException; import java.net.InetAddress; @@ -42,11 +49,14 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.IntStream; -import javax.sql.DataSource; -import org.h2.jdbcx.JdbcDataSource; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.DisabledOnOs; -import org.junit.jupiter.api.condition.OS; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assumptions.assumeTrue; /** * Regression coverage for the code-audit findings of issue #13183: the diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcCsiBindingControlTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcCsiBindingControlTest.java index 7a55ed1e8c4..8ad8c36cbf5 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcCsiBindingControlTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcCsiBindingControlTest.java @@ -1,19 +1,22 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; - +import com.alibaba.qwen.code.runtimebroker.managedschema.JdbcRuntimeBrokerSchema; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import org.h2.jdbcx.JdbcDataSource; import org.junit.jupiter.api.Test; + import java.sql.Connection; import java.time.Duration; import java.time.Instant; import java.util.List; import java.util.UUID; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + class JdbcCsiBindingControlTest { private static final String SESSION = "2815c6b8-468c-449a-869a-8794b0d52fca"; private static final String ALIAS = "ec77f5fe1b4225e8f8203d59b5858eb235f9155261c440efaa02efd5513bd2df"; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcPhysicalStorageReleaseTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcPhysicalStorageReleaseTest.java index 47c0568bdf3..fd82eda26e8 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcPhysicalStorageReleaseTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcPhysicalStorageReleaseTest.java @@ -1,16 +1,13 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; - import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; - +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; import org.h2.jdbcx.JdbcDataSource; import org.junit.jupiter.api.Test; +import javax.sql.DataSource; + import java.net.URI; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; @@ -20,7 +17,10 @@ import java.util.HexFormat; import java.util.Map; import java.util.UUID; -import javax.sql.DataSource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; class JdbcPhysicalStorageReleaseTest { @Test diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcPlacementGuardTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcPlacementGuardTest.java index 0bdc251e495..321ccab0a0f 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcPlacementGuardTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcPlacementGuardTest.java @@ -1,10 +1,14 @@ package com.alibaba.qwen.code.runtimebroker; +import com.alibaba.qwen.code.runtimebroker.managedschema.JdbcRuntimeBrokerSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.security.ProtectedSecret; +import com.alibaba.qwen.code.runtimebroker.security.SecretProtector; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; +import javax.sql.DataSource; import java.net.URI; import java.sql.Connection; @@ -15,9 +19,10 @@ import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; -import javax.sql.DataSource; -import org.h2.jdbcx.JdbcDataSource; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; class JdbcPlacementGuardTest { @Test diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcRepositoryContract.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcRepositoryContract.java index 00ba1f7d737..314070d65b3 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcRepositoryContract.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcRepositoryContract.java @@ -1,12 +1,9 @@ package com.alibaba.qwen.code.runtimebroker; -import static com.alibaba.qwen.code.runtimebroker.ToolExecutionRecordFixtures.withIdentity; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.security.SecretProtector; + +import javax.sql.DataSource; import java.math.BigDecimal; import java.net.URI; @@ -29,7 +26,14 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; -import javax.sql.DataSource; + +import static com.alibaba.qwen.code.runtimebroker.ToolExecutionRecordFixtures.withIdentity; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Contract for the JDBC repositories. It is public so that diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcRepositorySupportTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcRepositorySupportTest.java index d5de7c64c8a..526a1b6aecf 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcRepositorySupportTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcRepositorySupportTest.java @@ -1,15 +1,17 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocolTest; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.jupiter.api.Test; import java.sql.Connection; import java.time.Duration; import java.time.Instant; import java.util.UUID; -import org.h2.jdbcx.JdbcDataSource; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class JdbcRepositorySupportTest { @Test diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcRuntimeBrokerMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcRuntimeBrokerMySqlIT.java index 6ec941ac145..05b0e9d7d9b 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcRuntimeBrokerMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcRuntimeBrokerMySqlIT.java @@ -1,13 +1,10 @@ package com.alibaba.qwen.code.runtimebroker; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import javax.sql.DataSource; import java.net.URI; import java.sql.Connection; @@ -23,8 +20,13 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import javax.sql.DataSource; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class JdbcRuntimeBrokerMySqlIT { @Test diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcRuntimeRetentionTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcRuntimeRetentionTest.java index 3e3cad2b1b0..159ff825164 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcRuntimeRetentionTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/JdbcRuntimeRetentionTest.java @@ -1,14 +1,12 @@ package com.alibaba.qwen.code.runtimebroker; +import com.alibaba.qwen.code.runtimebroker.managedschema.JdbcRuntimeBrokerSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertInstanceOf; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import javax.sql.DataSource; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Proxy; @@ -25,16 +23,21 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; -import java.util.concurrent.CountDownLatch; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.CompletionStage; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import javax.sql.DataSource; -import org.h2.jdbcx.JdbcDataSource; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class JdbcRuntimeRetentionTest { private static final Instant OLD = Instant.parse("2000-01-01T00:00:00Z"); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/KubernetesRuntimeWorkerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/KubernetesRuntimeWorkerTest.java index dc46de69894..4646ef16c30 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/KubernetesRuntimeWorkerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/KubernetesRuntimeWorkerTest.java @@ -1,10 +1,11 @@ package com.alibaba.qwen.code.runtimebroker; -import static com.alibaba.qwen.code.runtimebroker.FakeKubernetesRuntimeClient.map; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import com.alibaba.qwen.code.runtimebroker.provisioning.KubernetesRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.provisioning.KubernetesRuntimeProvisionerTest; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfSystemProperty; +import org.junit.jupiter.api.io.TempDir; import java.net.Inet4Address; import java.net.NetworkInterface; @@ -19,9 +20,12 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.CompletionStage; import java.util.concurrent.TimeUnit; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.EnabledIfSystemProperty; -import org.junit.jupiter.api.io.TempDir; + +import static com.alibaba.qwen.code.runtimebroker.FakeKubernetesRuntimeClient.map; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** Opt-in protocol integration: fake scheduler observations, real Broker and bundled worker. */ @EnabledIfSystemProperty(named = "qwen.kubernetes.worker-test", matches = "true") diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/LostResponseFaultGateTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/LostResponseFaultGateTest.java index 877978c0006..c56acbb4399 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/LostResponseFaultGateTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/LostResponseFaultGateTest.java @@ -1,18 +1,9 @@ package com.alibaba.qwen.code.runtimebroker; -import static com.alibaba.qwen.code.runtimebroker.FaultGateRig.HARNESS; -import static com.alibaba.qwen.code.runtimebroker.FaultGateRig.SESSION; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; -import java.time.Duration; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; @@ -21,6 +12,18 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.ValueSource; +import java.time.Duration; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import static com.alibaba.qwen.code.runtimebroker.FaultGateRig.HARNESS; +import static com.alibaba.qwen.code.runtimebroker.FaultGateRig.SESSION; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + /** * FG2: the worker answered, and the answer never reached the Broker. Every * case checks that the side effect ran at most once, that nothing reported a diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedContextRecoveryTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedContextRecoveryTest.java index 6f3b0b91ac1..eeea1c271d6 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedContextRecoveryTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedContextRecoveryTest.java @@ -1,13 +1,17 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocol; +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocolTest; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.security.SecretProtector; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; import com.sun.net.httpserver.HttpServer; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.jupiter.api.Test; + +import javax.sql.DataSource; + import java.net.InetSocketAddress; import java.net.URI; import java.nio.file.Files; @@ -23,9 +27,13 @@ import java.util.concurrent.CompletionStage; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import javax.sql.DataSource; -import org.h2.jdbcx.JdbcDataSource; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class ManagedContextRecoveryTest { private static final RuntimeProvisionRequest REQUEST = ManagedContextProtocolTest.request(); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiAcknowledgementProtocolTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiAcknowledgementProtocolTest.java index 2f2a621c080..6e4c407d15e 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiAcknowledgementProtocolTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiAcknowledgementProtocolTest.java @@ -1,31 +1,33 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - +import com.alibaba.qwen.code.runtimebroker.transport.ManagedCsiProtocol; import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; + import java.net.URI; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.LinkedHashMap; import java.util.Map; -import org.junit.jupiter.api.Test; -class ManagedCsiAcknowledgementProtocolTest { - static Map fixtures() throws Exception { +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class ManagedCsiAcknowledgementProtocolTest { + public static Map fixtures() throws Exception { return ManagedCsiProtocol.parseAcknowledgement(Files.readAllBytes( Path.of("../cli/src/serve/contracts/managed-csi-worker-ack-v1.fixtures.json"))); } @SuppressWarnings("unchecked") - static Map map(Object value) { + public static Map map(Object value) { return (Map) value; } - static Map with(Map original, String field, Object value) { + public static Map with(Map original, String field, Object value) { var changed = new LinkedHashMap<>(original); changed.put(field, value); return changed; @@ -38,13 +40,13 @@ class ManagedCsiAcknowledgementProtocolTest { (String) context.get("capabilityDigest"), (String) context.get("isolationClass")); } - static RuntimeLease lease(Map boot, URI endpoint) { + public static RuntimeLease lease(Map boot, URI endpoint) { var context = map(boot.get("context")); return new RuntimeLease((String) context.get("runtimeInstanceId"), endpoint, (String) context.get("token"), (String) context.get("leaseId"), BrokerValues.exactLong(context.get("epoch"))); } - static RuntimeSession session(Map fixture) { + public static RuntimeSession session(Map fixture) { var response = map(fixture.get("response")); return new RuntimeSession((String) map(response.get("captureIdentity")).get("sessionId"), (String) map(response.get("reference")).get("sessionId"), "continuation", scope(map(fixture.get("boot")))); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiFilesHttpTransportTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiFilesHttpTransportTest.java index aa9bcf6b291..1a1ae099703 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiFilesHttpTransportTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiFilesHttpTransportTest.java @@ -1,12 +1,14 @@ package com.alibaba.qwen.code.runtimebroker; -import static com.alibaba.qwen.code.runtimebroker.ManagedCsiFilesProtocolTest.map; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.transport.CsiNativeReadbackProtocol; +import com.alibaba.qwen.code.runtimebroker.transport.CsiNativeReadbackProtocolTest; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedCsiFilesProtocol; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedCsiFilesProtocolTest; import com.sun.net.httpserver.HttpServer; +import org.junit.jupiter.api.Test; + import java.net.InetSocketAddress; import java.net.URI; import java.time.Instant; @@ -17,7 +19,11 @@ import java.util.concurrent.CompletionException; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; -import org.junit.jupiter.api.Test; + +import static com.alibaba.qwen.code.runtimebroker.transport.ManagedCsiFilesProtocolTest.map; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class ManagedCsiFilesHttpTransportTest { @Test diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiHttpTransportTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiHttpTransportTest.java index 8c9180e4533..8aaf918463b 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiHttpTransportTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiHttpTransportTest.java @@ -1,11 +1,11 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertInstanceOf; -import static org.junit.jupiter.api.Assertions.assertThrows; - +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocol; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedCsiProtocol; import com.sun.net.httpserver.HttpServer; +import org.junit.jupiter.api.Test; + import java.net.InetSocketAddress; import java.net.URI; import java.nio.file.Files; @@ -14,7 +14,11 @@ import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.CompletionException; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertThrows; class ManagedCsiHttpTransportTest { @Test diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedSchemaMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedSchemaMySqlIT.java index 466c6fd0a95..e1a1527b7ac 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedSchemaMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedSchemaMySqlIT.java @@ -1,25 +1,23 @@ package com.alibaba.qwen.code.runtimebroker; -import com.alibaba.qwen.code.managedagent.store.IsolatedManagedSchemaMySqlTestDatabase; -import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - +import com.alibaba.qwen.code.managedagent.persistence.IsolatedManagedSchemaMySqlTestDatabase; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaRows; - +import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; import org.junit.jupiter.api.Test; +import javax.sql.DataSource; + import java.nio.charset.StandardCharsets; import java.sql.SQLException; import java.util.HashSet; -import javax.sql.DataSource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** Destructive schema checks use their own database; system catalogs remain untouched. */ class ManagedSchemaMySqlIT { diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ProcessCrashFaultGateTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ProcessCrashFaultGateTest.java index 7119f0cffdf..755bb97232a 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ProcessCrashFaultGateTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ProcessCrashFaultGateTest.java @@ -1,5 +1,19 @@ package com.alibaba.qwen.code.runtimebroker; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; + +import java.time.Duration; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + import static com.alibaba.qwen.code.runtimebroker.FaultGateRig.HARNESS; import static com.alibaba.qwen.code.runtimebroker.FaultGateRig.SESSION; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -7,18 +21,6 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import com.alibaba.fastjson2.JSONObject; -import java.time.Duration; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; - /** * FG3: a worker or a Broker JVM dies with a tool call in flight. A killed * Broker leaves its worker running, as a crashed JVM does; a host crash diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ProviderRuntimeTransportTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ProviderRuntimeTransportTest.java index 49dbc25aad1..c6a39cd2fd5 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ProviderRuntimeTransportTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ProviderRuntimeTransportTest.java @@ -1,19 +1,19 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertInstanceOf; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - +import com.alibaba.qwen.code.runtimebroker.provisioning.ProviderRuntimeProtocol; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedRuntimeAttestationConformanceTest; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpServer; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; import java.net.InetSocketAddress; import java.net.URI; -import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -27,9 +27,13 @@ import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Function; import java.util.function.Supplier; import java.util.function.UnaryOperator; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class ProviderRuntimeTransportTest { private static final String HARNESS = "550e8400-e29b-41d4-a716-446655440301"; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RecoverableProcessProvisioner.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RecoverableProcessProvisioner.java index 373d8db7038..a01e2c2995b 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RecoverableProcessProvisioner.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RecoverableProcessProvisioner.java @@ -2,6 +2,9 @@ package com.alibaba.qwen.code.runtimebroker; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; + import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; @@ -35,7 +38,7 @@ import java.util.concurrent.TimeUnit; * it so the gates can drive the service's adoption and takeover paths * against real workers. */ -final class RecoverableProcessProvisioner implements RuntimeProvisioner { +public final class RecoverableProcessProvisioner implements RuntimeProvisioner { private static final Duration TIMEOUT = Duration.ofSeconds(60); private static final Set IDENTITY_FAILURES = Set.of( "managed_runtime_identity_conflict", @@ -53,7 +56,7 @@ final class RecoverableProcessProvisioner implements RuntimeProvisioner { return thread; }); - RecoverableProcessProvisioner(LocalProcessRuntimeProvisioner local, + public RecoverableProcessProvisioner(LocalProcessRuntimeProvisioner local, HttpRuntimeTransport transport, Path records) { this.local = local; this.transport = transport; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerHttpServerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerHttpServerTest.java index f27f73cbc8b..a6b7f72c03a 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerHttpServerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerHttpServerTest.java @@ -1,13 +1,13 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertSame; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.assertThrows; - import com.alibaba.fastjson2.JSON; +import com.alibaba.qwen.code.runtimebroker.managedschema.JdbcRuntimeBrokerSchema; +import com.alibaba.qwen.code.runtimebroker.provisioning.StaticRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.security.ProtectedSecret; +import com.alibaba.qwen.code.runtimebroker.transport.RuntimeBrokerHttpServer; +import org.junit.jupiter.api.Test; + import java.lang.reflect.Proxy; import java.net.InetSocketAddress; import java.net.URI; @@ -16,12 +16,12 @@ import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; -import java.util.HashMap; -import java.util.HexFormat; -import java.util.List; import java.time.Clock; import java.time.Duration; import java.time.Instant; +import java.util.HashMap; +import java.util.HexFormat; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.CompletableFuture; @@ -29,7 +29,13 @@ import java.util.concurrent.CompletionStage; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class RuntimeBrokerHttpServerTest { @Test diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerServiceTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerServiceTest.java index aa1d9ffeac6..5627c408163 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerServiceTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerServiceTest.java @@ -1,13 +1,7 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertSame; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively; -import static org.junit.jupiter.api.Assertions.assertTrue; +import com.alibaba.qwen.code.runtimebroker.provisioning.StaticRuntimeProvisioner; +import org.junit.jupiter.api.Test; import java.lang.reflect.Proxy; import java.net.URI; @@ -36,7 +30,15 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; import java.util.function.BooleanSupplier; import java.util.function.Supplier; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively; +import static org.junit.jupiter.api.Assertions.assertTrue; class RuntimeBrokerServiceTest { private static final String MOUNT_CLAIM = "claim"; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerStorageAdmissionTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerStorageAdmissionTest.java index 5779e6e7fcb..b1d48e1474e 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerStorageAdmissionTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerStorageAdmissionTest.java @@ -1,8 +1,7 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import org.junit.jupiter.api.Test; import java.time.Clock; import java.time.Duration; @@ -13,7 +12,10 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.CompletionStage; import java.util.function.Consumer; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; class RuntimeBrokerStorageAdmissionTest { private static final RuntimeScope SCOPE = new RuntimeScope("tenant", "workspace", "1", "/workspace", diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerTestAccess.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerTestAccess.java new file mode 100644 index 00000000000..464fbb9c140 --- /dev/null +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeBrokerTestAccess.java @@ -0,0 +1,58 @@ +package com.alibaba.qwen.code.runtimebroker; + +import javax.sql.DataSource; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.time.Clock; +import java.time.Duration; +import java.util.function.Supplier; + +public final class RuntimeBrokerTestAccess { + private RuntimeBrokerTestAccess() { + } + + public static boolean matches(RuntimeRecoveryEvidence evidence, + RuntimeProvisionSeed seed, RuntimeResourceHandle handle, RuntimeLease lease) { + return evidence.matches(seed, handle, lease); + } + + public static boolean sameIdentity(RuntimeSessionRecord expected, RuntimeSessionRecord actual) { + return expected.sameIdentity(actual); + } + + public static boolean sameIdentity(RuntimeBindingRecord expected, RuntimeBindingRecord actual) { + return expected.sameIdentity(actual); + } + + public static byte[] encode(RuntimeProvisionSeed seed) { + return seed.encode(); + } + + public static RuntimeProvisionSeed decodeSeed(byte[] encoded) { + return RuntimeProvisionSeed.decode(encoded); + } + + public static T transaction(DataSource source, SqlWork work) { + return JdbcRepositorySupport.transaction(source, work::run); + } + + public static void setIdentity(PreparedStatement statement, int index, String value) throws SQLException { + JdbcRepositorySupport.setIdentity(statement, index, value); + } + + public static RuntimeBrokerService service(HarnessSessionResolver sessions, + RuntimeProvisioner provisioner, RuntimeTransport transport, + RuntimeBindingRepository bindings, RuntimeSessionRepository runtimeSessions, + ToolExecutionRepository executions, String owner, Duration operationLease, + Duration dispatchLease, Clock clock, Supplier executionIds) { + return new RuntimeBrokerService(sessions, provisioner, transport, bindings, + runtimeSessions, executions, owner, operationLease, dispatchLease, clock, executionIds); + } + + @FunctionalInterface + public interface SqlWork { + T run(Connection connection) throws SQLException; + } +} diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeDispatchAdmissionTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeDispatchAdmissionTest.java index 1b83801715b..ec4d18c15e1 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeDispatchAdmissionTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeDispatchAdmissionTest.java @@ -1,9 +1,10 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.jupiter.api.Test; + +import javax.sql.DataSource; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -16,9 +17,11 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.UUID; -import javax.sql.DataSource; -import org.h2.jdbcx.JdbcDataSource; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; class RuntimeDispatchAdmissionTest { @Test diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeMaintenanceRecoveryTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeMaintenanceRecoveryTest.java index 1b613c51563..4a777aa9508 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeMaintenanceRecoveryTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeMaintenanceRecoveryTest.java @@ -1,6 +1,9 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.*; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import java.lang.reflect.Proxy; import java.net.URI; @@ -12,9 +15,8 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import org.h2.jdbcx.JdbcDataSource; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; + +import static org.junit.jupiter.api.Assertions.*; class RuntimeMaintenanceRecoveryTest { @ParameterizedTest diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeRecoveryTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeRecoveryTest.java index 1a9ba5c1fd7..5b768b0c416 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeRecoveryTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeRecoveryTest.java @@ -1,8 +1,10 @@ package com.alibaba.qwen.code.runtimebroker; -import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; import com.alibaba.fastjson2.JSON; +import com.alibaba.qwen.code.runtimebroker.provisioning.StaticRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.transport.RuntimeBrokerHttpServer; +import org.junit.jupiter.api.Test; + import java.lang.reflect.Proxy; import java.net.InetSocketAddress; import java.net.http.HttpClient; @@ -11,6 +13,8 @@ import java.net.http.HttpResponse; import java.time.Duration; import java.util.Map; +import static org.junit.jupiter.api.Assertions.*; + class RuntimeRecoveryTest { @Test void memoryRepositoryHonorsRecoveryContract() throws Exception { diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeSessionTombstoneTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeSessionTombstoneTest.java index a8a3051b554..d04b86a8e2e 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeSessionTombstoneTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeSessionTombstoneTest.java @@ -1,16 +1,18 @@ package com.alibaba.qwen.code.runtimebroker; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import java.time.Duration; +import java.time.Instant; +import java.util.UUID; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; -import java.time.Instant; -import java.time.Duration; -import java.util.UUID; -import org.h2.jdbcx.JdbcDataSource; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; - class RuntimeSessionTombstoneTest { private static final RuntimeScope SCOPE = new RuntimeScope( "tenant", "workspace", "generation", "/workspace", "capability", "session"); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeSshAcknowledgementTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeSshAcknowledgementTest.java index 105c2c3c01c..6e58de8f3c2 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeSshAcknowledgementTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeSshAcknowledgementTest.java @@ -1,11 +1,14 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; +import com.alibaba.qwen.code.runtimebroker.provisioning.LocalProcessRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.provisioning.SshRuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + import java.net.URI; import java.time.Duration; import java.time.Instant; @@ -16,10 +19,11 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.CompletionStage; import java.util.concurrent.atomic.AtomicInteger; -import org.h2.jdbcx.JdbcDataSource; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class RuntimeSshAcknowledgementTest { @Test diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/SharedHarnessOwnershipTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/SharedHarnessOwnershipTest.java index f1a312bc11d..ba1cfde87d5 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/SharedHarnessOwnershipTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/SharedHarnessOwnershipTest.java @@ -1,10 +1,9 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertInstanceOf; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.function.Executable; import java.net.URI; import java.time.Duration; @@ -14,9 +13,12 @@ import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.ExecutionException; -import org.h2.jdbcx.JdbcDataSource; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.function.Executable; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; /** A shared Workspace binding answers each Runtime Session for its own Harness Session. */ class SharedHarnessOwnershipTest { diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/TakeoverReconciliationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/TakeoverReconciliationTest.java index 6a0b91dd972..fae63fbc73a 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/TakeoverReconciliationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/TakeoverReconciliationTest.java @@ -1,24 +1,26 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.*; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Proxy; import java.time.Duration; import java.time.Instant; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.HashSet; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.TimeUnit; import java.util.function.Function; -import org.h2.jdbcx.JdbcDataSource; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; + +import static org.junit.jupiter.api.Assertions.*; class TakeoverReconciliationTest { @ParameterizedTest diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/UnknownExecutionObservationTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/UnknownExecutionObservationTest.java index 16ca4b895f9..cdfa551ebbf 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/UnknownExecutionObservationTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/UnknownExecutionObservationTest.java @@ -1,9 +1,9 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - import com.alibaba.fastjson2.JSON; +import com.alibaba.qwen.code.runtimebroker.transport.RuntimeBrokerHttpServer; +import org.junit.jupiter.api.Test; + import java.net.InetSocketAddress; import java.net.URI; import java.net.http.HttpClient; @@ -19,7 +19,9 @@ import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.atomic.AtomicInteger; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * An execution whose record is UNKNOWN keeps answering diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/WorkspaceCreationSchemaMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/WorkspaceCreationSchemaMySqlIT.java index c30baea073b..e85dbfc0092 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/WorkspaceCreationSchemaMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/WorkspaceCreationSchemaMySqlIT.java @@ -1,16 +1,9 @@ package com.alibaba.qwen.code.runtimebroker; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import com.alibaba.qwen.code.managedagent.store.IsolatedManagedSchemaMySqlTestDatabase; +import com.alibaba.qwen.code.managedagent.persistence.IsolatedManagedSchemaMySqlTestDatabase; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchema; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaContract; import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaKeys; - import org.flywaydb.core.Flyway; import org.junit.jupiter.api.Test; import org.springframework.dao.DataAccessException; @@ -20,6 +13,12 @@ import java.nio.charset.StandardCharsets; import java.sql.Connection; import java.sql.SQLException; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + /** Uses its own disposable empty application catalog. */ class WorkspaceCreationSchemaMySqlIT { @Test diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/managedschema/ManagedSchemaProjectionTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/managedschema/ManagedSchemaProjectionTest.java index 644b29e60e0..9420e208cbf 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/managedschema/ManagedSchemaProjectionTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/managedschema/ManagedSchemaProjectionTest.java @@ -1,16 +1,15 @@ package com.alibaba.qwen.code.runtimebroker.managedschema; -import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaProjection; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.UUID; -import org.h2.jdbcx.JdbcDataSource; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; class ManagedSchemaProjectionTest { @Test diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/managedschema/ManagedSchemaTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/managedschema/ManagedSchemaTest.java index e49bcf04ba4..442eea42402 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/managedschema/ManagedSchemaTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/managedschema/ManagedSchemaTest.java @@ -1,24 +1,22 @@ package com.alibaba.qwen.code.runtimebroker.managedschema; -import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - import org.flywaydb.core.Flyway; import org.h2.jdbcx.JdbcDataSource; import org.junit.jupiter.api.Test; +import javax.sql.DataSource; + import java.sql.Connection; import java.sql.SQLException; import java.util.Map; import java.util.Set; import java.util.UUID; -import javax.sql.DataSource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class ManagedSchemaTest { @Test diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/managedschema/ManagedSchemaTimeTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/managedschema/ManagedSchemaTimeTest.java index 323590db63e..ed470444784 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/managedschema/ManagedSchemaTimeTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/managedschema/ManagedSchemaTimeTest.java @@ -1,17 +1,16 @@ package com.alibaba.qwen.code.runtimebroker.managedschema; -import com.alibaba.qwen.code.runtimebroker.managedschema.ManagedSchemaTime; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.jupiter.api.Test; + +import java.sql.SQLException; +import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.sql.SQLException; -import java.util.UUID; -import org.h2.jdbcx.JdbcDataSource; -import org.junit.jupiter.api.Test; - class ManagedSchemaTimeTest { @Test void readsNullableEpochMillisecondsWithoutTimezoneOrSecondConversion() throws Exception { diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/DurableLocalProcessRuntimeProvisionerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/DurableLocalProcessRuntimeProvisionerTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/DurableLocalProcessRuntimeProvisionerTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/DurableLocalProcessRuntimeProvisionerTest.java index cbe2e14b498..71e28284608 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/DurableLocalProcessRuntimeProvisionerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/DurableLocalProcessRuntimeProvisionerTest.java @@ -1,16 +1,31 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import com.alibaba.qwen.code.runtimebroker.InMemoryRuntimeBindingRepository; +import com.alibaba.qwen.code.runtimebroker.InMemoryRuntimeSessionRepository; +import com.alibaba.qwen.code.runtimebroker.InMemoryToolExecutionRepository; +import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerTestAccess; +import com.alibaba.qwen.code.runtimebroker.RuntimeLease; +import com.alibaba.qwen.code.runtimebroker.RuntimeObservation; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.RuntimeResourceHandle; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledOnOs; +import org.junit.jupiter.api.condition.OS; +import org.junit.jupiter.api.io.TempDir; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import java.net.URI; import java.nio.file.Files; import java.nio.file.Path; -import java.net.URI; import java.nio.file.attribute.PosixFilePermissions; import java.time.Duration; import java.time.Instant; @@ -21,13 +36,14 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.DisabledOnOs; -import org.junit.jupiter.api.condition.OS; -import org.junit.jupiter.api.io.TempDir; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; @DisabledOnOs(OS.WINDOWS) class DurableLocalProcessRuntimeProvisionerTest { @@ -218,7 +234,7 @@ class DurableLocalProcessRuntimeProvisionerTest { RuntimeObservation stopped = provisioner.attestOperatorStop(binding, recoveryId); assertEquals(RuntimeObservation.Outcome.NOT_FOUND, stopped.getOutcome()); assertEquals("operator-attested:" + recoveryId, stopped.getStopEvidence().source()); - assertTrue(stopped.getStopEvidence().matches(SEED, handle, lease)); + assertTrue(RuntimeBrokerTestAccess.matches(stopped.getStopEvidence(), SEED, handle, lease)); assertEquals(LocalRuntimeStore.State.RETIRED, registration(store, request, handle).state()); provisioner.verifyOperatorRegistration(binding); assertEquals(stopped.getStopEvidence().evidenceId(), @@ -267,7 +283,7 @@ class DurableLocalProcessRuntimeProvisionerTest { var stopped = restored.attestOperatorStop(binding, "11111111-1111-1111-1111-111111111111"); assertEquals(RuntimeObservation.Outcome.NOT_FOUND, stopped.getOutcome()); - assertTrue(stopped.getStopEvidence().matches(SEED, handle, lease)); + assertTrue(RuntimeBrokerTestAccess.matches(stopped.getStopEvidence(), SEED, handle, lease)); assertEquals(LocalRuntimeStore.State.RETIRED, registration(store, request, handle).state()); } } @@ -285,7 +301,7 @@ class DurableLocalProcessRuntimeProvisionerTest { worker.onExit().get(5, TimeUnit.SECONDS); var lost = await(second.reconcile(request, SEED, handle, lease)); assertEquals(RuntimeObservation.Outcome.NOT_FOUND, lost.getOutcome()); - assertTrue(lost.getLossEvidence().matches(SEED, handle, lease)); + assertTrue(RuntimeBrokerTestAccess.matches(lost.getLossEvidence(), SEED, handle, lease)); assertNull(lost.getStopEvidence()); assertEquals(LocalRuntimeStore.State.RETIRED, registration(store, request, handle).state()); assertBlocked(second.provision(request, SEED)); @@ -591,7 +607,7 @@ class DurableLocalProcessRuntimeProvisionerTest { null, new LocalRuntimeStore(directory.toRealPath(), reboot), true)) { var stopped = await(second.reconcile(request, SEED, handle, lease)); assertEquals(RuntimeObservation.Outcome.NOT_FOUND, stopped.getOutcome()); - assertTrue(stopped.getStopEvidence().matches(SEED, handle, lease)); + assertTrue(RuntimeBrokerTestAccess.matches(stopped.getStopEvidence(), SEED, handle, lease)); assertEquals(loss.getLossEvidence().hostDomain(), stopped.getStopEvidence().hostDomain()); assertEquals(LocalRuntimeStore.State.RETIRED, registration(store, request, handle).state()); assertBlocked(second.provision(request, SEED)); @@ -623,8 +639,8 @@ class DurableLocalProcessRuntimeProvisionerTest { try (var second = new LocalProcessRuntimeProvisioner(List.of("must-not-run"), directory, TRANSPORT, null, new LocalRuntimeStore(directory.toRealPath(), reboot), true)) { var observed = await(second.reconcile(request, SEED, handle, null)); - assertTrue(observed.getLossEvidence().matches(SEED, handle, null)); - assertTrue(observed.getStopEvidence().matches(SEED, handle, null)); + assertTrue(RuntimeBrokerTestAccess.matches(observed.getLossEvidence(), SEED, handle, null)); + assertTrue(RuntimeBrokerTestAccess.matches(observed.getStopEvidence(), SEED, handle, null)); assertNull(observed.getEndpoint()); assertBlocked(second.provision(request, SEED)); Path record = directory.resolve(handle.getValue().get("resourceId") + ".json"); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FaultGateBroker.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/FaultGateBroker.java similarity index 89% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FaultGateBroker.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/FaultGateBroker.java index d668eb5ac72..9b960935ad7 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/FaultGateBroker.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/FaultGateBroker.java @@ -1,8 +1,27 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; +import com.alibaba.qwen.code.runtimebroker.DriverManagerDataSource; +import com.alibaba.qwen.code.runtimebroker.FaultGateTransport; +import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; +import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; +import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; +import com.alibaba.qwen.code.runtimebroker.RecoverableProcessProvisioner; +import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; +import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransportTestAccess; + +import javax.sql.DataSource; + import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintStream; @@ -23,7 +42,6 @@ import java.util.concurrent.CompletionStage; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import javax.sql.DataSource; /** * One Broker process for the fault gates: the production @@ -32,7 +50,7 @@ import javax.sql.DataSource; * the gate's fault proxy. It reads one JSON command per line on standard * input and answers each on standard output. */ -final class FaultGateBroker { +public final class FaultGateBroker { private static final Duration COMMAND_TIMEOUT = Duration.ofSeconds(90); private FaultGateBroker() { @@ -77,7 +95,7 @@ final class FaultGateBroker { InetAddress.getLoopbackAddress(), config.getIntValue("proxyPort")))) .build(); - HttpRuntimeTransport runtime = new HttpRuntimeTransport(client, + HttpRuntimeTransport runtime = HttpRuntimeTransportTestAccess.create(client, Duration.ofMillis(config.getLongValue("requestTimeoutMillis"))); // A context selects managed-context/1: the provisioner then places // every scope on the configured storage, with boot v2. diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/KubernetesCsiLogReaderTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesCsiLogReaderTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/KubernetesCsiLogReaderTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesCsiLogReaderTest.java index 0db9e583d53..122e6fba489 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/KubernetesCsiLogReaderTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesCsiLogReaderTest.java @@ -1,9 +1,7 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import org.junit.jupiter.api.Test; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; @@ -14,7 +12,11 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.CompletionStage; import java.util.concurrent.atomic.AtomicInteger; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class KubernetesCsiLogReaderTest { private static final String POD_UID = "12345678-1234-5678-9abc-123456789abc"; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/KubernetesHttpRuntimeClientTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesHttpRuntimeClientTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/KubernetesHttpRuntimeClientTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesHttpRuntimeClientTest.java index 152992ff7c9..810e1ebb1ab 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/KubernetesHttpRuntimeClientTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesHttpRuntimeClientTest.java @@ -1,12 +1,13 @@ -package com.alibaba.qwen.code.runtimebroker; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +package com.alibaba.qwen.code.runtimebroker.provisioning; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import com.sun.net.httpserver.HttpServer; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + import java.net.InetSocketAddress; import java.net.URI; import java.net.http.HttpClient; @@ -22,10 +23,12 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class KubernetesHttpRuntimeClientTest { @TempDir diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/KubernetesRuntimeProvisionerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesRuntimeProvisionerTest.java similarity index 95% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/KubernetesRuntimeProvisionerTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesRuntimeProvisionerTest.java index efbbe2addb1..ba4d3b5cea8 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/KubernetesRuntimeProvisionerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/KubernetesRuntimeProvisionerTest.java @@ -1,4 +1,31 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; + +import com.alibaba.qwen.code.runtimebroker.FakeKubernetesRuntimeClient; +import com.alibaba.qwen.code.runtimebroker.InMemoryRuntimeBindingRepository; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerTestAccess; +import com.alibaba.qwen.code.runtimebroker.RuntimeLease; +import com.alibaba.qwen.code.runtimebroker.RuntimeObservation; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.RuntimeResourceHandle; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import java.net.URI; +import java.time.Duration; +import java.util.Base64; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletionException; +import java.util.concurrent.CompletionStage; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; import static com.alibaba.qwen.code.runtimebroker.FakeKubernetesRuntimeClient.map; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -6,23 +33,8 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.net.URI; -import java.time.Duration; -import java.util.Base64; -import java.util.Collection; -import java.util.List; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.concurrent.CompletionException; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CompletionStage; -import java.util.function.Consumer; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; - -class KubernetesRuntimeProvisionerTest { - static final String IMAGE = "registry.example/qwen@sha256:" + "a".repeat(64); +public class KubernetesRuntimeProvisionerTest { + public static final String IMAGE = "registry.example/qwen@sha256:" + "a".repeat(64); static final List COMMAND = List.of("node", "/opt/qwen/dist/cli.js"); static final RuntimeProvisionSeed SEED = RuntimeProvisionSeed.create("binding", 1); @@ -379,10 +391,10 @@ class KubernetesRuntimeProvisionerTest { } var scope = new RuntimeScope("tenant", "workspace", "1", "/workspace", "invalid", "session"); failure(provisioner.ensureResource(provisioner.createRequest(scope, "harness"), SEED, null)); - var encoded = new LinkedHashMap<>(JsonCodec.parseObject(SEED.encode(), "seed")); + var encoded = new LinkedHashMap<>(JsonCodec.parseObject(RuntimeBrokerTestAccess.encode(SEED), "seed")); encoded.put("epoch", 9_007_199_254_740_992L); failure(provisioner.ensureResource(request(provisioner, "/workspace"), - RuntimeProvisionSeed.decode(JsonCodec.encode(encoded)), null)); + RuntimeBrokerTestAccess.decodeSeed(JsonCodec.encode(encoded)), null)); assertEquals(0, api.reads); assertEquals(0, api.creates); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/LocalProcessRuntimeProvisionerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/LocalProcessRuntimeProvisionerTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/LocalProcessRuntimeProvisionerTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/LocalProcessRuntimeProvisionerTest.java index 1dd89e33c4a..460afebe96b 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/LocalProcessRuntimeProvisionerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/LocalProcessRuntimeProvisionerTest.java @@ -1,10 +1,26 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assumptions.assumeTrue; +import com.alibaba.qwen.code.runtimebroker.CsiFilesRetirementProfile; +import com.alibaba.qwen.code.runtimebroker.DelegatingBindingRepository; +import com.alibaba.qwen.code.runtimebroker.InMemoryRuntimeBindingRepository; +import com.alibaba.qwen.code.runtimebroker.InMemoryRuntimeSessionRepository; +import com.alibaba.qwen.code.runtimebroker.InMemoryToolExecutionRepository; +import com.alibaba.qwen.code.runtimebroker.RuntimeAttestation; +import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; +import com.alibaba.qwen.code.runtimebroker.RuntimeLease; +import com.alibaba.qwen.code.runtimebroker.RuntimeObservation; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.RuntimeRecoveryEvidence; +import com.alibaba.qwen.code.runtimebroker.RuntimeResourceHandle; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.RuntimeSession; +import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeTransport; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import org.junit.jupiter.api.Test; import java.io.IOException; import java.net.InetAddress; @@ -12,17 +28,22 @@ import java.net.ServerSocket; import java.net.URI; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Comparator; import java.time.Duration; import java.time.Instant; +import java.util.Comparator; import java.util.List; import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import org.junit.jupiter.api.Test; -class LocalProcessRuntimeProvisionerTest { +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assumptions.assumeTrue; + +public class LocalProcessRuntimeProvisionerTest { private static final String DIGEST = "sha256:" + "a".repeat(64); @Test @@ -1037,7 +1058,7 @@ class LocalProcessRuntimeProvisionerTest { .collect(Collectors.toSet()); } - static void requireNode() { + public static void requireNode() { if (commandExists("node")) { return; } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/LocalProcessStopExecutorTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/LocalProcessStopExecutorTest.java similarity index 87% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/LocalProcessStopExecutorTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/LocalProcessStopExecutorTest.java index e8f797897f2..a9442cb5535 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/LocalProcessStopExecutorTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/LocalProcessStopExecutorTest.java @@ -1,8 +1,16 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assumptions.assumeTrue; +import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeDrainReceipt; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledOnOs; +import org.junit.jupiter.api.condition.OS; +import org.junit.jupiter.api.io.TempDir; import java.nio.file.Path; import java.time.Instant; @@ -13,10 +21,10 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.TimeUnit; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.DisabledOnOs; -import org.junit.jupiter.api.condition.OS; -import org.junit.jupiter.api.io.TempDir; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assumptions.assumeTrue; @DisabledOnOs(OS.WINDOWS) class LocalProcessStopExecutorTest { diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/LocalRebootTestSupport.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/LocalRebootTestSupport.java similarity index 88% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/LocalRebootTestSupport.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/LocalRebootTestSupport.java index c7a11cef175..20b3a0a079d 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/LocalRebootTestSupport.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/LocalRebootTestSupport.java @@ -1,4 +1,6 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; + +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; import java.nio.file.Path; import java.util.List; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/LocalRuntimeStoreTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/LocalRuntimeStoreTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/LocalRuntimeStoreTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/LocalRuntimeStoreTest.java index 65a78934674..4060d634ed1 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/LocalRuntimeStoreTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/LocalRuntimeStoreTest.java @@ -1,14 +1,16 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import org.junit.jupiter.api.Test; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.attribute.PosixFilePermissions; import java.util.List; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class LocalRuntimeStoreTest { @org.junit.jupiter.api.condition.DisabledOnOs(org.junit.jupiter.api.condition.OS.WINDOWS) diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/MacOsHostIdentityTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/MacOsHostIdentityTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/MacOsHostIdentityTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/MacOsHostIdentityTest.java index 8d5f9d11951..fdfcfb18139 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/MacOsHostIdentityTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/MacOsHostIdentityTest.java @@ -1,15 +1,16 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.io.IOException; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + class MacOsHostIdentityTest { private static final String UUID = "ABCDEF01-2345-6789-ABCD-EF0123456789"; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedContextProtocolTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/ManagedContextProtocolTest.java similarity index 90% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedContextProtocolTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/ManagedContextProtocolTest.java index a1c6d0348f6..4a6539e8e54 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedContextProtocolTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/ManagedContextProtocolTest.java @@ -1,4 +1,23 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; + +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import com.alibaba.qwen.code.runtimebroker.transport.ManagedRuntimeAttestationConformanceTest; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; + +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.util.List; +import java.util.Map; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -6,18 +25,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import java.nio.charset.StandardCharsets; -import java.nio.file.Path; -import java.util.List; -import java.util.Map; -import org.junit.jupiter.api.Test; - -class ManagedContextProtocolTest { +public class ManagedContextProtocolTest { private static final ObjectMapper JSON = new ObjectMapper() .enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS); @@ -110,18 +118,18 @@ class ManagedContextProtocolTest { () -> ManagedContextProtocol.verify(fractional, Map.of("epoch", 4))); } - static RuntimeProvisionRequest request() { + public static RuntimeProvisionRequest request() { return new RuntimeProvisionRequest(new RuntimeScope("tenant-a", "workspace-a", "7", "/runtime/workspaces/workspace-a", "sha256:" + "a".repeat(64), "workspace"), null, "local-process", "storage://pvc/workspace-a"); } - static RuntimeProvisionSeed seed() { + public static RuntimeProvisionSeed seed() { return new RuntimeProvisionSeed("provision-01", "runtime-01", "boot-01", "lease-01", 4, "fixture-token"); } - static ContextBinding binding() { + public static ContextBinding binding() { return new ContextBinding("tenant-a", "workspace-a", 7, "storage://pvc/workspace-a", "services/api", "config:bundle-3@r12", 1); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RoutingRuntimeProvisionerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/RoutingRuntimeProvisionerTest.java similarity index 90% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RoutingRuntimeProvisionerTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/RoutingRuntimeProvisionerTest.java index 88971958dc5..18b62be2c11 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RoutingRuntimeProvisionerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/RoutingRuntimeProvisionerTest.java @@ -1,9 +1,24 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import com.alibaba.qwen.code.runtimebroker.InMemoryRuntimeBindingRepository; +import com.alibaba.qwen.code.runtimebroker.InMemoryRuntimeSessionRepository; +import com.alibaba.qwen.code.runtimebroker.InMemoryToolExecutionRepository; +import com.alibaba.qwen.code.runtimebroker.RuntimeAttestation; +import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; +import com.alibaba.qwen.code.runtimebroker.RuntimeDrainReceipt; +import com.alibaba.qwen.code.runtimebroker.RuntimeLease; +import com.alibaba.qwen.code.runtimebroker.RuntimeObservation; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.RuntimeResourceHandle; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.RuntimeSession; +import com.alibaba.qwen.code.runtimebroker.RuntimeTransport; +import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; +import org.junit.jupiter.api.Test; import java.net.URI; import java.time.Duration; @@ -14,7 +29,11 @@ import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.TimeUnit; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class RoutingRuntimeProvisionerTest { private static final RuntimeScope SCOPE = new RuntimeScope("tenant", "workspace", "1", "/workspace/project", diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeHarnessDrainMySqlIT.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/RuntimeHarnessDrainMySqlIT.java similarity index 90% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeHarnessDrainMySqlIT.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/RuntimeHarnessDrainMySqlIT.java index 38ecc7fe31c..ef022061fd2 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeHarnessDrainMySqlIT.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/RuntimeHarnessDrainMySqlIT.java @@ -1,8 +1,11 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; + +import com.alibaba.qwen.code.runtimebroker.DriverManagerDataSource; +import com.alibaba.qwen.code.runtimebroker.managedschema.JdbcRuntimeBrokerSchema; +import org.junit.jupiter.api.AfterEach; import java.sql.DriverManager; import java.util.UUID; -import org.junit.jupiter.api.AfterEach; class RuntimeHarnessDrainMySqlIT extends RuntimeHarnessDrainTest { private Database database; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeHarnessDrainTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/RuntimeHarnessDrainTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeHarnessDrainTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/RuntimeHarnessDrainTest.java index c5c37a4c7aa..2ddd62ffb20 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/RuntimeHarnessDrainTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/RuntimeHarnessDrainTest.java @@ -1,6 +1,46 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; -import static org.junit.jupiter.api.Assertions.*; +import com.alibaba.qwen.code.runtimebroker.CsiFilesRetirementProfile; +import com.alibaba.qwen.code.runtimebroker.HarnessSessionResolver; +import com.alibaba.qwen.code.runtimebroker.InMemoryRuntimeBindingRepository; +import com.alibaba.qwen.code.runtimebroker.InMemoryRuntimeSessionRepository; +import com.alibaba.qwen.code.runtimebroker.InMemoryToolExecutionRepository; +import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeBindingRepository; +import com.alibaba.qwen.code.runtimebroker.JdbcRuntimeSessionRepository; +import com.alibaba.qwen.code.runtimebroker.JdbcToolExecutionRepository; +import com.alibaba.qwen.code.runtimebroker.RuntimeAttestation; +import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerTestAccess; +import com.alibaba.qwen.code.runtimebroker.RuntimeDrainReceipt; +import com.alibaba.qwen.code.runtimebroker.RuntimeLease; +import com.alibaba.qwen.code.runtimebroker.RuntimeLifecycleAuthority; +import com.alibaba.qwen.code.runtimebroker.RuntimeObservation; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.RuntimeRecoveryEvidence; +import com.alibaba.qwen.code.runtimebroker.RuntimeResourceHandle; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.RuntimeSession; +import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRepository; +import com.alibaba.qwen.code.runtimebroker.RuntimeTransport; +import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; +import com.alibaba.qwen.code.runtimebroker.ToolExecutionRepository; +import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; +import com.alibaba.qwen.code.runtimebroker.security.AesGcmSecretProtector; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; +import org.h2.jdbcx.JdbcDataSource; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledOnOs; +import org.junit.jupiter.api.condition.OS; +import org.junit.jupiter.api.io.TempDir; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Proxy; @@ -13,16 +53,10 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import org.h2.jdbcx.JdbcDataSource; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.DisabledOnOs; -import org.junit.jupiter.api.condition.OS; -import org.junit.jupiter.api.io.TempDir; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; -import org.junit.jupiter.params.provider.ValueSource; -class RuntimeHarnessDrainTest { +import static org.junit.jupiter.api.Assertions.*; + +public class RuntimeHarnessDrainTest { private final javax.sql.DataSource source; private final RuntimeBindingRepository bindings; private final RuntimeSessionRepository sessions; @@ -36,7 +70,7 @@ class RuntimeHarnessDrainTest { private final Provider provisioner = new Provider(); private final Transport transport = new Transport(); - RuntimeHarnessDrainTest() { + public RuntimeHarnessDrainTest() { this.source = createSource(); bindings = new JdbcRuntimeBindingRepository(source, new AesGcmSecretProtector("test", new byte[32])); sessions = new JdbcRuntimeSessionRepository(source); @@ -49,7 +83,7 @@ class RuntimeHarnessDrainTest { @Test void lifecycleUpsertsAdvanceModificationTimeOnlyWhenValuesChange() throws Exception { - JdbcRepositorySupport.transaction(source, connection -> { + RuntimeBrokerTestAccess.transaction(source, connection -> { JdbcRuntimeBindingRepository.beginHarnessLifecycle(connection, "tenant", "harness", "first"); return null; }); @@ -60,7 +94,7 @@ class RuntimeHarnessDrainTest { assertTrue(row.getLong(2) > 0); } statement.executeUpdate("UPDATE ma_session_head SET gmt_modified = 1"); - JdbcRepositorySupport.transaction(source, transaction -> { + RuntimeBrokerTestAccess.transaction(source, transaction -> { JdbcRuntimeBindingRepository.beginHarnessLifecycle(transaction, "tenant", "harness", "first"); return null; }); @@ -68,7 +102,7 @@ class RuntimeHarnessDrainTest { assertTrue(row.next()); assertEquals(1, row.getLong(1)); } - JdbcRepositorySupport.transaction(source, transaction -> { + RuntimeBrokerTestAccess.transaction(source, transaction -> { JdbcRuntimeBindingRepository.beginHarnessLifecycle(transaction, "tenant", "harness", "second"); return null; }); @@ -191,7 +225,7 @@ class RuntimeHarnessDrainTest { assertFalse(failure.isRetryable()); assertNull(sessionRepository.findById(scope, "late")); var retained = sessionRepository.findById(scope, "original"); - assertTrue(original.sameIdentity(retained)); + assertTrue(RuntimeBrokerTestAccess.sameIdentity(original, retained)); assertEquals(RuntimeSessionRecord.State.ACQUIRING, retained.getState()); assertEquals(1, sessionRepository.countActiveByBinding(binding.getBindingId(), binding.getGeneration())); assertEquals(RuntimeBindingRecord.State.READY, registry.findById(binding.getBindingId()).getState()); @@ -275,7 +309,7 @@ class RuntimeHarnessDrainTest { assertEquals(0, transport.attestations); assertEquals(0, provisioner.provisions); assertEquals(0, provisioner.stops); - assertTrue(binding.sameIdentity(bindings.findById(binding.getBindingId()))); + assertTrue(RuntimeBrokerTestAccess.sameIdentity(binding, bindings.findById(binding.getBindingId()))); } } @@ -1174,10 +1208,10 @@ class RuntimeHarnessDrainTest { try (var connection = source.getConnection(); var statement = connection.prepareStatement( "UPDATE ma_session_head SET operation_id = ?, claim_generation = 1," + " claim_lease_until = ? WHERE tenant_id = ? AND harness_session_id = ?")) { - JdbcRepositorySupport.setIdentity(statement, 1, "lifecycle"); + RuntimeBrokerTestAccess.setIdentity(statement, 1, "lifecycle"); statement.setLong(2, System.currentTimeMillis() + 30_000); - JdbcRepositorySupport.setIdentity(statement, 3, "tenant"); - JdbcRepositorySupport.setIdentity(statement, 4, "harness"); + RuntimeBrokerTestAccess.setIdentity(statement, 3, "tenant"); + RuntimeBrokerTestAccess.setIdentity(statement, 4, "harness"); assertEquals(1, statement.executeUpdate()); } return new RuntimeLifecycleAuthority("lifecycle", 1); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/SshConnectionManagerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshConnectionManagerTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/SshConnectionManagerTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshConnectionManagerTest.java index a3d7953dada..319b0b2a4bd 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/SshConnectionManagerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshConnectionManagerTest.java @@ -1,29 +1,33 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeLease; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledOnOs; +import org.junit.jupiter.api.condition.OS; +import org.junit.jupiter.api.io.TempDir; import java.net.URI; -import java.nio.file.Path; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.attribute.PosixFilePermissions; import java.time.Duration; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; -import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.DisabledOnOs; -import org.junit.jupiter.api.condition.OS; -import org.junit.jupiter.api.io.TempDir; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; @DisabledOnOs(OS.WINDOWS) class SshConnectionManagerTest { diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/SshRuntimeInteropTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshRuntimeInteropTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/SshRuntimeInteropTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshRuntimeInteropTest.java index 254992234d6..67890fb1701 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/SshRuntimeInteropTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshRuntimeInteropTest.java @@ -1,13 +1,34 @@ -package com.alibaba.qwen.code.runtimebroker; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +package com.alibaba.qwen.code.runtimebroker.provisioning; +import com.alibaba.qwen.code.runtimebroker.CsiNativeActivationProof; +import com.alibaba.qwen.code.runtimebroker.InMemoryRuntimeBindingRepository; +import com.alibaba.qwen.code.runtimebroker.InMemoryRuntimeSessionRepository; +import com.alibaba.qwen.code.runtimebroker.InMemoryToolExecutionRepository; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import com.alibaba.qwen.code.runtimebroker.RuntimeAttestation; +import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerService; +import com.alibaba.qwen.code.runtimebroker.RuntimeDrainReceipt; +import com.alibaba.qwen.code.runtimebroker.RuntimeLease; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.RuntimePublicationGrant; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.RuntimeSession; +import com.alibaba.qwen.code.runtimebroker.RuntimeTransport; +import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; +import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; import com.alibaba.qwen.code.runtimebroker.managedworkspace.ContextBinding; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; import com.sun.net.httpserver.HttpServer; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledOnOs; +import org.junit.jupiter.api.condition.EnabledIfSystemProperty; +import org.junit.jupiter.api.condition.OS; +import org.junit.jupiter.api.io.TempDir; + import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; @@ -29,13 +50,12 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.DisabledOnOs; -import org.junit.jupiter.api.condition.EnabledIfSystemProperty; -import org.junit.jupiter.api.condition.OS; -import org.junit.jupiter.api.io.TempDir; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** Opt-in loopback SSH acceptance using private keys, real bootstrap and real HTTP workers. */ @DisabledOnOs(OS.WINDOWS) diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/SshRuntimeProvisionerTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshRuntimeProvisionerTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/SshRuntimeProvisionerTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshRuntimeProvisionerTest.java index b6abdc4b7de..816a26c7a52 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/SshRuntimeProvisionerTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/SshRuntimeProvisionerTest.java @@ -1,12 +1,24 @@ -package com.alibaba.qwen.code.runtimebroker; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively; -import static org.junit.jupiter.api.Assertions.assertTrue; +package com.alibaba.qwen.code.runtimebroker.provisioning; +import com.alibaba.qwen.code.runtimebroker.InMemoryRuntimeBindingRepository; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeLease; +import com.alibaba.qwen.code.runtimebroker.RuntimeObservation; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.RuntimeResourceHandle; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; +import com.alibaba.qwen.code.runtimebroker.transport.HttpRuntimeTransport; import com.sun.net.httpserver.HttpServer; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledOnOs; +import org.junit.jupiter.api.condition.OS; +import org.junit.jupiter.api.io.TempDir; + import java.net.InetSocketAddress; import java.net.URI; import java.nio.file.Path; @@ -21,12 +33,12 @@ import java.util.concurrent.CompletionStage; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.DisabledOnOs; -import org.junit.jupiter.api.condition.OS; -import org.junit.jupiter.api.io.TempDir; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively; +import static org.junit.jupiter.api.Assertions.assertTrue; @DisabledOnOs(OS.WINDOWS) class SshRuntimeProvisionerTest { diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/WorkspaceFileProcessTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/WorkspaceFileProcessTest.java similarity index 92% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/WorkspaceFileProcessTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/WorkspaceFileProcessTest.java index 34916a53b16..17d8e2d2016 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/WorkspaceFileProcessTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/provisioning/WorkspaceFileProcessTest.java @@ -1,5 +1,7 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.provisioning; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/AesGcmSecretProtectorTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/security/AesGcmSecretProtectorTest.java similarity index 99% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/AesGcmSecretProtectorTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/security/AesGcmSecretProtectorTest.java index 696b76d95ca..fa8141f7361 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/AesGcmSecretProtectorTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/security/AesGcmSecretProtectorTest.java @@ -1,4 +1,12 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.security; + +import org.junit.jupiter.api.Test; + +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Base64; +import java.util.Locale; +import java.util.Map; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -7,13 +15,6 @@ import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Base64; -import java.util.Locale; -import java.util.Map; -import org.junit.jupiter.api.Test; - class AesGcmSecretProtectorTest { @Test void roundTripsWithoutEmbeddingThePlaintext() { diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/CsiFileHistoryProtocolTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/CsiFileHistoryProtocolTest.java similarity index 94% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/CsiFileHistoryProtocolTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/CsiFileHistoryProtocolTest.java index 2159f0003f2..48f7a7dad86 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/CsiFileHistoryProtocolTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/CsiFileHistoryProtocolTest.java @@ -1,13 +1,15 @@ -package com.alibaba.qwen.code.runtimebroker; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertThrows; +package com.alibaba.qwen.code.runtimebroker.transport; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; + import java.nio.file.Path; import java.util.LinkedHashMap; import java.util.Map; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; class CsiFileHistoryProtocolTest { @Test diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/CsiNativeReadbackProtocolTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/CsiNativeReadbackProtocolTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/CsiNativeReadbackProtocolTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/CsiNativeReadbackProtocolTest.java index 51e5c75a54a..ecdce555a4e 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/CsiNativeReadbackProtocolTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/CsiNativeReadbackProtocolTest.java @@ -1,17 +1,20 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.transport; + +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import org.junit.jupiter.api.Test; + +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.charset.StandardCharsets; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import org.junit.jupiter.api.Test; - -class CsiNativeReadbackProtocolTest { +public class CsiNativeReadbackProtocolTest { @Test void sharesAllThreeClosedActionsAndTheNullablePreparedRule() throws Exception { var fixture = JsonCodec.parseObject(Files.readAllBytes(Path.of( @@ -112,7 +115,7 @@ class CsiNativeReadbackProtocolTest { assertThrows(IllegalArgumentException.class, () -> CsiNativeReadbackProtocol.executeResult(JsonCodec.encode(response), request)); } - static Map executionResult(String text) { + public static Map executionResult(String text) { return Map.of("executionStatus", "success", "responseParts", List.of(Map.of("text", text))); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/HttpRuntimeTransportTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/HttpRuntimeTransportTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/HttpRuntimeTransportTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/HttpRuntimeTransportTest.java index 467e7c00f10..d1556e365a4 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/HttpRuntimeTransportTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/HttpRuntimeTransportTest.java @@ -1,22 +1,41 @@ -package com.alibaba.qwen.code.runtimebroker; - -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertInstanceOf; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +package com.alibaba.qwen.code.runtimebroker.transport; +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.InMemoryRuntimeBindingRepository; +import com.alibaba.qwen.code.runtimebroker.InMemoryRuntimeSessionRepository; +import com.alibaba.qwen.code.runtimebroker.InMemoryToolExecutionRepository; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import com.alibaba.qwen.code.runtimebroker.RuntimeAttestation; +import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerTestAccess; +import com.alibaba.qwen.code.runtimebroker.RuntimeLease; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisioner; +import com.alibaba.qwen.code.runtimebroker.RuntimeResourceHandle; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.RuntimeSession; +import com.alibaba.qwen.code.runtimebroker.RuntimeSessionRecord; +import com.alibaba.qwen.code.runtimebroker.RuntimeTransport; +import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocol; +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocolTest; +import com.alibaba.qwen.code.runtimebroker.provisioning.ProviderRuntimeProtocol; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpServer; -import java.io.IOException; -import java.io.OutputStream; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStreamReader; +import java.io.OutputStream; import java.math.BigDecimal; import java.net.InetSocketAddress; import java.net.URI; @@ -42,10 +61,14 @@ import java.util.concurrent.Flow; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.Assumptions; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class HttpRuntimeTransportTest { private static final ObjectMapper JSON = new ObjectMapper(); @@ -588,7 +611,7 @@ class HttpRuntimeTransportTest { exchange.close(); }); stalled.start(); - HttpRuntimeTransport impatient = new HttpRuntimeTransport( + HttpRuntimeTransport impatient = HttpRuntimeTransportTestAccess.create( HttpClient.newHttpClient(), Duration.ofMillis(300)); JsonNode identity = suite.required("identity"); RuntimeScope scope = new RuntimeScope( @@ -664,7 +687,7 @@ class HttpRuntimeTransportTest { }); drip.start(); try { - HttpRuntimeTransport client = new HttpRuntimeTransport( + HttpRuntimeTransport client = HttpRuntimeTransportTestAccess.create( HttpClient.newBuilder() .version(HttpClient.Version.HTTP_1_1).build(), Duration.ofMillis(callerCancels ? 10_000 : 300)); @@ -991,7 +1014,7 @@ class HttpRuntimeTransportTest { var sessions = new InMemoryRuntimeSessionRepository(); var executions = new InMemoryToolExecutionRepository(clock); RuntimeProvisioner provisioner = request -> CompletableFuture.completedFuture(lease); - try (var service = new RuntimeBrokerService(harness -> CompletableFuture.completedFuture(scope), + try (var service = RuntimeBrokerTestAccess.service(harness -> CompletableFuture.completedFuture(scope), provisioner, transport, bindings, sessions, executions, "size-probe", Duration.ofMinutes(1), Duration.ofMinutes(1), clock, () -> "size-probe-execution")) { service.acquire(session.getHarnessSessionId(), session.getRuntimeSessionId(), "bootstrap").toCompletableFuture().join(); diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/HttpRuntimeTransportTestAccess.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/HttpRuntimeTransportTestAccess.java new file mode 100644 index 00000000000..f33724cdcbc --- /dev/null +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/HttpRuntimeTransportTestAccess.java @@ -0,0 +1,13 @@ +package com.alibaba.qwen.code.runtimebroker.transport; + +import java.net.http.HttpClient; +import java.time.Duration; + +public final class HttpRuntimeTransportTestAccess { + private HttpRuntimeTransportTestAccess() { + } + + public static HttpRuntimeTransport create(HttpClient client, Duration timeout) { + return new HttpRuntimeTransport(client, timeout); + } +} diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiAcknowledgementHttpTransportTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedCsiAcknowledgementHttpTransportTest.java similarity index 97% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiAcknowledgementHttpTransportTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedCsiAcknowledgementHttpTransportTest.java index 2bfa2064e98..3fa6e8b7b84 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiAcknowledgementHttpTransportTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedCsiAcknowledgementHttpTransportTest.java @@ -1,23 +1,26 @@ -package com.alibaba.qwen.code.runtimebroker; - -import static com.alibaba.qwen.code.runtimebroker.ManagedCsiAcknowledgementProtocolTest.fixtures; -import static com.alibaba.qwen.code.runtimebroker.ManagedCsiAcknowledgementProtocolTest.map; -import static com.alibaba.qwen.code.runtimebroker.ManagedCsiAcknowledgementProtocolTest.with; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertInstanceOf; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +package com.alibaba.qwen.code.runtimebroker.transport; +import com.alibaba.qwen.code.runtimebroker.JsonCodec; +import com.alibaba.qwen.code.runtimebroker.ManagedCsiAcknowledgementProtocolTest; +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeLease; +import com.alibaba.qwen.code.runtimebroker.RuntimeSession; +import com.alibaba.qwen.code.runtimebroker.RuntimeTransport; import com.sun.net.httpserver.HttpServer; -import java.net.InetSocketAddress; -import java.net.URI; +import org.junit.jupiter.api.Test; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLParameters; + +import java.math.BigDecimal; import java.net.Authenticator; import java.net.CookieHandler; +import java.net.InetSocketAddress; import java.net.ProxySelector; +import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; -import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.time.Duration; import java.util.List; @@ -32,9 +35,14 @@ import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLParameters; -import org.junit.jupiter.api.Test; + +import static com.alibaba.qwen.code.runtimebroker.ManagedCsiAcknowledgementProtocolTest.fixtures; +import static com.alibaba.qwen.code.runtimebroker.ManagedCsiAcknowledgementProtocolTest.map; +import static com.alibaba.qwen.code.runtimebroker.ManagedCsiAcknowledgementProtocolTest.with; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class ManagedCsiAcknowledgementHttpTransportTest { @Test diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiFilesProtocolTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedCsiFilesProtocolTest.java similarity index 89% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiFilesProtocolTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedCsiFilesProtocolTest.java index 7edd6723a43..61d8c1030cf 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiFilesProtocolTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedCsiFilesProtocolTest.java @@ -1,24 +1,32 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.transport; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import com.alibaba.qwen.code.runtimebroker.BrokerValues; +import com.alibaba.qwen.code.runtimebroker.CsiFilesRetirementProfile; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionRequest; +import com.alibaba.qwen.code.runtimebroker.RuntimeProvisionSeed; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.WorkspaceExecutionProfile; +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocol; +import org.junit.jupiter.api.Test; import java.nio.file.Files; import java.nio.file.Path; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import org.junit.jupiter.api.Test; -class ManagedCsiFilesProtocolTest { - static Map fixtures() throws Exception { +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class ManagedCsiFilesProtocolTest { + public static Map fixtures() throws Exception { return ManagedCsiFilesProtocol.parse(Files.readAllBytes( Path.of("../cli/src/serve/contracts/managed-csi-files-v2.fixtures.json"))); } - static RuntimeProvisionRequest request(Map fixture) { + public static RuntimeProvisionRequest request(Map fixture) { var boot = map(fixture.get("boot")); var context = map(boot.get("context")); return new RuntimeProvisionRequest(new RuntimeScope((String) context.get("tenantId"), @@ -27,7 +35,7 @@ class ManagedCsiFilesProtocolTest { (String) map(boot.get("identity")).get("sessionId"), "kubernetes-workspace", (String) context.get("storageId")); } - static RuntimeProvisionSeed seed(Map fixture) { + public static RuntimeProvisionSeed seed(Map fixture) { var context = map(map(fixture.get("boot")).get("context")); return new RuntimeProvisionSeed((String) context.get("provisionRequestId"), (String) context.get("runtimeInstanceId"), (String) context.get("runtimeIncarnation"), (String) context.get("leaseId"), BrokerValues.exactLong(context.get("epoch")), @@ -124,7 +132,7 @@ class ManagedCsiFilesProtocolTest { } @SuppressWarnings("unchecked") - static Map map(Object value) { + public static Map map(Object value) { return (Map) value; } } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiProtocolTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedCsiProtocolTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiProtocolTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedCsiProtocolTest.java index f949bc2c19a..1c2c0244590 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedCsiProtocolTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedCsiProtocolTest.java @@ -1,13 +1,15 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.transport; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; +import com.alibaba.qwen.code.runtimebroker.provisioning.ManagedContextProtocol; +import org.junit.jupiter.api.Test; import java.nio.file.Files; import java.nio.file.Path; import java.util.Map; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; class ManagedCsiProtocolTest { @Test diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedExtensionExecutionContractTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedExtensionExecutionContractTest.java similarity index 96% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedExtensionExecutionContractTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedExtensionExecutionContractTest.java index 112eec153cc..bd7a9d0291c 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedExtensionExecutionContractTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedExtensionExecutionContractTest.java @@ -1,15 +1,17 @@ -package com.alibaba.qwen.code.runtimebroker; - -import static org.junit.jupiter.api.Assertions.assertEquals; +package com.alibaba.qwen.code.runtimebroker.transport; +import com.alibaba.qwen.code.runtimebroker.ToolExecutionRecord; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.EnumSet; import java.util.Set; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Pins what the Broker's HTTP API reports for each execution state to the diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedMonitorProtocolTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedMonitorProtocolTest.java similarity index 93% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedMonitorProtocolTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedMonitorProtocolTest.java index 9e44a4f07e5..e1184b8e56b 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedMonitorProtocolTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedMonitorProtocolTest.java @@ -1,8 +1,13 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.transport; + +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.RuntimeSession; +import org.junit.jupiter.api.Test; import java.nio.charset.StandardCharsets; import java.util.Map; -import org.junit.jupiter.api.Test; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedRuntimeAttestationConformanceTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedRuntimeAttestationConformanceTest.java similarity index 98% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedRuntimeAttestationConformanceTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedRuntimeAttestationConformanceTest.java index 19172716977..45022b9a5b8 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedRuntimeAttestationConformanceTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedRuntimeAttestationConformanceTest.java @@ -1,20 +1,21 @@ -package com.alibaba.qwen.code.runtimebroker; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; +package com.alibaba.qwen.code.runtimebroker.transport; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.HashSet; import java.util.Map; import java.util.Set; -import org.junit.jupiter.api.Test; -class ManagedRuntimeAttestationConformanceTest { +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class ManagedRuntimeAttestationConformanceTest { private static final ObjectMapper JSON = new ObjectMapper(); private static final Path CONTRACT_DIR = findContractDirectory(); private static final Path FIXTURES = CONTRACT_DIR.resolve( @@ -218,7 +219,7 @@ class ManagedRuntimeAttestationConformanceTest { return JSON.readTree(path.toFile()); } - static Path contractDirectory() { + public static Path contractDirectory() { return findContractDirectory(); } diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedShellProtocolTest.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedShellProtocolTest.java similarity index 92% rename from packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedShellProtocolTest.java rename to packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedShellProtocolTest.java index 44dae2c19df..4e59e7b7502 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/ManagedShellProtocolTest.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/code/runtimebroker/transport/ManagedShellProtocolTest.java @@ -1,8 +1,13 @@ -package com.alibaba.qwen.code.runtimebroker; +package com.alibaba.qwen.code.runtimebroker.transport; + +import com.alibaba.qwen.code.runtimebroker.RuntimeBrokerException; +import com.alibaba.qwen.code.runtimebroker.RuntimeScope; +import com.alibaba.qwen.code.runtimebroker.RuntimeSession; +import org.junit.jupiter.api.Test; import java.nio.charset.StandardCharsets; import java.util.Map; -import org.junit.jupiter.api.Test; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/managedprobes/PublicationProbeWiring.java b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/managedprobes/PublicationProbeWiring.java index 1c6a56a0a80..cb4af2e36b0 100644 --- a/packages/managed-agent-server/src/test/java/com/alibaba/qwen/managedprobes/PublicationProbeWiring.java +++ b/packages/managed-agent-server/src/test/java/com/alibaba/qwen/managedprobes/PublicationProbeWiring.java @@ -1,13 +1,13 @@ package com.alibaba.qwen.managedprobes; import com.alibaba.qwen.code.managedagent.api.ToolPublicationController; +import com.alibaba.qwen.code.managedagent.artifact.ToolPublicationObjectStore; import com.alibaba.qwen.code.managedagent.config.ManagedAgentProperties; -import com.alibaba.qwen.code.managedagent.store.ManagedSessionStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationAdmissionStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationContract; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationDataStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationObjectStore; -import com.alibaba.qwen.code.managedagent.store.ToolPublicationStore; +import com.alibaba.qwen.code.managedagent.persistence.ManagedSessionStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationAdmissionStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationContract; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationDataStore; +import com.alibaba.qwen.code.managedagent.persistence.ToolPublicationStore; import com.alibaba.qwen.code.runtimebroker.RuntimeBindingRepository; import com.alibaba.qwen.code.runtimebroker.ToolExecutionRepository; import org.springframework.context.annotation.Bean; diff --git a/scripts/run-managed-agent-server-e2e.ts b/scripts/run-managed-agent-server-e2e.ts index 677c95e06ba..7288e858116 100644 --- a/scripts/run-managed-agent-server-e2e.ts +++ b/scripts/run-managed-agent-server-e2e.ts @@ -1415,7 +1415,7 @@ try { [ '-cp', springJar, - '-Dloader.main=com.alibaba.qwen.code.managedagent.store.WorkspaceStorageRegistrationMain', + '-Dloader.main=com.alibaba.qwen.code.managedagent.persistence.WorkspaceStorageRegistrationMain', 'org.springframework.boot.loader.launch.PropertiesLauncher', 'register', tenant, diff --git a/scripts/tests/managed-agent-server-e2e.test.js b/scripts/tests/managed-agent-server-e2e.test.js index 4775e760fce..6427bda901d 100644 --- a/scripts/tests/managed-agent-server-e2e.test.js +++ b/scripts/tests/managed-agent-server-e2e.test.js @@ -385,7 +385,7 @@ describe('managed-agent-server e2e runner', () => { expect(source).toContain(`'${refusal}'`); expect( read( - 'packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/store/ManagedSessionStore.java', + 'packages/managed-agent-server/src/main/java/com/alibaba/qwen/code/managedagent/persistence/ManagedSessionStore.java', ), ).toContain(`"${refusal}."`); const writerBefore = source.indexOf(