tomo-ai 0.5.7 → 0.5.9

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.
Files changed (43) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +1 -0
  3. package/defaults/skills/system/CONFIG.md +5 -3
  4. package/defaults/skills/system/SKILL.md +6 -2
  5. package/dist/agent/live-session.d.ts +3 -2
  6. package/dist/agent/live-session.d.ts.map +1 -1
  7. package/dist/agent/live-session.js +13 -1
  8. package/dist/agent/live-session.js.map +1 -1
  9. package/dist/agent/permissions.d.ts +60 -0
  10. package/dist/agent/permissions.d.ts.map +1 -0
  11. package/dist/agent/permissions.js +203 -0
  12. package/dist/agent/permissions.js.map +1 -0
  13. package/dist/agent/sdk-options.d.ts +41 -9
  14. package/dist/agent/sdk-options.d.ts.map +1 -1
  15. package/dist/agent/sdk-options.js +69 -22
  16. package/dist/agent/sdk-options.js.map +1 -1
  17. package/dist/agent.d.ts +5 -0
  18. package/dist/agent.d.ts.map +1 -1
  19. package/dist/agent.js +84 -12
  20. package/dist/agent.js.map +1 -1
  21. package/dist/channels/imessage.js +1 -1
  22. package/dist/channels/imessage.js.map +1 -1
  23. package/dist/channels/telegram.d.ts.map +1 -1
  24. package/dist/channels/telegram.js +2 -1
  25. package/dist/channels/telegram.js.map +1 -1
  26. package/dist/cli/config/model.js +1 -1
  27. package/dist/cli/config/model.js.map +1 -1
  28. package/dist/cli/config/shared.d.ts +1 -0
  29. package/dist/cli/config/shared.d.ts.map +1 -1
  30. package/dist/cli/config/shared.js +7 -6
  31. package/dist/cli/config/shared.js.map +1 -1
  32. package/dist/cli/init.d.ts.map +1 -1
  33. package/dist/cli/init.js +3 -0
  34. package/dist/cli/init.js.map +1 -1
  35. package/dist/config.d.ts +1 -0
  36. package/dist/config.d.ts.map +1 -1
  37. package/dist/config.js +1 -0
  38. package/dist/config.js.map +1 -1
  39. package/dist/workspace/index.d.ts +12 -1
  40. package/dist/workspace/index.d.ts.map +1 -1
  41. package/dist/workspace/index.js +25 -6
  42. package/dist/workspace/index.js.map +1 -1
  43. package/package.json +8 -7
