docs(headless): record preserved Auto policy on resume

This commit is contained in:
Tianyi Cui committed 2026-10-18 11:44:14 +08:00
1 parent e0dffac6fa
commit a8963e75a0
12 files changed
+19 -20

No files matched your search

@@ -9,8 +9,8 @@
en: 20d6e15ab5963b2e
zh: 0b02f9b734d7e51d
/agent-note-headless-caller-authority-for-auto-review/decision:
en: b82d3db1eb75f183
zh: efc4f6c4102f641b
en: f62c8ade10197017
zh: f8d8735da1b5d076
/agent-note-headless-caller-authority-for-auto-review/alternatives-considered:
en: 5b1070855dcaef30
zh: ba056b01e3310f51
@@ -14,7 +14,7 @@ The [experimental Auto layer](../../../../packages/experimental/auto-review/READ
While Auto is active, the headless runner admits each task with the optional user-source field `entrypoint: 'headless'`. The durable message keeps this attribution across resume and ordinary replay. The reviewer assigns its text the `caller-instruction` role. The caller may be a human or a supervising agent; both can define the task and authorize an exact medium-risk action, target, and scope. Direct-parent instructions cannot override caller restrictions. Files, constraints, checkpoints, images, tool results, and unmarked messages do not gain authority. The marker comes from task admission, never from prompt contents; it is not retroactively added to earlier history.
Headless applies an explicit `--approval-policy` after selecting the permission preset. An unattended invocation repeats `--permission-mode auto --approval-policy never`, including on resume. This retains the structured denial and avoids dependence on a human answerer. `ask` still follows [the approval fallback decision](2026-09-24-auto-review-user-approval-fallback.md); it does not add a CLI approval transport. Unloading a profile may migrate a live Auto Session to Full access, so saved selection alone is insufficient for an unattended invocation.
Headless applies an explicit `--approval-policy` after selecting the permission preset. An unattended invocation repeats `--permission-mode auto --approval-policy never`, including on resume. This retains the structured denial and avoids dependence on a human answerer. `ask` still follows [the approval fallback decision](2026-09-24-auto-review-user-approval-fallback.md); it does not add a CLI approval transport. Application shutdown preserves the saved Auto selection. Restoring it requires the integration even when selecting another preset; removing the plugin while the application remains active still migrates live Sessions to Full access.
The JSON projection includes existing durable error fields under its normal output bounds. A final denial carries `AutoReviewDeniedError` / `AUTO_REVIEW_DENIED` and optional reviewer detail; a technical or parsing failure carries `AutoReviewFailedError` / `AUTO_REVIEW_FAILED`. Neither executes the tool body. Completed agent execution does not imply that every requested action succeeded.
@@ -14,7 +14,7 @@ Status: implemented
Auto 生效时,headless runner 接纳每个任务并在 user source 写入可选字段 `entrypoint: 'headless'`。持久消息在恢复与普通回放时保留此归属。Reviewer 将其文本归为 `caller-instruction`。调用者可以是人或监督 agent;两者都可定义任务,并明确授权 medium 风险动作、准确目标和范围。直接父级指令不能覆盖调用者限制。文件、约束、checkpoint、图片、工具结果和未标记消息不会获得权威。标记来自任务入口,绝不来自提示词内容;不会追补到早期历史。
Headless 在选择权限预设后应用显式 `--approval-policy`。无人值守调用每次都重复 `--permission-mode auto --approval-policy never`,包括恢复时。这保留结构化拒绝,并避免依赖人工应答者。`ask` 仍遵循[审批兜底决策](2026-09-24-auto-review-user-approval-fallback.zh.md);它不添加 CLI 审批传输。卸载 profile 可能将存活 Auto Session 迁移到 Full access,因此无人值守调用不能只依赖已保存的选择。
Headless 在选择权限预设后应用显式 `--approval-policy`。无人值守调用每次都重复 `--permission-mode auto --approval-policy never`,包括恢复时。这保留结构化拒绝,并避免依赖人工应答者。`ask` 仍遵循[审批兜底决策](2026-09-24-auto-review-user-approval-fallback.zh.md);它不添加 CLI 审批传输。应用关闭保留已保存的 Auto 选择。恢复时需要该 integration,即使要选择其他预设也是如此;应用仍运行时移除插件则仍将存活 Session 迁移到 Full access。
JSON 投影在正常输出限制内包含已有的持久错误字段。最终拒绝携带 `AutoReviewDeniedError` / `AUTO_REVIEW_DENIED` 和可选 reviewer 详情;技术或解析失败携带 `AutoReviewFailedError` / `AUTO_REVIEW_FAILED`。两者都不执行工具 body。Agent 执行完成不代表每个请求动作都成功。
+1 -1
View File
@@ -1484,7 +1484,7 @@ export interface Config {
- `inject`: `agentDefaultModel` · `agents` · `sessions`
- `refs`: [`ApprovalPolicy`](subsystems/approval.md)
- `source`: [`packages/bundle/headless/src/index.ts:47`](../packages/bundle/headless/src/index.ts)
- `source`: [`packages/bundle/headless/src/index.ts:48`](../packages/bundle/headless/src/index.ts)
```ts config-catalog
/** Plugin config: the task and run options resolved from this app's injected provider service. */
+1 -1
View File
@@ -1486,7 +1486,7 @@ export interface Config {
- `inject`: `agentDefaultModel` · `agents` · `sessions`
- `refs`: [`ApprovalPolicy`](subsystems/approval.zh.md)
- `source`: [`packages/bundle/headless/src/index.ts:47`](../packages/bundle/headless/src/index.ts)
- `source`: [`packages/bundle/headless/src/index.ts:48`](../packages/bundle/headless/src/index.ts)
```ts config-catalog
/** Plugin config: the task and run options resolved from this app's injected provider service. */
@@ -21,8 +21,8 @@
en: 1ff6d4cdda7aa1c4
zh: 46dafadc80eaa569
/2026-10-18-headless-auto-review/verification:
en: 9e46d8b141eacf08
zh: b957566b510e4587
en: 426ff49e504c1413
zh: 139ada1a214794f7
/2026-10-18-headless-auto-review/dev-note:
en: b75c8458928b72b9
zh: 003ba4e17b4b5269
@@ -52,7 +52,7 @@ Existing messages without entrypoint remain valid and do not acquire caller auth
<a id="verification"></a>
## Verification
Focused headless and Auto review suites: 161 tests passed with 100% coverage of both changed modules. The shipped headless profile exercised allow, deny, malformed response, provider failure, missing integration, and resumed caller attribution. The recorded headless-auto-review scenario verifies that only the allowed target is written.
Focused headless and Auto review suites: 163 tests passed with 100% coverage of both changed modules. The shipped headless profile exercised allow, deny, malformed response, provider failure, missing integration, and resumed caller attribution. The recorded headless-auto-review scenario verifies that only the allowed target is written.
<a id="dev-note"></a>
## Dev Note
@@ -52,7 +52,7 @@ changes:
<a id="verification"></a>
## 验证
聚焦 headless 与 Auto review 套件:161 个测试通过,两个修改模块的覆盖率均为 100%。Shipped headless profile 覆盖允许、拒绝、不合法响应、provider 失败、缺失 integration 与恢复调用者归属。记录的 headless-auto-review 场景验证只写入获准目标。
聚焦 headless 与 Auto review 套件:163 个测试通过,两个修改模块的覆盖率均为 100%。Shipped headless profile 覆盖允许、拒绝、不合法响应、provider 失败、缺失 integration 与恢复调用者归属。记录的 headless-auto-review 场景验证只写入获准目标。
<a id="dev-note"></a>
## 开发备注
@@ -21,8 +21,8 @@
en: 6198fc176a1e77fc
zh: f486661a0658f313
/deepseek-ai-dsh-experimental-auto-review/use-this-package/headless-supervision:
en: db33ea8a610a9cd9
zh: e63c471c920c0087
en: 61d5bb9fcebf7946
zh: 11616bfeeb76d99f
/deepseek-ai-dsh-experimental-auto-review/use-this-package/what-you-get:
en: daa4e3dea6bdd117
zh: fe9b3899bafdec7a
+1 -1
View File
@@ -59,7 +59,7 @@ The headless runner marks tasks admitted while Auto is active with `source.entry
Select `--approval-policy never` after Auto selection so denials are final and retain `AUTO_REVIEW_DENIED` plus the optional raw reason in `tool_result.error`. `AUTO_REVIEW_FAILED` identifies invalid reviewer output or a technical failure. Neither executes the body. Review the task report even when `final.reason` is completed: the model can finish after a denied call.
Resume with the same worktree, `--session-id`, and both policy flags. A supervisor can send an explicit scoped instruction after a denial; a new call receives a fresh review. Headless has no channel for approving a pending call. `ask` uses any composed approval answerer and fails closed when none is available; it does not turn stdin into an approval channel. Profile unloading can migrate live Auto Sessions to Full access, so repeat Auto selection on each unattended invocation.
Resume with the same worktree, `--session-id`, and both policy flags. A supervisor can send an explicit scoped instruction after a denial; a new call receives a fresh review. Headless has no channel for approving a pending call. `ask` uses any composed approval answerer and fails closed when none is available; it does not turn stdin into an approval channel. Application shutdown preserves Auto. The same integration must be loaded when restoring its Session, even to select another preset. Removing the plugin from a running application still migrates its live Auto Sessions to Full access.
### What you get
@@ -59,7 +59,7 @@ Headless runner 将 Auto 生效期间接纳的任务标记为 `source.entrypoint
在选择 Auto 后设置 `--approval-policy never`,使拒绝成为最终结果,并在 `tool_result.error` 中保留 `AUTO_REVIEW_DENIED` 及可选原始理由。`AUTO_REVIEW_FAILED` 标识不合法的 reviewer 输出或技术失败。两者都不执行 body。即使 `final.reason` 为 completed,也需审查任务报告:调用被拒绝后模型仍可结束。
恢复时使用相同工作目录、`--session-id` 和两个策略选项。监督者可在拒绝后发送明确且限定范围的指令;新调用会重新接受审查。Headless 没有审批待执行调用的通道。`ask` 使用已组合的审批应答者,没有可用应答者时按拒绝处理;它不会把 stdin 变成审批通道。Profile 卸载可能将存活 Auto Session 迁移到 Full access,因此每次无人值守调用都应重复选择 Auto。
恢复时使用相同工作目录、`--session-id` 和两个策略选项。监督者可在拒绝后发送明确且限定范围的指令;新调用会重新接受审查。Headless 没有审批待执行调用的通道。`ask` 使用已组合的审批应答者,没有可用应答者时按拒绝处理;它不会把 stdin 变成审批通道。应用关闭保留 Auto。恢复其 Session 时必须加载同一 integration,即使要选择其他预设也是如此。从运行中的应用移除插件仍会将其存活 Auto Session 迁移到 Full access。
### 获得的能力
@@ -15,27 +15,26 @@
{"type":"request/header","data":{"header":{"config":{"provider":"deepseek-official","model":"deepseek-v4-flash"},"tools":"{{tools}}"},"reason":"initial"}}
{"type":"request/context","data":{"provider":"deepseek-official","model":"deepseek-v4-flash"}}
{"type":"session/title","data":{"title":"Write allowed.txt, denied.txt, malformed","messageSeqs":[11],"source":{"kind":"fallback"}}}
{"type":"assistant/message","data":{"turn":1,"step":1,"message":{"role":"assistant","content":[{"type":"tool-call","id":"auto-allowed","name":"write","arguments":"{\"file_path\":\"allowed.txt\",\"content\":\"allowed\\n\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{message:4}}"},"stream":[{"type":"chunk","time":1792256268702,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}},{"type":"tool-call-chunks","time0":1792256268703,"index":0,"dt":[],"id":"auto-allowed","name":"write","args":["{\"file_path\":\"allowed.txt\",\"content\":\"allowed\\n\"}"]},{"type":"chunk","time":1792256268703,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"auto-allowed","name":"write","arguments":"{\"file_path\":\"allowed.txt\",\"content\":\"allowed\\n\"}"}}},{"type":"chunk","time":1792256268703,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}]},"surfaceOp":"append"}
{"type":"assistant/message","data":{"turn":1,"step":1,"message":{"role":"assistant","content":[{"type":"tool-call","id":"auto-allowed","name":"write","arguments":"{\"file_path\":\"allowed.txt\",\"content\":\"allowed\\n\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{message:4}}"},"stream":[{"type":"chunk","time":1792259366793,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}},{"type":"tool-call-chunks","time0":1792259366793,"index":0,"dt":[],"id":"auto-allowed","name":"write","args":["{\"file_path\":\"allowed.txt\",\"content\":\"allowed\\n\"}"]},{"type":"chunk","time":1792259366793,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"auto-allowed","name":"write","arguments":"{\"file_path\":\"allowed.txt\",\"content\":\"allowed\\n\"}"}}},{"type":"chunk","time":1792259366793,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}]},"surfaceOp":"append"}
{"type":"tool/call","data":{"turn":1,"step":1,"callId":"auto-allowed","name":"write","arguments":"{\"file_path\":\"allowed.txt\",\"content\":\"allowed\\n\"}"}}
{"type":"tool/result","data":{"turn":1,"step":1,"message":{"role":"tool","source":{"kind":"tool","callId":"auto-allowed"},"toolCallId":"auto-allowed","content":[{"type":"text","text":"<path>{{cwd}}/allowed.txt</path>\n<type>file</type>\n<content>\nCreated file\n</content>"}],"isError":false,"id":"{{message:5}}"},"meta":{"operation":"create","path":"{{cwd}}/allowed.txt","diffs":[]}},"sourceEventSeqs":[17],"surfaceOp":"append"}
{"type":"step/end","data":{"turn":1,"step":1}}
{"type":"step/start","data":{"turn":1,"step":2}}
{"type":"assistant/message","data":{"turn":1,"step":2,"message":{"role":"assistant","content":[{"type":"tool-call","id":"auto-denied","name":"write","arguments":"{\"file_path\":\"denied.txt\",\"content\":\"denied\\n\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{message:6}}"},"stream":[{"type":"chunk","time":1792256268719,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}},{"type":"tool-call-chunks","time0":1792256268720,"index":0,"dt":[],"id":"auto-denied","name":"write","args":["{\"file_path\":\"denied.txt\",\"content\":\"denied\\n\"}"]},{"type":"chunk","time":1792256268720,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"auto-denied","name":"write","arguments":"{\"file_path\":\"denied.txt\",\"content\":\"denied\\n\"}"}}},{"type":"chunk","time":1792256268720,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}]},"surfaceOp":"append"}
{"type":"assistant/message","data":{"turn":1,"step":2,"message":{"role":"assistant","content":[{"type":"tool-call","id":"auto-denied","name":"write","arguments":"{\"file_path\":\"denied.txt\",\"content\":\"denied\\n\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{message:6}}"},"stream":[{"type":"chunk","time":1792259366820,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}},{"type":"tool-call-chunks","time0":1792259366820,"index":0,"dt":[],"id":"auto-denied","name":"write","args":["{\"file_path\":\"denied.txt\",\"content\":\"denied\\n\"}"]},{"type":"chunk","time":1792259366820,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"auto-denied","name":"write","arguments":"{\"file_path\":\"denied.txt\",\"content\":\"denied\\n\"}"}}},{"type":"chunk","time":1792259366820,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}]},"surfaceOp":"append"}
{"type":"tool/call","data":{"turn":1,"step":2,"callId":"auto-denied","name":"write","arguments":"{\"file_path\":\"denied.txt\",\"content\":\"denied\\n\"}"}}
{"type":"tool/result","data":{"turn":1,"step":2,"message":{"role":"tool","source":{"kind":"tool","callId":"auto-denied"},"toolCallId":"auto-denied","content":[{"type":"text","text":"Error: Auto review rejected tool \"write\"; its body was not executed"}],"isError":true,"id":"{{message:7}}"},"error":{"name":"AutoReviewDeniedError","code":"AUTO_REVIEW_DENIED","reason":"The caller did not authorize this target."}},"sourceEventSeqs":[22],"surfaceOp":"append"}
{"type":"step/end","data":{"turn":1,"step":2}}
{"type":"step/start","data":{"turn":1,"step":3}}
{"type":"assistant/message","data":{"turn":1,"step":3,"message":{"role":"assistant","content":[{"type":"tool-call","id":"auto-malformed","name":"write","arguments":"{\"file_path\":\"malformed.txt\",\"content\":\"malformed\\n\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{message:8}}"},"stream":[{"type":"chunk","time":1792256268733,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}},{"type":"tool-call-chunks","time0":1792256268733,"index":0,"dt":[],"id":"auto-malformed","name":"write","args":["{\"file_path\":\"malformed.txt\",\"content\":\"malformed\\n\"}"]},{"type":"chunk","time":1792256268733,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"auto-malformed","name":"write","arguments":"{\"file_path\":\"malformed.txt\",\"content\":\"malformed\\n\"}"}}},{"type":"chunk","time":1792256268733,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}]},"surfaceOp":"append"}
{"type":"assistant/message","data":{"turn":1,"step":3,"message":{"role":"assistant","content":[{"type":"tool-call","id":"auto-malformed","name":"write","arguments":"{\"file_path\":\"malformed.txt\",\"content\":\"malformed\\n\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{message:8}}"},"stream":[{"type":"chunk","time":1792259366833,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}},{"type":"tool-call-chunks","time0":1792259366833,"index":0,"dt":[],"id":"auto-malformed","name":"write","args":["{\"file_path\":\"malformed.txt\",\"content\":\"malformed\\n\"}"]},{"type":"chunk","time":1792259366833,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"auto-malformed","name":"write","arguments":"{\"file_path\":\"malformed.txt\",\"content\":\"malformed\\n\"}"}}},{"type":"chunk","time":1792259366833,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}]},"surfaceOp":"append"}
{"type":"tool/call","data":{"turn":1,"step":3,"callId":"auto-malformed","name":"write","arguments":"{\"file_path\":\"malformed.txt\",\"content\":\"malformed\\n\"}"}}
{"type":"tool/result","data":{"turn":1,"step":3,"message":{"role":"tool","source":{"kind":"tool","callId":"auto-malformed"},"toolCallId":"auto-malformed","content":[{"type":"text","text":"Error: Auto review of tool \"write\" failed; its body was not executed: auto-review: reviewer output does not match the risk/decision protocol"}],"isError":true,"id":"{{message:9}}"},"error":{"name":"AutoReviewFailedError","code":"AUTO_REVIEW_FAILED"}},"sourceEventSeqs":[27],"surfaceOp":"append"}
{"type":"step/end","data":{"turn":1,"step":3}}
{"type":"step/start","data":{"turn":1,"step":4}}
{"type":"assistant/message","data":{"turn":1,"step":4,"message":{"role":"assistant","content":[{"type":"tool-call","id":"auto-failed","name":"write","arguments":"{\"file_path\":\"failed.txt\",\"content\":\"failed\\n\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{message:10}}"},"stream":[{"type":"chunk","time":1792256268747,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}},{"type":"tool-call-chunks","time0":1792256268747,"index":0,"dt":[],"id":"auto-failed","name":"write","args":["{\"file_path\":\"failed.txt\",\"content\":\"failed\\n\"}"]},{"type":"chunk","time":1792256268747,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"auto-failed","name":"write","arguments":"{\"file_path\":\"failed.txt\",\"content\":\"failed\\n\"}"}}},{"type":"chunk","time":1792256268747,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}]},"surfaceOp":"append"}
{"type":"assistant/message","data":{"turn":1,"step":4,"message":{"role":"assistant","content":[{"type":"tool-call","id":"auto-failed","name":"write","arguments":"{\"file_path\":\"failed.txt\",\"content\":\"failed\\n\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{message:10}}"},"stream":[{"type":"chunk","time":1792259366847,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}},{"type":"tool-call-chunks","time0":1792259366847,"index":0,"dt":[],"id":"auto-failed","name":"write","args":["{\"file_path\":\"failed.txt\",\"content\":\"failed\\n\"}"]},{"type":"chunk","time":1792259366847,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"auto-failed","name":"write","arguments":"{\"file_path\":\"failed.txt\",\"content\":\"failed\\n\"}"}}},{"type":"chunk","time":1792259366847,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}]},"surfaceOp":"append"}
{"type":"tool/call","data":{"turn":1,"step":4,"callId":"auto-failed","name":"write","arguments":"{\"file_path\":\"failed.txt\",\"content\":\"failed\\n\"}"}}
{"type":"tool/result","data":{"turn":1,"step":4,"message":{"role":"tool","source":{"kind":"tool","callId":"auto-failed"},"toolCallId":"auto-failed","content":[{"type":"text","text":"Error: Auto review of tool \"write\" failed; its body was not executed: auto-review: reviewer ended with error SERVER: review provider unavailable"}],"isError":true,"id":"{{message:11}}"},"error":{"name":"AutoReviewFailedError","code":"AUTO_REVIEW_FAILED"}},"sourceEventSeqs":[32],"surfaceOp":"append"}
{"type":"step/end","data":{"turn":1,"step":4}}
{"type":"step/start","data":{"turn":1,"step":5}}
{"type":"assistant/message","data":{"turn":1,"step":5,"message":{"role":"assistant","content":[{"type":"text","text":"Only allowed.txt was written. The other calls did not execute."}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{message:12}}"},"stream":[{"type":"chunk","time":1792256268762,"chunk":{"type":"block-start","index":0,"blockType":"text"}},{"type":"text-chunks","time0":1792256268762,"index":0,"dt":[],"texts":["Only allowed.txt was written. The other calls did not execute."]},{"type":"chunk","time":1792256268762,"chunk":{"type":"block-end","index":0,"block":{"type":"text","text":"Only allowed.txt was written. The other calls did not execute."}}},{"type":"chunk","time":1792256268762,"chunk":{"type":"finish","reason":{"kind":"stop"}}}]},"surfaceOp":"append"}
{"type":"assistant/message","data":{"turn":1,"step":5,"message":{"role":"assistant","content":[{"type":"text","text":"Only allowed.txt was written. The other calls did not execute."}],"source":{"kind":"model","provider":"deepseek-official","model":"deepseek-v4-flash"},"id":"{{message:12}}"},"stream":[{"type":"chunk","time":1792259366860,"chunk":{"type":"block-start","index":0,"blockType":"text"}},{"type":"text-chunks","time0":1792259366860,"index":0,"dt":[],"texts":["Only allowed.txt was written. The other calls did not execute."]},{"type":"chunk","time":1792259366860,"chunk":{"type":"block-end","index":0,"block":{"type":"text","text":"Only allowed.txt was written. The other calls did not execute."}}},{"type":"chunk","time":1792259366860,"chunk":{"type":"finish","reason":{"kind":"stop"}}}]},"surfaceOp":"append"}
{"type":"step/end","data":{"turn":1,"step":5}}
{"type":"turn/end","data":{"turn":1,"reason":{"kind":"completed"}}}
{"type":"permission/preset","data":{"preset":"danger-full-access"}}