@kyo-so/cli 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.7.0] - 2026-07-09
11
+
12
+ ### Added
13
+
14
+ - `agents.<name>.effort` config field for Codex and Claude, mirroring
15
+ `agents.<name>.model`. Kyoso sends it once per session as an ACP
16
+ `session/set_config_option` request (`effort` for Claude,
17
+ `reasoning_effort` for Codex). The request is fail-soft: a rejection is
18
+ logged to stderr as a sanitized warning and surfaced to MCP/JSON callers
19
+ via `result.audit.warnings`, and the review continues at the backend's
20
+ own default effort. Settable from both user-global and project TOML
21
+ (same risk profile as `model`: no command execution or env forwarding).
22
+
23
+ ### Fixed
24
+
25
+ - Documentation still described the default Claude agent timeout as 240
26
+ seconds; README (all languages), the design document, and the example
27
+ config now reflect the 300-second default introduced in 0.6.0.
28
+
10
29
  ## [0.6.0] - 2026-07-08
11
30
 
12
31
  ### Added
package/README.ja.md CHANGED
@@ -22,6 +22,16 @@ Kyo-so は Codex と Claude の reviewer を連携させ、次のレビューを
22
22
 
23
23
  Kyoso はコード変更を適用しません。
24
24
 
25
+ ## Review Flow
26
+
27
+ 3 つの review tool はすべて同じパイプラインで動きます。secret scan の後、read-only の一時スナップショット上で reviewer ensemble を ACP 経由で並列実行し、所見の集約・ゲート適用・決定を行います。
28
+
29
+ <p align="center">
30
+ <img src="https://raw.githubusercontent.com/hokupod/kyoso/main/docs/assets/kyoso-review-flow.ja.svg" alt="Kyo-so のレビュー実行フロー。MCP/CLI リクエストから secret scan、スナップショット、アンサンブルレビュー、集約、ゲート、最終決定まで" width="640">
31
+ </p>
32
+
33
+ backend が 1 つだけ有効な場合は、2 role の ensemble の代わりに 1 agent が `combined_reviewer` として実行されます。この図の Mermaid ソースは [docs/assets/](docs/assets/) にあります。
34
+
25
35
  ## Quick Start
26
36
 
27
37
  グローバルインストールは不要です。Kyoso は `npx` または `bunx` で実行します。
@@ -229,18 +239,20 @@ Default child-agent env allowlist:
229
239
 
230
240
  Kyoso は subprocesses の起動に必要な最小限の runtime env も forward します: `PATH`, `HOME`, `TMPDIR`, `TEMP`, `TMP`, `LANG`, `LC_ALL`, `SHELL`, `USER`, `USERNAME`, `SystemRoot`。
231
241
 
232
- ## Agent Models
242
+ ## Agent Models and Effort
233
243
 
234
- `agents.<name>.model` を省略すると、各 agent 独自の default を使用します。Codex は `~/.codex/config.toml` などの local Codex config を使用し、Claude は adapter default を使用します。
244
+ `agents.<name>.model` または `agents.<name>.effort` を省略すると、各 agent 独自の default を使用します。Codex は `~/.codex/config.toml` などの local Codex config を使用し、Claude は adapter default を使用します。
235
245
 
