diff --git a/CHANGELOG.md b/CHANGELOG.md index 679db26..fc43a1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,13 +2,17 @@ ## [Unreleased] +### Removed + +- Remove the deprecated Managed `skills().update(...)` API and `managed.SkillUpdateParams` from the 0.2.0 candidate, including asynchronous and `withResponse()` variants. Use `skills().versions().create(...)` for Skill content updates; it does not replace Skill metadata updates. Forward Skill APIs are unchanged. + ## [0.2.0] - 2026-10-29 Bring Forward additions and Managed API support together in one Java 8 compatible release. ### Added -- Add `ManagedClient` / `AsyncManagedClient` and 108 documented Managed operations: Agents and versions, Deployments and Runs, Sessions/Threads/events/resources, Environments/self-hosted Work, Files, Skills/Versions, Vaults/Credentials/OAuth, Memory Stores, Models and Dreams. +- Add `ManagedClient` / `AsyncManagedClient` and 107 documented Managed operations: Agents and versions, Deployments and Runs, Sessions/Threads/events/resources, Environments/self-hosted Work, Files, Skills/Versions, Vaults/Credentials/OAuth, Memory Stores, Models and Dreams. - Add typed Managed budget and Credits, Agent runtime patches, versioned multiagent references, OSS storage, repository resources and exact Session provenance markers. Preserve null/omitted values and unknown response fields; retain POST search filters and opaque cursors. - Add Managed independent JAR examples, opt-in CN/Global PAT/SA integration groups, official-response contract fixtures and API coverage documentation. - Add typed synchronous/asynchronous Forward resource Search for Environments, Files, Skills and Vaults, retaining body filters, Identity query scope and Beta selectors across cursor pages. diff --git a/README.md b/README.md index 2487ba0..c9b08c3 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Version **0.2.0** supports both the **Forward API** and the **[Managed API](docs See the [Forward](docs/forward-api-coverage.md) and [Managed](docs/managed-api-coverage.md) coverage inventories and resource guides for the supported operations. -The [0.2.0 changelog](CHANGELOG.md) covers Forward Search, Dreams, Decisions, pairing management, contract updates, Session creation metadata, Webhooks, client extensions and 108 Managed operations. See the [Forward migration guide](docs/forward-parity.md) for the rubric field and reserved metadata changes. +The [0.2.0 changelog](CHANGELOG.md) covers Forward Search, Dreams, Decisions, pairing management, contract updates, Session creation metadata, Webhooks, client extensions and 107 Managed operations. See the [Forward migration guide](docs/forward-parity.md) for the rubric field and reserved metadata changes. - [Installation](#installation) - [Quick start](#quick-start) diff --git a/docs/forward-api-coverage.md b/docs/forward-api-coverage.md index afd412e..97bb9d7 100644 --- a/docs/forward-api-coverage.md +++ b/docs/forward-api-coverage.md @@ -1,6 +1,6 @@ # Forward API 覆盖基线 -契约核对:2026-10-28。**0.2.0** 覆盖 **146 个 HTTP 操作及 Realtime WebSocket**:首版 123 项、Webhook 8 项、Forward Search / Dream / Pairing / Decision 15 项。同一版本还提供 [108 个 Managed 操作](managed-api-coverage.md)。离线验证与真实环境验收分别记录,不能把操作覆盖数当作线上通过率。 +契约核对:2026-10-28。**0.2.0** 覆盖 **146 个 HTTP 操作及 Realtime WebSocket**:首版 123 项、Webhook 8 项、Forward Search / Dream / Pairing / Decision 15 项。同一版本还提供 [107 个 Managed 操作](managed-api-coverage.md)。离线验证与真实环境验收分别记录,不能把操作覆盖数当作线上通过率。 HTTP BaseURL 为 CN `https://api.qoder.com.cn/api/v1/forward` 或 Global `https://api.qoder.com/api/v1/forward`;表内路径均相对于 BaseURL。 diff --git a/docs/managed-api-coverage.md b/docs/managed-api-coverage.md index 6d9f92d..9743b64 100644 --- a/docs/managed-api-coverage.md +++ b/docs/managed-api-coverage.md @@ -1,10 +1,10 @@ # Managed API 覆盖基线 -契约核对:2026-10-28。**0.2.0** 与 Forward 更新一起提供 **108 个 Managed 协议操作:106 个普通 HTTP 操作、2 个 SSE 操作**。同步/异步/响应封装只计一个操作;0.1.0 不包含本表能力。 +契约核对:2026-10-28;接口清单更新:2026-10-29。**0.2.0** 与 Forward 更新一起提供 **107 个 Managed 协议操作:105 个普通 HTTP 操作、2 个 SSE 操作**。同步/异步/响应封装只计一个操作;0.1.0 不包含本表能力。 Base URL:CN `https://api.qoder.com.cn/api/v1/cloud`,Global `https://api.qoder.com/api/v1/cloud`。使用方法见 [Managed 指南](managed.md);验收范围见 [真实环境测试](managed-live-testing.md)。接口存在与离线通过不等于线上权限或执行结果已验证。 -OAuth 的浏览器重定向快捷入口 `/oauth/authorize` 不是 SDK JSON 方法;SDK 使用 `/oauth/start` 返回授权 URL。Forward 专用 Webhook、Identity、Channel 等不属于 Managed API。 +OAuth 的浏览器重定向快捷入口 `/oauth/authorize` 不是 SDK JSON 方法;SDK 使用 `/oauth/start` 返回授权 URL。Forward 专用 Webhook、Identity、Channel 等不属于 Managed API。已弃用的 `PUT /skills/{skill_id}` 不提供 SDK 方法;更新 Skill 内容请使用 `skills().versions().create(...)`,该方法不替代 Skill metadata 更新。 | # | Java 资源方法 | HTTP | 相对路径 | 官方文档 | | ---: | --- | --- | --- | --- | @@ -101,18 +101,17 @@ OAuth 的浏览器重定向快捷入口 `/oauth/authorize` 不是 SDK JSON 方 | 91 | `skills().versions().list(...)` | `GET` | `/skills/{skill_id}/versions` | [文档](https://docs.qoder.com/cloud-agents/api/skills/list-versions) | | 92 | `skills().list(...)` | `GET` | `/skills` | [文档](https://docs.qoder.com/cloud-agents/api/skills/list) | | 93 | `skills().search(...)` | `POST` | `/skills/search` | [文档](https://docs.qoder.com/cloud-agents/api/skills/search) | -| 94 | `skills().update(...)` | `PUT` | `/skills/{skill_id}` | [文档](https://docs.qoder.com/cloud-agents/api/skills/update) | -| 95 | `vaults().credentials().archive(...)` | `POST` | `/vaults/{vault_id}/credentials/{credential_id}/archive` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/archive-credential) | -| 96 | `vaults().archive(...)` | `POST` | `/vaults/{vault_id}/archive` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/archive) | -| 97 | `vaults().credentials().create(...)` | `POST` | `/vaults/{vault_id}/credentials` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/create-credential) | -| 98 | `vaults().create(...)` | `POST` | `/vaults` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/create) | -| 99 | `vaults().credentials().delete(...)` | `DELETE` | `/vaults/{vault_id}/credentials/{credential_id}` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/delete-credential) | -| 100 | `vaults().delete(...)` | `DELETE` | `/vaults/{vault_id}` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/delete) | -| 101 | `vaults().credentials().retrieve(...)` | `GET` | `/vaults/{vault_id}/credentials/{credential_id}` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/get-credential) | -| 102 | `vaults().retrieve(...)` | `GET` | `/vaults/{vault_id}` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/get) | -| 103 | `vaults().credentials().list(...)` | `GET` | `/vaults/{vault_id}/credentials` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/list-credentials) | -| 104 | `vaults().list(...)` | `GET` | `/vaults` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/list) | -| 105 | `vaults().search(...)` | `POST` | `/vaults/search` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/search) | -| 106 | `oauth().start(...)` | `POST` | `/oauth/start` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/start-oauth) | -| 107 | `vaults().credentials().update(...)` | `POST` | `/vaults/{vault_id}/credentials/{credential_id}` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/update-credential) | -| 108 | `vaults().credentials().validate(...)` | `POST` | `/vaults/{vault_id}/credentials/{credential_id}/mcp_oauth_validate` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/validate-credential) | +| 94 | `vaults().credentials().archive(...)` | `POST` | `/vaults/{vault_id}/credentials/{credential_id}/archive` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/archive-credential) | +| 95 | `vaults().archive(...)` | `POST` | `/vaults/{vault_id}/archive` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/archive) | +| 96 | `vaults().credentials().create(...)` | `POST` | `/vaults/{vault_id}/credentials` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/create-credential) | +| 97 | `vaults().create(...)` | `POST` | `/vaults` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/create) | +| 98 | `vaults().credentials().delete(...)` | `DELETE` | `/vaults/{vault_id}/credentials/{credential_id}` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/delete-credential) | +| 99 | `vaults().delete(...)` | `DELETE` | `/vaults/{vault_id}` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/delete) | +| 100 | `vaults().credentials().retrieve(...)` | `GET` | `/vaults/{vault_id}/credentials/{credential_id}` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/get-credential) | +| 101 | `vaults().retrieve(...)` | `GET` | `/vaults/{vault_id}` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/get) | +| 102 | `vaults().credentials().list(...)` | `GET` | `/vaults/{vault_id}/credentials` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/list-credentials) | +| 103 | `vaults().list(...)` | `GET` | `/vaults` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/list) | +| 104 | `vaults().search(...)` | `POST` | `/vaults/search` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/search) | +| 105 | `oauth().start(...)` | `POST` | `/oauth/start` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/start-oauth) | +| 106 | `vaults().credentials().update(...)` | `POST` | `/vaults/{vault_id}/credentials/{credential_id}` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/update-credential) | +| 107 | `vaults().credentials().validate(...)` | `POST` | `/vaults/{vault_id}/credentials/{credential_id}/mcp_oauth_validate` | [文档](https://docs.qoder.com/cloud-agents/api/vaults/validate-credential) | diff --git a/docs/managed-live-testing.md b/docs/managed-live-testing.md index bd65639..fc973aa 100644 --- a/docs/managed-live-testing.md +++ b/docs/managed-live-testing.md @@ -23,6 +23,6 @@ export QODER_RUN_LIVE=true 每次 HTTP 请求最长 120 秒;模型回复只发一条短消息。记录方法、路径、状态和请求/资源 ID,日志不打印请求体、密钥、完整 URL query 或模型文本。失败退出非零,清理单独尝试并记录 `cleanup_failed`,不会掩盖业务异常。外部运行器应为每个分组设置进程超时,并保留首轮、后续复验及未清理资源记录。 -需要分别记录 CN/Global × PAT/SA 的结果。五个 JDK 的离线回归不能代替真实链路结果。当前测试入口不是 108 项逐接口线上覆盖:OAuth 用户授权、OSS 挂载、Dream 模型执行、长稳及故障注入需专用配置和单独验收。已有 Forward 内网测试不会自动执行本入口;同步内部控制脚本时要显式加入相应分组,默认 `promote=false`。 +需要分别记录 CN/Global × PAT/SA 的结果。五个 JDK 的离线回归不能代替真实链路结果。当前测试入口不是 107 项逐接口线上覆盖:OAuth 用户授权、OSS 挂载、Dream 模型执行、长稳及故障注入需专用配置和单独验收。已有 Forward 内网测试不会自动执行本入口;同步内部控制脚本时要显式加入相应分组,默认 `promote=false`。 上传文件不一定可下载;当响应 `downloadable=false` 时,资源分组检查 `/content` 返回官方规定的 403,并明确记录该路径未进行实际文件传输。Work 的 `block_ms` 必须在 1–999 之间;当前示例使用 999。 diff --git a/docs/managed.md b/docs/managed.md index 940f281..af5331f 100644 --- a/docs/managed.md +++ b/docs/managed.md @@ -1,6 +1,6 @@ # Managed API -Managed support is included with the Forward additions in **0.2.0**. The [coverage inventory](managed-api-coverage.md) records 108 documented operations, including two SSE endpoints, checked against the [official documentation](https://docs.qoder.com/cloud-agents/overview) on 2026-10-28. +Managed support is included with the Forward additions in **0.2.0**. The [coverage inventory](managed-api-coverage.md) records 107 documented operations, including two SSE endpoints, checked against the [official documentation](https://docs.qoder.com/cloud-agents/overview) on 2026-10-28. ## Client and authentication @@ -85,12 +85,12 @@ Cursor lists retain supported filters and request options; `getNextPageAsync()` - `deployments()` supports create/retrieve/update/list/search, pause/unpause/archive and manual run. Omit `schedule` for manual-only execution. Use `deployments().runs()` for scoped runs and `deploymentRuns()` for global runs. - `environments().work()` supports poll, ack, heartbeat, retrieve/list/stats, metadata update and stop for self-hosted environments. Poll may return null. Heartbeat parameters go in the query. Supply `Worker-ID` through `RequestOptions.header(...)`. Poll/ack/heartbeat are never automatically retried because they claim or advance a lease. - Environment storage supports typed OSS buckets, RAM roles and access-key credentials. Set `x-qoder-beta: oss-bucket-2026-09-23` explicitly when required by the [storage contract](https://docs.qoder.com/cloud-agents/api/environments/schemas). No dedicated OSS live configuration is included in the test suite. -- Files support multipart upload, metadata, search, URL retrieval and isolated streaming download. Skill creation accepts `displayTitle`, repeatable files and metadata; Skill Versions support immutable upload/retrieve/list/delete and ZIP download. The deprecated Skill PUT update remains available for compatibility. +- Files support multipart upload, metadata, search, URL retrieval and isolated streaming download. Skill creation accepts `displayTitle`, repeatable files and metadata; Skill Versions support immutable upload/retrieve/list/delete and ZIP download. The deprecated Skill PUT update is not exposed. Use `skills().versions().create(...)` for content updates; version creation does not replace Skill metadata updates. - Vaults support archives and credential CRUD/archive/validation. `oauth().start(...)` sends optional client secrets in the JSON body and returns `authorizationUrl`, `state` and `callbackOrigin`. User authorization still happens at the provider. Credential updates, OAuth startup and validation disable automatic retries to avoid replaying token rotations or OAuth state changes. - Dream inputs support a single primary Memory Store plus optional Session IDs. Forward's `identity_template` input does not apply to Managed. `Dream.sessionId()` exposes the execution Session when available. ## Verification and release -The offline suite tests all 106 HTTP operations in four call styles, both SSE routes, exact wire placement, pagination, metadata/budget semantics, and response examples from the official docs. The independent examples project compiles and tests against the installed JAR. Run [the opt-in Managed integration entry](managed-live-testing.md) separately; offline coverage is not a claim that all operations passed against production. +The offline suite tests all 105 HTTP operations in four call styles, both SSE routes, exact wire placement, pagination, metadata/budget semantics, and response examples from the official docs. The independent examples project compiles and tests against the installed JAR. Run [the opt-in Managed integration entry](managed-live-testing.md) separately; offline coverage is not a claim that all operations passed against production. Forward and Managed are delivered together in 0.2.0. Before publishing, run internal integration tests from the merged version commit and accept that build's QA package; results from an earlier development package do not replace version-package acceptance. diff --git a/examples/src/test/java/com/qoder/cloudagents/examples/ManagedConsumerTest.java b/examples/src/test/java/com/qoder/cloudagents/examples/ManagedConsumerTest.java index b77dd17..8d369e8 100644 --- a/examples/src/test/java/com/qoder/cloudagents/examples/ManagedConsumerTest.java +++ b/examples/src/test/java/com/qoder/cloudagents/examples/ManagedConsumerTest.java @@ -15,6 +15,22 @@ @Timeout(15) class ManagedConsumerTest { + @Test + void packagedManagedSkillsExcludeTheDeprecatedUpdateApi() { + for (Class service : + Arrays.asList( + Skills.class, + AsyncSkills.class, + Skills.WithResponse.class, + AsyncSkills.WithResponse.class)) + assertFalse( + Arrays.stream(service.getMethods()).anyMatch(method -> "update".equals(method.getName())), + service.getName()); + assertThrows( + ClassNotFoundException.class, + () -> Class.forName("com.qoder.cloudagents.managed.SkillUpdateParams")); + } + @Test void compiledConsumerUsesJarAndCreatesBudgetedSession() throws Exception { assertTrue( diff --git a/src/main/java/com/qoder/cloudagents/managed/AsyncSkills.java b/src/main/java/com/qoder/cloudagents/managed/AsyncSkills.java index 407b49f..52c5e6c 100644 --- a/src/main/java/com/qoder/cloudagents/managed/AsyncSkills.java +++ b/src/main/java/com/qoder/cloudagents/managed/AsyncSkills.java @@ -58,23 +58,6 @@ public CompletableFuture retrieve( return Futures.map(withResponse().retrieve(skillId, params, options), ApiResponse::data); } - /** - * @deprecated Append an immutable Skill version instead. - */ - @Deprecated - public CompletableFuture update(String skillId, SkillUpdateParams params) { - return update(skillId, params, RequestOptions.DEFAULT); - } - - /** - * @deprecated Append an immutable Skill version instead. - */ - @Deprecated - public CompletableFuture update( - String skillId, SkillUpdateParams params, RequestOptions options) { - return Futures.map(withResponse().update(skillId, params, options), ApiResponse::data); - } - public CompletableFuture delete(String skillId) { return delete(skillId, RequestOptions.DEFAULT); } @@ -205,32 +188,6 @@ public CompletableFuture> retrieve( r -> r.map(v -> new Skill(v, r.requestId()))); } - /** - * @deprecated Append an immutable Skill version instead. - */ - @Deprecated - public CompletableFuture> update(String skillId, SkillUpdateParams params) { - return update(skillId, params, RequestOptions.DEFAULT); - } - - /** - * @deprecated Append an immutable Skill version instead. - */ - @Deprecated - public CompletableFuture> update( - String skillId, SkillUpdateParams params, RequestOptions options) { - if (params == null) throw new ConfigurationException("Request parameters are required"); - return Futures.map( - engine.request( - "PUT", - new String[] {"skills", skillId}, - Collections.emptyMap(), - params.toJsonValue(), - true, - options), - r -> r.map(v -> new Skill(v, r.requestId()))); - } - public CompletableFuture> delete(String skillId) { return delete(skillId, RequestOptions.DEFAULT); } diff --git a/src/main/java/com/qoder/cloudagents/managed/SkillUpdateParams.java b/src/main/java/com/qoder/cloudagents/managed/SkillUpdateParams.java deleted file mode 100644 index 0aa02ca..0000000 --- a/src/main/java/com/qoder/cloudagents/managed/SkillUpdateParams.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.qoder.cloudagents.managed; - -import com.qoder.cloudagents.core.*; -import java.util.*; - -/** Immutable JSON configuration; unknown fields are preserved. */ -public final class SkillUpdateParams extends JsonObject { - private SkillUpdateParams(JsonValue value) { - super(value); - } - - public static SkillUpdateParams fromJson(JsonValue value) { - return new SkillUpdateParams(value); - } - - public String name() { - return optional("name", JsonValue::asString); - } - - public String description() { - return optional("description", JsonValue::asString); - } - - public String content() { - return optional("content", JsonValue::asString); - } - - public String contentEncoding() { - return optional("content_encoding", JsonValue::asString); - } - - public Map metadata() { - return optionalNullableMap("metadata", JsonValue::asString); - } - - public static Builder builder() { - return new Builder(); - } - - public static final class Builder extends JsonObjectBuilder { - private Builder() {} - - public Builder name(String value) { - return put("name", value); - } - - public Builder description(String value) { - return put("description", value); - } - - public Builder content(String value) { - return put("content", value); - } - - public Builder contentEncoding(String value) { - return put("content_encoding", value); - } - - public Builder metadata(Map value) { - return put("metadata", value); - } - - public SkillUpdateParams build() { - - return new SkillUpdateParams(json()); - } - } -} diff --git a/src/main/java/com/qoder/cloudagents/managed/Skills.java b/src/main/java/com/qoder/cloudagents/managed/Skills.java index e8bcfba..60a4dbb 100644 --- a/src/main/java/com/qoder/cloudagents/managed/Skills.java +++ b/src/main/java/com/qoder/cloudagents/managed/Skills.java @@ -55,22 +55,6 @@ public Skill retrieve(String skillId, SkillRetrieveParams params, RequestOptions return Futures.await(async.retrieve(skillId, params, options)); } - /** - * @deprecated Append an immutable Skill version instead. - */ - @Deprecated - public Skill update(String skillId, SkillUpdateParams params) { - return update(skillId, params, RequestOptions.DEFAULT); - } - - /** - * @deprecated Append an immutable Skill version instead. - */ - @Deprecated - public Skill update(String skillId, SkillUpdateParams params, RequestOptions options) { - return Futures.await(async.update(skillId, params, options)); - } - public DeletedSkill delete(String skillId) { return delete(skillId, RequestOptions.DEFAULT); } @@ -157,23 +141,6 @@ public ApiResponse retrieve( return Futures.await(async.withResponse().retrieve(skillId, params, options)); } - /** - * @deprecated Append an immutable Skill version instead. - */ - @Deprecated - public ApiResponse update(String skillId, SkillUpdateParams params) { - return update(skillId, params, RequestOptions.DEFAULT); - } - - /** - * @deprecated Append an immutable Skill version instead. - */ - @Deprecated - public ApiResponse update( - String skillId, SkillUpdateParams params, RequestOptions options) { - return Futures.await(async.withResponse().update(skillId, params, options)); - } - public ApiResponse delete(String skillId) { return delete(skillId, RequestOptions.DEFAULT); } diff --git a/src/test/resources/managed-documentation-responses.json b/src/test/resources/managed-documentation-responses.json index 8578558..d2cae1f 100644 --- a/src/test/resources/managed-documentation-responses.json +++ b/src/test/resources/managed-documentation-responses.json @@ -2034,24 +2034,6 @@ "has_more": false } }, - { - "source": "api__skills__update.md", - "model": "Skill", - "value": { - "id": "skill_019e3bba474b73cfaf19eae9b5f5e66d", - "type": "skill", - "display_title": "test-skill-api-doc", - "description": "Updated skill description", - "source": "custom", - "latest_version": "1759178010641129", - "metadata": { - "team": "docs", - "stage": "updated" - }, - "created_at": "2026-05-18T15:35:24.248164Z", - "updated_at": "2026-05-18T15:36:01.767469Z" - } - }, { "source": "api__vaults__archive-credential.md", "model": "VaultCredential", diff --git a/src/test/resources/managed-routes.json b/src/test/resources/managed-routes.json index eb108fa..8481894 100644 --- a/src/test/resources/managed-routes.json +++ b/src/test/resources/managed-routes.json @@ -2280,32 +2280,6 @@ "total": 0 } }, - { - "source": "https://docs.qoder.com/cloud-agents/api/skills/update", - "method": "PUT", - "path": "/api/v1/cloud/skills/segment_0%2Fencoded", - "resource": "skills", - "operation": "update", - "param": "SkillUpdateParams", - "mode": "body", - "ids": [ - "segment_0/encoded" - ], - "query": {}, - "query_types": {}, - "body": { - "metadata": { - "team": "sdk" - } - }, - "response": { - "id": "object_test", - "type": "test", - "future": { - "accepted": true - } - } - }, { "source": "https://docs.qoder.com/cloud-agents/api/vaults/archive-credential", "method": "POST",