Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
4e64ee8
refactor(agent-core-v2): simplify context tags and shared copy
RealKai42 Aug 3, 2026
3ff467e
feat(agent-core-v2): add a switch for the product-documentation skills
RealKai42 Aug 3, 2026
dee3e11
feat(agent-core-v2): add custom agent identity
RealKai42 Aug 3, 2026
7cae62e
fix(agent-core-v2): keep the file value when a scalar env binding fai…
RealKai42 Aug 3, 2026
32bfd0d
feat(agent-core-v2): extend the custom identity to discovery and glob…
RealKai42 Aug 3, 2026
5097d42
refactor(agent-core-v2): neutralize remaining copy and align comments
RealKai42 Aug 3, 2026
5a921d0
Merge branch 'main' into feat/custom-agent-identity
RealKai42 Aug 3, 2026
82eae7b
fix(agent-core-v2): read the product-skill switch after config is ready
RealKai42 Aug 3, 2026
cc35b36
fix(agent-core-v2): apply the product-skill switch to session-less li…
RealKai42 Aug 3, 2026
b0f1f21
fix(node-sdk): await config before materializing the global MCP OAuth…
RealKai42 Aug 3, 2026
cddb2f6
refactor(agent-core-v2): drop the unused builtin-skill registrar
RealKai42 Aug 3, 2026
db4618f
fix(agent-core-v2): send the configured identity on custom-registry i…
RealKai42 Aug 3, 2026
463bcb5
docs: scope the identity env vars and condense the changeset
RealKai42 Aug 3, 2026
733c649
docs(agent-core-v2): describe the identity as what the agent calls it…
RealKai42 Aug 3, 2026
f03e0e4
test(agent-core-v2): cover the identity on custom-registry imports
RealKai42 Aug 3, 2026
ca21540
fix(node-sdk): guard every global MCP OAuth path behind config readiness
RealKai42 Aug 3, 2026
34974b0
fix(agent-core-v2): send the configured identity on models.dev requests
RealKai42 Aug 3, 2026
d0940a3
test(agent-core-v2): assert the product-skill set literally
RealKai42 Aug 3, 2026
57d9c0d
fix(agent-core-v2): normalize the host-declared display name too
RealKai42 Aug 3, 2026
d8ca821
Merge branch 'main' into feat/custom-agent-identity
RealKai42 Aug 4, 2026
1450304
fix(agent-core-v2): keep the configured slug when the host sends no U…
RealKai42 Aug 4, 2026
6bf7e7c
test(acp-server): follow the renamed skill-activation tag
RealKai42 Aug 4, 2026
408d57c
fix(agent-core-v2): present the configured slug on registry refreshes…
RealKai42 Aug 4, 2026
a836636
docs(agent-core-v2): move new member docs into the module headers
RealKai42 Aug 4, 2026
4e89373
fix(agent-core-v2): connect session MCP overlays after config is ready
RealKai42 Aug 4, 2026
3603944
fix(agent-core-v2): reload builtin skills when their switch changes
RealKai42 Aug 4, 2026
02b1017
Merge branch 'main' into feat/custom-agent-identity
RealKai42 Aug 4, 2026
48a7f68
fix(agent-core-v2): apply the identity to self-configured web services
RealKai42 Aug 4, 2026
ad5adf5
docs(agent-core-v2): condense the identity headers to their contracts
RealKai42 Aug 4, 2026
37c54d4
fix(agent-core-v2): rebuild active prompts when the builtin skills ch…
RealKai42 Aug 4, 2026
b2fd7b9
Merge remote-tracking branch 'origin/main' into feat/custom-agent-ide…
RealKai42 Aug 4, 2026
c10e449
refactor(agent-core-v2): freeze the agent identity for the process li…
RealKai42 Aug 4, 2026
1b8bed9
fix(agent-core-v2): locate the User-Agent header case-insensitively
RealKai42 Aug 4, 2026
ef85373
Merge remote-tracking branch 'origin/main' into feat/custom-agent-ide…
RealKai42 Aug 4, 2026
42c13cc
fix(agent-core-v2): attribute header provenance from the finished thi…
RealKai42 Aug 4, 2026
35ce330
fix(agent-core-v2): keep web tool backends from racing the identity f…
RealKai42 Aug 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/custom-agent-identity.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@moonshot-ai/kimi-code": minor
---

