@pentoshi/clai 4.0.3 → 4.2.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/README.md +45 -9
- package/dist/agent/compaction-executor.d.ts +68 -0
- package/dist/agent/compaction-executor.js +343 -0
- package/dist/agent/compaction-executor.js.map +1 -0
- package/dist/agent/confirm-port.js +6 -3
- package/dist/agent/confirm-port.js.map +1 -1
- package/dist/agent/context-breakdown.js +2 -0
- package/dist/agent/context-breakdown.js.map +1 -1
- package/dist/agent/context-manager.d.ts +23 -9
- package/dist/agent/context-manager.js +72 -43
- package/dist/agent/context-manager.js.map +1 -1
- package/dist/agent/events.d.ts +3 -0
- package/dist/agent/loop-guard.d.ts +2 -0
- package/dist/agent/loop-guard.js +48 -3
- package/dist/agent/loop-guard.js.map +1 -1
- package/dist/agent/prompt-composer.js +6 -6
- package/dist/agent/prompt-composer.js.map +1 -1
- package/dist/agent/reliability-policy.d.ts +1 -0
- package/dist/agent/reliability-policy.js +6 -3
- package/dist/agent/reliability-policy.js.map +1 -1
- package/dist/agent/request-accounting.d.ts +97 -0
- package/dist/agent/request-accounting.js +207 -0
- package/dist/agent/request-accounting.js.map +1 -0
- package/dist/agent/request-budget.d.ts +2 -2
- package/dist/agent/request-budget.js +2 -4
- package/dist/agent/request-budget.js.map +1 -1
- package/dist/agent/runner.d.ts +8 -2
- package/dist/agent/runner.js +412 -181
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/session-title.d.ts +0 -26
- package/dist/agent/session-title.js +0 -80
- package/dist/agent/session-title.js.map +1 -1
- package/dist/agent/tool-history.d.ts +2 -2
- package/dist/agent/tool-history.js +19 -6
- package/dist/agent/tool-history.js.map +1 -1
- package/dist/agent/turn-outcome.d.ts +1 -1
- package/dist/agent/turn-outcome.js +2 -12
- package/dist/agent/turn-outcome.js.map +1 -1
- package/dist/app/adapters/agent-event-adapter.js +19 -0
- package/dist/app/adapters/agent-event-adapter.js.map +1 -1
- package/dist/app/adapters/current-agent-adapter.js +4 -0
- package/dist/app/adapters/current-agent-adapter.js.map +1 -1
- package/dist/app/commands/catalog.js +23 -16
- package/dist/app/commands/catalog.js.map +1 -1
- package/dist/app/controllers/cancel-coordinator.d.ts +51 -0
- package/dist/app/controllers/cancel-coordinator.js +48 -0
- package/dist/app/controllers/cancel-coordinator.js.map +1 -0
- package/dist/app/controllers/session-compact-helper.d.ts +19 -2
- package/dist/app/controllers/session-compact-helper.js +100 -127
- package/dist/app/controllers/session-compact-helper.js.map +1 -1
- package/dist/app/controllers/session-context-usage.d.ts +32 -15
- package/dist/app/controllers/session-context-usage.js +186 -51
- package/dist/app/controllers/session-context-usage.js.map +1 -1
- package/dist/app/controllers/session-controller.d.ts +22 -11
- package/dist/app/controllers/session-controller.js +137 -92
- package/dist/app/controllers/session-controller.js.map +1 -1
- package/dist/app/controllers/session-naming.d.ts +31 -0
- package/dist/app/controllers/session-naming.js +173 -0
- package/dist/app/controllers/session-naming.js.map +1 -0
- package/dist/app/controllers/session-persistence.d.ts +2 -2
- package/dist/app/controllers/session-persistence.js +3 -6
- package/dist/app/controllers/session-persistence.js.map +1 -1
- package/dist/app/controllers/session-turn-request.d.ts +2 -1
- package/dist/app/controllers/session-turn-request.js +3 -0
- package/dist/app/controllers/session-turn-request.js.map +1 -1
- package/dist/app/controllers/turn-continuation.d.ts +0 -6
- package/dist/app/controllers/turn-continuation.js +4 -21
- package/dist/app/controllers/turn-continuation.js.map +1 -1
- package/dist/app/controllers/turn-controller.d.ts +2 -1
- package/dist/app/controllers/turn-controller.js +1 -0
- package/dist/app/controllers/turn-controller.js.map +1 -1
- package/dist/app/events/app-event.d.ts +9 -0
- package/dist/app/events/app-event.js.map +1 -1
- package/dist/app/ports/agent-port.d.ts +8 -1
- package/dist/app/ports/transcript-item.d.ts +9 -1
- package/dist/classic/app/ClassicApp.js +3 -3
- package/dist/classic/app/ClassicApp.js.map +1 -1
- package/dist/classic/app/app-wiring.js +1 -2
- package/dist/classic/app/app-wiring.js.map +1 -1
- package/dist/classic/app/wiring-interactions.js +4 -9
- package/dist/classic/app/wiring-interactions.js.map +1 -1
- package/dist/classic/blocks/TurnSummaryBlock.d.ts +3 -0
- package/dist/classic/blocks/TurnSummaryBlock.js +6 -0
- package/dist/classic/blocks/TurnSummaryBlock.js.map +1 -0
- package/dist/classic/blocks/tool-lines.js +2 -1
- package/dist/classic/blocks/tool-lines.js.map +1 -1
- package/dist/classic/blocks/turn-summary-lines.d.ts +3 -0
- package/dist/classic/blocks/turn-summary-lines.js +7 -0
- package/dist/classic/blocks/turn-summary-lines.js.map +1 -0
- package/dist/classic/chrome/status-rows.d.ts +0 -1
- package/dist/classic/chrome/status-rows.js +0 -12
- package/dist/classic/chrome/status-rows.js.map +1 -1
- package/dist/classic/feed/Feed.js +2 -0
- package/dist/classic/feed/Feed.js.map +1 -1
- package/dist/classic/feed/feed-blocks.d.ts +1 -1
- package/dist/classic/feed/feed-blocks.js +3 -0
- package/dist/classic/feed/feed-blocks.js.map +1 -1
- package/dist/classic/input/cancel-ladder.d.ts +2 -19
- package/dist/classic/input/cancel-ladder.js +13 -20
- package/dist/classic/input/cancel-ladder.js.map +1 -1
- package/dist/commands/providers.js +2 -0
- package/dist/commands/providers.js.map +1 -1
- package/dist/llm/adapters/anthropic-tools.d.ts +31 -14
- package/dist/llm/adapters/anthropic-tools.js +124 -29
- package/dist/llm/adapters/anthropic-tools.js.map +1 -1
- package/dist/llm/adapters/gemini-tools.d.ts +16 -4
- package/dist/llm/adapters/gemini-tools.js +117 -16
- package/dist/llm/adapters/gemini-tools.js.map +1 -1
- package/dist/llm/adapters/openai-tools.d.ts +13 -2
- package/dist/llm/adapters/openai-tools.js +58 -11
- package/dist/llm/adapters/openai-tools.js.map +1 -1
- package/dist/llm/agentrouter.js +68 -45
- package/dist/llm/agentrouter.js.map +1 -1
- package/dist/llm/anthropic.js +69 -36
- package/dist/llm/anthropic.js.map +1 -1
- package/dist/llm/aws-mantle.js +70 -32
- package/dist/llm/aws-mantle.js.map +1 -1
- package/dist/llm/bynara.js +26 -69
- package/dist/llm/bynara.js.map +1 -1
- package/dist/llm/capabilities.d.ts +2 -1
- package/dist/llm/capabilities.js +56 -1
- package/dist/llm/capabilities.js.map +1 -1
- package/dist/llm/context-snapshot.d.ts +100 -0
- package/dist/llm/context-snapshot.js +277 -0
- package/dist/llm/context-snapshot.js.map +1 -0
- package/dist/llm/context-windows.d.ts +10 -0
- package/dist/llm/context-windows.js +129 -0
- package/dist/llm/context-windows.js.map +1 -0
- package/dist/llm/custom-provider-profile.d.ts +75 -0
- package/dist/llm/custom-provider-profile.js +558 -0
- package/dist/llm/custom-provider-profile.js.map +1 -0
- package/dist/llm/custom-providers.d.ts +13 -1
- package/dist/llm/custom-providers.js +77 -25
- package/dist/llm/custom-providers.js.map +1 -1
- package/dist/llm/effort-fallback.d.ts +44 -0
- package/dist/llm/effort-fallback.js +101 -0
- package/dist/llm/effort-fallback.js.map +1 -0
- package/dist/llm/fireworks.d.ts +3 -0
- package/dist/llm/fireworks.js +103 -0
- package/dist/llm/fireworks.js.map +1 -0
- package/dist/llm/free.js +4 -0
- package/dist/llm/free.js.map +1 -1
- package/dist/llm/gemini.d.ts +1 -1
- package/dist/llm/gemini.js +89 -51
- package/dist/llm/gemini.js.map +1 -1
- package/dist/llm/groq.js +4 -0
- package/dist/llm/groq.js.map +1 -1
- package/dist/llm/hetzner.d.ts +3 -0
- package/dist/llm/hetzner.js +98 -0
- package/dist/llm/hetzner.js.map +1 -0
- package/dist/llm/http.d.ts +60 -10
- package/dist/llm/http.js +465 -156
- package/dist/llm/http.js.map +1 -1
- package/dist/llm/kimchi.js +4 -0
- package/dist/llm/kimchi.js.map +1 -1
- package/dist/llm/lightning.js +4 -0
- package/dist/llm/lightning.js.map +1 -1
- package/dist/llm/meta.d.ts +2 -0
- package/dist/llm/meta.js +839 -624
- package/dist/llm/meta.js.map +1 -1
- package/dist/llm/modal.js +4 -0
- package/dist/llm/modal.js.map +1 -1
- package/dist/llm/model-families.d.ts +9 -0
- package/dist/llm/model-families.js +39 -0
- package/dist/llm/model-families.js.map +1 -0
- package/dist/llm/nvidia.js +4 -0
- package/dist/llm/nvidia.js.map +1 -1
- package/dist/llm/ollama.js +44 -40
- package/dist/llm/ollama.js.map +1 -1
- package/dist/llm/openai.js +4 -0
- package/dist/llm/openai.js.map +1 -1
- package/dist/llm/openrouter.js +4 -0
- package/dist/llm/openrouter.js.map +1 -1
- package/dist/llm/operation-ledger.d.ts +60 -0
- package/dist/llm/operation-ledger.js +136 -0
- package/dist/llm/operation-ledger.js.map +1 -0
- package/dist/llm/operation-usage.d.ts +32 -0
- package/dist/llm/operation-usage.js +172 -0
- package/dist/llm/operation-usage.js.map +1 -0
- package/dist/llm/orcarouter.d.ts +7 -0
- package/dist/llm/orcarouter.js +166 -0
- package/dist/llm/orcarouter.js.map +1 -0
- package/dist/llm/provider-profile-layers.d.ts +7 -0
- package/dist/llm/provider-profile-layers.js +961 -0
- package/dist/llm/provider-profile-layers.js.map +1 -0
- package/dist/llm/provider-profile.d.ts +181 -0
- package/dist/llm/provider-profile.js +329 -0
- package/dist/llm/provider-profile.js.map +1 -0
- package/dist/llm/provider-profiles.d.ts +13 -0
- package/dist/llm/provider-profiles.js +86 -0
- package/dist/llm/provider-profiles.js.map +1 -0
- package/dist/llm/provider.d.ts +2 -0
- package/dist/llm/provider.js +198 -21
- package/dist/llm/provider.js.map +1 -1
- package/dist/llm/qwen-cloud.js +4 -0
- package/dist/llm/qwen-cloud.js.map +1 -1
- package/dist/llm/reasoning-artifacts.d.ts +101 -0
- package/dist/llm/reasoning-artifacts.js +440 -0
- package/dist/llm/reasoning-artifacts.js.map +1 -0
- package/dist/llm/request-fingerprint.d.ts +10 -0
- package/dist/llm/request-fingerprint.js +313 -0
- package/dist/llm/request-fingerprint.js.map +1 -0
- package/dist/llm/request-plan.d.ts +119 -0
- package/dist/llm/request-plan.js +279 -0
- package/dist/llm/request-plan.js.map +1 -0
- package/dist/llm/router.d.ts +19 -1
- package/dist/llm/router.js +504 -102
- package/dist/llm/router.js.map +1 -1
- package/dist/llm/stream-events.d.ts +47 -0
- package/dist/llm/stream-events.js +55 -0
- package/dist/llm/stream-events.js.map +1 -0
- package/dist/llm/stream-terminal.d.ts +30 -0
- package/dist/llm/stream-terminal.js +51 -0
- package/dist/llm/stream-terminal.js.map +1 -0
- package/dist/llm/token-estimate-calibration.d.ts +23 -0
- package/dist/llm/token-estimate-calibration.js +140 -0
- package/dist/llm/token-estimate-calibration.js.map +1 -0
- package/dist/llm/token-usage.d.ts +35 -5
- package/dist/llm/token-usage.js +212 -162
- package/dist/llm/token-usage.js.map +1 -1
- package/dist/llm/tokenrouter.js +13 -6
- package/dist/llm/tokenrouter.js.map +1 -1
- package/dist/modes/ask.js +11 -5
- package/dist/modes/ask.js.map +1 -1
- package/dist/noninteractive/start-noninteractive.js +31 -2
- package/dist/noninteractive/start-noninteractive.js.map +1 -1
- package/dist/noninteractive/stream-blocks.js +15 -4
- package/dist/noninteractive/stream-blocks.js.map +1 -1
- package/dist/prompts/embedded.js +1 -1
- package/dist/prompts/embedded.js.map +1 -1
- package/dist/prompts/system.agent.md +6 -0
- package/dist/store/config.js +7 -1
- package/dist/store/config.js.map +1 -1
- package/dist/store/history.d.ts +2 -0
- package/dist/store/history.js +19 -10
- package/dist/store/history.js.map +1 -1
- package/dist/store/plan.js +20 -14
- package/dist/store/plan.js.map +1 -1
- package/dist/tools/elevated-shell.d.ts +1 -1
- package/dist/tools/elevated-shell.js +24 -72
- package/dist/tools/elevated-shell.js.map +1 -1
- package/dist/tools/fs.d.ts +5 -3
- package/dist/tools/fs.js +8 -5
- package/dist/tools/fs.js.map +1 -1
- package/dist/tools/nmap-runner.js +30 -36
- package/dist/tools/nmap-runner.js.map +1 -1
- package/dist/tools/sudo-session.d.ts +83 -0
- package/dist/tools/sudo-session.js +124 -0
- package/dist/tools/sudo-session.js.map +1 -0
- package/dist/tui-v2/app/App.js +9 -24
- package/dist/tui-v2/app/App.js.map +1 -1
- package/dist/tui-v2/components/plan/plan-view.js +5 -3
- package/dist/tui-v2/components/plan/plan-view.js.map +1 -1
- package/dist/tui-v2/components/status/context-limit-chip.js +2 -2
- package/dist/tui-v2/components/status/context-limit-chip.js.map +1 -1
- package/dist/tui-v2/components/status/status-line.js +1 -14
- package/dist/tui-v2/components/status/status-line.js.map +1 -1
- package/dist/tui-v2/components/transcript/intro-card.js +2 -1
- package/dist/tui-v2/components/transcript/intro-card.js.map +1 -1
- package/dist/tui-v2/components/transcript/notice-row.d.ts +3 -1
- package/dist/tui-v2/components/transcript/notice-row.js +28 -3
- package/dist/tui-v2/components/transcript/notice-row.js.map +1 -1
- package/dist/tui-v2/components/transcript/thinking-block.d.ts +0 -5
- package/dist/tui-v2/components/transcript/thinking-block.js +3 -8
- package/dist/tui-v2/components/transcript/thinking-block.js.map +1 -1
- package/dist/tui-v2/components/transcript/tool-card.js +16 -7
- package/dist/tui-v2/components/transcript/tool-card.js.map +1 -1
- package/dist/tui-v2/components/transcript/transcript-row.d.ts +0 -2
- package/dist/tui-v2/components/transcript/transcript-row.js +7 -3
- package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -1
- package/dist/tui-v2/components/transcript/transcript-view.js +1 -3
- package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -1
- package/dist/tui-v2/composer/composer-editor.js +2 -1
- package/dist/tui-v2/composer/composer-editor.js.map +1 -1
- package/dist/types.d.ts +156 -1
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -1
- package/dist/ui-core/bootstrap/composition-root.d.ts +2 -0
- package/dist/ui-core/bootstrap/composition-root.js +26 -3
- package/dist/ui-core/bootstrap/composition-root.js.map +1 -1
- package/dist/ui-core/commands/picker-commands.js +11 -5
- package/dist/ui-core/commands/picker-commands.js.map +1 -1
- package/dist/ui-core/commands/session-commands.js +41 -5
- package/dist/ui-core/commands/session-commands.js.map +1 -1
- package/dist/ui-core/plan/plan-lifecycle.js +3 -2
- package/dist/ui-core/plan/plan-lifecycle.js.map +1 -1
- package/dist/ui-core/rendering/context-limit.js +4 -1
- package/dist/ui-core/rendering/context-limit.js.map +1 -1
- package/dist/ui-core/rendering/duration.d.ts +5 -0
- package/dist/ui-core/rendering/duration.js +43 -0
- package/dist/ui-core/rendering/duration.js.map +1 -0
- package/dist/ui-core/rendering/intro-header.js +2 -2
- package/dist/ui-core/rendering/intro-header.js.map +1 -1
- package/dist/ui-core/rendering/theme.d.ts +1 -0
- package/dist/ui-core/rendering/theme.js +2 -0
- package/dist/ui-core/rendering/theme.js.map +1 -1
- package/dist/ui-core/rendering/transcript-semantic.js +2 -0
- package/dist/ui-core/rendering/transcript-semantic.js.map +1 -1
- package/dist/ui-core/state/transcript-compaction.js +2 -0
- package/dist/ui-core/state/transcript-compaction.js.map +1 -1
- package/dist/ui-core/state/transcript-hydrate.js +34 -4
- package/dist/ui-core/state/transcript-hydrate.js.map +1 -1
- package/dist/ui-core/state/transcript-reducer.d.ts +5 -0
- package/dist/ui-core/state/transcript-reducer.js +96 -8
- package/dist/ui-core/state/transcript-reducer.js.map +1 -1
- package/dist/ui-core/state/transcript-store.d.ts +10 -1
- package/dist/ui-core/state/transcript-store.js +22 -1
- package/dist/ui-core/state/transcript-store.js.map +1 -1
- package/dist/ui-core/state/transcript-types.d.ts +9 -1
- package/dist/ui-core/state/transcript-types.js +3 -1
- package/dist/ui-core/state/transcript-types.js.map +1 -1
- package/dist/version.generated.d.ts +2 -2
- package/dist/version.generated.js +2 -2
- package/package.json +6 -1
package/README.md
CHANGED
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
|
|
7
7
|
Two things make it practical for everyday use:
|
|
8
8
|
|
|
9
|
-
- **It's cheap-to-free to run.** A fresh install runs **keyless out of the box** on the built-in Free provider — no signup, no API key. Point it at Groq, Google Gemini, NVIDIA NIM, OpenRouter, Bynara, Kimchi, or a local Ollama — all have free access — and clai stacks them. Add several keys per provider; when one hits a rate limit, it rotates to the next automatically. Want frontier models instead? Serve **Kimi K3 on your own Modal endpoint** on Modal's **$30/month of free credit**, or start on **Lightning AI's 40M free tokens**.
|
|
9
|
+
- **It's cheap-to-free to run.** A fresh install runs **keyless out of the box** on the built-in Free provider — no signup, no API key. Point it at Groq, Google Gemini, NVIDIA NIM, OpenRouter, Bynara, Kimchi, Hetzner, or a local Ollama — all have free access — and clai stacks them. Add several keys per provider; when one hits a rate limit, it rotates to the next automatically. Want frontier models instead? Serve **Kimi K3 on your own Modal endpoint** on Modal's **$30/month of free credit**, or start on **Lightning AI's 40M free tokens**.
|
|
10
10
|
- **It's honest.** Findings need real tool output. Builds get typechecked/run before "done." Compaction and history keep long sessions coherent instead of hallucinating progress.
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
14
14
|
## Highlights
|
|
15
15
|
|
|
16
|
-
- **Free-tier first.**
|
|
16
|
+
- **Free-tier first.** 19 providers wired in, 8 cloud free tiers + local Ollama. The default provider is the **keyless Free** gateway (`free-1/deepseek-v4-flash-free`) so a fresh install runs at no cost with zero setup — no API key required.
|
|
17
17
|
- **Multi-key smart switching.** Up to 10 keys per provider with a *sticky* active key and circular rotation on rate-limit / auth / quota / transient / 5xx / empty-response errors. Disable any key or endpoint row to skip it without deleting it. Optional cross-provider fallback and a free-only filter.
|
|
18
18
|
- **Bring your own endpoint.** Deploy Kimi K3 (or Qwen / DeepSeek / GLM / GPT-OSS / your own fine-tune) to a [Modal](#modal--run-kimi-k3-on-your-own-endpoint-on-30month-of-free-credit) endpoint and drive it from clai on **$30/month of free compute credit**. Modal, Lightning AI and TokenRouter each keep a list of up to 10 base URLs with a sticky active one, so several deployments live side by side and you switch with one command — same editor, same ★ active row as keys.
|
|
19
19
|
- **Scope-based pentesting.** Opt-in engagement scope with authorized/excluded targets, allowed phases, rate and concurrency ceilings, redirect and DNS-rebinding escape detection, and out-of-scope flagging — designed for authorized pentests and bug-bounty programs.
|
|
@@ -105,7 +105,7 @@ clai # launch the full-screen agent console (already on the free provid
|
|
|
105
105
|
Prefer a different provider? Get a free key, add it, and go:
|
|
106
106
|
|
|
107
107
|
```sh
|
|
108
|
-
# Add a free key (Groq shown; NVIDIA/Gemini/OpenRouter/Bynara/Kimchi work the same)
|
|
108
|
+
# Add a free key (Groq shown; NVIDIA/Gemini/OpenRouter/Bynara/Kimchi/Hetzner work the same)
|
|
109
109
|
clai set groq gsk_your_key_here
|
|
110
110
|
clai use groq
|
|
111
111
|
|
|
@@ -151,8 +151,11 @@ This is the core of clai's design: assemble capacity from free tiers, then survi
|
|
|
151
151
|
| Qwen Cloud | `qwen3.7-plus` | Paid (DashScope) | `DASHSCOPE_API_KEY` |
|
|
152
152
|
| Modal | `moonshotai/Kimi-K3` | Usage-based ($30/mo credit) | `MODAL_PROXY_TOKEN_ID` + `MODAL_PROXY_TOKEN_SECRET` |
|
|
153
153
|
| Lightning AI | `openai/gpt-5` | Per token (40M free to start) | `LIGHTNING_API_KEY` |
|
|
154
|
-
| TokenRouter | `kimi-
|
|
154
|
+
| TokenRouter | `moonshotai/kimi-k3` | Per token (prepaid) | `TOKENROUTER_API_KEY` |
|
|
155
155
|
| Meta (Muse Spark) | `muse-spark-1.2` | Paid (per token) | `MODEL_API_KEY` |
|
|
156
|
+
| Fireworks | `accounts/fireworks/models/kimi-k2p6` | Paid (per token) | `FIREWORKS_API_KEY` |
|
|
157
|
+
| Hetzner | `Qwen/Qwen3.6-35B-A3B-FP8` | Free (experiment — no billing yet) | `HETZNER_API_KEY` |
|
|
158
|
+
| OrcaRouter | `openai/gpt-4o-mini` | Paid (per token, zero markup) | `ORCAROUTER_API_KEY` |
|
|
156
159
|
|
|
157
160
|
Several "paid" providers also expose limited free allowances — the tier label reflects what the default keys usually buy you. Flip `freeOnly` off to include paid providers in fallback.
|
|
158
161
|
|
|
@@ -225,11 +228,41 @@ clai use lightning
|
|
|
225
228
|
|
|
226
229
|
```sh
|
|
227
230
|
clai set tokenrouter sk-your-key # key: your account → API Keys
|
|
228
|
-
clai use tokenrouter # model defaults to kimi-
|
|
229
|
-
/model deepseek-v4-pro
|
|
231
|
+
clai use tokenrouter # model defaults to moonshotai/kimi-k3
|
|
232
|
+
/model deepseek/deepseek-v4-pro # 1M context · or moonshotai/kimi-k2.7-code, z-ai/glm-5.1, MiniMax-M3
|
|
230
233
|
```
|
|
231
234
|
|
|
232
|
-
Model ids are
|
|
235
|
+
Model ids are vendor-namespaced (`moonshotai/kimi-k2.6`, `deepseek/deepseek-v4-pro`, `qwen/qwen3.7-plus`); the old short ids (`kimi-k2p6`, `glm-5p1`, …) are still accepted and silently redirected to the current namespaced id. `/model` reads the live `/models` list, which is filtered to the channels your key can reach. clai carries the real per-model context windows — 1M for DeepSeek V4, 512K for MiniMax M3, 256K for Kimi/Qwen, 200K for GLM — so the context meter and auto-compaction are accurate instead of guessing 128K. Reasoning arrives as `reasoning_content` and is folded into the normal thinking block, so `/think` and `/effort` work. Base URL defaults to `https://api.tokenrouter.com/v1` and is overridable with `clai set tokenrouter --url <url>` or `TOKENROUTER_BASE_URL` if your account uses a different host.
|
|
236
|
+
|
|
237
|
+
#### Fireworks and Hetzner (open-model inference)
|
|
238
|
+
|
|
239
|
+
[Fireworks](https://fireworks.ai) is a per-token inference gateway for open models — Kimi, DeepSeek, GLM, Qwen, GPT-OSS, Llama — with SSE streaming and native tool calling.
|
|
240
|
+
|
|
241
|
+
```sh
|
|
242
|
+
clai set fireworks fw_your_key # key: fireworks.ai → API keys
|
|
243
|
+
clai use fireworks # model defaults to accounts/fireworks/models/kimi-k2p6
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
[Hetzner Inference](https://docs.hetzner.com/general/company-and-policy/experiments/inference/) is Hetzner's OpenAI-compatible experiment API serving open-weight models (Qwen3.6-35B with vision, 262K context) from EU servers. It is free while experimental — there is no billing yet — with fair-use per-key rate limits and no SLA or production guarantee.
|
|
247
|
+
|
|
248
|
+
```sh
|
|
249
|
+
clai set hetzner your-token # token: experiments.hetzner.com → Create API Token
|
|
250
|
+
clai use hetzner # model defaults to Qwen/Qwen3.6-35B-A3B-FP8
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
Both fetch the live model catalog for `/model` (cached 1h) and rotate keys like every other provider.
|
|
254
|
+
|
|
255
|
+
#### OrcaRouter (one key, eleven upstreams, zero markup)
|
|
256
|
+
|
|
257
|
+
[OrcaRouter](https://docs.orcarouter.ai) is an OpenAI-compatible gateway that routes OpenAI, Anthropic, Google Gemini, DeepSeek, xAI Grok, Qwen, Kimi, MiniMax, Z.ai GLM and more behind one key — billed at each provider's published price with no token markup. Model ids are vendor-prefixed (`openai/gpt-4o-mini`, `anthropic/claude-sonnet-4.6`, `google/gemini-2.5-flash`, `deepseek/deepseek-reasoner`, …), and `orcarouter/auto` picks the cheapest model that fits the request.
|
|
258
|
+
|
|
259
|
+
```sh
|
|
260
|
+
clai set orcarouter sk-your-key # key: orcarouter.ai/console (starts with sk-)
|
|
261
|
+
clai use orcarouter # model defaults to openai/gpt-4o-mini
|
|
262
|
+
/model anthropic/claude-sonnet-4.6 # or any id from the live /models catalog
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
Streaming, native tool calling, structured outputs (`response_format`), vision via `image_url` and prompt caching all work. Reasoning uses one unified `reasoning_effort` knob (low/medium/high, plus minimal/max on some models) that the gateway translates to each upstream's native shape — `/think` and `/effort` map onto it, and thinking arrives as `reasoning_content` in the usual thinking block. `/model` reads the live catalog (cached 1h), filtered to Chat-Completions-reachable models so image/video/tts ids stay out of the picker. Keys are multi-key with rotation like everywhere else; env var is `ORCAROUTER_API_KEY`.
|
|
233
266
|
|
|
234
267
|
### Manage keys
|
|
235
268
|
|
|
@@ -243,6 +276,9 @@ clai set modal --url https://ws--ep-kimi-k3-server.us-west.modal.direct # endp
|
|
|
243
276
|
clai set modal wk-tokenId:ws-tokenSecret # …then the proxy token pair
|
|
244
277
|
clai set lightning <key> # Lightning AI Model APIs
|
|
245
278
|
clai set tokenrouter sk-your-key # TokenRouter
|
|
279
|
+
clai set fireworks fw_your_key # Fireworks
|
|
280
|
+
clai set hetzner your-token # Hetzner Inference (experiments.hetzner.com)
|
|
281
|
+
clai set orcarouter sk-your-key # OrcaRouter (orcarouter.ai/console)
|
|
246
282
|
clai set free <key> # optional: unlock premium models (free is keyless by default)
|
|
247
283
|
clai unset modal --url # drop stored endpoint URLs, keep the keys
|
|
248
284
|
clai keys # providers + masked keys (★ active) + endpoint URLs
|
|
@@ -368,7 +404,7 @@ The old line REPL has been removed — there are only full surfaces now. An Open
|
|
|
368
404
|
| Commands / file mentions | `/` · `@` |
|
|
369
405
|
| Help / shortcuts | `Ctrl+G` |
|
|
370
406
|
|
|
371
|
-
Tool cards show the command/input clearly and keep long scan tails in an expandable OUTPUT pager (search, copy, export). File writes show a diff preview. Compaction cards preserve session memory without dropping the plan, and `/history` restores full sessions — prompts, tool results, and the matching plan — even after an abort or autosave.
|
|
407
|
+
Tool cards show the command/input clearly, with a live elapsed timer next to the command name while they run (the final duration stays visible afterwards), and keep long scan tails in an expandable OUTPUT pager (search, copy, export). File writes show a diff preview. When the agent finishes each prompt — naturally or aborted — a `✻ Worked for 1m16s` row is appended under the response, and it is restored when the session is resumed from `/history`. The status line names what the agent is actually doing right now — `responding` while streaming, `compacting` during auto or manual context compaction — instead of holding the last tool name. Prompts typed while the agent is busy are queued and run automatically in order once the turn settles; the queue pauses only when the previous turn was cancelled, errored, or stopped by the loop guard. Compaction cards preserve session memory without dropping the plan, and `/history` restores full sessions — prompts, tool results, and the matching plan — even after an abort or autosave.
|
|
372
408
|
|
|
373
409
|
---
|
|
374
410
|
|
|
@@ -560,7 +596,7 @@ clai/
|
|
|
560
596
|
├─ src/
|
|
561
597
|
│ ├─ index.ts # CLI entry + subcommands
|
|
562
598
|
│ ├─ agent/ # loop, plans, compaction, resume orientation, tool parsing
|
|
563
|
-
│ ├─ llm/ #
|
|
599
|
+
│ ├─ llm/ # 19 providers, streaming, native tools, key rotation + fallback
|
|
564
600
|
│ ├─ tools/ # fs, shell, net, http, web, pentest, batch, plan
|
|
565
601
|
│ ├─ safety/ # risk classifier + engagement (scope) policy
|
|
566
602
|
│ ├─ store/ # config, history, keys, plans, scope
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { ChatMessage, CompletionRequest, ProviderId, SuccessfulRequestSnapshot } from "../types.js";
|
|
2
|
+
import type { OperationLedger } from "../llm/operation-ledger.js";
|
|
3
|
+
import { type RequestAccounting } from "./request-accounting.js";
|
|
4
|
+
/** The assembled snapshot-replay request cannot fit the effective safe limit. */
|
|
5
|
+
export declare class CompactionOverLimitError extends Error {
|
|
6
|
+
readonly requestTokens: number;
|
|
7
|
+
readonly effectiveSafeTokens: number | undefined;
|
|
8
|
+
constructor(message: string, requestTokens: number, effectiveSafeTokens: number | undefined);
|
|
9
|
+
}
|
|
10
|
+
export declare function isCompactionOverLimitError(error: unknown): error is CompactionOverLimitError;
|
|
11
|
+
export interface CompactionSummaryExecution {
|
|
12
|
+
readonly provider: ProviderId | undefined;
|
|
13
|
+
readonly model: string | undefined;
|
|
14
|
+
readonly systemContent: string;
|
|
15
|
+
readonly prompt: string;
|
|
16
|
+
readonly maxTokens: number;
|
|
17
|
+
readonly signal?: AbortSignal | undefined;
|
|
18
|
+
readonly sourceMessages?: readonly ChatMessage[] | undefined;
|
|
19
|
+
readonly baseRequest?: SuccessfulRequestSnapshot | undefined;
|
|
20
|
+
readonly history?: readonly ChatMessage[] | undefined;
|
|
21
|
+
readonly contextLimitTokens?: number | undefined;
|
|
22
|
+
readonly tools?: CompletionRequest["tools"] | undefined;
|
|
23
|
+
readonly allowModelFallback?: boolean | undefined;
|
|
24
|
+
readonly stream: boolean;
|
|
25
|
+
readonly retryOnServerError?: boolean | undefined;
|
|
26
|
+
/** Backoff before the error retry; defaults to COMPACTION_ERROR_RETRY_DELAY_MS. */
|
|
27
|
+
readonly retryDelayMs?: number | undefined;
|
|
28
|
+
readonly qualityRetry?: boolean | undefined;
|
|
29
|
+
readonly operation?: OperationLedger | undefined;
|
|
30
|
+
readonly onToken?: ((text: string, replace?: boolean) => void) | undefined;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The cache-preserving compaction request: the exact messages of the last
|
|
34
|
+
* successful turn request, any history messages appended since, then the
|
|
35
|
+
* compaction instruction as the final user turn. The previous prompt is a
|
|
36
|
+
* strict prefix of this request, so APC providers serve it entirely from
|
|
37
|
+
* cache and only the tail + instruction bill as fresh input.
|
|
38
|
+
*/
|
|
39
|
+
export declare function buildCompactionReplayMessages(baseRequest: SuccessfulRequestSnapshot, history: readonly ChatMessage[], userPrompt: string): ChatMessage[];
|
|
40
|
+
export interface CompactionReplayPlan {
|
|
41
|
+
readonly messages: ChatMessage[];
|
|
42
|
+
readonly accounting: RequestAccounting;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Pre-flight the snapshot-replay request without dispatching it. Returns
|
|
46
|
+
* undefined when the snapshot is not a usable prefix base for the live
|
|
47
|
+
* history; otherwise the replay messages and their serialized-request
|
|
48
|
+
* accounting, so the caller can pick the cache-preserving strategy only when
|
|
49
|
+
* the request actually fits (`!plan.accounting.overLimit`). The accounting
|
|
50
|
+
* reserves the summary completion budget and adds planner slack for the
|
|
51
|
+
* durable-state detail the final instruction prompt gains later.
|
|
52
|
+
*
|
|
53
|
+
* Replay compatibility: identical heads are the common case (the snapshot was
|
|
54
|
+
* captured from this session's live message array). History restored from
|
|
55
|
+
* disk drops the composed system head, so a headless history is accepted when
|
|
56
|
+
* its messages still match into the snapshot's body. Anything else means the
|
|
57
|
+
* snapshot belongs to a different lineage (provider/model switch, rewound or
|
|
58
|
+
* replaced history) and replaying it would resurrect dropped messages.
|
|
59
|
+
*/
|
|
60
|
+
export declare function planCompactionReplay(input: {
|
|
61
|
+
readonly baseRequest: SuccessfulRequestSnapshot;
|
|
62
|
+
readonly history: readonly ChatMessage[];
|
|
63
|
+
readonly prompt: string;
|
|
64
|
+
readonly maxTokens: number;
|
|
65
|
+
readonly contextLimitTokens?: number | undefined;
|
|
66
|
+
readonly stream?: boolean | undefined;
|
|
67
|
+
}): CompactionReplayPlan | undefined;
|
|
68
|
+
export declare function executeCompactionSummary(execution: CompactionSummaryExecution): Promise<string>;
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import { buildCompactionRetryPrompt, isCompactionCompletionTruncated, looksLikeIncompleteCompactionSummary, looksLikeTranscriptReplay, normalizeCompactionSummary, } from "./compaction-summary.js";
|
|
2
|
+
import { completeWithProvider, streamWithProvider } from "../llm/router.js";
|
|
3
|
+
import { streamAlreadyEmitted } from "../llm/stream-progress.js";
|
|
4
|
+
import { createThinkingStreamParser, stripThinking } from "../ui/thinking.js";
|
|
5
|
+
import { accountAssembledRequest, RequestOverLimitError, SAFETY_MARGIN_TOKENS, } from "./request-accounting.js";
|
|
6
|
+
import { isAbortError } from "./session-policy.js";
|
|
7
|
+
const RETRY_SYSTEM_SUFFIX = "\nReturn only a complete continuation-memory summary. Do not include analysis, reasoning, or <think> tags.";
|
|
8
|
+
/**
|
|
9
|
+
* Pause between a failed compaction admission and its retry: the failure is
|
|
10
|
+
* almost always transient upstream capacity (5xx, 429, a 200 whose stream
|
|
11
|
+
* errored), and an instant replay just re-hits the same hot route.
|
|
12
|
+
*/
|
|
13
|
+
const COMPACTION_ERROR_RETRY_DELAY_MS = 1_500;
|
|
14
|
+
/**
|
|
15
|
+
* Extra headroom the replay planner adds on top of the standard safety margin.
|
|
16
|
+
* The planner sizes the request with a representative instruction prompt; the
|
|
17
|
+
* real prompt additionally embeds durable-state snippets extracted while the
|
|
18
|
+
* summary runs, so the plan must leave room for them.
|
|
19
|
+
*/
|
|
20
|
+
const REPLAY_PLAN_SLACK_TOKENS = 4_096;
|
|
21
|
+
/**
|
|
22
|
+
* A compaction failure worth one more admission. Retryable by default: the
|
|
23
|
+
* only failures excluded are ones a retry cannot fix — aborts, partial streams
|
|
24
|
+
* (re-sending would double-print the summary card), fit-check rejections (the
|
|
25
|
+
* request is deterministically too large), and definitive request errors (4xx
|
|
26
|
+
* other than 408/429). Everything else is treated as transient: 5xx, 429/408,
|
|
27
|
+
* network resets, idle timeouts, and gateway responses that returned HTTP 200
|
|
28
|
+
* but failed upstream mid-stream.
|
|
29
|
+
*/
|
|
30
|
+
function isCompactionRetryableError(error, signal) {
|
|
31
|
+
if (streamAlreadyEmitted(error))
|
|
32
|
+
return false;
|
|
33
|
+
if (isAbortError(error, signal))
|
|
34
|
+
return false;
|
|
35
|
+
if (isCompactionOverLimitError(error))
|
|
36
|
+
return false;
|
|
37
|
+
if (error instanceof RequestOverLimitError)
|
|
38
|
+
return false;
|
|
39
|
+
const status = error && typeof error === "object" && "status" in error
|
|
40
|
+
? Number(error.status)
|
|
41
|
+
: 0;
|
|
42
|
+
if (status === 408 || status === 429)
|
|
43
|
+
return true;
|
|
44
|
+
if (status >= 400 && status < 500)
|
|
45
|
+
return false;
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
/** The assembled snapshot-replay request cannot fit the effective safe limit. */
|
|
49
|
+
export class CompactionOverLimitError extends Error {
|
|
50
|
+
requestTokens;
|
|
51
|
+
effectiveSafeTokens;
|
|
52
|
+
constructor(message, requestTokens, effectiveSafeTokens) {
|
|
53
|
+
super(message);
|
|
54
|
+
this.requestTokens = requestTokens;
|
|
55
|
+
this.effectiveSafeTokens = effectiveSafeTokens;
|
|
56
|
+
this.name = "CompactionOverLimitError";
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export function isCompactionOverLimitError(error) {
|
|
60
|
+
return error instanceof CompactionOverLimitError;
|
|
61
|
+
}
|
|
62
|
+
const FAIL_CLOSED_BY_REASON = {
|
|
63
|
+
truncated: "compaction failed: model hit the summary output limit — original context retained",
|
|
64
|
+
"reasoning-only": "compaction failed: model returned no visible summary — original context retained",
|
|
65
|
+
replayed: "compaction failed: model replayed the transcript — original context retained",
|
|
66
|
+
incomplete: "compaction failed: model returned an incomplete summary — original context retained",
|
|
67
|
+
};
|
|
68
|
+
function comparableMessage(message) {
|
|
69
|
+
const { images: _images, ...rest } = message;
|
|
70
|
+
return JSON.stringify(rest);
|
|
71
|
+
}
|
|
72
|
+
function missingHistoryTail(requestMessages, history) {
|
|
73
|
+
let requestIndex = 0;
|
|
74
|
+
let matchedHistory = 0;
|
|
75
|
+
while (matchedHistory < history.length) {
|
|
76
|
+
const expected = comparableMessage(history[matchedHistory]);
|
|
77
|
+
let found = -1;
|
|
78
|
+
for (let index = requestIndex; index < requestMessages.length; index += 1) {
|
|
79
|
+
if (comparableMessage(requestMessages[index]) === expected) {
|
|
80
|
+
found = index;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (found < 0)
|
|
85
|
+
break;
|
|
86
|
+
requestIndex = found + 1;
|
|
87
|
+
matchedHistory += 1;
|
|
88
|
+
}
|
|
89
|
+
return history.slice(matchedHistory).map((message) => structuredClone(message));
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The cache-preserving compaction request: the exact messages of the last
|
|
93
|
+
* successful turn request, any history messages appended since, then the
|
|
94
|
+
* compaction instruction as the final user turn. The previous prompt is a
|
|
95
|
+
* strict prefix of this request, so APC providers serve it entirely from
|
|
96
|
+
* cache and only the tail + instruction bill as fresh input.
|
|
97
|
+
*/
|
|
98
|
+
export function buildCompactionReplayMessages(baseRequest, history, userPrompt) {
|
|
99
|
+
return [
|
|
100
|
+
...baseRequest.messages.map((message) => structuredClone(message)),
|
|
101
|
+
...missingHistoryTail(baseRequest.messages, history),
|
|
102
|
+
{ role: "user", content: userPrompt },
|
|
103
|
+
];
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Pre-flight the snapshot-replay request without dispatching it. Returns
|
|
107
|
+
* undefined when the snapshot is not a usable prefix base for the live
|
|
108
|
+
* history; otherwise the replay messages and their serialized-request
|
|
109
|
+
* accounting, so the caller can pick the cache-preserving strategy only when
|
|
110
|
+
* the request actually fits (`!plan.accounting.overLimit`). The accounting
|
|
111
|
+
* reserves the summary completion budget and adds planner slack for the
|
|
112
|
+
* durable-state detail the final instruction prompt gains later.
|
|
113
|
+
*
|
|
114
|
+
* Replay compatibility: identical heads are the common case (the snapshot was
|
|
115
|
+
* captured from this session's live message array). History restored from
|
|
116
|
+
* disk drops the composed system head, so a headless history is accepted when
|
|
117
|
+
* its messages still match into the snapshot's body. Anything else means the
|
|
118
|
+
* snapshot belongs to a different lineage (provider/model switch, rewound or
|
|
119
|
+
* replaced history) and replaying it would resurrect dropped messages.
|
|
120
|
+
*/
|
|
121
|
+
export function planCompactionReplay(input) {
|
|
122
|
+
const baseRequest = input.baseRequest;
|
|
123
|
+
const snapshotHead = baseRequest.messages[0];
|
|
124
|
+
const historyHead = input.history[0];
|
|
125
|
+
if (!snapshotHead || !historyHead)
|
|
126
|
+
return undefined;
|
|
127
|
+
const tail = missingHistoryTail(baseRequest.messages, input.history);
|
|
128
|
+
if (comparableMessage(snapshotHead) !== comparableMessage(historyHead)) {
|
|
129
|
+
if (historyHead.role === "system")
|
|
130
|
+
return undefined;
|
|
131
|
+
if (tail.length >= input.history.length)
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
const messages = [
|
|
135
|
+
...baseRequest.messages.map((message) => structuredClone(message)),
|
|
136
|
+
...tail,
|
|
137
|
+
{ role: "user", content: input.prompt },
|
|
138
|
+
];
|
|
139
|
+
const { accounting } = accountAssembledRequest({
|
|
140
|
+
provider: baseRequest.provider,
|
|
141
|
+
model: baseRequest.model,
|
|
142
|
+
messages,
|
|
143
|
+
stream: input.stream ?? true,
|
|
144
|
+
...(baseRequest.tools?.length ? { tools: baseRequest.tools } : {}),
|
|
145
|
+
...(baseRequest.toolChoice !== undefined
|
|
146
|
+
? { toolChoice: baseRequest.toolChoice }
|
|
147
|
+
: {}),
|
|
148
|
+
...(baseRequest.parallelToolCalls !== undefined
|
|
149
|
+
? { parallelToolCalls: baseRequest.parallelToolCalls }
|
|
150
|
+
: {}),
|
|
151
|
+
...(baseRequest.thinking ? { reasoning: baseRequest.thinking } : {}),
|
|
152
|
+
...(input.contextLimitTokens !== undefined
|
|
153
|
+
? { contextLimitTokens: input.contextLimitTokens }
|
|
154
|
+
: {}),
|
|
155
|
+
reservedOutputTokens: input.maxTokens,
|
|
156
|
+
safetyMarginTokens: SAFETY_MARGIN_TOKENS + REPLAY_PLAN_SLACK_TOKENS,
|
|
157
|
+
});
|
|
158
|
+
return { messages, accounting };
|
|
159
|
+
}
|
|
160
|
+
export async function executeCompactionSummary(execution) {
|
|
161
|
+
const attemptMessages = (userPrompt, systemContent) => {
|
|
162
|
+
if (execution.baseRequest) {
|
|
163
|
+
return buildCompactionReplayMessages(execution.baseRequest, execution.history ?? [], userPrompt);
|
|
164
|
+
}
|
|
165
|
+
return execution.sourceMessages
|
|
166
|
+
? [
|
|
167
|
+
...execution.sourceMessages,
|
|
168
|
+
{ role: "user", content: userPrompt },
|
|
169
|
+
]
|
|
170
|
+
: [
|
|
171
|
+
{ role: "system", content: systemContent },
|
|
172
|
+
{ role: "user", content: userPrompt },
|
|
173
|
+
];
|
|
174
|
+
};
|
|
175
|
+
const baseRequest = execution.baseRequest;
|
|
176
|
+
const request = {
|
|
177
|
+
provider: baseRequest?.provider ?? execution.provider,
|
|
178
|
+
model: baseRequest?.model ?? execution.model,
|
|
179
|
+
purpose: "compaction",
|
|
180
|
+
messages: attemptMessages(execution.prompt, execution.systemContent),
|
|
181
|
+
maxTokens: execution.maxTokens,
|
|
182
|
+
...(baseRequest
|
|
183
|
+
? {
|
|
184
|
+
...(baseRequest.temperature !== undefined
|
|
185
|
+
? { temperature: baseRequest.temperature }
|
|
186
|
+
: {}),
|
|
187
|
+
...(baseRequest.thinking
|
|
188
|
+
? { thinking: structuredClone(baseRequest.thinking) }
|
|
189
|
+
: {}),
|
|
190
|
+
...(baseRequest.tools
|
|
191
|
+
? { tools: baseRequest.tools.map((tool) => structuredClone(tool)) }
|
|
192
|
+
: {}),
|
|
193
|
+
...(baseRequest.toolChoice !== undefined
|
|
194
|
+
? { toolChoice: structuredClone(baseRequest.toolChoice) }
|
|
195
|
+
: {}),
|
|
196
|
+
...(baseRequest.parallelToolCalls !== undefined
|
|
197
|
+
? { parallelToolCalls: baseRequest.parallelToolCalls }
|
|
198
|
+
: {}),
|
|
199
|
+
}
|
|
200
|
+
: {
|
|
201
|
+
temperature: 0.1,
|
|
202
|
+
// Disable reasoning for the compression pass. Use "low" (not "none"):
|
|
203
|
+
// for openai-style gateways (TokenRouter etc.) `effort:"none"` maps to
|
|
204
|
+
// the wire value `reasoning_effort:"none"`, which many models reject
|
|
205
|
+
// ("reasoning option not supported"). "low" with enabled:false maps to
|
|
206
|
+
// no reasoning knob on those gateways while still disabling default
|
|
207
|
+
// thinking on deepseek-style models via their own mapping.
|
|
208
|
+
thinking: { enabled: false, effort: "low" },
|
|
209
|
+
...(execution.allowModelFallback ? { allowModelFallback: true } : {}),
|
|
210
|
+
...(execution.tools?.length
|
|
211
|
+
? { tools: execution.tools, toolChoice: "none" }
|
|
212
|
+
: {}),
|
|
213
|
+
}),
|
|
214
|
+
...(execution.signal ? { signal: execution.signal } : {}),
|
|
215
|
+
};
|
|
216
|
+
if (baseRequest) {
|
|
217
|
+
const accounting = accountAssembledRequest({
|
|
218
|
+
provider: baseRequest.provider,
|
|
219
|
+
model: baseRequest.model,
|
|
220
|
+
messages: request.messages,
|
|
221
|
+
stream: execution.stream,
|
|
222
|
+
...(request.tools?.length ? { tools: request.tools } : {}),
|
|
223
|
+
...(request.toolChoice !== undefined
|
|
224
|
+
? { toolChoice: request.toolChoice }
|
|
225
|
+
: {}),
|
|
226
|
+
...(request.parallelToolCalls !== undefined
|
|
227
|
+
? { parallelToolCalls: request.parallelToolCalls }
|
|
228
|
+
: {}),
|
|
229
|
+
...(request.thinking ? { reasoning: request.thinking } : {}),
|
|
230
|
+
...(execution.contextLimitTokens !== undefined
|
|
231
|
+
? { contextLimitTokens: execution.contextLimitTokens }
|
|
232
|
+
: {}),
|
|
233
|
+
reservedOutputTokens: execution.maxTokens,
|
|
234
|
+
}).accounting;
|
|
235
|
+
if (accounting.overLimit) {
|
|
236
|
+
throw new CompactionOverLimitError(`compaction failed: captured request plus compaction instruction needs about ${accounting.requestTokens.toLocaleString()} input tokens but only ${accounting.limit.effectiveSafeTokens?.toLocaleString()} fit after reserving summary output — original context retained`, accounting.requestTokens, accounting.limit.effectiveSafeTokens);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
const runProviderAttempt = async (attemptRequest, replace = false) => {
|
|
240
|
+
// A pinned single dispatch is what makes the one-admission contract real:
|
|
241
|
+
// without it the router can still rotate keys, fall back to another
|
|
242
|
+
// provider, or retry a capability downgrade, each resending this prompt.
|
|
243
|
+
const routerOptions = {
|
|
244
|
+
maxRetries: 0,
|
|
245
|
+
singleDispatch: true,
|
|
246
|
+
...(execution.operation ? { operation: execution.operation } : {}),
|
|
247
|
+
};
|
|
248
|
+
if (!execution.stream) {
|
|
249
|
+
return completeWithProvider(attemptRequest, routerOptions);
|
|
250
|
+
}
|
|
251
|
+
if (replace)
|
|
252
|
+
execution.onToken?.("", true);
|
|
253
|
+
const parser = createThinkingStreamParser((text) => execution.onToken?.(text), undefined, { remember: false });
|
|
254
|
+
const result = await streamWithProvider(attemptRequest, (token) => parser.push(token), { onStatus: () => undefined, ...routerOptions });
|
|
255
|
+
parser.finish();
|
|
256
|
+
return result;
|
|
257
|
+
};
|
|
258
|
+
const sleepBeforeRetry = async () => {
|
|
259
|
+
const delayMs = execution.retryDelayMs ?? COMPACTION_ERROR_RETRY_DELAY_MS;
|
|
260
|
+
if (delayMs <= 0)
|
|
261
|
+
return;
|
|
262
|
+
if (execution.signal?.aborted) {
|
|
263
|
+
throw execution.signal.reason ?? new Error("Aborted");
|
|
264
|
+
}
|
|
265
|
+
await new Promise((resolve, reject) => {
|
|
266
|
+
const signal = execution.signal;
|
|
267
|
+
const timer = setTimeout(() => {
|
|
268
|
+
cleanup();
|
|
269
|
+
resolve();
|
|
270
|
+
}, delayMs);
|
|
271
|
+
const onAbort = () => {
|
|
272
|
+
clearTimeout(timer);
|
|
273
|
+
cleanup();
|
|
274
|
+
reject(signal?.reason ?? new Error("Aborted"));
|
|
275
|
+
};
|
|
276
|
+
const cleanup = () => {
|
|
277
|
+
signal?.removeEventListener("abort", onAbort);
|
|
278
|
+
};
|
|
279
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
280
|
+
});
|
|
281
|
+
};
|
|
282
|
+
// One automatic retry after a transient failure: the replayed prefix is
|
|
283
|
+
// cache-hot, so the second admission only re-bills the small fresh tail.
|
|
284
|
+
const runAttempt = async (attemptRequest, replace = false) => {
|
|
285
|
+
try {
|
|
286
|
+
return await runProviderAttempt(attemptRequest, replace);
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
if (!execution.retryOnServerError ||
|
|
290
|
+
!isCompactionRetryableError(error, execution.signal)) {
|
|
291
|
+
throw error;
|
|
292
|
+
}
|
|
293
|
+
await sleepBeforeRetry();
|
|
294
|
+
return await runProviderAttempt(attemptRequest, replace);
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
const first = await runAttempt(request);
|
|
298
|
+
if (first.toolCalls?.length) {
|
|
299
|
+
throw new Error("compaction failed: model returned tool calls instead of a summary — original context retained");
|
|
300
|
+
}
|
|
301
|
+
let visible = normalizeCompactionSummary(stripThinking(first.text).visible);
|
|
302
|
+
let retryReason;
|
|
303
|
+
if (isCompactionCompletionTruncated(first, execution.maxTokens)) {
|
|
304
|
+
retryReason = "truncated";
|
|
305
|
+
}
|
|
306
|
+
else if (!visible) {
|
|
307
|
+
retryReason = "reasoning-only";
|
|
308
|
+
}
|
|
309
|
+
else if (looksLikeTranscriptReplay(visible)) {
|
|
310
|
+
retryReason = "replayed";
|
|
311
|
+
}
|
|
312
|
+
else if (looksLikeIncompleteCompactionSummary(visible)) {
|
|
313
|
+
retryReason = "incomplete";
|
|
314
|
+
}
|
|
315
|
+
if (retryReason) {
|
|
316
|
+
if (execution.qualityRetry === false) {
|
|
317
|
+
throw new Error(FAIL_CLOSED_BY_REASON[retryReason]);
|
|
318
|
+
}
|
|
319
|
+
const retry = await runAttempt({
|
|
320
|
+
...request,
|
|
321
|
+
messages: attemptMessages(buildCompactionRetryPrompt(execution.prompt, retryReason), `${execution.systemContent}${RETRY_SYSTEM_SUFFIX}`),
|
|
322
|
+
temperature: 0,
|
|
323
|
+
}, true);
|
|
324
|
+
if (retry.toolCalls?.length) {
|
|
325
|
+
throw new Error("compaction failed: model returned tool calls instead of a summary — original context retained");
|
|
326
|
+
}
|
|
327
|
+
if (isCompactionCompletionTruncated(retry, execution.maxTokens)) {
|
|
328
|
+
throw new Error("compaction failed: model hit the summary output limit twice — original context retained");
|
|
329
|
+
}
|
|
330
|
+
visible = normalizeCompactionSummary(stripThinking(retry.text).visible);
|
|
331
|
+
if (!visible) {
|
|
332
|
+
throw new Error("compaction failed: model returned an empty summary");
|
|
333
|
+
}
|
|
334
|
+
if (looksLikeTranscriptReplay(visible)) {
|
|
335
|
+
throw new Error("compaction failed: model replayed the transcript twice — original context retained");
|
|
336
|
+
}
|
|
337
|
+
if (looksLikeIncompleteCompactionSummary(visible)) {
|
|
338
|
+
throw new Error("compaction failed: model returned an incomplete summary twice — original context retained");
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return visible;
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=compaction-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction-executor.js","sourceRoot":"","sources":["../../src/agent/compaction-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,14 +34,17 @@ export async function ensurePentestAuthorization(call, autoConfirm, session, con
|
|
|
34
34
|
return true;
|
|
35
35
|
}
|
|
36
36
|
export async function confirmToolExecution(call, autoConfirm, session, confirmPort, options) {
|
|
37
|
-
// fs.delete
|
|
38
|
-
// Deletion is irreversible; never auto-approve.
|
|
39
|
-
|
|
37
|
+
// fs.delete always prompts — at every permission level, even allow-all / -y.
|
|
38
|
+
// Deletion is irreversible; never auto-approve. Everything else (including
|
|
39
|
+
// out-of-cwd writes) honors allow-all.
|
|
40
|
+
if (call.name === "fs.delete") {
|
|
40
41
|
return confirmPort.confirmTool(call);
|
|
41
42
|
}
|
|
42
43
|
const config = getConfig();
|
|
43
44
|
if (config.permissions === "allow-all")
|
|
44
45
|
return true;
|
|
46
|
+
if (options?.forceConfirm)
|
|
47
|
+
return confirmPort.confirmTool(call);
|
|
45
48
|
if (autoConfirm)
|
|
46
49
|
return true;
|
|
47
50
|
if (session.allow.has(call.name))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confirm-port.js","sourceRoot":"","sources":["../../src/agent/confirm-port.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAIhF,OAAO,EAAE,uBAAuB,EAAE,CAAC;AAgBnC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,gBAAgB,GAAgB,sBAAsB,EAAE,CAAC;AAEtE,MAAM,kBAAkB,GAAG,qBAAqB,EAAE,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAG1C;IACC,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,IAAc,EACd,WAAoB,EACpB,OAAsB,EACtB,WAAwB;IAExB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,MAAM,CAAC,WAAW,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACpD,6DAA6D;IAC7D,IAAI,MAAM,CAAC,iBAAiB;QAAE,OAAO,IAAI,CAAC;IAC1C,+DAA+D;IAC/D,IAAI,OAAO,CAAC,iBAAiB,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAEjD,IAAI,WAAW,EAAE,CAAC;QAChB,sEAAsE;QACtE,oEAAoE;QACpE,OAAO,CAAC,iBAAiB,CAAC,KAAK,GAAG,IAAI,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,CAAC;IAC9C,IAAI,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IACtB,OAAO,CAAC,iBAAiB,CAAC,KAAK,GAAG,IAAI,CAAC;IACvC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAc,EACd,WAAoB,EACpB,OAAsB,EACtB,WAAwB,EACxB,OAAgD;IAEhD,6EAA6E;IAC7E,
|
|
1
|
+
{"version":3,"file":"confirm-port.js","sourceRoot":"","sources":["../../src/agent/confirm-port.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAIhF,OAAO,EAAE,uBAAuB,EAAE,CAAC;AAgBnC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,gBAAgB,GAAgB,sBAAsB,EAAE,CAAC;AAEtE,MAAM,kBAAkB,GAAG,qBAAqB,EAAE,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAG1C;IACC,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,IAAc,EACd,WAAoB,EACpB,OAAsB,EACtB,WAAwB;IAExB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,MAAM,CAAC,WAAW,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACpD,6DAA6D;IAC7D,IAAI,MAAM,CAAC,iBAAiB;QAAE,OAAO,IAAI,CAAC;IAC1C,+DAA+D;IAC/D,IAAI,OAAO,CAAC,iBAAiB,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAEjD,IAAI,WAAW,EAAE,CAAC;QAChB,sEAAsE;QACtE,oEAAoE;QACpE,OAAO,CAAC,iBAAiB,CAAC,KAAK,GAAG,IAAI,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,CAAC;IAC9C,IAAI,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IACtB,OAAO,CAAC,iBAAiB,CAAC,KAAK,GAAG,IAAI,CAAC;IACvC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAc,EACd,WAAoB,EACpB,OAAsB,EACtB,WAAwB,EACxB,OAAgD;IAEhD,6EAA6E;IAC7E,2EAA2E;IAC3E,uCAAuC;IACvC,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC9B,OAAO,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,MAAM,CAAC,WAAW,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,OAAO,EAAE,YAAY;QAAE,OAAO,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAChE,IAAI,WAAW;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,uEAAuE;IACvE,wEAAwE;IACxE,qDAAqD;IACrD,IAAI,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAE7D,OAAO,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Used for reliability ops and regression harnesses. Does not truncate context.
|
|
6
6
|
*/
|
|
7
7
|
import { createHash } from "node:crypto";
|
|
8
|
+
import { reasoningArtifactTokensForMessage } from "../llm/reasoning-artifacts.js";
|
|
8
9
|
import { estimateMessagesTokens, estimateTokens, isCompactionMemoryMessage, COMPACTION_MEMORY_PREFIX, PLAN_IMPLEMENT_MEMORY_PREFIX, MECHANICAL_MEMORY_PREFIX, } from "./context-manager.js";
|
|
9
10
|
import { SESSION_STATE_PREFIX } from "./session-state.js";
|
|
10
11
|
function isPlanSystem(content) {
|
|
@@ -81,6 +82,7 @@ export function buildContextBreakdown(messages, tools) {
|
|
|
81
82
|
if (message.toolCalls?.length) {
|
|
82
83
|
assistantTokens += estimateTokens(JSON.stringify(message.toolCalls));
|
|
83
84
|
}
|
|
85
|
+
assistantTokens += reasoningArtifactTokensForMessage(message);
|
|
84
86
|
break;
|
|
85
87
|
case "tool":
|
|
86
88
|
toolMessageCount += 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-breakdown.js","sourceRoot":"","sources":["../../src/agent/context-breakdown.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"context-breakdown.js","sourceRoot":"","sources":["../../src/agent/context-breakdown.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,iCAAiC,EAAE,MAAM,+BAA+B,CAAC;AAClF,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,yBAAyB,EACzB,wBAAwB,EACxB,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AA2B1D,SAAS,YAAY,CAAC,OAAe;IACnC,OAAO,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO,CACL,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC;QACtC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CACvC,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAe;IAC3C,OAAO,CACL,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC;QACxC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CACvC,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe;IACzC,OAAO,CACL,OAAO,CAAC,UAAU,CAAC,wBAAwB,CAAC;QAC5C,OAAO,CAAC,UAAU,CAAC,4BAA4B,CAAC;QAChD,OAAO,CAAC,UAAU,CAAC,wBAAwB,CAAC;QAC5C,6CAA6C;QAC7C,yBAAyB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CACvD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAAgC,EAChC,KAA6C;IAE7C,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,qBAAqB,GAAG,CAAC,CAAC;IAC9B,IAAI,gBAAgB,GAAG,CAAC,CAAC;IAEzB,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,IAAI,sBAAsB,GAAG,CAAC,CAAC;IAC/B,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAE1B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,kBAAkB,IAAI,CAAC,CAAC;gBACxB,YAAY,IAAI,MAAM,CAAC;gBACvB,IAAI,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBACxC,sBAAsB,IAAI,MAAM,CAAC;gBACnC,CAAC;qBAAM,IAAI,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBACzC,UAAU,IAAI,MAAM,CAAC;gBACvB,CAAC;qBAAM,IAAI,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC1C,WAAW,IAAI,MAAM,CAAC;gBACxB,CAAC;qBAAM,IAAI,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBACjD,kBAAkB,IAAI,MAAM,CAAC;gBAC/B,CAAC;qBAAM,IACL,kBAAkB,KAAK,CAAC;oBACxB,kDAAkD,CAAC,IAAI,CACrD,OAAO,CAAC,OAAO,CAChB,EACD,CAAC;oBACD,6DAA6D;oBAC7D,kBAAkB,IAAI,MAAM,CAAC;gBAC/B,CAAC;qBAAM,CAAC;oBACN,iBAAiB,IAAI,MAAM,CAAC;gBAC9B,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,MAAM;gBACT,gBAAgB,IAAI,CAAC,CAAC;gBACtB,UAAU,IAAI,MAAM,CAAC;gBACrB,MAAM;YACR,KAAK,WAAW;gBACd,qBAAqB,IAAI,CAAC,CAAC;gBAC3B,eAAe,IAAI,MAAM,CAAC;gBAC1B,IAAI,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;oBAC9B,eAAe,IAAI,cAAc,CAC/B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAClC,CAAC;gBACJ,CAAC;gBACD,eAAe,IAAI,iCAAiC,CAAC,OAAO,CAAC,CAAC;gBAC9D,MAAM;YACR,KAAK,MAAM;gBACT,gBAAgB,IAAI,CAAC,CAAC;gBACtB,gBAAgB,IAAI,MAAM,CAAC;gBAC3B,MAAM;YACR;gBACE,iBAAiB,IAAI,MAAM,CAAC;gBAC5B,MAAM;QACV,CAAC;IACH,CAAC;IAED,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,MAAM,mBAAmB,GAAG,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC;IAC/C,IAAI,KAAK,EAAE,MAAM,EAAE,CAAC;QAClB,gBAAgB,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,oBAAoB,GACxB,sBAAsB,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,gBAAgB,CAAC;IAE3D,OAAO;QACL,oBAAoB;QACpB,YAAY;QACZ,UAAU;QACV,eAAe;QACf,gBAAgB;QAChB,gBAAgB;QAChB,YAAY,EAAE,QAAQ,CAAC,MAAM;QAC7B,kBAAkB;QAClB,gBAAgB;QAChB,qBAAqB;QACrB,gBAAgB;QAChB,WAAW,EAAE;YACX,kBAAkB;YAClB,UAAU;YACV,WAAW;YACX,kBAAkB;YAClB,sBAAsB;YACtB,iBAAiB;SAClB;QACD,mBAAmB;KACpB,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,4BAA4B,CAC1C,SAA2B;IAE3B,OAAO;QACL,oBAAoB,EAAE,SAAS,CAAC,oBAAoB;QACpD,YAAY,EAAE,SAAS,CAAC,YAAY;QACpC,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,eAAe,EAAE,SAAS,CAAC,eAAe;QAC1C,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;QAC5C,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;QAC5C,YAAY,EAAE,SAAS,CAAC,YAAY;QACpC,kBAAkB,EAAE,SAAS,CAAC,kBAAkB;QAChD,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;QAC5C,qBAAqB,EAAE,SAAS,CAAC,qBAAqB;QACtD,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;QAC5C,kBAAkB,EAAE,SAAS,CAAC,WAAW,CAAC,kBAAkB;QAC5D,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC,UAAU;QAC5C,WAAW,EAAE,SAAS,CAAC,WAAW,CAAC,WAAW;QAC9C,kBAAkB,EAAE,SAAS,CAAC,WAAW,CAAC,kBAAkB;QAC5D,sBAAsB,EAAE,SAAS,CAAC,WAAW,CAAC,sBAAsB;QACpE,iBAAiB,EAAE,SAAS,CAAC,WAAW,CAAC,iBAAiB;QAC1D,mBAAmB,EAAE,SAAS,CAAC,mBAAmB;KACnD,CAAC;AACJ,CAAC;AAGD,+EAA+E;AAC/E,+EAA+E;AAC/E,uCAAuC;AACvC,MAAM,UAAU,4BAA4B,CAC1C,QAAgC,EAChC,KAA6C;IAE7C,MAAM,SAAS,GAAG,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACzD,MAAM,UAAU,GAA6C;QAC3D,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,CAAC,gBAAgB,EAAE;QAC7D,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,CAAC,gBAAgB,EAAE;QAC7D,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,SAAS,CAAC,eAAe,EAAE;QACjE,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,CAAC,UAAU,EAAE;QACxD;YACE,KAAK,EAAE,qBAAqB;YAC5B,MAAM,EAAE,SAAS,CAAC,WAAW,CAAC,kBAAkB;SACjD;QACD;YACE,KAAK,EAAE,mBAAmB;YAC1B,MAAM,EAAE,SAAS,CAAC,WAAW,CAAC,sBAAsB;SACrD;QACD,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,CAAC,WAAW,CAAC,UAAU,EAAE;QACjE;YACE,KAAK,EAAE,eAAe;YACtB,MAAM,EAAE,SAAS,CAAC,WAAW,CAAC,kBAAkB;SACjD;KACF,CAAC;IACF,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,CACxD,SAAS,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CACxD,CAAC;IACF,OAAO,GAAG,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC;AAC3E,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,cAAc,CAC5B,KAA4C;IAE5C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAChD,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACxG,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC"}
|