package/CHANGELOG.md CHANGED
@@ -1,5 +1,41 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.9 (2026-05-13)
4
+
5
+ ### Features
6
+
7
+ - **Persistent per-session model switching.** `/model <name>` now writes the selected model into `sessionModelOverrides` in `~/.tomo/config.json`, so the choice survives daemon restarts. The current live SDK process is still closed immediately so the next turn uses the selected model. `/model` now accepts the short aliases (`sonnet`, `opus`, `haiku`) or their known full model IDs, and rejects unknown names instead of persisting typos. The old `sonnet-1m` / `opus-1m` aliases were removed from chat commands and the config TUI.
8
+ - **Chat restore for bad config edits.** New `/restore` command restores `~/.tomo/config.json` from `~/.tomo/config.json.bak`, sends a confirmation, and restarts Tomo. Built-in config writers now copy the current config to `config.json.bak` before mutating it, including `/model`, group activation, `tomo config`, and re-running `tomo init` over an existing config.
9
+
10
+ ### Bug fixes
11
+
12
+ - **Surface SDK model errors in chat.** Some SDK-originated errors, including invalid selected-model messages, arrive as assistant text blocks without stream deltas. Tomo now pushes those assistant blocks into the channel stream before sealing them, so Telegram and iMessage users see the error instead of a hanging turn.
13
+
14
+ ### Docs
15
+
16
+ - Updated `tomo-system` docs and README with the config backup rule, `sessionModelOverrides` behavior, and `/restore` command.
17
+
18
+ ## 0.5.8 (2026-05-12)
19
+
20
+ ### Features
21
+
22
+ - **Private memory for DMs only** (#97). New `~/.tomo/workspace/memory/private/` subdir holds memories the agent shouldn't surface in group chats. DM sessions see the full MEMORY.md index and can Read/Write under `memory/private/` normally; group sessions get the index with `private/` links stripped *and* a `PreToolUse` hook that denies any tool call that could reach the dir. The system prompt's privacy section flips per session type so the agent knows the rule. Per Anthropic SDK docs, `PreToolUse` denials bypass `canUseTool` so the guard holds even though Tomo runs in `bypassPermissions` mode. Enforcement evolved across review rounds — final shape uses path resolution + `minimatch` reachability probes rather than substring matching:
23
+ - File ops (Read/Edit/Write/MultiEdit/NotebookEdit): resolved `file_path` must not land inside `memory/private/`.
24
+ - Glob/Grep: pattern tested against synthetic probe paths anchored under `private/` (catches `pri*`, `{public,private}`, `p[a-z]*`, case permutations); Grep also denies basename globs like `-g '*.md'` from any root that can reach private/, because ripgrep applies basename filters at every depth.
25
+ - Bash: denies any command that names `memory` or `private` as a path segment, or that contains the absolute private dir. Shell expansion happens after the hook fires so per-token resolution can't catch `cat memory/pri*/*.md` reliably — Bash on the memory tree is just denied wholesale. Group sessions can still Read public memory files by name (MEMORY.md is already in the prompt).
26
+ - **Turn budget warnings at 75% and 90% of `maxTurns`** (#96). The SDK enforces `maxTurns` silently and only surfaces the limit as an error after the fact, so long agent loops would die mid-thought. A new `PostToolBatch` hook counts tool rounds per `send()` call and injects an `additionalContext` system reminder when usage crosses the thresholds — at 75% the agent is nudged to wrap up; at 90% it's told the SDK will abort imminently. Budget resets per user message → response cycle, so a single long turn doesn't poison the next one. `PostToolBatch` fires exactly once per model→tools→model round, which is the right granularity for turn counting.
27
+
28
+ ### Internal
29
+
30
+ - **Permission logic extracted to `src/agent/permissions.ts`.** `sdk-options.ts` had grown to 405 lines with permission code (canUseTool callback + private-memory guard) accounting for ~45%. Split into a dedicated module so future guards have a clear home; `sdk-options.ts` is back to SDK option assembly and turn-budget nudges.
31
+
32
+ ### Other
33
+
34
+ - Bump `@anthropic-ai/claude-agent-sdk` 0.2.138 → 0.2.139.
35
+ - Bump `@clack/prompts` 1.3.0 → 1.4.0.
36
+ - Bump dev dependencies: `@types/node` 25.6.2 → 25.7.0, `vitest` 4.1.5 → 4.1.6, `@vitest/coverage-v8` 4.1.5 → 4.1.6, `typescript-eslint` 8.59.2 → 8.59.3.
37
+ - New direct dependency: `minimatch` ^10.2.5 (already a transitive dep) — used by the private-memory guard to evaluate Glob/Grep pattern reachability.
38
+
3
39
  ## 0.5.7 (2026-05-10)
4
40
 
5
41
  ### Other
package/README.md CHANGED
@@ -59,6 +59,7 @@ tomo sessions clear # Reset all sessions
59
59
  |---------|-------------|
60
60
  | `/new` | Start a new conversation (resets session) |
61
61
  | `/model` | Switch model (sonnet/opus/haiku) |
62
+ | `/restore` | Restore `config.json` from `config.json.bak` and restart |
62
63
  | `/status` | Show session info (model, channel, message count) |
63
64
 
64
65
  ## Features
@@ -1,6 +1,8 @@
1
1
  # Config file reference (`~/.tomo/config.json`)
2
2
 
3
- Prefer editing via `tomo config` (interactive TUI). This reference is for reading/verifying values or scripted edits. **Changes require `tomo restart` to take effect.**
3
+ Prefer editing via `tomo config` (interactive TUI). This reference is for reading/verifying values or scripted edits. **Manual edits require `tomo restart` to take effect.** Chat `/model <name>` writes `sessionModelOverrides` and applies to that session without a restart.
4
+
5
+ Before direct edits, copy `~/.tomo/config.json` to `~/.tomo/config.json.bak`. Chat `/restore` restores that backup over `config.json` and restarts Tomo.
4
6
 
5
7
  ## Full example (every supported field)
6
8
 
@@ -50,7 +52,7 @@ Prefer editing via `tomo config` (interactive TUI). This reference is for readin
50
52
 
51
53
  | Field | Type | Allowed values / notes |
52
54
  |---|---|---|
53
- | `model` | string | `claude-sonnet-4-6`, `claude-opus-4-7`, `claude-haiku-4-5`. Append `[1m]` for 1M-context variants on Sonnet/Opus (e.g. `claude-opus-4-7[1m]`). Default model for every session. |
55
+ | `model` | string | `claude-sonnet-4-6`, `claude-opus-4-7`, `claude-haiku-4-5`. Default model for every session. |
54
56
  | `city` | string \| null | Any city name (e.g. `"Seattle"`). Used for weather in continuity pings. `null` or missing = no weather. |
55
57
  | `continuity` | boolean | `true` / `false`. Enables periodic proactive heartbeats. Off by default. |
56
58
  | `groupSecret` | string \| null | Passphrase users send in a group chat to activate Tomo there. `null` disables group chats entirely. |
@@ -64,7 +66,7 @@ Prefer editing via `tomo config` (interactive TUI). This reference is for readin
64
66
  | `identities[].name` | string | Unified identity name (lowercased to form the session key `dm:<name>`). |
65
67
  | `identities[].channels` | object | `{ channelName: chatId }` — maps each channel the identity uses to its chatId. |
66
68
  | `identities[].replyPolicy` | string | `"last-active"` (reply on whichever channel the identity last messaged from) or a fixed channel name like `"telegram"` / `"imessage"` (always reply there). |
67
- | `sessionModelOverrides` | object | `{ sessionKey: modelId }` — per-session model override, takes precedence over top-level `model`. Keys are session keys (`dm:alice`, `telegram:12345`, etc.). |
69
+ | `sessionModelOverrides` | object | `{ sessionKey: modelId }` — per-session model override, takes precedence over top-level `model`. Keys are session keys (`dm:alice`, `telegram:12345`, etc.). Written by `/model <name>` for the current chat and by the `tomo config` Sessions menu. |
68
70
  | `maxTurns` | number | Max agent turns per single user message (one turn ≈ one tool-use round). Default `50`. Raise if you see "max turns exceeded" on long tool chains. |
69
71
  | `lcm.nudgeAtPct` | number | Context-usage % at which the harness nudges the agent to run `tomo lcm daily`. Default `70`. Lower = compact earlier and more often. |
70
72
  | `lcm.nudgeResetPct` | number | Hysteresis reset threshold — the "already nudged" flag clears once usage drops below this %. Default `60`. Must be less than `nudgeAtPct`; invalid values fall back to defaults. |
@@ -29,6 +29,8 @@ Session stats show:
29
29
 
30
30
  **Note:** Context stats come from the SDK API and reflect the state at the end of the *previous* query. After compacting or other changes, you need to wait for a new query to complete before the numbers update.
31
31
 
32
+ Per-session model overrides live in `sessionModelOverrides` in `~/.tomo/config.json`. Users can set them from chat with `/model <name>`; Tomo persists the override for the current session, closes the live SDK process, and uses the selected model on the next turn. `tomo config` can also set or clear model overrides from the Sessions menu.
33
+
32
34
  When context crosses the nudge threshold (default 70%, set via `lcm.nudgeAtPct` in config.json), the harness sends a system message asking you to run `tomo lcm daily` — see the `tomo-lcm` skill. A second nudge at 80% asks you to use the `lcm compact` skill before the next user message. A periodic rollup runner also nudges you when daily/weekly/monthly/yearly blocks are due. Group sessions default to SDK auto-compact instead (override with `lcm.groupCompactStyle: "lcm"` to enroll groups in all three nudges).
33
35
 
34
36
  ## Cron Jobs
@@ -47,7 +49,7 @@ The `tomo cron list / add / remove` CLI is still here for human debugging (audit
47
49
 
48
50
  | Path | Purpose |
49
51
  |------|---------|
50
- | `~/.tomo/config.json` | Configuration (Telegram token, model) |
52
+ | `~/.tomo/config.json` | Configuration (channels, identities, model, session model overrides) |
51
53
  | `~/.tomo/workspace/` | Agent working directory (cwd) |
52
54
  | `~/.tomo/workspace/memory/` | Persistent memory files |
53
55
  | `~/.tomo/workspace/memory/MEMORY.md` | Memory index (loaded every conversation) |
@@ -61,7 +63,9 @@ The `tomo cron list / add / remove` CLI is still here for human debugging (audit
61
63
 
62
64
  ## Config file
63
65
 
64
- `~/.tomo/config.json` holds model, channels, identities, allowlists, and other settings. Prefer editing via `tomo config`; for the full field list, example JSON, and env-var overrides see [CONFIG.md](CONFIG.md). Changes require `tomo restart` to take effect.
66
+ `~/.tomo/config.json` holds model, channels, identities, allowlists, session model overrides, and other settings. Prefer editing via `tomo config`; for the full field list, example JSON, and env-var overrides see [CONFIG.md](CONFIG.md). Manual edits require `tomo restart` to take effect; `/model <name>` persists and applies the current session override without a restart.
67
+
68
+ Before changing `~/.tomo/config.json` directly, copy the current file to `~/.tomo/config.json.bak`, then write the updated config. If the new config breaks Tomo while the harness is still reachable, the user can send `/restore` to copy `config.json.bak` back to `config.json` and restart.
65
69
 
66
70
  ## Harness Features
67
71
 
@@ -1,5 +1,5 @@
1
1
  import { type SDKUserMessage } from "@anthropic-ai/claude-agent-sdk";
2
- import type { sdkOptions } from "./sdk-options.js";
2
+ import { type TurnBudget, type sdkOptions } from "./sdk-options.js";
3
3
  export interface MessageRequest {
4
4
  message: SDKUserMessage;
5
5
  /** Called for each text-delta as it streams (cumulative running text). */
@@ -40,8 +40,9 @@ export declare class LiveSession {
40
40
  private prevTotalCost;
41
41
  private eventLoopDone;
42
42
  private sessionKey;
43
+ private turnBudget;
43
44
  private pendingToolNames;
44
- constructor(options: ReturnType<typeof sdkOptions>, sessionKey?: string);
45
+ constructor(options: ReturnType<typeof sdkOptions>, sessionKey?: string, turnBudget?: TurnBudget);
45
46
  private messageGenerator;
46
47
  private consumeEvents;
47
48
  private handleEvent;
@@ -1 +1 @@
1
- {"version":3,"file":"live-session.d.ts","sourceRoot":"","sources":["../../src/agent/live-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,cAAc,EAAmB,MAAM,gCAAgC,CAAC;AAEzG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,cAAc,CAAC;IACxB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACvD;AAuCD,qBAAa,WAAW;IACtB,OAAO,CAAC,CAAC,CAAQ;IACjB,OAAO,CAAC,cAAc,CAAgD;IACtE,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,KAAK,CAAQ;IACrB,UAAU,EAAE,WAAW,GAAG,IAAI,CAAQ;IACtC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,UAAU,CAAqB;IAGvC,OAAO,CAAC,gBAAgB,CAA6B;gBAEzC,OAAO,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM;YAMxD,gBAAgB;YAUjB,aAAa;YAeb,WAAW;YA2GX,eAAe;IA6CvB,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAC/B,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,EACnD,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACxD,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GACxE,OAAO,CAAC,MAAM,CAAC;IAuDlB,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,OAAO,IAAI,OAAO;IAIlB,KAAK,IAAI,IAAI;CAId"}
1
+ {"version":3,"file":"live-session.d.ts","sourceRoot":"","sources":["../../src/agent/live-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,cAAc,EAAmB,MAAM,gCAAgC,CAAC;AAEzG,OAAO,EAAmB,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAErF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,cAAc,CAAC;IACxB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACvD;AAuCD,qBAAa,WAAW;IACtB,OAAO,CAAC,CAAC,CAAQ;IACjB,OAAO,CAAC,cAAc,CAAgD;IACtE,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,KAAK,CAAQ;IACrB,UAAU,EAAE,WAAW,GAAG,IAAI,CAAQ;IACtC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,UAAU,CAAyB;IAG3C,OAAO,CAAC,gBAAgB,CAA6B;gBAEzC,OAAO,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU;YAOjF,gBAAgB;YAUjB,aAAa;YAeb,WAAW;YAgHX,eAAe;IA6CvB,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAC/B,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,EACnD,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACxD,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GACxE,OAAO,CAAC,MAAM,CAAC;IA0DlB,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,OAAO,IAAI,OAAO;IAIlB,KAAK,IAAI,IAAI;CAId"}
@@ -1,5 +1,6 @@
1
1
  import { query } from "@anthropic-ai/claude-agent-sdk";
2
2
  import { log } from "../logger.js";
3
+ import { resetTurnBudget } from "./sdk-options.js";
3
4
  function summarizeToolResult(content) {
4
5
  // Tool results arrive as either a string or an array of content blocks
5
6
  // ({type:"text",text:"..."} | {type:"image",...} | etc.). We flatten to a
@@ -51,11 +52,13 @@ export class LiveSession {
51
52
  prevTotalCost = 0;
52
53
  eventLoopDone;
53
54
  sessionKey;
55
+ turnBudget;
54
56
  // Maps tool_use_id → tool name so we can label tool_result log lines
55
57
  // (the result event only carries the use id, not the original name).
56
58
  pendingToolNames = new Map();
57
- constructor(options, sessionKey) {
59
+ constructor(options, sessionKey, turnBudget) {
58
60
  this.sessionKey = sessionKey;
61
+ this.turnBudget = turnBudget;
59
62
  this.q = query({ prompt: this.messageGenerator(), options });
60
63
  this.eventLoopDone = this.consumeEvents();
61
64
  }
@@ -93,10 +96,16 @@ export class LiveSession {
93
96
  }
94
97
  }
95
98
  if (event.type === "assistant" && event.message?.content) {
99
+ const hadStreamDeltas = this.streamingText.length > 0;
96
100
  this.streamingText = "";
97
101
  for (const block of event.message.content) {
98
102
  if ("text" in block) {
99
103
  this.parts.push(block.text);
104
+ // Some SDK-originated errors arrive as an assistant text block
105
+ // without preceding stream deltas. Push the full block into the
106
+ // channel stream before sealing it so the user sees the message.
107
+ if (!hadStreamDeltas)
108
+ req?.onText?.(block.text);
100
109
  // Signal block boundary so channels can seal the streamed message
101
110
  // and start fresh on the next block (text → tool → text turns).
102
111
  if (req?.onBlockComplete) {
@@ -207,6 +216,9 @@ export class LiveSession {
207
216
  async send(text, onText, images, onBlockComplete, documents) {
208
217
  if (!this.alive)
209
218
  throw new Error("Session is closed");
219
+ // Fresh maxTurns budget per user message — warnings fire once per send().
220
+ if (this.turnBudget)
221
+ resetTurnBudget(this.turnBudget);
210
222
  const TIMEOUT_MS = 10 * 60 * 1000; // 10 minute timeout per send()
211
223
  const content = [];
212
224
  if (images && images.length > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"live-session.js","sourceRoot":"","sources":["../../src/agent/live-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"live-session.js","sourceRoot":"","sources":["../../src/agent/live-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /** SDK canUseTool callback. The SDK auto-approves most tools under
2
+ * `bypassPermissions`, but writes to `.claude/`, `.git/`, etc. are protected
3
+ * and fall through to canUseTool. We narrowly re-allow `.claude/skills/` so
4
+ * tomo can manage its own skill library; every other protected path stays
5
+ * denied. See https://code.claude.com/docs/en/agent-sdk/permissions#permission-modes. */
6
+ export declare function skillsCanUseTool(toolName: string, input: Record<string, unknown>): Promise<{
7
+ behavior: "allow";
8
+ updatedInput: Record<string, unknown>;
9
+ } | {
10
+ behavior: "deny";
11
+ message: string;
12
+ }>;
13
+ /** PreToolUse hook that denies tool calls that could surface DM-only memory
14
+ * in a group session. Per SDK docs, PreToolUse denies bypass canUseTool, so
15
+ * this enforces even in bypassPermissions mode. See {@link isPrivateMemoryAccess}
16
+ * for per-tool rules — substring matching wasn't enough since parent-dir
17
+ * scans, alternate relative paths, and shell `cd` tricks reach private/
18
+ * without spelling the full path. */
19
+ export declare function privateMemoryGuardHooks(sessionKey?: string): {
20
+ PreToolUse: {
21
+ hooks: ((input: {
22
+ tool_name: string;
23
+ tool_input: unknown;
24
+ }) => Promise<{
25
+ hookSpecificOutput?: undefined;
26
+ } | {
27
+ hookSpecificOutput: {
28
+ hookEventName: "PreToolUse";
29
+ permissionDecision: "deny";
30
+ permissionDecisionReason: string;
31
+ };
32
+ }>)[];
33
+ }[];
34
+ };
35
+ /** Per-tool predicate for the group-session private-memory guard. Exported for
36
+ * testing. The rules are intentionally conservative:
37
+ *
38
+ * - File ops (Read/Edit/Write/MultiEdit/NotebookEdit): deny when the resolved
39
+ * file_path lands at-or-inside the private dir.
40
+ * - Glob: deny when the search root is at-or-inside MEMORY_DIR, or when the
41
+ * pattern joined to the root could match any path at-or-inside private/.
42
+ * Wildcard segments like `pri*` are evaluated by minimatch against synthetic
43
+ * probe paths under private/, so `memory/pri*\/*.md` is denied just like
44
+ * `memory/private/*.md`.
45
+ * - Grep: same logic against the `glob` filter when present, plus a root
46
+ * check that mirrors ripgrep's default-recursive behaviour.
47
+ * - Bash: deny any command that names `memory` as a path segment. The Bash
48
+ * surface area is too wide to reason about — shell expansion happens after
49
+ * the hook fires, `cd` rewrites the working dir, and command substitution
50
+ * can hide paths. Group sessions don't need Bash for memory ops; the agent
51
+ * can Read public memory files by name (MEMORY.md is in its prompt).
52
+ *
53
+ * False positives in groups are tolerable for the same reason — the agent
54
+ * always has an alternative path through Read on a named public file. */
55
+ export declare function isPrivateMemoryAccess(toolName: string, toolInput: unknown, ctx: {
56
+ cwd: string;
57
+ memoryDir: string;
58
+ privateDir: string;
59
+ }): boolean;
60
+ //# sourceMappingURL=permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/agent/permissions.ts"],"names":[],"mappings":"AAYA;;;;0FAI0F;AAC1F,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAa/G;AAMD;;;;;sCAKsC;AACtC,wBAAgB,uBAAuB,CAAC,UAAU,CAAC,EAAE,MAAM;;wBAI/B;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,OAAO,CAAA;SAAE;;;;;;;;;;EAarE;AAED;;;;;;;;;;;;;;;;;;;0EAmB0E;AAC1E,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,OAAO,EAClB,GAAG,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC1D,OAAO,CAsCT"}
@@ -0,0 +1,203 @@
1
+ import { isAbsolute, relative, resolve as pathResolve } from "node:path";
2
+ import { minimatch } from "minimatch";
3
+ import { config } from "../config.js";
4
+ import { log } from "../logger.js";
5
+ import { MEMORY_DIR, PRIVATE_MEMORY_DIR, PRIVATE_MEMORY_SUBDIR } from "../workspace/index.js";
6
+ // ---------------------------------------------------------------------------
7
+ // canUseTool: re-allow `.claude/skills/` under bypassPermissions
8
+ // ---------------------------------------------------------------------------
9
+ const SKILLS_DIR = `${config.workspaceDir}/.claude/skills/`;
10
+ /** SDK canUseTool callback. The SDK auto-approves most tools under
11
+ * `bypassPermissions`, but writes to `.claude/`, `.git/`, etc. are protected
12
+ * and fall through to canUseTool. We narrowly re-allow `.claude/skills/` so
13
+ * tomo can manage its own skill library; every other protected path stays
14
+ * denied. See https://code.claude.com/docs/en/agent-sdk/permissions#permission-modes. */
15
+ export async function skillsCanUseTool(toolName, input) {
16
+ const filePath = (input.file_path ?? input.notebook_path ?? input.path);
17
+ if (filePath && filePath.startsWith(SKILLS_DIR)) {
18
+ return { behavior: "allow", updatedInput: input };
19
+ }
20
+ // Bash mkdir / touch / etc. — allow if command targets the skills dir.
21
+ if (toolName === "Bash" && typeof input.command === "string" && input.command.includes(SKILLS_DIR)) {
22
+ return { behavior: "allow", updatedInput: input };
23
+ }
24
+ return {
25
+ behavior: "deny",
26
+ message: `Permission required for ${toolName}${filePath ? ` on ${filePath}` : ""} — only ${SKILLS_DIR}** is auto-approved at this step.`,
27
+ };
28
+ }
29
+ // ---------------------------------------------------------------------------
30
+ // Group-session guard for memory/private/
31
+ // ---------------------------------------------------------------------------
32
+ /** PreToolUse hook that denies tool calls that could surface DM-only memory
33
+ * in a group session. Per SDK docs, PreToolUse denies bypass canUseTool, so
34
+ * this enforces even in bypassPermissions mode. See {@link isPrivateMemoryAccess}
35
+ * for per-tool rules — substring matching wasn't enough since parent-dir
36
+ * scans, alternate relative paths, and shell `cd` tricks reach private/
37
+ * without spelling the full path. */
38
+ export function privateMemoryGuardHooks(sessionKey) {
39
+ const ctx = { cwd: config.workspaceDir, memoryDir: MEMORY_DIR, privateDir: PRIVATE_MEMORY_DIR };
40
+ return {
41
+ PreToolUse: [{
42
+ hooks: [async (input) => {
43
+ if (!isPrivateMemoryAccess(input.tool_name, input.tool_input, ctx))
44
+ return {};
45
+ log.warn({ key: sessionKey, tool: input.tool_name }, "Blocked group-session access to private memory");
46
+ return {
47
+ hookSpecificOutput: {
48
+ hookEventName: "PreToolUse",
49
+ permissionDecision: "deny",
50
+ permissionDecisionReason: `\`memory/${PRIVATE_MEMORY_SUBDIR}/\` is DM-only and not accessible from group sessions. Scans rooted at \`memory/\` are also blocked — use Read on a specific public memory file.`,
51
+ },
52
+ };
53
+ }],
54
+ }],
55
+ };
56
+ }
57
+ /** Per-tool predicate for the group-session private-memory guard. Exported for
58
+ * testing. The rules are intentionally conservative:
59
+ *
60
+ * - File ops (Read/Edit/Write/MultiEdit/NotebookEdit): deny when the resolved
61
+ * file_path lands at-or-inside the private dir.
62
+ * - Glob: deny when the search root is at-or-inside MEMORY_DIR, or when the
63
+ * pattern joined to the root could match any path at-or-inside private/.
64
+ * Wildcard segments like `pri*` are evaluated by minimatch against synthetic
65
+ * probe paths under private/, so `memory/pri*\/*.md` is denied just like
66
+ * `memory/private/*.md`.
67
+ * - Grep: same logic against the `glob` filter when present, plus a root
68
+ * check that mirrors ripgrep's default-recursive behaviour.
69
+ * - Bash: deny any command that names `memory` as a path segment. The Bash
70
+ * surface area is too wide to reason about — shell expansion happens after
71
+ * the hook fires, `cd` rewrites the working dir, and command substitution
72
+ * can hide paths. Group sessions don't need Bash for memory ops; the agent
73
+ * can Read public memory files by name (MEMORY.md is in its prompt).
74
+ *
75
+ * False positives in groups are tolerable for the same reason — the agent
76
+ * always has an alternative path through Read on a named public file. */
77
+ export function isPrivateMemoryAccess(toolName, toolInput, ctx) {
78
+ if (!toolInput || typeof toolInput !== "object")
79
+ return false;
80
+ const ti = toolInput;
81
+ switch (toolName) {
82
+ case "Read":
83
+ case "Edit":
84
+ case "Write":
85
+ case "MultiEdit": {
86
+ const p = ti.file_path;
87
+ if (typeof p !== "string")
88
+ return false;
89
+ return isInside(abs(p, ctx.cwd), ctx.privateDir);
90
+ }
91
+ case "NotebookEdit": {
92
+ const p = ti.notebook_path;
93
+ if (typeof p !== "string")
94
+ return false;
95
+ return isInside(abs(p, ctx.cwd), ctx.privateDir);
96
+ }
97
+ case "Glob": {
98
+ const rootRaw = typeof ti.path === "string" ? ti.path : ctx.cwd;
99
+ const root = abs(rootRaw, ctx.cwd);
100
+ const pattern = typeof ti.pattern === "string" ? ti.pattern : "";
101
+ return globReachesPrivate(root, pattern, ctx);
102
+ }
103
+ case "Grep": {
104
+ const rootRaw = typeof ti.path === "string" ? ti.path : ctx.cwd;
105
+ const root = abs(rootRaw, ctx.cwd);
106
+ const glob = typeof ti.glob === "string" ? ti.glob : "";
107
+ return grepReachesPrivate(root, glob, ctx);
108
+ }
109
+ case "Bash": {
110
+ const cmd = ti.command;
111
+ if (typeof cmd !== "string")
112
+ return false;
113
+ return bashTouchesMemory(cmd, ctx);
114
+ }
115
+ default:
116
+ return false;
117
+ }
118
+ }
119
+ /** Resolve `p` to an absolute, normalized path against `cwd` if relative. */
120
+ function abs(p, cwd) {
121
+ return isAbsolute(p) ? pathResolve(p) : pathResolve(cwd, p);
122
+ }
123
+ /** True when `child` equals `parent` or sits inside it. Both must be absolute. */
124
+ function isInside(child, parent) {
125
+ if (child === parent)
126
+ return true;
127
+ const rel = relative(parent, child);
128
+ return rel !== "" && !rel.startsWith("..") && !isAbsolute(rel);
129
+ }
130
+ /** True when `rel` represents a non-empty path that doesn't escape upward —
131
+ * i.e. it points to a descendant of the reference dir. Used to short-circuit
132
+ * glob/grep checks when private/ isn't reachable from the search root. */
133
+ function isRelativeDescendant(rel) {
134
+ return rel !== "" && !rel.startsWith("..") && !isAbsolute(rel);
135
+ }
136
+ /** Decide whether a Glob call rooted at `root` with pattern `pattern` could
137
+ * surface anything at-or-inside the private memory dir.
138
+ *
139
+ * Earlier versions split the pattern at its first wildcard and compared the
140
+ * literal prefix only — that missed `memory/pri*\/*.md`, which expands into
141
+ * `memory/private/...` at match time. We test the pattern against three
142
+ * synthetic probe paths anchored under private/ using minimatch. */
143
+ function globReachesPrivate(root, pattern, ctx) {
144
+ if (isInside(root, ctx.memoryDir))
145
+ return true;
146
+ const relPrivate = relative(root, ctx.privateDir);
147
+ if (!isRelativeDescendant(relPrivate))
148
+ return false;
149
+ const probes = [relPrivate, `${relPrivate}/probe.md`, `${relPrivate}/sub/probe.md`];
150
+ // `nocase: true` covers case-insensitive filesystems (macOS, Windows).
151
+ // `dot: true` so leading-dot files inside private/ aren't given a free pass.
152
+ const opts = { dot: true, nocase: true };
153
+ return probes.some((probe) => minimatch(probe, pattern, opts));
154
+ }
155
+ /** Decide whether a Grep call rooted at `root` with optional `glob` filter
156
+ * could surface anything inside the private memory dir.
157
+ *
158
+ * ripgrep recurses by default. The `glob` filter narrows the file set, but
159
+ * its semantics differ from a typical glob library:
160
+ * - If the glob has no `/`, it's a basename filter that matches files at any
161
+ * depth (e.g. `-g '*.md'` matches `memory/private/x.md`). Path-style
162
+ * matching would miss this — we deny outright when the root could reach
163
+ * private/.
164
+ * - If the glob has `/`, it's a path-style pattern; use minimatch probes.
165
+ * Without a glob filter, treat the search as fully recursive. */
166
+ function grepReachesPrivate(root, glob, ctx) {
167
+ if (isInside(root, ctx.memoryDir))
168
+ return true;
169
+ const relPrivate = relative(root, ctx.privateDir);
170
+ if (!isRelativeDescendant(relPrivate))
171
+ return false;
172
+ // No glob filter ⇒ unrestricted recursion ⇒ reaches private/.
173
+ if (!glob)
174
+ return true;
175
+ // Basename glob (no `/`) is anchored only by file basename; if private/ is
176
+ // reachable from root, ripgrep will scan it and apply the filter there too.
177
+ if (!glob.includes("/"))
178
+ return true;
179
+ // Path-style glob: probe like Glob does.
180
+ const probes = [relPrivate, `${relPrivate}/probe.md`, `${relPrivate}/sub/probe.md`];
181
+ const opts = { dot: true, nocase: true };
182
+ return probes.some((probe) => minimatch(probe, glob, opts));
183
+ }
184
+ /** Bash guard for group sessions. Shell expansion happens after the hook
185
+ * fires, so we can't reliably predict which paths a command will actually
186
+ * touch — `cat memory/pri*\/*.md`, `$(echo memory/private/x)`, and
187
+ * `cd memory && cat private/x.md` all reach private/ without spelling it
188
+ * literally. Rather than chase every shell construct, we deny anything that
189
+ * names `memory` (or `private`) as a path segment, plus any absolute path
190
+ * that lands inside the memory tree.
191
+ *
192
+ * Group sessions don't need Bash for memory ops — Read works on named public
193
+ * files, and the MEMORY.md index is already in the system prompt. */
194
+ function bashTouchesMemory(cmd, ctx) {
195
+ if (cmd.includes(ctx.memoryDir) || cmd.includes(ctx.privateDir))
196
+ return true;
197
+ // `memory` or `private` as a path segment: bordered by /, quote, whitespace,
198
+ // shell operator, or string boundary. Catches `memory/x`, `./memory`,
199
+ // `cd memory`, `ls memory/private`, `cat private/foo`, etc.
200
+ const memorySegment = /(^|[\s'"`=()|&;></])(memory|private)(\/|$|[\s'"`=()|&;><])/i;
201
+ return memorySegment.test(cmd);
202
+ }
203
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/agent/permissions.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,21 @@
1
1
  import type { McpSdkServerConfigWithInstance } from "@anthropic-ai/claude-agent-sdk";
2
+ import { skillsCanUseTool } from "./permissions.js";
2
3
  /** True when the session uses our custom LCM compaction (DMs always; groups
3
4
  * unless config.lcm.groupCompactStyle="sdk"). When false, SDK auto-compact is
4
5
  * in charge and the harness skips its compaction nudges. */
5
6
  export declare function usesLcmCompact(sessionKey: string): boolean;
6
- declare function skillsCanUseTool(toolName: string, input: Record<string, unknown>): Promise<{
7
- behavior: "allow";
8
- updatedInput: Record<string, unknown>;
9
- } | {
10
- behavior: "deny";
11
- message: string;
12
- }>;
7
+ /** Mutable per-send counter for the SDK's maxTurns budget. The SDK enforces
8
+ * maxTurns silently and only surfaces it as an error after the fact, so we
9
+ * count tool rounds via a PostToolBatch hook and inject a system reminder at
10
+ * 75% / 90% so the agent can wrap up before hitting the ceiling. Reset by
11
+ * LiveSession.send() at the start of each user-message → response cycle. */
12
+ export interface TurnBudget {
13
+ count: number;
14
+ fired75: boolean;
15
+ fired90: boolean;
16
+ }
17
+ export declare function makeTurnBudget(): TurnBudget;
18
+ export declare function resetTurnBudget(b: TurnBudget): void;
13
19
  export interface SessionContext {
14
20
  sessionKey: string;
15
21
  sdkSessionId?: string;
@@ -22,11 +28,38 @@ export interface SessionContext {
22
28
  isPassive: boolean;
23
29
  };
24
30
  }
25
- export declare function sdkOptions(internalMcpServer: McpSdkServerConfigWithInstance, resumeSessionId?: string, model?: string, sessionContext?: SessionContext): {
31
+ export declare function sdkOptions(internalMcpServer: McpSdkServerConfigWithInstance, resumeSessionId?: string, model?: string, sessionContext?: SessionContext, turnBudget?: TurnBudget): {
32
+ env?: {
33
+ DISABLE_AUTO_COMPACT: string;
34
+ } | undefined;
35
+ resume?: string | undefined;
36
+ hooks: Record<string, unknown>;
37
+ model: string;
38
+ cwd: string;
39
+ systemPrompt: string;
40
+ permissionMode: "bypassPermissions";
41
+ allowDangerouslySkipPermissions: boolean;
42
+ allowedTools: string[];
43
+ skills: "all";
44
+ mcpServers: {
45
+ "tomo-internal": McpSdkServerConfigWithInstance;
46
+ };
47
+ settingSources: ("project")[];
48
+ settings: {
49
+ attribution: {
50
+ commit: string;
51
+ pr: string;
52
+ };
53
+ };
54
+ canUseTool: typeof skillsCanUseTool;
55
+ includePartialMessages: boolean;
56
+ maxTurns: number;
57
+ } | {
26
58
  env?: {
27
59
  DISABLE_AUTO_COMPACT: string;
28
60
  } | undefined;
29
61
  resume?: string | undefined;
62
+ hooks?: undefined;
30
63
  model: string;
31
64
  cwd: string;
32
65
  systemPrompt: string;
@@ -48,5 +81,4 @@ export declare function sdkOptions(internalMcpServer: McpSdkServerConfigWithInst
48
81
  includePartialMessages: boolean;
49
82
  maxTurns: number;
50
83
  };
51
- export {};
52
84
  //# sourceMappingURL=sdk-options.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-options.d.ts","sourceRoot":"","sources":["../../src/agent/sdk-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAC;AAarF;;6DAE6D;AAC7D,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAG1D;AAID,iBAAe,gBAAgB,CAC7B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAa/G;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,KAAK,CAAC,EAAE;QACN,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB;iFACyE;QACzE,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;CACH;AAED,wBAAgB,UAAU,CACxB,iBAAiB,EAAE,8BAA8B,EACjD,eAAe,CAAC,EAAE,MAAM,EACxB,KAAK,CAAC,EAAE,MAAM,EACd,cAAc,CAAC,EAAE,cAAc;;;;;;;;;;;;;;;oBAuDE,CAAC,SAAS,CAAC,EAAE;;;;;;;;;;EAwB/C"}
1
+ {"version":3,"file":"sdk-options.d.ts","sourceRoot":"","sources":["../../src/agent/sdk-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAC;AAMrF,OAAO,EAA2B,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAS7E;;6DAE6D;AAC7D,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAG1D;AAED;;;;6EAI6E;AAC7E,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,cAAc,IAAI,UAAU,CAE3C;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAInD;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,KAAK,CAAC,EAAE;QACN,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB;iFACyE;QACzE,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;CACH;AAED,wBAAgB,UAAU,CACxB,iBAAiB,EAAE,8BAA8B,EACjD,eAAe,CAAC,EAAE,MAAM,EACxB,KAAK,CAAC,EAAE,MAAM,EACd,cAAc,CAAC,EAAE,cAAc,EAC/B,UAAU,CAAC,EAAE,UAAU;;;;;;;;;;;;;;;;oBAwDU,CAAC,SAAS,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;oBAAb,CAAC,SAAS,CAAC,EAAE;;;;;;;;;;EA0B/C"}