Add a custom agent identity, plus a switch for the built-in skills that document Kimi Code itself. Set `[identity] name` in `config.toml` (or `KIMI_CODE_IDENTITY_NAME`) to change the name the agent uses for itself and the identifier it presents to third-party providers and MCP servers; set `builtin_product_skills = false` to drop the product-documentation skills.
2 changes: 1 addition & 1 deletion apps/kimi-web/src/components/chat/ChatPane.vue
Original file line number Diff line number Diff line change
Expand Up @@ -1124,7 +1124,7 @@ function isStreamingRenderBlock(turn: ChatTurn, block: { sourceIndex: number }):
padding: 10px 0;
}

/* Skill activation card (replaces raw <kimi-skill-loaded> XML) */
/* Skill activation card (replaces raw <skill-loaded> XML) */
.skill-act {
display: flex;
flex-direction: column;
Expand Down
25 changes: 25 additions & 0 deletions docs/en/configuration/config-files.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ Fields in the config file fall into two categories: **top-level scalars** that d
| `merge_all_available_skills` | `boolean` | `true` | Whether to merge Agent Skills from all available directories |
| `extra_skill_dirs` | `array<string>` | — | Extra skill search directories, layered on top of the default directories |
| `extra_agent_dirs` | `array<string>` | — | Extra custom agent search directories, layered on top of the default directories |
| `builtin_product_skills` | `boolean` | `true` | Whether the built-in skills that document Kimi Code itself are offered to the model: `update-config`, `custom-theme`, `mcp-config`, `check-kimi-code-docs`, and `import-from-cc-codex`. Turning them off trims their names and descriptions from the system prompt, at the cost of the guided flows for those tasks. Read by the `agent-core-v2` engine (`kimi web` and the `KIMI_CODE_EXPERIMENTAL_FLAG` paths); ignored on the default engine |
| `telemetry` | `boolean` | `true` | Whether anonymous telemetry is enabled; disabled only when explicitly set to `false` |
| `providers` | `table` | `{}` | API provider table → [`providers`](#providers) |
| `models` | `table` | — | Model alias table → [`models`](#models) |
Expand All @@ -114,6 +115,7 @@ Fields in the config file fall into two categories: **top-level scalars** that d
| `services` | `table` | — | Built-in external service configuration → [`services`](#services) |
| `permission` | `table` | — | Initial permission rules → [`permission`](#permission) |
| `hooks` | `array<table>` | — | Lifecycle hooks; see [Hooks](../customization/hooks.md) |
| `identity` | `table` | — | Custom agent identity → [`identity`](#identity) |

The following sections cover each of the nested tables in turn: `providers`, `models`, `thinking`, `loop_control`, `background`, `tools`, `image`, `services`, and `permission`.

Expand Down Expand Up @@ -297,6 +299,29 @@ In print mode (`kimi -p "<prompt>"`), Kimi Code stays alive after the main agent

`startup_timeout_ms` and `tool_timeout_ms` can be overridden by the `KIMI_MCP_STARTUP_TIMEOUT_MS` and `KIMI_MCP_TOOL_TIMEOUT_MS` environment variables respectively, which take higher priority than `config.toml`. See [MCP](../customization/mcp.md) for the full MCP server configuration.

## `identity`

Customizes how the agent identifies itself. Leave it unset and nothing changes.

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `name` | `string` | — | Display name the agent calls itself in the system prompt (fills the `${product_name}` slot, including in your own `SYSTEM.md` and agent files) |
| `slug` | `string` | derived from `name` | Machine identifier used in protocol fields: the `User-Agent` product token sent to third-party providers, and the client name announced to MCP servers. Derived from `name` when omitted: lowercased, with every run of non-alphanumeric characters folded to `-` |
Comment thread
RealKai42 marked this conversation as resolved.
Comment thread
RealKai42 marked this conversation as resolved.

```toml
[identity]
name = "Acme Dev Agent"
slug = "acme-dev" # optional
```

Both fields can be set through the `KIMI_CODE_IDENTITY_NAME` and `KIMI_CODE_IDENTITY_SLUG` environment variables, which take higher priority than `config.toml` and are never written back to it — convenient for containers and CI, where writing a config file is awkward.

A name that contains no ASCII letters or digits (for example a purely Chinese name) leaves nothing to derive a slug from and falls back to `agent`; write `slug` explicitly if you need a specific protocol token.

The identity is resolved once at startup and holds for the life of the process — it is announced to MCP servers and providers when connections are made, so it cannot change midway. Edits to this section take effect on the next start, for new sessions: a resumed session keeps the system prompt it was recorded with, since its past turns already speak under that identity. Likewise, an MCP OAuth authorization keeps the client registration it was granted under; reset that server's authentication to register under the new identity.

This section is read by the `agent-core-v2` engine, which currently backs `kimi web` and the `KIMI_CODE_EXPERIMENTAL_FLAG` paths. On the default `kimi` / `kimi -p` engine it is ignored.

## `tools`

`tools` is the global tool switch: it applies to every agent in all sessions and intersects with each agent's own `tools` / `disallowedTools` policy.
Expand Down
5 changes: 5 additions & 0 deletions docs/en/configuration/env-vars.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,9 @@ Switches that control the behavior of subsystems such as telemetry, background t
| `KIMI_CODE_PLUGIN_MARKETPLACE_URL` | Override the plugin marketplace JSON loaded by `/plugins`; useful for dev loopback servers, staging CDN files, or alternate marketplace directories | `https://code.kimi.com/kimi-code/plugins/marketplace.json`; also accepts `http://`, `file://` URLs, and local paths |
| `KIMI_CODE_AGENT_SWARM_MAX_CONCURRENCY` | Cap how many AgentSwarm subagents run concurrently during the initial ramp; leave unset for no cap | Positive integer; invalid values fail fast |
| `KIMI_SUBAGENT_TIMEOUT_MS` | Maximum wall-clock time (ms) a single subagent (`Agent` / `AgentSwarm`) may run; takes higher priority than `[subagent] timeout_ms` in `config.toml` (default `7200000`, i.e. 2 hours) | Positive integer; invalid values fall back to the config or default |
| `KIMI_CODE_IDENTITY_NAME` | Display name the agent calls itself in the system prompt; takes higher priority than `[identity] name` in `config.toml` and is never written back to it | Any non-empty string; blank values read as unset |
| `KIMI_CODE_IDENTITY_SLUG` | Protocol identifier for the `User-Agent` product token sent to third-party providers and the MCP client name; takes higher priority than `[identity] slug`. Derived from the name when unset | Any non-empty string; normalized to lowercase with non-alphanumeric runs folded to `-` |
| `KIMI_CODE_BUILTIN_PRODUCT_SKILLS` | Whether the built-in skills documenting Kimi Code itself are offered to the model; takes higher priority than `builtin_product_skills` in `config.toml` (default enabled) | Truthy: `1`/`true`/`yes`/`on`; falsy: `0`/`false`/`no`/`off` |
Comment thread
RealKai42 marked this conversation as resolved.
| `KIMI_CODE_EXPERIMENTAL_SECONDARY_MODEL` | Enable the experimental secondary-model feature in every launch mode, including the interactive TUI; the master `KIMI_CODE_EXPERIMENTAL_FLAG=1` also enables it | Truthy: `1`/`true`/`yes`/`on`; falsy: `0`/`false`/`no`/`off` |
| `KIMI_SECONDARY_MODEL` | Secondary model; takes higher priority than [`[secondary_model] model`](./config-files.md#secondary-model) in `config.toml`. When the secondary-model experiment is enabled, newly spawned subagents (`Agent` / `AgentSwarm`) bind to it by default instead of inheriting the main agent's model | The alias of a configured `[models]` entry, e.g. `kimi-code/kimi-k2.5`; blank values are ignored |
| `KIMI_SECONDARY_EFFORT` | Thinking effort for the secondary model; takes higher priority than `[secondary_model] default_effort` in `config.toml` and applies only when both the model and its experiment are enabled | An effort value, e.g. `low`; blank values are ignored |
Expand All @@ -150,6 +153,8 @@ Switches that control the behavior of subsystems such as telemetry, background t
| `KIMI_CODE_NO_AUTO_UPDATE` | Fully disable the update preflight — no check, background install, or prompt. Legacy alias `KIMI_CLI_NO_AUTO_UPDATE` is also honored | Truthy: `1`/`true`/`yes`/`on` |
| `KIMI_DISABLE_CRON` | Disable the scheduled-task tool (`CronCreate` rejects new schedules; existing tasks do not fire) | `1` to disable |

The three `KIMI_CODE_IDENTITY_*` / `KIMI_CODE_BUILTIN_PRODUCT_SKILLS` variables are read by the `agent-core-v2` engine, which currently backs `kimi web` and the `KIMI_CODE_EXPERIMENTAL_FLAG` paths; the default `kimi` / `kimi -p` engine ignores them.

## Diagnostic logs

These variables control log level and file rotation, read once at process startup:
Expand Down
2 changes: 1 addition & 1 deletion docs/en/customization/skills.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ The Kimi-specific user Skill directory moves with `KIMI_CODE_HOME`, so isolated
extra_skill_dirs = ["~/team-skills", ".agents/team-skills"]
```

**Built-in Skills** are distributed with the CLI and have the lowest priority. They provide out-of-the-box workflows for common tasks — for example, configuring MCP servers, customizing the TUI theme, and editing config files. See [Built-in skill commands](../reference/slash-commands.md#built-in-skill-commands) for the full list.
**Built-in Skills** are distributed with the CLI and have the lowest priority. They provide out-of-the-box workflows for common tasks — for example, configuring MCP servers, customizing the TUI theme, and editing config files. See [Built-in skill commands](../reference/slash-commands.md#built-in-skill-commands) for the full list. Those describing Kimi Code itself can be turned off with the top-level [`builtin_product_skills`](../configuration/config-files.md#top-level-fields) field.

## Invoking a Skill

Expand Down
25 changes: 25 additions & 0 deletions docs/zh/configuration/config-files.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ timeout = 5
| `merge_all_available_skills` | `boolean` | `true` | 是否合并所有目录中的 Agent Skills |
| `extra_skill_dirs` | `array<string>` | — | 额外 Skill 搜索目录,叠加到默认目录之上 |
| `extra_agent_dirs` | `array<string>` | — | 额外自定义 Agent 搜索目录,叠加到默认目录之上 |
| `builtin_product_skills` | `boolean` | `true` | 是否向模型提供介绍 Kimi Code 自身的内置 Skills:`update-config`、`custom-theme`、`mcp-config`、`check-kimi-code-docs`、`import-from-cc-codex`。关闭后它们的名称和描述不再进入系统提示词,代价是失去这些任务的引导流程。本字段由 `agent-core-v2` 引擎读取(`kimi web` 和开启 `KIMI_CODE_EXPERIMENTAL_FLAG` 的路径),默认引擎会忽略 |
| `telemetry` | `boolean` | `true` | 是否启用匿名遥测;显式设为 `false` 时关闭 |
| `providers` | `table` | `{}` | API 供应商表 → [`providers`](#providers) |
| `models` | `table` | — | 模型别名表 → [`models`](#models) |
Expand All @@ -114,6 +115,7 @@ timeout = 5
| `services` | `table` | — | 内置外部服务配置 → [`services`](#services) |
| `permission` | `table` | — | 初始权限规则 → [`permission`](#permission) |
| `hooks` | `array<table>` | — | 生命周期 hook,详见 [Hooks](../customization/hooks.md) |
| `identity` | `table` | — | 自定义 Agent 身份 → [`identity`](#identity) |

以下各节对 `providers`、`models`、`thinking`、`loop_control`、`background`、`image`、`services`、`permission` 等嵌套表逐一展开。

Expand Down Expand Up @@ -297,6 +299,29 @@ max_output_size = 8192

`startup_timeout_ms` 和 `tool_timeout_ms` 可分别被环境变量 `KIMI_MCP_STARTUP_TIMEOUT_MS` 和 `KIMI_MCP_TOOL_TIMEOUT_MS` 覆盖,优先级高于配置文件。MCP server 的完整配置方式见 [MCP](../customization/mcp.md)。

## `identity`

自定义 Agent 的身份标识。不设置时行为完全不变。

| 字段 | 类型 | 默认值 | 说明 |
| --- | --- | --- | --- |
| `name` | `string` | — | Agent 在系统提示词中的自称(填充 `${product_name}` 变量,你自己的 `SYSTEM.md` 和 agent 文件同样适用) |
| `slug` | `string` | 由 `name` 派生 | 协议字段中使用的机器标识:发给第三方 provider 的 `User-Agent` 产品名,以及连接 MCP 服务器时声明的客户端名。省略时由 `name` 派生:转小写,连续的非字母数字字符折叠为 `-` |

```toml
[identity]
name = "Acme Dev Agent"
slug = "acme-dev" # 可选
```

两个字段都可以通过 `KIMI_CODE_IDENTITY_NAME` 和 `KIMI_CODE_IDENTITY_SLUG` 环境变量设置,优先级高于 `config.toml`,且不会被写回配置文件——适合不便写配置文件的容器和 CI 场景。

如果名称中不含任何 ASCII 字母或数字(例如纯中文名称),就无法派生出 slug,此时回退为 `agent`;需要特定协议标识请显式填写 `slug`。

身份在启动时解析一次,进程生命周期内保持不变——建立连接时它已宣告给 MCP 服务器和 provider,中途无法更换。修改本节配置在下次启动时对新会话生效;resume 的会话保留录制时的系统提示词,因为其历史轮次本就以原身份自称。同理,已完成的 MCP OAuth 授权保留其授予时的客户端注册;重置该服务器的认证即可在新身份下重新注册。

本节由 `agent-core-v2` 引擎读取,目前 `kimi web` 和开启 `KIMI_CODE_EXPERIMENTAL_FLAG` 的路径使用该引擎。默认的 `kimi` / `kimi -p` 引擎会忽略此配置。

## `tools`

`tools` 设置全局工具开关,对所有会话中的每个 Agent 生效,并在 Agent 自身的 `tools` / `disallowedTools` 策略之上再取一次交集。
Expand Down
5 changes: 5 additions & 0 deletions docs/zh/configuration/env-vars.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,9 @@ kimi
| `KIMI_CODE_PLUGIN_MARKETPLACE_URL` | 覆盖 `/plugins` 加载的 plugin marketplace JSON,适合 dev loopback server、测试 CDN 文件或替换 marketplace 目录 | `https://code.kimi.com/kimi-code/plugins/marketplace.json`;也接受 `http://`、`file://` URL 和本地路径 |
| `KIMI_CODE_AGENT_SWARM_MAX_CONCURRENCY` | 限制 AgentSwarm 初始提升并发阶段可同时运行的子 Agent 数量;不设置表示不限制 | 正整数;非法值会立即失败 |
| `KIMI_SUBAGENT_TIMEOUT_MS` | 单个子 Agent(`Agent` / `AgentSwarm`)可运行的最长时间(毫秒);优先级高于 `config.toml` 的 `[subagent] timeout_ms`(默认 `7200000`,即 2 小时) | 正整数;非法值回退到配置或默认值 |
| `KIMI_CODE_IDENTITY_NAME` | Agent 在系统提示词中的自称,优先级高于 `config.toml` 的 `[identity] name`,且不会被写回配置文件 | 任意非空字符串;空值视为未设置 |
| `KIMI_CODE_IDENTITY_SLUG` | 协议标识,用于发给第三方 provider 的 `User-Agent` 产品名和 MCP 客户端名,优先级高于 `[identity] slug`。未设置时由名称派生 | 任意非空字符串;会转小写并将连续非字母数字字符折叠为 `-` |
| `KIMI_CODE_BUILTIN_PRODUCT_SKILLS` | 是否向模型提供介绍 Kimi Code 自身的内置 Skills,优先级高于 `config.toml` 的 `builtin_product_skills`(默认开启) | 真值:`1`/`true`/`yes`/`on`;假值:`0`/`false`/`no`/`off` |
| `KIMI_CODE_EXPERIMENTAL_SECONDARY_MODEL` | 在包括交互式 TUI 在内的所有启动方式下启用实验性的次主力模型功能;master `KIMI_CODE_EXPERIMENTAL_FLAG=1` 也会启用本功能 | 真值:`1`/`true`/`yes`/`on`;假值:`0`/`false`/`no`/`off` |
| `KIMI_SECONDARY_MODEL` | 次主力模型;优先级高于 `config.toml` 的 [`[secondary_model] model`](./config-files.md#secondary-model)。次主力模型实验功能启用后,新派生的子 Agent 默认绑定该模型,而不再继承主 Agent 的模型 | `[models]` 中已配置条目的别名,如 `kimi-code/kimi-k2.5`;空白值被忽略 |
| `KIMI_SECONDARY_EFFORT` | 次主力模型的 thinking effort;优先级高于 `config.toml` 的 `[secondary_model] default_effort`,仅在次主力模型及其实验功能均启用时生效 | effort 取值,如 `low`;空白值被忽略 |
Expand All @@ -150,6 +153,8 @@ kimi
| `KIMI_CODE_NO_AUTO_UPDATE` | 完全禁用更新预检——不检查、不后台安装、不提示。同时兼容旧名 `KIMI_CLI_NO_AUTO_UPDATE` | 真值:`1`/`true`/`yes`/`on` |
| `KIMI_DISABLE_CRON` | 禁用定时任务工具(`CronCreate` 拒绝新计划,已有任务不触发) | `1` 表示禁用 |

`KIMI_CODE_IDENTITY_*` 和 `KIMI_CODE_BUILTIN_PRODUCT_SKILLS` 这三个变量由 `agent-core-v2` 引擎读取,目前 `kimi web` 和开启 `KIMI_CODE_EXPERIMENTAL_FLAG` 的路径使用该引擎;默认的 `kimi` / `kimi -p` 引擎会忽略它们。

## 诊断日志

这组变量控制日志级别和文件滚动,进程启动时读取一次:
Expand Down
2 changes: 1 addition & 1 deletion docs/zh/customization/skills.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ Kimi 专属用户级 Skill 目录会随 `KIMI_CODE_HOME` 移动,因此隔离
extra_skill_dirs = ["~/team-skills", ".agents/team-skills"]
```

**内置 Skills** 随 CLI 一起分发,优先级最低。它们为常见任务提供开箱即用的工作流,例如配置 MCP server、定制 TUI 主题和编辑配置文件。完整列表详见[内置 Skill 命令](../reference/slash-commands.md#内置-skill-命令)。
**内置 Skills** 随 CLI 一起分发,优先级最低。它们为常见任务提供开箱即用的工作流,例如配置 MCP server、定制 TUI 主题和编辑配置文件。完整列表详见[内置 Skill 命令](../reference/slash-commands.md#内置-skill-命令)。其中介绍 Kimi Code 自身的部分可以通过顶层 [`builtin_product_skills`](../configuration/config-files.md#顶层字段) 字段关闭。

## 调用 Skill

Expand Down
4 changes: 2 additions & 2 deletions packages/acp-server/test/skills.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ describe('acp-server skills / available commands', () => {
// The model received the rendered skill activation (content + args), not
// the raw slash text.
const history = JSON.stringify(scripted!.callHistory()[0]);
expect(history).toContain('kimi-skill-loaded');
expect(history).toContain('skill-loaded');
expect(history).toContain('Always answer with the word FIXTURE');
expect(history).toContain('ARGUMENTS: some args');
expect(history).not.toContain('/skill:acp-fixture');
Expand All @@ -211,7 +211,7 @@ describe('acp-server skills / available commands', () => {
expect(scripted!.callCount()).toBe(1);

const history = JSON.stringify(scripted!.callHistory()[0]);
expect(history).toContain('kimi-skill-loaded');
expect(history).toContain('skill-loaded');
expect(history).toContain('write-goal');
}, 30_000);

Expand Down
Loading
Loading