@kenkaiiii/ggcoder 5.74.3 → 5.75.1
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 +1 -1
- package/assets/skills/bulletproof/SKILL.md +1 -1
- package/assets/skills/clarify/SKILL.md +1 -1
- package/assets/skills/code-review/SKILL.md +1 -1
- package/assets/skills/compliance-guard/SKILL.md +1 -1
- package/assets/skills/durable/SKILL.md +1 -1
- package/assets/skills/evidence-led-ui/SKILL.md +1 -1
- package/assets/skills/lean/SKILL.md +1 -1
- package/assets/skills/refactoring/SKILL.md +1 -1
- package/assets/skills/root-cause/SKILL.md +1 -1
- package/assets/skills/shared-language/SKILL.md +1 -1
- package/assets/skills/tdd/SKILL.md +1 -1
- package/dist/app-sidecar/app-settings.d.ts +65 -0
- package/dist/app-sidecar/app-settings.js +147 -0
- package/dist/app-sidecar/app-settings.js.map +1 -0
- package/dist/app-sidecar/attachments.d.ts +11 -0
- package/dist/app-sidecar/attachments.js +47 -0
- package/dist/app-sidecar/attachments.js.map +1 -0
- package/dist/app-sidecar/auth-routes.d.ts +3 -0
- package/dist/app-sidecar/auth-routes.js +290 -0
- package/dist/app-sidecar/auth-routes.js.map +1 -0
- package/dist/app-sidecar/autopilot-runner.d.ts +61 -0
- package/dist/app-sidecar/autopilot-runner.js +367 -0
- package/dist/app-sidecar/autopilot-runner.js.map +1 -0
- package/dist/app-sidecar/file-search.d.ts +15 -0
- package/dist/app-sidecar/file-search.js +103 -0
- package/dist/app-sidecar/file-search.js.map +1 -0
- package/dist/app-sidecar/hf-pull-manager.d.ts +20 -0
- package/dist/app-sidecar/hf-pull-manager.js +224 -0
- package/dist/app-sidecar/hf-pull-manager.js.map +1 -0
- package/dist/app-sidecar/history-routes.d.ts +3 -0
- package/dist/app-sidecar/history-routes.js +375 -0
- package/dist/app-sidecar/history-routes.js.map +1 -0
- package/dist/app-sidecar/history.d.ts +67 -0
- package/dist/app-sidecar/history.js +23 -0
- package/dist/app-sidecar/history.js.map +1 -0
- package/dist/app-sidecar/http.d.ts +5 -0
- package/dist/app-sidecar/http.js +27 -0
- package/dist/app-sidecar/http.js.map +1 -0
- package/dist/app-sidecar/integration-routes.d.ts +3 -0
- package/dist/app-sidecar/integration-routes.js +286 -0
- package/dist/app-sidecar/integration-routes.js.map +1 -0
- package/dist/app-sidecar/json-mode.d.ts +10 -0
- package/dist/app-sidecar/json-mode.js +73 -0
- package/dist/app-sidecar/json-mode.js.map +1 -0
- package/dist/app-sidecar/keep-awake.d.ts +4 -0
- package/dist/app-sidecar/keep-awake.js +5 -0
- package/dist/app-sidecar/keep-awake.js.map +1 -0
- package/dist/app-sidecar/ken-context.d.ts +20 -0
- package/dist/app-sidecar/ken-context.js +55 -0
- package/dist/app-sidecar/ken-context.js.map +1 -0
- package/dist/app-sidecar/mcp-routes.d.ts +3 -0
- package/dist/app-sidecar/mcp-routes.js +185 -0
- package/dist/app-sidecar/mcp-routes.js.map +1 -0
- package/dist/app-sidecar/mcp-rows.d.ts +31 -0
- package/dist/app-sidecar/mcp-rows.js +77 -0
- package/dist/app-sidecar/mcp-rows.js.map +1 -0
- package/dist/app-sidecar/progress-manager.d.ts +10 -0
- package/dist/app-sidecar/progress-manager.js +116 -0
- package/dist/app-sidecar/progress-manager.js.map +1 -0
- package/dist/app-sidecar/prompt-routes.d.ts +3 -0
- package/dist/app-sidecar/prompt-routes.js +354 -0
- package/dist/app-sidecar/prompt-routes.js.map +1 -0
- package/dist/app-sidecar/repo-polls.d.ts +15 -0
- package/dist/app-sidecar/repo-polls.js +25 -0
- package/dist/app-sidecar/repo-polls.js.map +1 -0
- package/dist/app-sidecar/route-context.d.ts +145 -0
- package/dist/app-sidecar/route-context.js +2 -0
- package/dist/app-sidecar/route-context.js.map +1 -0
- package/dist/app-sidecar/run-control-routes.d.ts +3 -0
- package/dist/app-sidecar/run-control-routes.js +430 -0
- package/dist/app-sidecar/run-control-routes.js.map +1 -0
- package/dist/app-sidecar/session-routes.d.ts +3 -0
- package/dist/app-sidecar/session-routes.js +115 -0
- package/dist/app-sidecar/session-routes.js.map +1 -0
- package/dist/app-sidecar/session-types.d.ts +39 -0
- package/dist/app-sidecar/session-types.js +5 -0
- package/dist/app-sidecar/session-types.js.map +1 -0
- package/dist/app-sidecar/task-routes.d.ts +3 -0
- package/dist/app-sidecar/task-routes.js +149 -0
- package/dist/app-sidecar/task-routes.js.map +1 -0
- package/dist/app-sidecar/usage.d.ts +19 -0
- package/dist/app-sidecar/usage.js +153 -0
- package/dist/app-sidecar/usage.js.map +1 -0
- package/dist/app-sidecar/workspace-routes.d.ts +3 -0
- package/dist/app-sidecar/workspace-routes.js +244 -0
- package/dist/app-sidecar/workspace-routes.js.map +1 -0
- package/dist/app-sidecar.js +467 -3775
- package/dist/app-sidecar.js.map +1 -1
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/core/acceptance-checks.js +3 -9
- package/dist/core/acceptance-checks.js.map +1 -1
- package/dist/core/agent-session/helpers.d.ts +26 -0
- package/dist/core/agent-session/helpers.js +47 -0
- package/dist/core/agent-session/helpers.js.map +1 -0
- package/dist/core/agent-session/mcp-tools.d.ts +68 -0
- package/dist/core/agent-session/mcp-tools.js +195 -0
- package/dist/core/agent-session/mcp-tools.js.map +1 -0
- package/dist/core/agent-session/run-loop-monitor.d.ts +63 -0
- package/dist/core/agent-session/run-loop-monitor.js +164 -0
- package/dist/core/agent-session/run-loop-monitor.js.map +1 -0
- package/dist/core/agent-session/transcript-markers.d.ts +57 -0
- package/dist/core/agent-session/transcript-markers.js +166 -0
- package/dist/core/agent-session/transcript-markers.js.map +1 -0
- package/dist/core/agent-session/verification-tracker.d.ts +46 -0
- package/dist/core/agent-session/verification-tracker.js +246 -0
- package/dist/core/agent-session/verification-tracker.js.map +1 -0
- package/dist/core/agent-session.d.ts +21 -87
- package/dist/core/agent-session.js +141 -712
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-providers.js +3 -3
- package/dist/core/auth-providers.js.map +1 -1
- package/dist/core/bundled-agents.js +6 -6
- package/dist/core/bundled-agents.js.map +1 -1
- package/dist/core/checklist-git.d.ts +19 -0
- package/dist/core/checklist-git.js +54 -0
- package/dist/core/checklist-git.js.map +1 -0
- package/dist/core/checklist-items.d.ts +10 -1
- package/dist/core/checklist-items.js +22 -0
- package/dist/core/checklist-items.js.map +1 -1
- package/dist/core/checklist-prompt.d.ts +5 -1
- package/dist/core/checklist-prompt.js +16 -5
- package/dist/core/checklist-prompt.js.map +1 -1
- package/dist/core/checklist-snapshot.d.ts +5 -1
- package/dist/core/checklist-snapshot.js +19 -2
- package/dist/core/checklist-snapshot.js.map +1 -1
- package/dist/core/context-limits.js +1 -1
- package/dist/core/context-limits.js.map +1 -1
- package/dist/core/skills.js +6 -9
- package/dist/core/skills.js.map +1 -1
- package/dist/core/style-packs/index.js +2 -11
- package/dist/core/style-packs/index.js.map +1 -1
- package/dist/core/style-packs/packs.d.ts +3 -12
- package/dist/core/style-packs/packs.js +132 -173
- package/dist/core/style-packs/packs.js.map +1 -1
- package/dist/system-prompt.js +55 -78
- package/dist/system-prompt.js.map +1 -1
- package/dist/tools/ask-user.js +13 -74
- package/dist/tools/ask-user.js.map +1 -1
- package/dist/tools/bash.js +13 -78
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/checklist.d.ts +2 -10
- package/dist/tools/checklist.js +7 -39
- package/dist/tools/checklist.js.map +1 -1
- package/dist/tools/code-nav.js +7 -29
- package/dist/tools/code-nav.js.map +1 -1
- package/dist/tools/edit.d.ts +3 -9
- package/dist/tools/edit.js +92 -65
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/enter-plan.js +2 -7
- package/dist/tools/enter-plan.js.map +1 -1
- package/dist/tools/exit-plan.js +2 -3
- package/dist/tools/exit-plan.js.map +1 -1
- package/dist/tools/find.js +3 -4
- package/dist/tools/find.js.map +1 -1
- package/dist/tools/grep.js +6 -18
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/ls.js +3 -3
- package/dist/tools/ls.js.map +1 -1
- package/dist/tools/prompt-hints.js +34 -47
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/read.js +8 -20
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/search-code.js +4 -12
- package/dist/tools/search-code.js.map +1 -1
- package/dist/tools/skill.js +13 -7
- package/dist/tools/skill.js.map +1 -1
- package/dist/tools/subagent-control.js +7 -22
- package/dist/tools/subagent-control.js.map +1 -1
- package/dist/tools/subagent.js +4 -7
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/task-output.js +4 -15
- package/dist/tools/task-output.js.map +1 -1
- package/dist/tools/task-send.js +5 -17
- package/dist/tools/task-send.js.map +1 -1
- package/dist/tools/task-stop.js +2 -2
- package/dist/tools/task-stop.js.map +1 -1
- package/dist/tools/tool-search.js +2 -7
- package/dist/tools/tool-search.js.map +1 -1
- package/dist/tools/tool-tiers.d.ts +17 -4
- package/dist/tools/tool-tiers.js +38 -15
- package/dist/tools/tool-tiers.js.map +1 -1
- package/dist/tools/web-fetch.js +7 -33
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/write.js +3 -4
- package/dist/tools/write.js.map +1 -1
- package/dist/ui/components/Footer.js +1 -2
- package/dist/ui/components/Footer.js.map +1 -1
- package/dist/utils/shared-poll.d.ts +37 -0
- package/dist/utils/shared-poll.js +104 -0
- package/dist/utils/shared-poll.js.map +1 -0
- package/package.json +7 -4
- package/dist/core/api-benchmark.d.ts +0 -63
- package/dist/core/api-benchmark.js +0 -381
- package/dist/core/api-benchmark.js.map +0 -1
- package/dist/core/bash-spawn-benchmark.d.ts +0 -1
- package/dist/core/bash-spawn-benchmark.js +0 -139
- package/dist/core/bash-spawn-benchmark.js.map +0 -1
- package/dist/core/cache-warm-benchmark.d.ts +0 -21
- package/dist/core/cache-warm-benchmark.js +0 -170
- package/dist/core/cache-warm-benchmark.js.map +0 -1
- package/dist/core/fast-apply-benchmark.d.ts +0 -25
- package/dist/core/fast-apply-benchmark.js +0 -284
- package/dist/core/fast-apply-benchmark.js.map +0 -1
- package/dist/core/hashline-edit-benchmark.d.ts +0 -88
- package/dist/core/hashline-edit-benchmark.js +0 -518
- package/dist/core/hashline-edit-benchmark.js.map +0 -1
- package/dist/core/semantic-search-benchmark.d.ts +0 -36
- package/dist/core/semantic-search-benchmark.js +0 -211
- package/dist/core/semantic-search-benchmark.js.map +0 -1
- package/dist/core/speed-benchmark.d.ts +0 -132
- package/dist/core/speed-benchmark.js +0 -410
- package/dist/core/speed-benchmark.js.map +0 -1
package/README.md
CHANGED
|
@@ -69,7 +69,7 @@ Switch mid-conversation with `/model`. Not locked to anyone.
|
|
|
69
69
|
|
|
70
70
|
| Provider | Models | Auth |
|
|
71
71
|
| ----------------- | ------------------------------------------------------------------ | ---------------- |
|
|
72
|
-
| **Anthropic** | Claude Fable 5.1, Opus 5.5, Sonnet 5.5, Haiku
|
|
72
|
+
| **Anthropic** | Claude Fable 5.1, Opus 5.5, Sonnet 5.5, Haiku 5.5 | OAuth |
|
|
73
73
|
| **OpenAI** | GPT-6 Astra, GPT-6.1 Sol, GPT-6 Luna | OAuth |
|
|
74
74
|
| **Moonshot** | Kimi K3, K2.8 Preview (Kimi sign-in), K2.7 Code | OAuth or API key |
|
|
75
75
|
| **Z.AI (GLM)** | GLM-5.3, GLM-5.3-Flash (image) | API key |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: bulletproof
|
|
3
|
-
description: Use
|
|
3
|
+
description: "Use for attacker-reachable code: auth, tokens, crypto, untrusted input, secrets, tenant data, CI, agent tools. Do NOT use for local scripts without auth or network."
|
|
4
4
|
license: Apache-2.0. Content is defensive engineering guidance, not a security certification or a penetration test. See references/provenance.md.
|
|
5
5
|
compatibility: Works offline from the bundled references, which are a snapshot dated 3 October 2026. Version numbers, CVEs, and incident details decay fast; re-verify date-sensitive claims with web access before stating them as current. Never certifies that software is secure.
|
|
6
6
|
---
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: clarify
|
|
3
|
-
description: Use when requirements
|
|
3
|
+
description: Use when requirements are genuinely unsettled. Do NOT use for routine work.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Clarify
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: code-review
|
|
3
|
-
description: Use when
|
|
3
|
+
description: Use when asked to review a diff, PR or finished work. Do NOT use mid-build.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Code Review
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: compliance-guard
|
|
3
|
-
description: Use when shipping
|
|
3
|
+
description: Use when shipping to real users risks legal exposure (personal data, payments, minors). Do NOT use for local work.
|
|
4
4
|
license: Apache-2.0. Content is engineering guidance, not legal advice. See references/provenance.md.
|
|
5
5
|
compatibility: Static review works offline from the bundled references. Legal status changes constantly; date-sensitive claims must be re-verified with web access before being stated as current. Never certifies compliance.
|
|
6
6
|
---
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: durable
|
|
3
|
-
description: Use when
|
|
3
|
+
description: "Use when data could be lost: migrations, destructive ops, real databases. Do NOT use for query speed."
|
|
4
4
|
license: Data-durability engineering guidance, not a DBA certification. Sources and snapshot date are recorded at the foot of each reference file.
|
|
5
5
|
compatibility: Snapshot dated 3 October 2026. Version behaviours, provider retention defaults and tool flags decay — re-verify with web access before asserting them as current.
|
|
6
6
|
---
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: evidence-led-ui
|
|
3
|
-
description: Use when building or
|
|
3
|
+
description: Use when building or reviewing UI visuals. Do NOT use for behaviour-only changes.
|
|
4
4
|
license: See LICENSES.md
|
|
5
5
|
compatibility: Full review requires filesystem inspection and rendered screenshots (deferred `screenshot` tool); web research and device tooling are optional and unavailable checks must be reported as unverified.
|
|
6
6
|
---
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: lean
|
|
3
|
-
description: Use when speed or resource use matters
|
|
3
|
+
description: Use when speed or resource use matters. Do NOT use for correctness bugs.
|
|
4
4
|
license: Performance engineering guidance, not a benchmark certification. Sources and snapshot date are recorded at the foot of each reference file.
|
|
5
5
|
compatibility: Snapshot dated 3 October 2026. Thresholds, tool names, and defaults decay — re-verify with web access before asserting them as current. Claims sourced to that date carry a SNAPSHOT marker.
|
|
6
6
|
---
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: refactoring
|
|
3
|
-
description: Use for
|
|
3
|
+
description: Use for behaviour-preserving restructuring behind an unchanged contract. Do NOT use for renames, bug fixes or behaviour changes.
|
|
4
4
|
license: Behavior-preservation methodology synthesized from public sources (Fowler's Refactoring catalog, Tidy First?, and community agent skills by bienhoang, wondelai, mattpocock, jeffallan, vasilyu1983), audited 2026-09-12.
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: root-cause
|
|
3
|
-
description: Use when a bug resists the obvious fix
|
|
3
|
+
description: Use when a bug resists the obvious fix or is flaky. Do NOT use when the cause is obvious.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Root-Cause
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: shared-language
|
|
3
|
-
description: Use when
|
|
3
|
+
description: Use when domain terms drift or a decision needs an ADR. Do NOT use for renames.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Shared Language
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tdd
|
|
3
|
-
description: Use when
|
|
3
|
+
description: Use when asked for test-first development. Do NOT use for post-build tests.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# TDD
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Provider, ThinkingLevel } from "@kenkaiiii/gg-ai";
|
|
2
|
+
import type { KenModelPref } from "../core/ken-model.js";
|
|
3
|
+
export declare const ALL_PROVIDERS: Provider[];
|
|
4
|
+
/** Per-project model + thinking preferences. Persisted so each window (one
|
|
5
|
+
* project cwd) restores its OWN model across app restarts — instead of every
|
|
6
|
+
* window reading the same single global slot that the last writer clobbered. */
|
|
7
|
+
export interface ProjectModelPrefs {
|
|
8
|
+
provider: Provider;
|
|
9
|
+
model: string;
|
|
10
|
+
thinkingEnabled?: boolean;
|
|
11
|
+
thinkingLevel?: ThinkingLevel;
|
|
12
|
+
}
|
|
13
|
+
export interface AppSettings {
|
|
14
|
+
/** Folder new projects are created inside. Defaults to ~/gg-projects. */
|
|
15
|
+
projectsRoot: string;
|
|
16
|
+
/** Model + thinking prefs keyed by normalized project cwd. A window restores
|
|
17
|
+
* its own entry on boot; absent → global settings.json → provider default. */
|
|
18
|
+
projectModels?: Record<string, ProjectModelPrefs>;
|
|
19
|
+
/** Autopilot (auto-review) on/off keyed by normalized project cwd. Per-window
|
|
20
|
+
* (one window = one cwd); absent/false → off. Restored on boot. */
|
|
21
|
+
autopilot?: Record<string, boolean>;
|
|
22
|
+
/** Ken's model override keyed by normalized project cwd. Absent → Ken follows
|
|
23
|
+
* GG Coder's model (the historical behavior). Set → Ken (chat + autopilot)
|
|
24
|
+
* uses this model regardless of GG Coder's. */
|
|
25
|
+
kenModels?: Record<string, KenModelPref>;
|
|
26
|
+
/** Extra folders scanned for projects alongside `projectsRoot`. */
|
|
27
|
+
projectRoots?: string[];
|
|
28
|
+
/** Project paths dismissed from the picker, as normalized cwds. */
|
|
29
|
+
hiddenProjects?: string[];
|
|
30
|
+
}
|
|
31
|
+
export declare function stringArray(value: unknown): string[] | undefined;
|
|
32
|
+
export declare function appSettingsFile(): string;
|
|
33
|
+
export declare function defaultProjectsRoot(): string;
|
|
34
|
+
/** Normalize a project cwd to a stable settings key so trailing slashes /
|
|
35
|
+
* relative segments collapse — the same project always maps to one entry. */
|
|
36
|
+
export declare function projectModelKey(cwd: string): string;
|
|
37
|
+
export declare function loadAppSettings(): Promise<AppSettings>;
|
|
38
|
+
export declare function saveAppSettings(settings: AppSettings): Promise<void>;
|
|
39
|
+
/** Read this project's persisted model/thinking prefs, if any. */
|
|
40
|
+
export declare function loadProjectModelPrefs(cwd: string): Promise<ProjectModelPrefs | undefined>;
|
|
41
|
+
/** Persist this project's model/thinking prefs via read-modify-write so the rest
|
|
42
|
+
* of the settings file (projectsRoot, other projects' entries) is preserved. */
|
|
43
|
+
export declare function saveProjectModelPrefs(cwd: string, prefs: ProjectModelPrefs): Promise<void>;
|
|
44
|
+
/** Read this project's persisted Ken model override, if any. */
|
|
45
|
+
export declare function loadKenModelPref(cwd: string): Promise<KenModelPref | undefined>;
|
|
46
|
+
/** Persist (or with null, clear) this project's Ken model override via
|
|
47
|
+
* read-modify-write so the rest of the settings file is preserved. */
|
|
48
|
+
export declare function saveKenModelPref(cwd: string, pref: KenModelPref | null): Promise<void>;
|
|
49
|
+
/** Read this project's persisted autopilot flag (default off). */
|
|
50
|
+
export declare function loadAutopilot(cwd: string): Promise<boolean>;
|
|
51
|
+
/** Persist this project's autopilot flag via read-modify-write so the rest of
|
|
52
|
+
* the settings file (projectsRoot, model map, other projects) is preserved. */
|
|
53
|
+
export declare function saveAutopilot(cwd: string, enabled: boolean): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Persist the active model selection to ~/.gg/settings.json so it survives app
|
|
56
|
+
* restarts. Mirrors the CLI's handleModelSelect persistence (App.tsx).
|
|
57
|
+
*/
|
|
58
|
+
export declare function persistModelSelection(settingsFile: string, provider: Provider, model: string): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Persist the thinking level to ~/.gg/settings.json so it survives app restarts.
|
|
61
|
+
* Mirrors the CLI's handleToggleThinking persistence (App.tsx).
|
|
62
|
+
*/
|
|
63
|
+
export declare function persistThinkingLevel(settingsFile: string, level: ThinkingLevel | undefined): Promise<void>;
|
|
64
|
+
/** Validate a project folder name: lowercase letters, digits, dashes only. */
|
|
65
|
+
export declare function isValidProjectName(name: string): boolean;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { SettingsManager } from "../core/settings-manager.js";
|
|
5
|
+
import { log } from "../core/logger.js";
|
|
6
|
+
export const ALL_PROVIDERS = [
|
|
7
|
+
// US
|
|
8
|
+
"anthropic",
|
|
9
|
+
"openai",
|
|
10
|
+
"gemini",
|
|
11
|
+
"xai",
|
|
12
|
+
// China
|
|
13
|
+
"moonshot",
|
|
14
|
+
"glm",
|
|
15
|
+
"minimax",
|
|
16
|
+
"xiaomi",
|
|
17
|
+
"deepseek",
|
|
18
|
+
// Open-community gateway, before the provider-agnostic one
|
|
19
|
+
"huggingface",
|
|
20
|
+
// Japan, then provider-agnostic gateway last
|
|
21
|
+
"sakana",
|
|
22
|
+
"openrouter",
|
|
23
|
+
];
|
|
24
|
+
export function stringArray(value) {
|
|
25
|
+
if (!Array.isArray(value))
|
|
26
|
+
return undefined;
|
|
27
|
+
const out = value.filter((v) => typeof v === "string" && v.trim().length > 0);
|
|
28
|
+
return out.length > 0 ? out : undefined;
|
|
29
|
+
}
|
|
30
|
+
export function appSettingsFile() {
|
|
31
|
+
return path.join(os.homedir(), ".gg", "gg-app.json");
|
|
32
|
+
}
|
|
33
|
+
export function defaultProjectsRoot() {
|
|
34
|
+
return path.join(os.homedir(), "gg-projects");
|
|
35
|
+
}
|
|
36
|
+
/** Normalize a project cwd to a stable settings key so trailing slashes /
|
|
37
|
+
* relative segments collapse — the same project always maps to one entry. */
|
|
38
|
+
export function projectModelKey(cwd) {
|
|
39
|
+
return path.resolve(cwd);
|
|
40
|
+
}
|
|
41
|
+
export async function loadAppSettings() {
|
|
42
|
+
try {
|
|
43
|
+
const raw = JSON.parse(await fs.readFile(appSettingsFile(), "utf-8"));
|
|
44
|
+
return {
|
|
45
|
+
projectsRoot: typeof raw.projectsRoot === "string" && raw.projectsRoot.trim()
|
|
46
|
+
? raw.projectsRoot
|
|
47
|
+
: defaultProjectsRoot(),
|
|
48
|
+
// Preserve the per-project map verbatim (validated + written by the
|
|
49
|
+
// model/thinking handlers below).
|
|
50
|
+
projectModels: raw.projectModels && typeof raw.projectModels === "object" ? raw.projectModels : undefined,
|
|
51
|
+
autopilot: raw.autopilot && typeof raw.autopilot === "object" ? raw.autopilot : undefined,
|
|
52
|
+
kenModels: raw.kenModels && typeof raw.kenModels === "object" ? raw.kenModels : undefined,
|
|
53
|
+
projectRoots: stringArray(raw.projectRoots),
|
|
54
|
+
hiddenProjects: stringArray(raw.hiddenProjects),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return { projectsRoot: defaultProjectsRoot() };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export async function saveAppSettings(settings) {
|
|
62
|
+
await fs.mkdir(path.dirname(appSettingsFile()), { recursive: true });
|
|
63
|
+
await fs.writeFile(appSettingsFile(), JSON.stringify(settings, null, 2), "utf-8");
|
|
64
|
+
}
|
|
65
|
+
/** Read this project's persisted model/thinking prefs, if any. */
|
|
66
|
+
export async function loadProjectModelPrefs(cwd) {
|
|
67
|
+
const s = await loadAppSettings();
|
|
68
|
+
return s.projectModels?.[projectModelKey(cwd)];
|
|
69
|
+
}
|
|
70
|
+
/** Persist this project's model/thinking prefs via read-modify-write so the rest
|
|
71
|
+
* of the settings file (projectsRoot, other projects' entries) is preserved. */
|
|
72
|
+
export async function saveProjectModelPrefs(cwd, prefs) {
|
|
73
|
+
const s = await loadAppSettings();
|
|
74
|
+
const key = projectModelKey(cwd);
|
|
75
|
+
s.projectModels = { ...(s.projectModels ?? {}), [key]: prefs };
|
|
76
|
+
await saveAppSettings(s);
|
|
77
|
+
}
|
|
78
|
+
/** Read this project's persisted Ken model override, if any. */
|
|
79
|
+
export async function loadKenModelPref(cwd) {
|
|
80
|
+
const s = await loadAppSettings();
|
|
81
|
+
return s.kenModels?.[projectModelKey(cwd)];
|
|
82
|
+
}
|
|
83
|
+
/** Persist (or with null, clear) this project's Ken model override via
|
|
84
|
+
* read-modify-write so the rest of the settings file is preserved. */
|
|
85
|
+
export async function saveKenModelPref(cwd, pref) {
|
|
86
|
+
const s = await loadAppSettings();
|
|
87
|
+
const key = projectModelKey(cwd);
|
|
88
|
+
const next = { ...(s.kenModels ?? {}) };
|
|
89
|
+
if (pref)
|
|
90
|
+
next[key] = pref;
|
|
91
|
+
else
|
|
92
|
+
delete next[key];
|
|
93
|
+
s.kenModels = next;
|
|
94
|
+
await saveAppSettings(s);
|
|
95
|
+
}
|
|
96
|
+
/** Read this project's persisted autopilot flag (default off). */
|
|
97
|
+
export async function loadAutopilot(cwd) {
|
|
98
|
+
const s = await loadAppSettings();
|
|
99
|
+
return s.autopilot?.[projectModelKey(cwd)] ?? false;
|
|
100
|
+
}
|
|
101
|
+
/** Persist this project's autopilot flag via read-modify-write so the rest of
|
|
102
|
+
* the settings file (projectsRoot, model map, other projects) is preserved. */
|
|
103
|
+
export async function saveAutopilot(cwd, enabled) {
|
|
104
|
+
const s = await loadAppSettings();
|
|
105
|
+
const key = projectModelKey(cwd);
|
|
106
|
+
s.autopilot = { ...(s.autopilot ?? {}), [key]: enabled };
|
|
107
|
+
await saveAppSettings(s);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Persist the active model selection to ~/.gg/settings.json so it survives app
|
|
111
|
+
* restarts. Mirrors the CLI's handleModelSelect persistence (App.tsx).
|
|
112
|
+
*/
|
|
113
|
+
export async function persistModelSelection(settingsFile, provider, model) {
|
|
114
|
+
try {
|
|
115
|
+
const sm = new SettingsManager(settingsFile);
|
|
116
|
+
await sm.load();
|
|
117
|
+
await sm.set("defaultProvider", provider);
|
|
118
|
+
await sm.set("defaultModel", model);
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
log("WARN", "app-sidecar", "failed to persist model selection", { err: String(err) });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Persist the thinking level to ~/.gg/settings.json so it survives app restarts.
|
|
126
|
+
* Mirrors the CLI's handleToggleThinking persistence (App.tsx).
|
|
127
|
+
*/
|
|
128
|
+
export async function persistThinkingLevel(settingsFile, level) {
|
|
129
|
+
try {
|
|
130
|
+
const sm = new SettingsManager(settingsFile);
|
|
131
|
+
await sm.load();
|
|
132
|
+
await sm.set("thinkingEnabled", !!level);
|
|
133
|
+
if (level)
|
|
134
|
+
await sm.set("thinkingLevel", level);
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
log("WARN", "app-sidecar", "failed to persist thinking level", { err: String(err) });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** Validate a project folder name: lowercase letters, digits, dashes only. */
|
|
141
|
+
export function isValidProjectName(name) {
|
|
142
|
+
return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(name);
|
|
143
|
+
}
|
|
144
|
+
// ── History reconstruction types ──────────────────────────
|
|
145
|
+
// Mirrors HistoryEntry in gg-app/src/agent.ts — the wire shape the webview
|
|
146
|
+
// receives from GET /history. Fields beyond role/text carry the transcript
|
|
147
|
+
//# sourceMappingURL=app-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-settings.js","sourceRoot":"","sources":["../../src/app-sidecar/app-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,eAAe,EAAiB,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAExC,MAAM,CAAC,MAAM,aAAa,GAAe;IACvC,KAAK;IACL,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,QAAQ;IACR,UAAU;IACV,KAAK;IACL,SAAS;IACT,QAAQ;IACR,UAAU;IACV,2DAA2D;IAC3D,aAAa;IACb,6CAA6C;IAC7C,QAAQ;IACR,YAAY;CACb,CAAC;AAmCF,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3F,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAChD,CAAC;AAED;8EAC8E;AAC9E,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,OAAO,CAAC,CAAyB,CAAC;QAC9F,OAAO;YACL,YAAY,EACV,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,IAAI,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE;gBAC7D,CAAC,CAAC,GAAG,CAAC,YAAY;gBAClB,CAAC,CAAC,mBAAmB,EAAE;YAC3B,oEAAoE;YACpE,kCAAkC;YAClC,aAAa,EACX,GAAG,CAAC,aAAa,IAAI,OAAO,GAAG,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;YAC5F,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YACzF,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YACzF,YAAY,EAAE,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC;YAC3C,cAAc,EAAE,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC;SAChD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,EAAE,CAAC;IACjD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAqB;IACzD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACpF,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAW;IACrD,MAAM,CAAC,GAAG,MAAM,eAAe,EAAE,CAAC;IAClC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;iFACiF;AACjF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAW,EAAE,KAAwB;IAC/E,MAAM,CAAC,GAAG,MAAM,eAAe,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;IAC/D,MAAM,eAAe,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW;IAChD,MAAM,CAAC,GAAG,MAAM,eAAe,EAAE,CAAC;IAClC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;uEACuE;AACvE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,IAAyB;IAC3E,MAAM,CAAC,GAAG,MAAM,eAAe,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC;IACxC,IAAI,IAAI;QAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;;QACtB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;IACnB,MAAM,eAAe,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,MAAM,CAAC,GAAG,MAAM,eAAe,EAAE,CAAC;IAClC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC;AACtD,CAAC;AAED;gFACgF;AAChF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,OAAgB;IAC/D,MAAM,CAAC,GAAG,MAAM,eAAe,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC,CAAC,SAAS,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC;IACzD,MAAM,eAAe,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,YAAoB,EACpB,QAAkB,EAClB,KAAa;IAEb,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,EAAE,CAAC,GAAG,CAAC,iBAAiB,EAAE,QAAuC,CAAC,CAAC;QACzE,MAAM,EAAE,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,mCAAmC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,YAAoB,EACpB,KAAgC;IAEhC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,EAAE,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,KAAK;YAAE,MAAM,EAAE,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,kCAAkC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACvF,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,6DAA6D;AAC7D,2EAA2E;AAC3E,2EAA2E"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface AppAttachment {
|
|
2
|
+
kind: "image" | "video" | "file";
|
|
3
|
+
name: string;
|
|
4
|
+
mediaType: string;
|
|
5
|
+
/** base64 (no data: prefix). */
|
|
6
|
+
data: string;
|
|
7
|
+
}
|
|
8
|
+
export interface PreparedAttachment extends AppAttachment {
|
|
9
|
+
path?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function prepareAttachments(cwd: string, attachments: AppAttachment[]): Promise<PreparedAttachment[]>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { shrinkToFit, validateVisionImage } from "../utils/image.js";
|
|
4
|
+
export async function prepareAttachments(cwd, attachments) {
|
|
5
|
+
const dir = path.join(cwd, ".gg", "uploads");
|
|
6
|
+
await fs.mkdir(dir, { recursive: true }).catch(() => { });
|
|
7
|
+
const out = [];
|
|
8
|
+
for (const a of attachments) {
|
|
9
|
+
// Sanitize the filename and prefix with a short timestamp to avoid clobber.
|
|
10
|
+
const safe = a.name.replace(/[^\w.-]+/g, "_").slice(-80) || "file";
|
|
11
|
+
const fileName = `${Date.now().toString(36)}-${safe}`;
|
|
12
|
+
const filePath = path.join(dir, fileName);
|
|
13
|
+
const buf = Buffer.from(a.data, "base64");
|
|
14
|
+
// Validate and cap image attachments before they become native image content
|
|
15
|
+
// blocks. Anthropic applies a 2000 px per-dimension cap once conversation
|
|
16
|
+
// history contains more than 20 images, so every attachment must be safe for
|
|
17
|
+
// later turns too. Keep the original on disk, but send the resized bytes.
|
|
18
|
+
// Corrupt or unsupported images become plain files so they cannot reject the
|
|
19
|
+
// entire provider request.
|
|
20
|
+
let prepared = { ...a };
|
|
21
|
+
if (a.kind === "image") {
|
|
22
|
+
try {
|
|
23
|
+
const resized = await shrinkToFit(buf, a.mediaType);
|
|
24
|
+
const validatedType = await validateVisionImage(resized.buffer);
|
|
25
|
+
prepared = validatedType
|
|
26
|
+
? {
|
|
27
|
+
...a,
|
|
28
|
+
mediaType: validatedType,
|
|
29
|
+
data: resized.buffer.toString("base64"),
|
|
30
|
+
}
|
|
31
|
+
: { ...a, kind: "file" };
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
prepared = { ...a, kind: "file" };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
await fs.writeFile(filePath, buf);
|
|
39
|
+
out.push({ ...prepared, path: filePath });
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
out.push({ ...prepared });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=attachments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/app-sidecar/attachments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAiBrE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAW,EACX,WAA4B;IAE5B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAC7C,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACzD,MAAM,GAAG,GAAyB,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,4EAA4E;QAC5E,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC;QACnE,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC1C,6EAA6E;QAC7E,0EAA0E;QAC1E,6EAA6E;QAC7E,0EAA0E;QAC1E,6EAA6E;QAC7E,2BAA2B;QAC3B,IAAI,QAAQ,GAAuB,EAAE,GAAG,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;gBACpD,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAChE,QAAQ,GAAG,aAAa;oBACtB,CAAC,CAAC;wBACE,GAAG,CAAC;wBACJ,SAAS,EAAE,aAAa;wBACxB,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;qBACxC;oBACH,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,QAAQ,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YACpC,CAAC;QACH,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAClC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|