Skip to content

Commit 8e5dd12

Browse files
authored
Merge pull request #177 from modelstudioai/feat/cma-command
Feat/cma command 补齐managed agent cli能力
2 parents 8880315 + 4f41eaa commit 8e5dd12

90 files changed

Lines changed: 9203 additions & 800 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,29 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and
66

77
[中文版](CHANGELOG.zh.md) · [README](README.md) · [Contributing](CONTRIBUTING.md)
88

9+
## [1.20.0] - 2026-09-03
10+
11+
> Managed Agents now combines YAML-first infrastructure management with direct Bailian AgentStudio resource and runtime operations.
12+
13+
### Added
14+
15+
- **Managed Agent API commands** — added direct list, get, search, version, upload, download, run, pause, archive, event, and diagnostic operations for Agents, Environments, Skills, Vaults, Deployments, Sessions, and Files.
16+
- **Scoped YAML-backed resource creation**`agent create`, `environment create`, `skill create`, `vault create`, `vault credential create`, and `deployment create` update `agents.yaml` and apply only the target resource without unrelated drift blocking the operation.
17+
- **Agent Skill attachment** — Agent creation supports existing custom or official Skill IDs as well as local Skill directories and ZIP archives.
18+
19+
### Changed
20+
21+
- **Bailian-only Managed Agent CLI**`bl managed-agent` now targets the Bailian provider exclusively; provider-selection flags were removed and configurations containing other providers are rejected.
22+
- **Runtime mutation confirmation** — Deployment run/pause/unpause, Session archive/delete, and File delete operations require explicit high-risk confirmation.
23+
24+
### Fixed
25+
26+
- **Managed Agent error reporting** — Apply and scoped-create failures preserve the underlying provider diagnostic instead of ending with only `Apply failed.`.
27+
28+
### Security
29+
30+
- Credentials are resolved in memory and removed from the process environment; Vault credential declarations reference environment variables without persisting plaintext secrets.
31+
932
## [1.19.0] - 2026-09-01
1033

1134
### Added

CHANGELOG.zh.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,29 @@
66

77
[English](CHANGELOG.md) · [README](README.zh.md) · [参与贡献](CONTRIBUTING.zh.md)
88

9+
## [1.20.0] - 2026-09-03
10+
11+
> Managed Agent 现在同时提供 YAML-first 基础设施管理与百炼 AgentStudio 资源、运行时 API 操作。
12+
13+
### 新增
14+
15+
- **Managed Agent API 命令** —— 新增 Agent、Environment、Skill、Vault、Deployment、Session 和 File 的列表、详情、搜索、版本、上传、下载、运行、暂停、归档、事件及诊断等操作。
16+
- **基于 YAML 的单资源创建** —— `agent create``environment create``skill create``vault create``vault credential create``deployment create` 会更新 `agents.yaml`,并且只 Apply 目标资源,不受无关资源 Drift 阻塞。
17+
- **Agent Skill 挂载** —— 创建 Agent 时支持引用已有的自定义或官方 Skill ID,也支持本地 Skill 目录和 ZIP 文件。
18+
19+
### 变更
20+
21+
- **Managed Agent CLI 限定为百炼 Provider** —— `bl managed-agent` 现在只面向百炼,移除 Provider 选择参数,并拒绝包含其他 Provider 的配置。
22+
- **运行时变更增加确认** —— Deployment 运行/暂停/恢复、Session 归档/删除以及 File 删除操作需要显式进行高风险确认。
23+
24+
### 修复
25+
26+
- **Managed Agent 错误输出** —— Apply 和单资源创建失败时会保留底层 Provider 的具体诊断,不再只显示 `Apply failed.`
27+
28+
### 安全
29+
30+
- 凭证仅在内存中解析并从进程环境清除;Vault Credential 声明通过环境变量引用 Secret,不会持久化明文。
31+
932
## [1.19.0] - 2026-09-01
1033

1134
### 新增