236
246
  指定できる model 名は [Claude models overview](https://platform.claude.com/docs/en/about-claude/models/overview) と [Codex models](https://developers.openai.com/codex/models) を参照してください。
237
247
 
238
248
  ```toml
239
249
  [agents.codex]
240
250
  model = "gpt-5.5"
251
+ effort = "medium"
241
252
 
242
253
  [agents.claude]
243
254
  model = "claude-sonnet-5"
255
+ effort = "high"
244
256
  ```
245
257
 
246
258
  Kyoso は model pins を adapter-supported configuration に mapping します。
@@ -248,6 +260,8 @@ Kyoso は model pins を adapter-supported configuration に mapping します
248
260
  - Claude: `agents.claude.env` または whitelisted parent env で未設定の場合に `ANTHROPIC_MODEL` を設定します。
249
261
  - Codex: `CODEX_CONFIG` が未設定の場合、`CODEX_CONFIG={"model":"..."}` を設定します。model pin と他の Codex session config を組み合わせるには、`agents.codex.env.CODEX_CONFIG` を直接設定してください。
250
262
 
263
+ effort は仕組みが異なります。Kyoso は env var を設定せず、session ごとに最初の prompt の前に一度、backend agent へ ACP の `session/set_config_option` リクエストを送信します(Claude は `configId: "effort"`、Codex は `configId: "reasoning_effort"`)。有効な値は backend agent のバージョンと選択した model に依存します(例えば Claude は effort levels に対応した model でのみこの option を公開します)。Kyoso は `effort` の値自体を validate しません。backend agent がリクエストを reject した場合、または対応していない場合、Kyoso は stderr に log を出力してレビューを継続します。
264
+
251
265
  ## Audit
252
266
 
253
267
  Audit traces は次の場所に書き込まれます。
@@ -269,7 +283,7 @@ Kyoso は次の順に config を load します。
269
283
  - project TOML: `<cwd>/kyoso.toml`
270
284
  - `--network` などの CLI flags
271
285
 
272
- Project `kyoso.toml` は declarative で、trust approval は不要です。tools toggles、agent `enabled` / `model` / `role` / `timeoutMs`、workspace byte limits と additive `workspace.deny`、verification settings、advisory judge settings、tightening-only security/network settings を設定できます。
286
+ Project `kyoso.toml` は declarative で、trust approval は不要です。tools toggles、agent `enabled` / `model` / `effort` / `role` / `timeoutMs`、workspace byte limits と additive `workspace.deny`、verification settings、advisory judge settings、tightening-only security/network settings を設定できます。
273
287
 
274
288
  Global TOML は command 実行や env forwarding を含む user-owned settings 用です。
275
289
 
@@ -284,7 +298,7 @@ CODEX_CONFIG = '{"model":"gpt-5.5"}'
284
298
 
285
299
  `kyoso.config.ts` は deprecated ですが、互換性のため引き続き supported です。trust-on-first-use approval の後にのみ load され、trusted hashes は `~/.kyoso/trusted-configs.json` に保存されます。`kyoso.toml` と `kyoso.config.ts` が両方ある場合、Kyoso は TOML を使用し TypeScript config を無視します。
286
300
 
287
- Default agent timeouts は Codex 120 秒、Claude 240 秒です。MCP clients は tool calls に少なくとも 360 秒を許可してください。`verification.enabled` が true の場合、Kyoso は追加の cross-agent verification round を実行することがあるため、少なくとも 480 秒を許可してください。
301
+ Default agent timeouts は Codex 120 秒、Claude 300 秒です。MCP clients は tool calls に少なくとも 360 秒を許可してください。`verification.enabled` が true の場合、Kyoso は追加の cross-agent verification round を実行することがあるため、少なくとも 480 秒を許可してください。
288
302
 
289
303
  Optional finding verification は default で disabled です:
290
304
 
@@ -318,7 +332,7 @@ Team admins は organization Usage credits も確認してください。Credits
318
332
 
319
333
  ## Troubleshooting
320
334
 
321
- - MCP timeout: client tool timeouts を少なくとも 360 秒、`verification.enabled` が true の場合は少なくとも 480 秒に設定してください。Kyoso defaults は Codex 120 秒、Claude 240 秒、verification 90 秒です。
335
+ - MCP timeout: client tool timeouts を少なくとも 360 秒、`verification.enabled` が true の場合は少なくとも 480 秒に設定してください。Kyoso defaults は Codex 120 秒、Claude 300 秒、verification 90 秒です。
322
336
  - Fresh npm release: safe-chain などの minimum-package-age protection により、publish 直後は `npx @kyo-so/cli` の解決が一時的に block される場合があります。
323
337
  - Deprecated TypeScript config: `--trust-config` を渡さない限り、untrusted `kyoso.config.ts` は skip されます。新規設定は `kyoso.toml` を使ってください。
324
338
 
package/README.md CHANGED
@@ -20,6 +20,16 @@ It coordinates Codex and Claude reviewers for:
20
20
 
21
21
  Kyoso does not apply code changes.
22
22
 
23
+ ## Review Flow
24
+
25
+ All three review tools run the same pipeline: scan for secrets, snapshot the workspace read-only, run the reviewer ensemble in parallel over ACP, then aggregate findings, apply gates, and decide.
26
+
27
+ <p align="center">
28
+ <img src="https://raw.githubusercontent.com/hokupod/kyoso/main/docs/assets/kyoso-review-flow.en.svg" alt="Kyo-so review execution flow, from MCP/CLI request through secret scan, snapshot, ensemble review, aggregation, gates, and final decision" width="640">
29
+ </p>
30
+
31
+ With a single backend enabled, one agent runs as `combined_reviewer` instead of the two-role ensemble. The Mermaid sources for this diagram live in [docs/assets/](docs/assets/).
32
+
23
33
  ## Quick Start
24
34
 
25
35
  No global install is required. Run Kyoso through `npx` or `bunx`.
@@ -230,18 +240,20 @@ Default child-agent env allowlist:
230
240
 
231
241
  Kyoso also forwards minimal runtime env needed to launch subprocesses: `PATH`, `HOME`, `TMPDIR`, `TEMP`, `TMP`, `LANG`, `LC_ALL`, `SHELL`, `USER`, `USERNAME`, and `SystemRoot`.
232
242
 
233
- ## Agent Models
243
+ ## Agent Models and Effort
234
244
 
235
- Omit `agents.<name>.model` to use each agent's own default. Codex uses the local Codex config, such as `~/.codex/config.toml`; Claude uses the adapter default.
245
+ Omit `agents.<name>.model` or `agents.<name>.effort` to use each agent's own default. Codex uses the local Codex config, such as `~/.codex/config.toml`; Claude uses the adapter default.
236
246
 
237
247
  For available model names, see the [Claude models overview](https://platform.claude.com/docs/en/about-claude/models/overview) and the [Codex models list](https://developers.openai.com/codex/models).
238
248
 
239
249
  ```toml
240
250
  [agents.codex]
241
251
  model = "gpt-5.5"
252
+ effort = "medium"
242
253
 
243
254
  [agents.claude]
244
255
  model = "claude-sonnet-5"
256
+ effort = "high"
245
257
  ```
246
258
 
247
259
  Kyoso maps model pins to adapter-supported configuration:
@@ -249,6 +261,8 @@ Kyoso maps model pins to adapter-supported configuration:
249
261
  - Claude: sets `ANTHROPIC_MODEL` when not already set in `agents.claude.env` or a whitelisted parent env.
250
262
  - Codex: sets `CODEX_CONFIG={"model":"..."}` when `CODEX_CONFIG` is not already set. To combine other Codex session config with a model pin, set `agents.codex.env.CODEX_CONFIG` directly.
251
263
 
264
+ Effort works differently: Kyoso does not set an env var for it. Instead, it sends an ACP `session/set_config_option` request to the backend agent once per session, before the first prompt: `configId: "effort"` for Claude, `configId: "reasoning_effort"` for Codex. Valid values depend on the backend agent version and the selected model (for example, Claude only exposes effort levels for models that support them). Kyoso does not validate `effort` values itself; if the backend agent rejects the request or does not support it, Kyoso logs it to stderr and continues the review.
265
+
252
266
  ## Audit
253
267
 
254
268
  Audit traces are written to:
@@ -270,7 +284,7 @@ Kyoso loads config in this order:
270
284
  - project TOML: `<cwd>/kyoso.toml`
271
285
  - CLI flags such as `--network`
272
286
 
273
- Project `kyoso.toml` is declarative and does not require trust approval. It can set safe project-scoped keys such as tool toggles, agent `enabled` / `model` / `role` / `timeoutMs`, workspace byte limits and additive `workspace.deny`, verification settings, advisory judge settings, and tightening-only security/network settings.
287
+ Project `kyoso.toml` is declarative and does not require trust approval. It can set safe project-scoped keys such as tool toggles, agent `enabled` / `model` / `effort` / `role` / `timeoutMs`, workspace byte limits and additive `workspace.deny`, verification settings, advisory judge settings, and tightening-only security/network settings.
274
288
 
275
289
  Global TOML is for user-owned settings that can launch commands or forward environment variables:
276
290
 
@@ -285,7 +299,7 @@ CODEX_CONFIG = '{"model":"gpt-5.5"}'
285
299
 
286
300
  `kyoso.config.ts` is deprecated but still supported for compatibility. It is loaded only after trust-on-first-use approval; trusted hashes are stored in `~/.kyoso/trusted-configs.json`. If both `kyoso.toml` and `kyoso.config.ts` exist, Kyoso uses TOML and ignores the TypeScript config.
287
301
 
288
- Default agent timeouts are Codex 120 seconds and Claude 240 seconds. MCP clients should allow at least 360 seconds for tool calls. If `verification.enabled` is true, allow at least 480 seconds because Kyoso may run an additional cross-agent verification round.
302
+ Default agent timeouts are Codex 120 seconds and Claude 300 seconds. MCP clients should allow at least 360 seconds for tool calls. If `verification.enabled` is true, allow at least 480 seconds because Kyoso may run an additional cross-agent verification round.
289
303
 
290
304
  Optional finding verification is disabled by default:
291
305
 
@@ -319,7 +333,7 @@ Team admins should also check organization Usage credits. If credits are enabled
319
333
 
320
334
  ## Troubleshooting
321
335
 
322
- - MCP timeout: set client tool timeouts to at least 360 seconds, or at least 480 seconds when `verification.enabled` is true. Kyoso defaults are Codex 120 seconds, Claude 240 seconds, and verification 90 seconds.
336
+ - MCP timeout: set client tool timeouts to at least 360 seconds, or at least 480 seconds when `verification.enabled` is true. Kyoso defaults are Codex 120 seconds, Claude 300 seconds, and verification 90 seconds.
323
337
  - Fresh npm release: minimum-package-age protection in tools such as safe-chain may briefly block `npx @kyo-so/cli` resolution after publish.
324
338
  - Deprecated TypeScript config: untrusted `kyoso.config.ts` is skipped unless you pass `--trust-config`; prefer `kyoso.toml`.
325
339
 
package/README.zh-CN.md CHANGED
@@ -22,6 +22,16 @@ Kyo-so (Kyoso / 協奏) 是面向 AI coding workflows 的 MCP-native、ACP-power
22
22
 
23
23
  Kyoso 不会应用代码更改。
24
24
 
25
+ ## Review Flow
26
+
27
+ 三个 review tool 都运行同一条流水线:先进行 secret scan,在 read-only 的临时快照上通过 ACP 并行运行 reviewer ensemble,然后聚合发现、应用门禁并作出决定。
28
+
29
+ <p align="center">
30
+ <img src="https://raw.githubusercontent.com/hokupod/kyoso/main/docs/assets/kyoso-review-flow.zh-CN.svg" alt="Kyo-so 评审执行流程:从 MCP/CLI 请求到 secret scan、快照、协奏评审、聚合、门禁与最终决定" width="640">
31
+ </p>
32
+
33
+ 当只启用一个 backend 时,会由 1 个 agent 以 `combined_reviewer` 运行,替代双角色 ensemble。此图的 Mermaid 源文件位于 [docs/assets/](docs/assets/)。
34
+
25
35
  ## Quick Start
26
36
 
27
37
  无需全局安装。通过 `npx` 或 `bunx` 运行 Kyoso。
@@ -229,18 +239,20 @@ Default child-agent env allowlist:
229
239
 
230
240
  Kyoso 还会 forward 启动 subprocesses 所需的最小 runtime env:`PATH`, `HOME`, `TMPDIR`, `TEMP`, `TMP`, `LANG`, `LC_ALL`, `SHELL`, `USER`, `USERNAME`, and `SystemRoot`。
231
241
 
232
- ## Agent Models
242
+ ## Agent Models and Effort
233
243
 
234
- 省略 `agents.<name>.model` 时,会使用各 agent 自身的 default。Codex 使用 local Codex config,例如 `~/.codex/config.toml`;Claude 使用 adapter default。
244
+ 省略 `agents.<name>.model` 或 `agents.<name>.effort` 时,会使用各 agent 自身的 default。Codex 使用 local Codex config,例如 `~/.codex/config.toml`;Claude 使用 adapter default。
235
245
 
236
246
  可指定的 model 名称请参阅 [Claude models overview](https://platform.claude.com/docs/en/about-claude/models/overview) 与 [Codex models](https://developers.openai.com/codex/models)。
237
247
 
238
248
  ```toml
239
249
  [agents.codex]
240
250
  model = "gpt-5.5"
251
+ effort = "medium"
241
252
 
242
253
  [agents.claude]
243
254
  model = "claude-sonnet-5"
255
+ effort = "high"
244
256
  ```
245
257
 
246
258
  Kyoso 会将 model pins 映射到 adapter-supported configuration:
@@ -248,6 +260,8 @@ Kyoso 会将 model pins 映射到 adapter-supported configuration:
248
260
  - Claude: 当 `agents.claude.env` 或 whitelisted parent env 中尚未设置时,设置 `ANTHROPIC_MODEL`。
249
261
  - Codex: 当 `CODEX_CONFIG` 尚未设置时,设置 `CODEX_CONFIG={"model":"..."}`。若要将 model pin 与其他 Codex session config 组合,请直接设置 `agents.codex.env.CODEX_CONFIG`。
250
262
 
263
+ effort 的工作方式不同:Kyoso 不会为它设置 env var,而是在每个 session 中、发送第一个 prompt 之前,向 backend agent 发送一次 ACP `session/set_config_option` 请求(Claude 为 `configId: "effort"`,Codex 为 `configId: "reasoning_effort"`)。有效值取决于 backend agent 的版本和所选的 model(例如,Claude 仅对支持 effort levels 的 model 公开该 option)。Kyoso 本身不会 validate `effort` 的值;如果 backend agent reject 了该请求,或不支持该 option,Kyoso 会将其记录到 stderr 并继续 review。
264
+
251
265
  ## Audit
252
266
 
253
267
  Audit traces 写入:
@@ -269,7 +283,7 @@ Kyoso 按以下顺序 load config:
269
283
  - project TOML: `<cwd>/kyoso.toml`
270
284
  - `--network` 等 CLI flags
271
285
 
272
- Project `kyoso.toml` 是 declarative config,不需要 trust approval。它可以设置 tools toggles、agent `enabled` / `model` / `role` / `timeoutMs`、workspace byte limits 和 additive `workspace.deny`、verification settings、advisory judge settings,以及 tightening-only security/network settings。
286
+ Project `kyoso.toml` 是 declarative config,不需要 trust approval。它可以设置 tools toggles、agent `enabled` / `model` / `effort` / `role` / `timeoutMs`、workspace byte limits 和 additive `workspace.deny`、verification settings、advisory judge settings,以及 tightening-only security/network settings。
273
287
 
274
288
  Global TOML 用于 user-owned settings,包括 command 启动和 env forwarding。
275
289
 
@@ -284,7 +298,7 @@ CODEX_CONFIG = '{"model":"gpt-5.5"}'
284
298
 
285
299
  `kyoso.config.ts` 已 deprecated,但为了兼容仍然 supported。它只会在 trust-on-first-use approval 之后 load;trusted hashes 保存在 `~/.kyoso/trusted-configs.json`。如果 `kyoso.toml` 和 `kyoso.config.ts` 同时存在,Kyoso 使用 TOML 并忽略 TypeScript config。
286
300
 
287
- Default agent timeouts 是 Codex 120 秒、Claude 240 秒。MCP clients 应允许 tool calls 至少运行 360 秒。如果 `verification.enabled` 为 true,Kyoso 可能会运行额外的 cross-agent verification round,因此建议至少允许 480 秒。
301
+ Default agent timeouts 是 Codex 120 秒、Claude 300 秒。MCP clients 应允许 tool calls 至少运行 360 秒。如果 `verification.enabled` 为 true,Kyoso 可能会运行额外的 cross-agent verification round,因此建议至少允许 480 秒。
288
302
 
289
303
  Optional finding verification 默认 disabled:
290
304
 
@@ -318,7 +332,7 @@ Team admins 还应检查 organization Usage credits。如果启用了 credits,
318
332
 
319
333
  ## Troubleshooting
320
334
 
321
- - MCP timeout: 将 client tool timeouts 设置为至少 360 秒;当 `verification.enabled` 为 true 时,设置为至少 480 秒。Kyoso defaults 是 Codex 120 秒、Claude 240 秒、verification 90 秒。
335
+ - MCP timeout: 将 client tool timeouts 设置为至少 360 秒;当 `verification.enabled` 为 true 时,设置为至少 480 秒。Kyoso defaults 是 Codex 120 秒、Claude 300 秒、verification 90 秒。
322
336
  - Fresh npm release: safe-chain 等 minimum-package-age protection 可能会在 publish 后短时间内 block `npx @kyo-so/cli` resolution。
323
337
  - Deprecated TypeScript config: 除非传入 `--trust-config`,否则 untrusted `kyoso.config.ts` 会被 skip;新配置请使用 `kyoso.toml`。
324
338
 
package/dist/bin/kyoso.js CHANGED
@@ -169774,7 +169774,7 @@ function isAllowedProjectPath(path) {
169774
169774
  if (top === "tools" && path.length === 2 && ["planReview", "securityReview", "diffReview"].includes(second ?? "")) {
169775
169775
  return true;
169776
169776
  }
169777
- if (top === "agents" && path.length === 3 && ["codex", "claude"].includes(second ?? "") && ["enabled", "model", "role", "timeoutMs"].includes(third ?? "")) {
169777
+ if (top === "agents" && path.length === 3 && ["codex", "claude"].includes(second ?? "") && ["enabled", "model", "effort", "role", "timeoutMs"].includes(third ?? "")) {
169778
169778
  return true;
169779
169779
  }
169780
169780
  if (top === "verification" && path.length === 2 && ["enabled", "maxFindings", "timeoutMs"].includes(second ?? "")) {
@@ -184186,6 +184186,7 @@ var agentSchema = exports_external.object({
184186
184186
  command: exports_external.string(),
184187
184187
  args: exports_external.array(exports_external.string()).default([]),
184188
184188
  model: exports_external.string().optional(),
184189
+ effort: exports_external.string().optional(),
184189
184190
  role: exports_external.enum([
184190
184191
  "implementation_reviewer",
184191
184192
  "architecture_security_reviewer",
@@ -184273,6 +184274,7 @@ function agentConfigLeafPaths(agent) {
184273
184274
  `agents.${agent}.command`,
184274
184275
  `agents.${agent}.args`,
184275
184276
  `agents.${agent}.model`,
184277
+ `agents.${agent}.effort`,
184276
184278
  `agents.${agent}.role`,
184277
184279
  `agents.${agent}.timeoutMs`,
184278
184280
  `agents.${agent}.env`,
@@ -184347,7 +184349,7 @@ var REDACTION = "[KYOSO_REDACTED]";
184347
184349
  var DEFAULT_AGENT_TIMEOUT_MS = 120000;
184348
184350
  var RAW_OUTPUT_MAX_CHARS = 16384;
184349
184351
  var KYOSO_CHILD_AGENT = "KYOSO_CHILD_AGENT";
184350
- var KYOSO_VERSION = "0.6.0";
184352
+ var KYOSO_VERSION = "0.7.0";
184351
184353
 
184352
184354
  // src/security/sanitizeText.ts
184353
184355
  var SENSITIVE_TEXT_PATTERNS = [
@@ -203406,7 +203408,7 @@ async function runSubprocessAgent(agent, agentConfig, input2) {
203406
203408
  error: failure
203407
203409
  });
203408
203410
  });
203409
- runAcpClientWorkflow(child, input2, abortController.signal).then((rawText) => {
203411
+ runAcpClientWorkflow(child, input2, abortController.signal, resolveEffortConfigOption(agent, agentConfig.effort)).then(({ rawText, warnings }) => {
203410
203412
  stdout = rawText;
203411
203413
  resolveOnce({
203412
203414
  agent,
@@ -203415,7 +203417,8 @@ async function runSubprocessAgent(agent, agentConfig, input2) {
203415
203417
  rawText,
203416
203418
  normalized: normalizeAgentOutput(agent, input2.role, rawText),
203417
203419
  startedAt,
203418
- completedAt: new Date().toISOString()
203420
+ completedAt: new Date().toISOString(),
203421
+ ...warnings.length > 0 ? { warnings } : {}
203419
203422
  });
203420
203423
  }).catch((error51) => {
203421
203424
  if (abortController.signal.aborted)
@@ -203450,7 +203453,7 @@ async function runSubprocessAgent(agent, agentConfig, input2) {
203450
203453
  });
203451
203454
  });
203452
203455
  }
203453
- async function runAcpClientWorkflow(child, input2, signal) {
203456
+ async function runAcpClientWorkflow(child, input2, signal, configOption) {
203454
203457
  if (!child.stdin || !child.stdout) {
203455
203458
  throw new Error("Agent process did not expose stdio streams.");
203456
203459
  }
@@ -203498,15 +203501,36 @@ async function runAcpClientWorkflow(child, input2, signal) {
203498
203501
  kyosoReadOnly: true
203499
203502
  }
203500
203503
  }).withSession(async (session) => {
203504
+ const warnings = [];
203505
+ if (configOption) {
203506
+ await ctx.request(methods.agent.session.setConfigOption, { sessionId: session.sessionId, ...configOption }, { cancellationSignal: signal }).catch((error51) => {
203507
+ if (signal.aborted)
203508
+ return;
203509
+ const sanitizedValue = sanitizeTextForDisplay(configOption.value);
203510
+ const detail = sanitizeTextForDisplay(formatAgentErrorDetail(error51));
203511
+ const warning = `rejected effort config option (configId=${configOption.configId}, value=${sanitizedValue}); continuing without it: ${detail}`;
203512
+ warnings.push(warning);
203513
+ console.error(`kyoso: ${warning}`);
203514
+ });
203515
+ }
203501
203516
  const promptResponse = session.prompt(input2.prompt, {
203502
203517
  cancellationSignal: signal
203503
203518
  });
203504
203519
  const text = await session.readText();
203505
203520
  await promptResponse;
203506
- return text;
203521
+ return { rawText: text, warnings };
203507
203522
  });
203508
203523
  });
203509
203524
  }
203525
+ function resolveEffortConfigOption(agent, effort) {
203526
+ if (!effort)
203527
+ return;
203528
+ if (agent === "codex")
203529
+ return { configId: "reasoning_effort", value: effort };
203530
+ if (agent === "claude")
203531
+ return { configId: "effort", value: effort };
203532
+ return;
203533
+ }
203510
203534
  async function readWorkspaceFile(workspaceDir, requestedPath, line, limit) {
203511
203535
  const workspaceRoot = await realpath(workspaceDir);
203512
203536
  const candidates = resolveReadablePaths(workspaceRoot, requestedPath);
@@ -205160,6 +205184,7 @@ async function runReview(tool, request, options = {}) {
205160
205184
  manager,
205161
205185
  trace
205162
205186
  });
205187
+ warnings.push(...agentResults.flatMap((result2) => (result2.warnings ?? []).map((warning) => `Agent ${result2.agent} ${warning}`)));
205163
205188
  const normalizedAgentResults = agentResults.map(normalizeAgentRunResult);
205164
205189
  const agentsUsed = normalizedAgentResults.map((result2) => result2.agent);
205165
205190
  const reviewMode = agentsUsed.length === 1 ? "single_agent" : "multi_agent";
@@ -20,6 +20,7 @@ export declare const kyosoConfigSchema: z.ZodObject<{
20
20
  command: z.ZodString;
21
21
  args: z.ZodDefault<z.ZodArray<z.ZodString>>;
22
22
  model: z.ZodOptional<z.ZodString>;
23
+ effort: z.ZodOptional<z.ZodString>;
23
24
  role: z.ZodEnum<{
24
25
  implementation_reviewer: "implementation_reviewer";
25
26
  architecture_security_reviewer: "architecture_security_reviewer";
@@ -41,6 +42,7 @@ export declare const kyosoConfigSchema: z.ZodObject<{
41
42
  command: z.ZodString;
42
43
  args: z.ZodDefault<z.ZodArray<z.ZodString>>;
43
44
  model: z.ZodOptional<z.ZodString>;
45
+ effort: z.ZodOptional<z.ZodString>;
44
46
  role: z.ZodEnum<{
45
47
  implementation_reviewer: "implementation_reviewer";
46
48
  architecture_security_reviewer: "architecture_security_reviewer";
@@ -4,4 +4,4 @@ export declare const DEFAULT_MAX_DIFF_BYTES = 300000;
4
4
  export declare const RAW_OUTPUT_MAX_CHARS = 16384;
5
5
  export declare const TRACE_DIR = ".kyoso/traces";
6
6
  export declare const KYOSO_CHILD_AGENT = "KYOSO_CHILD_AGENT";
7
- export declare const KYOSO_VERSION = "0.6.0";
7
+ export declare const KYOSO_VERSION = "0.7.0";
@@ -123,6 +123,7 @@ export type AgentRunResult = {
123
123
  message: string;
124
124
  detail?: string;
125
125
  };
126
+ warnings?: string[];
126
127
  startedAt: string;
127
128
  completedAt?: string;
128
129
  };
package/dist/index.js CHANGED
@@ -183783,6 +183783,7 @@ var agentSchema = exports_external.object({
183783
183783
  command: exports_external.string(),
183784
183784
  args: exports_external.array(exports_external.string()).default([]),
183785
183785
  model: exports_external.string().optional(),
183786
+ effort: exports_external.string().optional(),
183786
183787
  role: exports_external.enum([
183787
183788
  "implementation_reviewer",
183788
183789
  "architecture_security_reviewer",
@@ -183870,6 +183871,7 @@ function agentConfigLeafPaths(agent) {
183870
183871
  `agents.${agent}.command`,
183871
183872
  `agents.${agent}.args`,
183872
183873
  `agents.${agent}.model`,
183874
+ `agents.${agent}.effort`,
183873
183875
  `agents.${agent}.role`,
183874
183876
  `agents.${agent}.timeoutMs`,
183875
183877
  `agents.${agent}.env`,
@@ -184109,7 +184111,7 @@ function isAllowedProjectPath(path) {
184109
184111
  if (top === "tools" && path.length === 2 && ["planReview", "securityReview", "diffReview"].includes(second ?? "")) {
184110
184112
  return true;
184111
184113
  }
184112
- if (top === "agents" && path.length === 3 && ["codex", "claude"].includes(second ?? "") && ["enabled", "model", "role", "timeoutMs"].includes(third ?? "")) {
184114
+ if (top === "agents" && path.length === 3 && ["codex", "claude"].includes(second ?? "") && ["enabled", "model", "effort", "role", "timeoutMs"].includes(third ?? "")) {
184113
184115
  return true;
184114
184116
  }
184115
184117
  if (top === "verification" && path.length === 2 && ["enabled", "maxFindings", "timeoutMs"].includes(second ?? "")) {
@@ -189141,7 +189143,7 @@ async function runSubprocessAgent(agent, agentConfig, input) {
189141
189143
  error: failure
189142
189144
  });
189143
189145
  });
189144
- runAcpClientWorkflow(child, input, abortController.signal).then((rawText) => {
189146
+ runAcpClientWorkflow(child, input, abortController.signal, resolveEffortConfigOption(agent, agentConfig.effort)).then(({ rawText, warnings }) => {
189145
189147
  stdout = rawText;
189146
189148
  resolveOnce({
189147
189149
  agent,
@@ -189150,7 +189152,8 @@ async function runSubprocessAgent(agent, agentConfig, input) {
189150
189152
  rawText,
189151
189153
  normalized: normalizeAgentOutput(agent, input.role, rawText),
189152
189154
  startedAt,
189153
- completedAt: new Date().toISOString()
189155
+ completedAt: new Date().toISOString(),
189156
+ ...warnings.length > 0 ? { warnings } : {}
189154
189157
  });
189155
189158
  }).catch((error51) => {
189156
189159
  if (abortController.signal.aborted)
@@ -189185,7 +189188,7 @@ async function runSubprocessAgent(agent, agentConfig, input) {
189185
189188
  });
189186
189189
  });
189187
189190
  }
189188
- async function runAcpClientWorkflow(child, input, signal) {
189191
+ async function runAcpClientWorkflow(child, input, signal, configOption) {
189189
189192
  if (!child.stdin || !child.stdout) {
189190
189193
  throw new Error("Agent process did not expose stdio streams.");
189191
189194
  }
@@ -189233,15 +189236,36 @@ async function runAcpClientWorkflow(child, input, signal) {
189233
189236
  kyosoReadOnly: true
189234
189237
  }
189235
189238
  }).withSession(async (session) => {
189239
+ const warnings = [];
189240
+ if (configOption) {
189241
+ await ctx.request(methods.agent.session.setConfigOption, { sessionId: session.sessionId, ...configOption }, { cancellationSignal: signal }).catch((error51) => {
189242
+ if (signal.aborted)
189243
+ return;
189244
+ const sanitizedValue = sanitizeTextForDisplay(configOption.value);
189245
+ const detail = sanitizeTextForDisplay(formatAgentErrorDetail(error51));
189246
+ const warning = `rejected effort config option (configId=${configOption.configId}, value=${sanitizedValue}); continuing without it: ${detail}`;
189247
+ warnings.push(warning);
189248
+ console.error(`kyoso: ${warning}`);
189249
+ });
189250
+ }
189236
189251
  const promptResponse = session.prompt(input.prompt, {
189237
189252
  cancellationSignal: signal
189238
189253
  });
189239
189254
  const text = await session.readText();
189240
189255
  await promptResponse;
189241
- return text;
189256
+ return { rawText: text, warnings };
189242
189257
  });
189243
189258
  });
189244
189259
  }
189260
+ function resolveEffortConfigOption(agent, effort) {
189261
+ if (!effort)
189262
+ return;
189263
+ if (agent === "codex")
189264
+ return { configId: "reasoning_effort", value: effort };
189265
+ if (agent === "claude")
189266
+ return { configId: "effort", value: effort };
189267
+ return;
189268
+ }
189245
189269
  async function readWorkspaceFile(workspaceDir, requestedPath, line, limit) {
189246
189270
  const workspaceRoot = await realpath(workspaceDir);
189247
189271
  const candidates = resolveReadablePaths(workspaceRoot, requestedPath);
@@ -191169,6 +191193,7 @@ async function runReview(tool, request, options = {}) {
191169
191193
  manager,
191170
191194
  trace
191171
191195
  });
191196
+ warnings.push(...agentResults.flatMap((result2) => (result2.warnings ?? []).map((warning) => `Agent ${result2.agent} ${warning}`)));
191172
191197
  const normalizedAgentResults = agentResults.map(normalizeAgentRunResult);
191173
191198
  const agentsUsed = normalizedAgentResults.map((result2) => result2.agent);
191174
191199
  const reviewMode = agentsUsed.length === 1 ? "single_agent" : "multi_agent";
@@ -8,4 +8,4 @@ defaultMode = "model_only"
8
8
  [agents.claude]
9
9
  # Omit model to use the Claude adapter default.
10
10
  # model = "claude-sonnet-5"
11
- timeoutMs = 240000
11
+ timeoutMs = 300000
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kyo-so/cli",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Kyo-so: MCP-native, ACP-powered multi-agent review gates for AI coding workflows.",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "repository": {