docs/agents/auth-change.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,19 @@ defineCommand({ auth }) → runtime/authStage → ctx.client → command.run(ctx
6262
`bl managed-agent *` 按调用链分两层:
6363

6464
- **离线命令**`init``validate``state list/show/rm`:`auth: "none"`,只读写本地文件,无需登录;引擎侧传 `credentials: "none"` 跳过凭证断言
65-
- **联网命令**`plan``apply``destroy``state import``skill-list`、全部 `session *`:统一声明 `auth: "apiKey"` 硬门禁 —— 无论目标 provider 是谁,authStage 都经 `resolveApiKey(sources)` 解析 bailian 凭证(flag > env > active profile config),缺失报统一 AUTH;引擎层 `assertProviderCredentials` 再对 agents.yaml 里**全部已声明 provider** 的空 key 拦截并给 provider 专属 hint。例外:`plan --no-refresh` / `plan --dry-run``credentials: "none"` 并强制 `refresh: false`(不联网、不回写 state,不查 provider key),其中 `--dry-run` 连登录也不要求(authStage 的 dry-run 豁免),`--no-refresh` 仍需登录。
65+
- **联网命令**`plan``apply``destroy``state import``skill-list`、全部 `session *`:统一声明 `auth: "apiKey"` 硬门禁,authStage 经 `resolveApiKey(sources)` 解析 Bailian 凭证(flag > env > active profile config),缺失报统一 AUTH;引擎层再断言 Bailian key 非空。例外:`plan --no-refresh` / `plan --dry-run``credentials: "none"` 并强制 `refresh: false`(不联网、不回写 state,不查 provider key),其中 `--dry-run` 连登录也不要求(authStage 的 dry-run 豁免),`--no-refresh` 仍需登录。
66+
67+
`bl managed-agent` 是 Bailian-only 产品入口:命令不暴露 `--provider``init` 只生成 `providers.bailian`,所有远端调用固定传 `provider: "bailian"``resolveAgentProjectConfig` 在创建 SDK runtime 前通过 `assertBailianOnlyProviders` 拒绝包含非 Bailian Provider 的手写配置;共享 `@openagentpack/sdk` 仍可保留多 Provider 能力。
6668

6769
凭证不以真实值写入 `process.env`,而是经 `packages/commands/src/commands/managed-agent/_engine/`**内存注入管道**(`resolveAgentProjectConfig`)注入 SDK,管道五步:
6870

69-
1. `prepareProviderEnv()``bootstrapRuntimeCredentialsSync()`(SDK `.env` / `~/.agents/config.json` 灌进 env,服务 claude/ark/qoder 等非 bailian provider),再把全部凭证类 env(`CREDENTIAL_ENV_KEYS`含别名)中仍为 undefined 的占位为 `""`,使 agents.yaml 插值不因缺变量抛错
70-
2. `resolveProjectConfig`插值发生:bailian 插值拿到占位空串,claude/ark 拿到真实 env 值;随后 `normalizeInterpolatedProviderBlocks()` 把插值为空导致的 YAML `null` 归一为 `""`(避免离线命令下空 key 在 SDK zod 层报 "received null")
71+
1. `prepareProviderEnv()`调用 SDK 的凭证 bootstrap,再把凭证类 env(`CREDENTIAL_ENV_KEYS`含兼容别名)中仍为 undefined 的项占位为 `""`,使 agents.yaml 插值阶段能够完成并由 CLI 输出明确的 Bailian-only 配置错误
72+
2. `resolveProjectConfig`完成插值;随后 `normalizeInterpolatedProviderBlocks()` 把插值为空导致的 YAML `null` 归一为 `""`,避免空 key 在 SDK zod 层提前报 "received null"
7173
3. `injectProviderCredentials()` — 用 `ctx.client.exportApiCredential()`(lint 限定 `managed-agent/_engine/**` 可用)覆写内存 config 对象的 bailian 块:有凭证时 `api_key` 无条件覆写;`base_url`(拼 `/api/v1/agentstudio` 后缀,无凭证时用 client 默认域名补齐以满足 schema)/`workspace_id`(取 `settings.workspaceId`)仅在引用且为空时填充
7274
4. `scrubCredentialEnv()` — 从 `process.env` 删除全部凭证变量(真实凭证此后只存于 config 对象 → provider adapter 实例内存,不驻留 env / 不被子进程继承)
73-
5. `assertProviderCredentials(providers)`任一已声明 provider 的 `api_key` 为空 → CLI 权威 `AUTH` 错误 + provider 专属 hint(取代 SDK 原始插值/zod 报错);离线命令传 `credentials: "none"` 整体跳过
75+
5. `assertBailianOnlyProviders(providers)`拒绝非 Bailian Provider;随后 `assertProviderCredentials(providers)` 在 Bailian `api_key` 为空时给出 CLI 权威 `AUTH` 错误和登录 hint离线命令传 `credentials: "none"` 跳过 key 断言,但仍执行 Bailian-only 配置校验
7476

75-
`bl auth login` 仅管理 bailian(DashScope)凭证;claude/ark/qoder 的 key 从 env(shell / `.env` / `~/.agents/config.json`)经插值进入 config 对象,同样被清扫。禁止命令层直接 `readConfigFile` 裸读凭证;bailian 字段以 CLI 鉴权链为唯一信源。
77+
禁止命令层直接 `readConfigFile` 裸读凭证;Bailian 字段以 CLI 鉴权链为唯一信源。SDK bootstrap 期间读取到的兼容凭证变量也会在配置解析后统一清扫
7678

7779
## 必查清单
7880

packages/cli/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "bailian-cli",
3-
"version": "1.19.0",
3+
"version": "1.20.0",
44
"description": "CLI for Aliyun Model Studio (DashScope) AI Platform.",
55
"keywords": [
66
"agent",

packages/cli/src/commands.ts

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,48 @@ import {
152152
managedAgentSessionSend,
153153
managedAgentSessionEvents,
154154
managedAgentSkillList,
155+
managedAgentAgentCreate,
156+
managedAgentEnvironmentCreate,
157+
managedAgentSkillCreate,
158+
managedAgentVaultCreate,
159+
managedAgentVaultCredentialCreate,
160+
managedAgentDeploymentCreate,
161+
managedAgentAgentList,
162+
managedAgentAgentGet,
163+
managedAgentAgentSearch,
164+
managedAgentAgentVersions,
165+
managedAgentEnvironmentList,
166+
managedAgentEnvironmentGet,
167+
managedAgentEnvironmentSearch,
168+
managedAgentSkillGet,
169+
managedAgentSkillSearch,
170+
managedAgentSkillVersions,
171+
managedAgentSkillDownload,
172+
managedAgentVaultList,
173+
managedAgentVaultGet,
174+
managedAgentVaultSearch,
175+
managedAgentDeploymentList,
176+
managedAgentDeploymentGet,
177+
managedAgentDeploymentSearch,
178+
managedAgentDeploymentRunsList,
179+
managedAgentDeploymentRunsGet,
180+
managedAgentDeploymentRun,
181+
managedAgentDeploymentPause,
182+
managedAgentDeploymentUnpause,
183+
managedAgentSessionSearch,
184+
managedAgentSessionUpdate,
185+
managedAgentSessionArchive,
186+
managedAgentSessionEventList,
187+
managedAgentSessionEventSend,
188+
managedAgentSessionEventStream,
189+
managedAgentSessionDebug,
190+
managedAgentSessionExport,
191+
managedAgentFileUpload,
192+
managedAgentFileList,
193+
managedAgentFileGet,
194+
managedAgentFileSearch,
195+
managedAgentFileDownload,
196+
managedAgentFileDelete,
155197
} from "bailian-cli-commands";
156198

157199
// Full bailian-cli product: every command, exposed under the `bl` binary.
@@ -314,6 +356,49 @@ export const commands: Record<string, AnyCommand> = {
314356
"managed-agent session send": managedAgentSessionSend,
315357
"managed-agent session events": managedAgentSessionEvents,
316358
"managed-agent skill-list": managedAgentSkillList,
359+
"managed-agent agent create": managedAgentAgentCreate,
360+
"managed-agent agent list": managedAgentAgentList,
361+
"managed-agent agent get": managedAgentAgentGet,
362+
"managed-agent agent search": managedAgentAgentSearch,
363+
"managed-agent agent versions": managedAgentAgentVersions,
364+
"managed-agent environment create": managedAgentEnvironmentCreate,
365+
"managed-agent environment list": managedAgentEnvironmentList,
366+
"managed-agent environment get": managedAgentEnvironmentGet,
367+
"managed-agent environment search": managedAgentEnvironmentSearch,
368+
"managed-agent skill create": managedAgentSkillCreate,
369+
"managed-agent skill list": managedAgentSkillList,
370+
"managed-agent skill get": managedAgentSkillGet,
371+
"managed-agent skill search": managedAgentSkillSearch,
372+
"managed-agent skill versions": managedAgentSkillVersions,
373+
"managed-agent skill download": managedAgentSkillDownload,
374+
"managed-agent vault create": managedAgentVaultCreate,
375+
"managed-agent vault credential create": managedAgentVaultCredentialCreate,
376+
"managed-agent vault list": managedAgentVaultList,
377+
"managed-agent vault get": managedAgentVaultGet,
378+
"managed-agent vault search": managedAgentVaultSearch,
379+
"managed-agent deployment create": managedAgentDeploymentCreate,
380+
"managed-agent deployment list": managedAgentDeploymentList,
381+
"managed-agent deployment get": managedAgentDeploymentGet,
382+
"managed-agent deployment search": managedAgentDeploymentSearch,
383+
"managed-agent deployment runs list": managedAgentDeploymentRunsList,
384+
"managed-agent deployment runs get": managedAgentDeploymentRunsGet,
385+
"managed-agent deployment run": managedAgentDeploymentRun,
386+
"managed-agent deployment pause": managedAgentDeploymentPause,
387+
"managed-agent deployment unpause": managedAgentDeploymentUnpause,
388+
"managed-agent session search": managedAgentSessionSearch,
389+
"managed-agent session update": managedAgentSessionUpdate,
390+
"managed-agent session archive": managedAgentSessionArchive,
391+
"managed-agent session event list": managedAgentSessionEventList,
392+
"managed-agent session event send": managedAgentSessionEventSend,
393+
"managed-agent session event stream": managedAgentSessionEventStream,
394+
"managed-agent session debug": managedAgentSessionDebug,
395+
"managed-agent session export": managedAgentSessionExport,
396+
"managed-agent file upload": managedAgentFileUpload,
397+
"managed-agent file list": managedAgentFileList,
398+
"managed-agent file get": managedAgentFileGet,
399+
"managed-agent file search": managedAgentFileSearch,
400+
"managed-agent file download": managedAgentFileDownload,
401+
"managed-agent file delete": managedAgentFileDelete,
317402
};
318403

319404
/**

packages/cli/tests/skill-risk-confirmation.test.ts

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,18 @@ import { expect, test } from "vite-plus/test";
55

66
const repositoryRoot = join(dirname(fileURLToPath(import.meta.url)), "../../..");
77
const skillsRoot = join(repositoryRoot, "skills");
8+
const scopedCreateCommands = new Set([
9+
"bl managed-agent agent create",
10+
"bl managed-agent deployment create",
11+
"bl managed-agent environment create",
12+
"bl managed-agent skill create",
13+
"bl managed-agent vault create",
14+
"bl managed-agent vault credential create",
15+
]);
816

9-
test("every generated high-risk command reference requires user confirmation before --yes", () => {
17+
test("generated references distinguish runtime high-risk confirmation from scoped create execution", () => {
1018
let highRiskCommandCount = 0;
19+
const seenScopedCreateCommands = new Set<string>();
1120

1221
for (const skillDirectory of readdirSync(skillsRoot, { withFileTypes: true })) {
1322
if (!skillDirectory.isDirectory()) continue;
@@ -27,9 +36,21 @@ test("every generated high-risk command reference requires user confirmation bef
2736
const commandSections = markdown.split(/(?=^### `bl )/m).slice(1);
2837

2938
for (const commandSection of commandSections) {
30-
if (!commandSection.includes("`--yes`")) continue;
39+
const commandName = commandSection.match(/^### `([^`]+)`/m)?.[1];
40+
const hasConfirmationFlag = commandSection.includes("`--yes`");
41+
const hasHighRiskMetadata = /\|\s+\*\*Risk\*\*\s+\|\s+`high`\s+\|/.test(commandSection);
42+
43+
if (!hasHighRiskMetadata) {
44+
if (!hasConfirmationFlag) continue;
45+
expect(commandName).toBeDefined();
46+
expect(scopedCreateCommands.has(commandName ?? "")).toBe(true);
47+
expect(commandSection).toMatch(/Without --yes, .*preview/i);
48+
seenScopedCreateCommands.add(commandName ?? "");
49+
continue;
50+
}
51+
3152
highRiskCommandCount += 1;
32-
expect(commandSection).toMatch(/\|\s+\*\*Risk\*\*\s+\|\s+`high`\s+\|/);
53+
expect(hasConfirmationFlag).toBe(true);
3354
expect(commandSection).toMatch(/\|\s+\*\*Risk message\*\*\s+\|\s+.+\|/);
3455
expect(commandSection).toMatch(/type=.*requires_confirmation/);
3556
const agentSafetyLine = commandSection
@@ -44,4 +65,5 @@ test("every generated high-risk command reference requires user confirmation bef
4465
}
4566

4667
expect(highRiskCommandCount).toBeGreaterThan(0);
68+
expect([...seenScopedCreateCommands].sort()).toEqual([...scopedCreateCommands].sort());
4769
});

packages/commands/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "bailian-cli-commands",
3-
"version": "1.19.0",
3+
"version": "1.20.0",
44
"description": "Command library for bailian-cli products (knowledge, memory, media, …). See https://www.npmjs.com/package/bailian-cli for usage.",
55
"homepage": "https://bailian.console.aliyun.com/cli",
66
"bugs": {
@@ -40,7 +40,7 @@
4040
"check": "vp check"
4141
},
4242
"dependencies": {
43-
"@openagentpack/sdk": "0.3.2",
43+
"@openagentpack/sdk": "0.5.0",
4444
"bailian-cli-core": "workspace:*",
4545
"bailian-cli-runtime": "workspace:*",
4646
"boxen": "catalog:",

0 commit comments

Comments
 (0)