@kenkaiiii/ggcoder 5.75.0 → 5.76.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.
Files changed (137) hide show
  1. package/README.md +56 -40
  2. package/dist/app-sidecar/auth-routes.js +4 -1
  3. package/dist/app-sidecar/auth-routes.js.map +1 -1
  4. package/dist/app-sidecar/repo-polls.d.ts +18 -0
  5. package/dist/app-sidecar/repo-polls.js +45 -0
  6. package/dist/app-sidecar/repo-polls.js.map +1 -0
  7. package/dist/app-sidecar/route-context.d.ts +2 -0
  8. package/dist/app-sidecar.js +65 -63
  9. package/dist/app-sidecar.js.map +1 -1
  10. package/dist/chat-agents/jiwa.js +2 -0
  11. package/dist/chat-agents/jiwa.js.map +1 -1
  12. package/dist/chat-agents/memory.js +2 -0
  13. package/dist/chat-agents/memory.js.map +1 -1
  14. package/dist/cli/auth.js +13 -9
  15. package/dist/cli/auth.js.map +1 -1
  16. package/dist/cli.js +8 -9
  17. package/dist/cli.js.map +1 -1
  18. package/dist/core/checklist-prompt.d.ts +9 -2
  19. package/dist/core/checklist-prompt.js +26 -7
  20. package/dist/core/checklist-prompt.js.map +1 -1
  21. package/dist/core/checklist-snapshot.js +1 -1
  22. package/dist/core/checklist-snapshot.js.map +1 -1
  23. package/dist/core/checklist-store.d.ts +5 -1
  24. package/dist/core/checklist-store.js +35 -4
  25. package/dist/core/checklist-store.js.map +1 -1
  26. package/dist/core/event-bus.d.ts +1 -1
  27. package/dist/core/event-bus.js +39 -13
  28. package/dist/core/event-bus.js.map +1 -1
  29. package/dist/core/extensions/plugin-bundles.js +4 -2
  30. package/dist/core/extensions/plugin-bundles.js.map +1 -1
  31. package/dist/core/hashline.d.ts +10 -8
  32. package/dist/core/hashline.js.map +1 -1
  33. package/dist/core/mcp/client.js +2 -0
  34. package/dist/core/mcp/client.js.map +1 -1
  35. package/dist/core/mcp/loopback.d.ts +2 -2
  36. package/dist/core/mcp/loopback.js +2 -2
  37. package/dist/core/mcp/shared-pool.js +4 -3
  38. package/dist/core/mcp/shared-pool.js.map +1 -1
  39. package/dist/core/persistent-shell.js +2 -1
  40. package/dist/core/persistent-shell.js.map +1 -1
  41. package/dist/core/process-manager.js +9 -1
  42. package/dist/core/process-manager.js.map +1 -1
  43. package/dist/core/project-health-scan.d.ts +109 -0
  44. package/dist/core/project-health-scan.js +673 -0
  45. package/dist/core/project-health-scan.js.map +1 -0
  46. package/dist/core/project-health-score.d.ts +41 -0
  47. package/dist/core/project-health-score.js +257 -0
  48. package/dist/core/project-health-score.js.map +1 -0
  49. package/dist/core/prompt-commands.js +15 -2
  50. package/dist/core/prompt-commands.js.map +1 -1
  51. package/dist/core/session-manager.js.map +1 -1
  52. package/dist/core/session-storage.d.ts +1 -0
  53. package/dist/core/session-storage.js +1 -1
  54. package/dist/core/session-storage.js.map +1 -1
  55. package/dist/core/subagent-manager.js +11 -6
  56. package/dist/core/subagent-manager.js.map +1 -1
  57. package/dist/core/subagent-receipt.js +3 -4
  58. package/dist/core/subagent-receipt.js.map +1 -1
  59. package/dist/core/ui-adoption.js +2 -0
  60. package/dist/core/ui-adoption.js.map +1 -1
  61. package/dist/core/ui-registry.js +5 -4
  62. package/dist/core/ui-registry.js.map +1 -1
  63. package/dist/core/verification-gate.js +4 -2
  64. package/dist/core/verification-gate.js.map +1 -1
  65. package/dist/core/verify-commands.js +2 -3
  66. package/dist/core/verify-commands.js.map +1 -1
  67. package/dist/modes/agent-home-mode.js +1 -4
  68. package/dist/modes/agent-home-mode.js.map +1 -1
  69. package/dist/modes/subagent-worker-mode.js +13 -8
  70. package/dist/modes/subagent-worker-mode.js.map +1 -1
  71. package/dist/tools/checklist.d.ts +5 -4
  72. package/dist/tools/checklist.js +17 -4
  73. package/dist/tools/checklist.js.map +1 -1
  74. package/dist/tools/edit.js +27 -1
  75. package/dist/tools/edit.js.map +1 -1
  76. package/dist/tools/grep.js +3 -2
  77. package/dist/tools/grep.js.map +1 -1
  78. package/dist/tools/index.js +7 -5
  79. package/dist/tools/index.js.map +1 -1
  80. package/dist/ui/App.js +20 -26
  81. package/dist/ui/App.js.map +1 -1
  82. package/dist/ui/components/InputArea.js +0 -2
  83. package/dist/ui/components/InputArea.js.map +1 -1
  84. package/dist/ui/components/ToolExecution.js +4 -3
  85. package/dist/ui/components/ToolExecution.js.map +1 -1
  86. package/dist/ui/hooks/useAgentLoop.js +7 -6
  87. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  88. package/dist/ui/sessions.js +1 -5
  89. package/dist/ui/sessions.js.map +1 -1
  90. package/dist/ui/utils/highlight.d.ts +0 -5
  91. package/dist/ui/utils/highlight.js +3 -49
  92. package/dist/ui/utils/highlight.js.map +1 -1
  93. package/dist/ui/utils/markdown-renderer.d.ts +6 -0
  94. package/dist/ui/utils/markdown-renderer.js +21 -5
  95. package/dist/ui/utils/markdown-renderer.js.map +1 -1
  96. package/dist/utils/process.js +3 -3
  97. package/dist/utils/process.js.map +1 -1
  98. package/dist/utils/shared-poll.d.ts +37 -0
  99. package/dist/utils/shared-poll.js +104 -0
  100. package/dist/utils/shared-poll.js.map +1 -0
  101. package/package.json +5 -8
  102. package/dist/core/file-lock.d.ts +0 -1
  103. package/dist/core/file-lock.js +0 -3
  104. package/dist/core/file-lock.js.map +0 -1
  105. package/dist/core/oauth/pkce.d.ts +0 -1
  106. package/dist/core/oauth/pkce.js +0 -3
  107. package/dist/core/oauth/pkce.js.map +0 -1
  108. package/dist/ui/activity-phrases.d.ts +0 -10
  109. package/dist/ui/activity-phrases.js +0 -184
  110. package/dist/ui/activity-phrases.js.map +0 -1
  111. package/dist/ui/components/PlanApproval.d.ts +0 -8
  112. package/dist/ui/components/PlanApproval.js +0 -60
  113. package/dist/ui/components/PlanApproval.js.map +0 -1
  114. package/dist/ui/components/PlanBanner.d.ts +0 -6
  115. package/dist/ui/components/PlanBanner.js +0 -31
  116. package/dist/ui/components/PlanBanner.js.map +0 -1
  117. package/dist/ui/components/PlanProgress.d.ts +0 -7
  118. package/dist/ui/components/PlanProgress.js +0 -30
  119. package/dist/ui/components/PlanProgress.js.map +0 -1
  120. package/dist/ui/hooks/useMinDisplayTime.d.ts +0 -10
  121. package/dist/ui/hooks/useMinDisplayTime.js +0 -34
  122. package/dist/ui/hooks/useMinDisplayTime.js.map +0 -1
  123. package/dist/ui/hooks/useSessionManager.d.ts +0 -12
  124. package/dist/ui/hooks/useSessionManager.js +0 -43
  125. package/dist/ui/hooks/useSessionManager.js.map +0 -1
  126. package/dist/ui/hooks/useSlashCommands.d.ts +0 -6
  127. package/dist/ui/hooks/useSlashCommands.js +0 -11
  128. package/dist/ui/hooks/useSlashCommands.js.map +0 -1
  129. package/dist/ui/terminal-history-spacing.d.ts +0 -1
  130. package/dist/ui/terminal-history-spacing.js +0 -2
  131. package/dist/ui/terminal-history-spacing.js.map +0 -1
  132. package/dist/ui/utils/markdown-cache.d.ts +0 -10
  133. package/dist/ui/utils/markdown-cache.js +0 -58
  134. package/dist/ui/utils/markdown-cache.js.map +0 -1
  135. package/dist/ui/utils/token-to-ansi.d.ts +0 -8
  136. package/dist/ui/utils/token-to-ansi.js +0 -323
  137. package/dist/ui/utils/token-to-ansi.js.map +0 -1
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  ![ggcoder](screenshots/ggcoder.png)
2
2
 
3
3
  <p align="center">
4
- <strong>The fast, lean coding agent. Eight providers. Zero bloat.</strong>
4
+ <strong>The fast, lean coding agent. Twelve providers plus local models. Zero bloat.</strong>
5
5
  </p>
6
6
 
7
7
  <p align="center">
@@ -12,13 +12,13 @@
12
12
  <a href="https://github.com/KenKaiii"><img src="https://img.shields.io/badge/GitHub-181717?style=for-the-badge&logo=github&logoColor=white" alt="GitHub"></a>
13
13
  </p>
14
14
 
15
- A coding agent that ships only what the model needs to work — a tiny system prompt, one carefully-chosen MCP, and a focused tool set. Switch between Anthropic, OpenAI, GLM, Moonshot, MiniMax, Xiaomi, DeepSeek, and OpenRouter mid-conversation. Run it in the terminal, or use the same engine in the [GG Coder desktop app](../../README.md).
15
+ A coding agent that ships only what the model needs to work — a tiny system prompt, no bundled MCPs, and a focused tool set. Switch between Anthropic, OpenAI, Gemini, xAI, Moonshot, GLM, MiniMax, Xiaomi, DeepSeek, Sakana, OpenRouter, Hugging Face, and your own local models mid-conversation. Run it in the terminal, or use the same engine in the [GG Coder desktop app](../../README.md).
16
16
 
17
17
  Built on [`@kenkaiiii/gg-ai`](../gg-ai/README.md), [`@kenkaiiii/gg-agent`](../gg-agent/README.md), and `@kenkaiiii/gg-core`. Part of the [GG Framework](../../README.md) monorepo.
18
18
 
19
19
  ---
20
20
 
21
- ## 🚀 Run It
21
+ ## Run It
22
22
 
23
23
  ```bash
24
24
  npm i -g @kenkaiiii/ggcoder
@@ -27,11 +27,11 @@ ggcoder login # Pick provider, authenticate
27
27
  ggcoder # Start coding
28
28
  ```
29
29
 
30
- OAuth for Anthropic and OpenAI (log in once, auto-refresh, no key to leak). API keys for the rest. Up and running in seconds either way. Auth lives in `~/.gg/auth.json` and is shared with the GG Coder desktop app.
30
+ OAuth for Anthropic, OpenAI, and Gemini; OAuth or an API key for xAI and Moonshot (log in once, auto-refresh, no key to leak). API keys for the rest. Up and running in seconds either way. Auth lives in `~/.gg/auth.json` and is shared with the GG Coder desktop app.
31
31
 
32
32
  ---
33
33
 
34
- ## 🪶 The system prompt problem
34
+ ## The system prompt problem
35
35
 
36
36
  Every token in the system prompt gets processed on **every single turn**. It's not a one-time cost. It's a tax on every request.
37
37
 
@@ -51,41 +51,47 @@ GG Coder sends only what the model needs: how to work, what tools it has, and yo
51
51
 
52
52
  ---
53
53
 
54
- ## 🧩 The MCP problem
54
+ ## The MCP problem
55
55
 
56
56
  Same philosophy applies to tools. People collect MCPs like Pokemon. Slack MCP, GitHub MCP, Notion MCP, five different file system MCPs. Every single one injects its tool descriptions into the context. The model now has to figure out which of 40+ tools to use for any given task.
57
57
 
58
58
  This doesn't help. It confuses the agent. More tool descriptions = more noise = worse tool selection. The model spends tokens reasoning about tools it will never call.
59
59
 
60
- GG Coder ships with one MCP: [Grep](https://grep.dev). That's it. It lets the agent search across 1M+ public GitHub repos to verify implementations against real-world code. Correct API usage, library idioms, production patterns. One tool that actually makes the output better.
60
+ GG Coder ships with no MCPs by default. Checking work against real-world code is a native tool instead: `steroids` finds production repos similar to yours so the agent can confirm API usage, library idioms, and patterns. It loads only when the agent asks for it, so it costs nothing until it's used. (On GLM, the Z.AI MCP servers that come with your key are connected automatically.)
61
61
 
62
- You can still add your own MCPs if you need them. But start with less. You'll get better results.
62
+ You can still add your own MCPs in `~/.gg/mcp.json` or `.gg/mcp.json`. But start with less. You'll get better results.
63
63
 
64
64
  ---
65
65
 
66
- ## 🎛 Eight providers, one agent
66
+ ## Twelve providers, one agent
67
67
 
68
68
  Switch mid-conversation with `/model`. Not locked to anyone.
69
69
 
70
- | Provider | Models | Auth |
71
- | ----------------- | ------------------------------------------------------------------ | ---------------- |
72
- | **Anthropic** | Claude Fable 5.1, Opus 5.5, Sonnet 5.5, Haiku 5.5 | OAuth |
73
- | **OpenAI** | GPT-6 Astra, GPT-6.1 Sol, GPT-6 Luna | OAuth |
74
- | **Moonshot** | Kimi K3, K2.8 Preview (Kimi sign-in), K2.7 Code | OAuth or API key |
75
- | **Z.AI (GLM)** | GLM-5.3, GLM-5.3-Flash (image) | API key |
76
- | **MiniMax** | MiniMax M3 (image + video) | API key |
77
- | **Xiaomi (MiMo)** | MiMo-V2.6-Pro, MiMo-V2.6-Flash, MiMo-V2.6-Pro-UltraSpeed | API key |
78
- | **DeepSeek** | DeepSeek V4 Pro, V4.1 Flash (image) | API key |
79
- | **Sakana (Fugu)** | Fugu, Fugu Max, Fugu Ultra (image) | API key |
80
- | **OpenRouter** | Qwen3.8 Max (image + video) + multi-provider gateway | API key |
70
+ | Provider | Models | Auth |
71
+ | ----------------- | ------------------------------------------------------------------------------------------- | ---------------- |
72
+ | **Anthropic** | Claude Fable 5.1, Opus 5.5, Sonnet 5.5, Haiku 5.5 | OAuth |
73
+ | **OpenAI** | GPT-6 Astra, GPT-6.1 Sol, GPT-6 Luna | OAuth |
74
+ | **Gemini** | Gemini 3.1 Pro (Preview), 3.8 Flash, 3.7 Flash, 3.5 Flash, 3.5 Flash Lite, 3.1 Flash Lite | OAuth |
75
+ | **xAI (Grok)** | Grok 4.7 | OAuth or API key |
76
+ | **Moonshot** | Kimi K3, K2.8 Preview (Kimi sign-in), K2.7 Code, K2.7 Code HighSpeed | OAuth or API key |
77
+ | **Z.AI (GLM)** | GLM-5.3, GLM-5.3-Flash | API key |
78
+ | **MiniMax** | MiniMax M3 | API key |
79
+ | **Xiaomi (MiMo)** | MiMo-V2.6-Pro, MiMo-V2.6-Flash, MiMo-V2.6-Pro-UltraSpeed | API key |
80
+ | **DeepSeek** | DeepSeek V4 Pro, V4.1 Flash | API key |
81
+ | **Sakana (Fugu)** | Fugu, Fugu Max, Fugu Ultra | API key |
82
+ | **OpenRouter** | Qwen3.8 Max | API key |
83
+ | **Hugging Face** | Kimi K2.7 Code, DeepSeek V4.1 Flash, GPT-OSS 120B (Inference Providers router) | API key |
84
+ | **Local** | Any model on an OpenAI-compatible server: Ollama, LM Studio, llama.cpp, vLLM | None |
85
+
86
+ Every hosted model above except GLM-5.3, DeepSeek V4 Pro, and GPT-OSS 120B accepts images.
81
87
 
82
88
  The same conversation, the same tools, the same project context — only the model changes. Use a strong reasoning model when you need it, swap to a fast cheap one for grunt work, never restart your session.
83
89
 
84
- **Attachments.** Drag, paste, or type a path to attach images and video in the chat input. Video is sent natively to models that support it (Gemini 3.x, Kimi K3/K2.8 Preview/K2.7 Code, MiniMax M3, MiMo-V2.6, Qwen3.8 Max); for other models the video is saved to a temp file and the model is told to inspect it with ffmpeg or its own tools.
90
+ **Attachments.** Drag, paste, or type a path to attach images and video in the chat input. Video is sent natively to models that support it (Gemini 3.x, every Moonshot Kimi model, MiniMax M3, MiMo-V2.6, Qwen3.8 Max); for other models the video is saved to a temp file and the model is told to inspect it with ffmpeg or its own tools.
85
91
 
86
92
  ---
87
93
 
88
- ## ⌨️ Keybindings
94
+ ## Keybindings
89
95
 
90
96
  | Key | What it does |
91
97
  | --------------------------- | ---------------------------------------------------------------- |
@@ -99,7 +105,7 @@ The same conversation, the same tools, the same project context — only the mod
99
105
 
100
106
  ---
101
107
 
102
- ## 💬 Slash commands
108
+ ## Slash commands
103
109
 
104
110
  Everything runs through slash commands inside the session. Not CLI flags.
105
111
 
@@ -112,7 +118,8 @@ Everything runs through slash commands inside the session. Not CLI flags.
112
118
  | `/branch` (`/b`) | Branch the current conversation |
113
119
  | `/branches` | List branches of the current session |
114
120
  | `/rewind` | Restore files and/or conversation to an earlier checkpoint |
115
- | `/buddy` | Spin up a second model to review the current chat |
121
+ | `/add-dir` | Add another project folder to this workspace |
122
+ | `/remove-dir` | Remove an added project folder from this workspace |
116
123
  | `/settings` (`/config`) | Open settings |
117
124
  | `/help` (`/h`, `/?`) | Show all commands |
118
125
  | `/quit` (`/q`, `/exit`) | Exit |
@@ -120,29 +127,38 @@ Everything runs through slash commands inside the session. Not CLI flags.
120
127
  Plus built-in workflows that ship with the binary:
121
128
 
122
129
  ```bash
123
- /expand # Compare against current alternatives and report gaps
124
- /init # Generate CLAUDE.md for your project
130
+ /expand # Find exciting new features to add
131
+ /init # Generate or update AGENTS.md / CLAUDE.md for your project
125
132
  /setup-commit # Generate a /commit command with quality checks
133
+ /setup-ci # Set up or harden CI for any stack
126
134
  /setup-skills # Audit and recommend reusable skills
135
+ /compare # Compare your code against real-world code
136
+ /steroids # Index real repos like this project
127
137
  ```
128
138
 
129
139
  ---
130
140
 
131
- ## 🛠 Tools
141
+ ## Tools
132
142
 
133
- GG Coder comes with a focused set of tools. Each one is small, well-described, and earns its place in the prompt.
143
+ GG Coder comes with a focused set of tools. Only six core tools — `read`, `write`, `edit`, `bash`, `grep`, and `skill` — plus `tool_search` send their full schemas on every request. Everything else is listed as a one-line hint and loads the first time the agent needs it, so rarely used tools cost almost nothing.
134
144
 
135
145
  | Tool | What it does |
136
146
  | --------------------------------- | ------------------------------------------------------------------------------------------------------ |
137
- | `bash` | Run shell commands |
147
+ | `bash` | Run shell commands, in the foreground or background (`task_output` / `task_send` / `task_stop`) |
138
148
  | `read` | Read file contents |
139
149
  | `write` | Write files |
140
150
  | `edit` | Surgical string replacements |
141
151
  | `grep` | Search file contents (regex) |
142
- | `find` | Find files by glob pattern |
143
- | `ls` | List directory contents |
144
- | `web_fetch` | Fetch URL content |
152
+ | `skill` | Load a skill's instructions |
153
+ | `tool_search` | Load an on-demand tool by capability |
154
+ | `find` / `ls` | Find files by glob pattern / list a directory |
155
+ | `code_search` / `code_nav` | Find code by meaning / jump to exact definitions and callers |
156
+ | `web_fetch` / `web_search` | Fetch a URL / search the web |
157
+ | `steroids` | Find real production repos similar to yours and read how they do it |
158
+ | `source_path` | Locate an installed dependency's source |
145
159
  | `screenshot` | Open a URL / dev server in a headless browser and capture a PNG so the agent can see the rendered page |
160
+ | `debug` | Drive the Node debugger |
161
+ | `enter_plan` / `exit_plan` | Plan before editing, then hand the plan back for approval |
146
162
  | `subagent` | Run one blocking, isolated child task (backward-compatible) |
147
163
  | `spawn_agent` / `wait_agent` | Launch persistent child turns concurrently and collect results |
148
164
  | `send_message` / `followup_task` | Steer a running child or reuse an idle child's context |
@@ -150,7 +166,7 @@ GG Coder comes with a focused set of tools. Each one is small, well-described, a
150
166
 
151
167
  The `screenshot` tool needs the optional `playwright` dependency plus a one-time `npx playwright install chromium`. Without it the tool returns an install hint instead of failing the turn. Captured images render inline in graphics-capable terminals (kitty, Ghostty, WezTerm, iTerm2); other terminals show a text line.
152
168
 
153
- Plus the [Grep MCP](https://grep.dev) for searching across 1M+ public GitHub repos. Add your own MCPs in settings if you need more — but start lean.
169
+ Add your own MCPs in `~/.gg/mcp.json` or `.gg/mcp.json` if you need more — but start lean.
154
170
 
155
171
  ### Async subagent lifecycle
156
172
 
@@ -164,13 +180,13 @@ Parent cancellation interrupts active children. Session disposal shuts down ever
164
180
 
165
181
  ---
166
182
 
167
- ## 🪄 Custom commands
183
+ ## Custom commands
168
184
 
169
185
  Drop a markdown file in `.gg/commands/` and it becomes a slash command. Your React app gets `/deploy` and `/storybook`. Your API gets `/migrate` and `/seed`. Different projects, different commands.
170
186
 
171
187
  ---
172
188
 
173
- ## ⏪ Checkpoints & `/rewind`
189
+ ## Checkpoints & `/rewind`
174
190
 
175
191
  Before every file the agent writes or edits, GG Coder snapshots the prior on-disk content into a per-session checkpoint (stored under `~/.gg/checkpoints/`, never in your repo). Run `/rewind` to pick an earlier checkpoint and restore **code only**, **conversation only**, or **both**.
176
192
 
@@ -178,7 +194,7 @@ Only edits made through ggcoder's `write`/`edit` tools are tracked — changes m
178
194
 
179
195
  ---
180
196
 
181
- ## 🎒 Skills
197
+ ## Skills
182
198
 
183
199
  Reusable behaviors across projects. Drop `.md` files in:
184
200
 
@@ -205,15 +221,15 @@ Eleven ship built in, and route themselves when the work matches:
205
221
 
206
222
  ---
207
223
 
208
- ## 📋 Project guidelines
224
+ ## Project guidelines
209
225
 
210
- Drop a `CLAUDE.md` or `AGENTS.md` in your repo root (or any parent directory). GG Coder picks it up automatically.
226
+ Drop an `AGENTS.md` or `CLAUDE.md` in your repo root (or any parent directory). GG Coder picks it up automatically. One file per directory is loaded, first match wins: `AGENTS.override.md` > `AGENTS.md` > `CLAUDE.md` > `.cursorrules` > `CONVENTIONS.md`.
211
227
 
212
228
  Your rules. Your conventions. The agent follows them.
213
229
 
214
230
  ---
215
231
 
216
- ## 👥 Community
232
+ ## Community
217
233
 
218
234
  - [YouTube @kenkaidoesai](https://youtube.com/@kenkaidoesai) — tutorials and demos
219
235
  - [Skool community](https://skool.com/kenkai) — come hang out
@@ -221,7 +237,7 @@ Your rules. Your conventions. The agent follows them.
221
237
 
222
238
  ---
223
239
 
224
- ## 📄 License
240
+ ## License
225
241
 
226
242
  MIT
227
243
 
@@ -115,8 +115,11 @@ export function handleAuthRoutes(ctx, req, res, url, method) {
115
115
  else if (provider === "moonshot" || provider === "xai") {
116
116
  // Subscription OAuth (Kimi plan / SuperGrok-X Premium) stores under
117
117
  // a distinct key so it can coexist with the provider's API key.
118
+ const dual = dualAuthProvider(provider);
119
+ if (!dual)
120
+ throw new Error(`No subscription storage key for ${provider}`);
118
121
  creds = provider === "moonshot" ? await loginKimi(cb) : await loginXai(cb);
119
- storageKey = dualAuthProvider(provider).oauthKey;
122
+ storageKey = dual.oauthKey;
120
123
  }
121
124
  else {
122
125
  throw new Error(`OAuth not implemented for ${provider}`);
@@ -1 +1 @@
1
- {"version":3,"file":"auth-routes.js","sourceRoot":"","sources":["../../src/app-sidecar/auth-routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth-routes.js","sourceRoot":"","sources":["../../src/app-sidecar/auth-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type ProjectHealthScan } from "../core/project-health-scan.js";
2
+ import { type GitHubOpenCounts } from "../utils/github.js";
3
+ import { type GitHubCI } from "../utils/github-ci.js";
4
+ import { type SharedPolls } from "../utils/shared-poll.js";
5
+ /**
6
+ * Daemon-wide repo pollers, shared by every window on the same repo so
7
+ * opening a project twice doesn't double the git/`gh` processes.
8
+ * Keys: `dirtyFiles`, `gitHubCI` and `projectHealth` by resolved cwd (a
9
+ * worktree has its own files and HEAD); `gitHubCounts` by `owner/repo`
10
+ * (counts are repo-wide).
11
+ */
12
+ export interface RepoPolls {
13
+ readonly dirtyFiles: SharedPolls<number>;
14
+ readonly gitHubCounts: SharedPolls<GitHubOpenCounts>;
15
+ readonly gitHubCI: SharedPolls<GitHubCI | null>;
16
+ readonly projectHealth: SharedPolls<ProjectHealthScan>;
17
+ }
18
+ export declare function createRepoPolls(): RepoPolls;
@@ -0,0 +1,45 @@
1
+ import { createProjectHealthScanner } from "../core/project-health-scan.js";
2
+ import { getGitDirtyFileCount } from "../utils/git.js";
3
+ import { getGitHubOpenCounts } from "../utils/github.js";
4
+ import { startGitHubCIPoll } from "../utils/github-ci.js";
5
+ import { createSharedPolls, startIntervalPoll } from "../utils/shared-poll.js";
6
+ export function createRepoPolls() {
7
+ return {
8
+ // Files change outside the agent (editor saves, terminal commits).
9
+ dirtyFiles: createSharedPolls((cwd, publish) => startIntervalPoll({
10
+ fetch: () => getGitDirtyFileCount(cwd),
11
+ publish,
12
+ firstDelayMs: 5000,
13
+ intervalMs: 5000,
14
+ })),
15
+ // Issues/PRs change outside the app; network-bound, so a slow cadence well
16
+ // under the search API's rate budget (2 calls per tick).
17
+ gitHubCounts: createSharedPolls((slug, publish) => startIntervalPoll({
18
+ fetch: () => getGitHubOpenCounts(slug),
19
+ publish,
20
+ firstDelayMs: 2000,
21
+ intervalMs: 60_000,
22
+ })),
23
+ gitHubCI: createSharedPolls((cwd, publish) => startGitHubCIPoll(cwd, publish)),
24
+ // Reads every source file on the first pass; later passes only stat
25
+ // unchanged files (the scanner caches by mtime + size). Runs also refresh it.
26
+ projectHealth: createSharedPolls((cwd, publish) => {
27
+ const scanner = createProjectHealthScanner();
28
+ const controller = new AbortController();
29
+ const poller = startIntervalPoll({
30
+ fetch: () => scanner.scan(cwd, new Date(), controller.signal),
31
+ publish,
32
+ firstDelayMs: 3000,
33
+ intervalMs: 120_000,
34
+ });
35
+ return {
36
+ refresh: poller.refresh,
37
+ stop() {
38
+ controller.abort();
39
+ poller.stop();
40
+ },
41
+ };
42
+ }),
43
+ };
44
+ }
45
+ //# sourceMappingURL=repo-polls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-polls.js","sourceRoot":"","sources":["../../src/app-sidecar/repo-polls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAA0B,MAAM,gCAAgC,CAAC;AACpG,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAyB,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAiB,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAoB,MAAM,yBAAyB,CAAC;AAgBjG,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,mEAAmE;QACnE,UAAU,EAAE,iBAAiB,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAC7C,iBAAiB,CAAC;YAChB,KAAK,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC;YACtC,OAAO;YACP,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,IAAI;SACjB,CAAC,CACH;QACD,2EAA2E;QAC3E,yDAAyD;QACzD,YAAY,EAAE,iBAAiB,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAChD,iBAAiB,CAAC;YAChB,KAAK,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC;YACtC,OAAO;YACP,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,MAAM;SACnB,CAAC,CACH;QACD,QAAQ,EAAE,iBAAiB,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9E,oEAAoE;QACpE,8EAA8E;QAC9E,aAAa,EAAE,iBAAiB,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;YAChD,MAAM,OAAO,GAAG,0BAA0B,EAAE,CAAC;YAC7C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,iBAAiB,CAAC;gBAC/B,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC;gBAC7D,OAAO;gBACP,YAAY,EAAE,IAAI;gBAClB,UAAU,EAAE,OAAO;aACpB,CAAC,CAAC;YACH,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI;oBACF,UAAU,CAAC,KAAK,EAAE,CAAC;oBACnB,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,CAAC;aACF,CAAC;QACJ,CAAC,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -12,6 +12,7 @@ import type { RunLifecycle } from "../core/run-lifecycle.js";
12
12
  import type { HfSearchRow } from "../hf-pull.js";
13
13
  import type { ServeController } from "../modes/serve-mode.js";
14
14
  import type { GitHubCI } from "../utils/github-ci.js";
15
+ import type { ProjectHealth } from "../core/project-health-score.js";
15
16
  import type { ProgressManager } from "./progress-manager.js";
16
17
  import type { HfPullState, SseClient, WorkspaceMode } from "./session-types.js";
17
18
  import type { Provider } from "@kenkaiiii/gg-ai";
@@ -36,6 +37,7 @@ export interface SessionRouteContext {
36
37
  gitHubPRs: number | null;
37
38
  gitHubRepoUrl: string | null;
38
39
  gitHubCI: GitHubCI | null;
40
+ projectHealth: ProjectHealth | null;
39
41
  tasks: BackgroundProcess[];
40
42
  additionalRoots: string[];
41
43
  };
@@ -42,8 +42,9 @@ import { SettingsManager } from "./core/settings-manager.js";
42
42
  import { getModel, getDefaultThinkingLevel, getContextWindow, clearRuntimeModels, registerRuntimeModels, } from "./core/model-registry.js";
43
43
  import { resolveStartOrFallback } from "./core/resolve-start.js";
44
44
  import { getGitBranch, getGitDirtyFileCount, isGitRepo } from "./utils/git.js";
45
- import { getGitHubOpenCounts, getGitHubRepoSlug } from "./utils/github.js";
46
- import { startGitHubCIPoll } from "./utils/github-ci.js";
45
+ import { getGitHubRepoSlug } from "./utils/github.js";
46
+ import { scoreProjectHealth } from "./core/project-health-score.js";
47
+ import { createRepoPolls } from "./app-sidecar/repo-polls.js";
47
48
  import { extractPlanSteps } from "./utils/plan-steps.js";
48
49
  import { getSupportedThinkingLevels, isThinkingLevelSupported } from "./core/thinking-level.js";
49
50
  import { PROMPT_COMMANDS } from "./core/prompt-commands.js";
@@ -201,6 +202,9 @@ async function main() {
201
202
  ctx.broadcast("progress", { ...snapshot, origin: ctx.id === originId });
202
203
  });
203
204
  const { subscriptionUsage } = createUsageService(auth);
205
+ // git status / GitHub counts / CI pollers, one per repo however many windows
206
+ // have it open (each window used to run its own).
207
+ const repoPolls = createRepoPolls();
204
208
  /** Resolve the target session id: the `x-gg-session` header, else a
205
209
  * `?session=` query param (used by the SSE /events connection). */
206
210
  function sessionIdFromReq(req, url) {
@@ -266,6 +270,7 @@ async function main() {
266
270
  jiwaStore,
267
271
  broadcastAll,
268
272
  oauthInFlightProviders,
273
+ repoPolls,
269
274
  }, { id, mode, chatAgent, cwd: sessionCwd, sessionPath });
270
275
  sessions.set(id, ctx);
271
276
  log("INFO", "app-sidecar", "session created", {
@@ -431,7 +436,7 @@ async function main() {
431
436
  * logger, PATH, shared auth file, and radio live at the daemon level.
432
437
  */
433
438
  async function createSession(deps, opts) {
434
- const { auth, progress, memoryStore, jiwaStore, broadcastAll, oauthInFlightProviders } = deps;
439
+ const { auth, progress, memoryStore, jiwaStore, broadcastAll, oauthInFlightProviders, repoPolls, } = deps;
435
440
  const paths = deps.paths;
436
441
  const mode = opts.mode;
437
442
  let chatAgent = opts.chatAgent;
@@ -806,6 +811,23 @@ async function createSession(deps, opts) {
806
811
  let gitHubIssues = null;
807
812
  let gitHubPRs = null;
808
813
  let gitHubCI = null;
814
+ // Latest Project Health scan (code mode only); scored with the live CI result.
815
+ let projectHealthScan = null;
816
+ // Footer extras go out on every git/CI/task change; score only when the scan
817
+ // or CI result actually changed.
818
+ let scoredHealth = null;
819
+ function currentProjectHealth() {
820
+ if (!projectHealthScan)
821
+ return null;
822
+ if (scoredHealth?.scan !== projectHealthScan || scoredHealth.ci !== gitHubCI) {
823
+ scoredHealth = {
824
+ scan: projectHealthScan,
825
+ ci: gitHubCI,
826
+ health: scoreProjectHealth(projectHealthScan, gitHubCI),
827
+ };
828
+ }
829
+ return scoredHealth.health;
830
+ }
809
831
  function currentContextWindow() {
810
832
  const st = session.getState();
811
833
  return getContextWindow(st.model, { provider: st.provider, accountId: st.accountId });
@@ -822,6 +844,7 @@ async function createSession(deps, opts) {
822
844
  gitHubPRs,
823
845
  gitHubCI,
824
846
  gitHubRepoUrl: gitHubSlug ? `https://github.com/${gitHubSlug}` : null,
847
+ projectHealth: currentProjectHealth(),
825
848
  tasks: session.listBackgroundProcesses(),
826
849
  // Roots added with /add-dir — the header shows a badge when non-empty.
827
850
  additionalRoots: session.getAdditionalRoots(),
@@ -840,20 +863,6 @@ async function createSession(deps, opts) {
840
863
  error: err instanceof Error ? err.message : String(err),
841
864
  });
842
865
  });
843
- // Refresh the GitHub counts and broadcast only on change. Transient failures
844
- // keep the last-known numbers so the chips don't flicker off on a timeout.
845
- async function refreshGitHubCounts() {
846
- if (!gitHubSlug)
847
- return;
848
- const counts = await getGitHubOpenCounts(gitHubSlug);
849
- if (!counts)
850
- return;
851
- if (counts.issues !== gitHubIssues || counts.prs !== gitHubPRs) {
852
- gitHubIssues = counts.issues;
853
- gitHubPRs = counts.prs;
854
- broadcast("extras", footerExtras());
855
- }
856
- }
857
866
  // tool_call_end carries no tool name (only the id), so remember each call's
858
867
  // name from tool_call_start to log a useful line on completion. Mirrors the
859
868
  // CLI's logging so the app sidecar's ~/.gg/gg-app-sidecar.log records tool
@@ -1432,8 +1441,9 @@ async function createSession(deps, opts) {
1432
1441
  ]);
1433
1442
  // A run may have opened/closed issues or PRs — refresh fire-and-forget so
1434
1443
  // teardown isn't delayed by the network. Broadcasts itself on change.
1435
- void refreshGitHubCounts();
1436
- void ciPoll.refresh();
1444
+ gitHubCountsPoll?.refresh();
1445
+ ciPoll.refresh();
1446
+ healthPoll?.refresh();
1437
1447
  // Serialize behind any marker/tool-triggered refresh so the terminal
1438
1448
  // progress snapshot uses the live plan file. Once every canonical step
1439
1449
  // is complete, remove the approved plan from future system prompts and
@@ -1755,48 +1765,43 @@ async function createSession(deps, opts) {
1755
1765
  tasksPoll.unref?.();
1756
1766
  };
1757
1767
  scheduleTasksPoll(1500);
1758
- // Files can change outside the agent (editor saves, terminal commits), so keep
1759
- // the dirty count current while idle. Branch/repo state already refreshes after
1760
- // agent runs; polling only the count avoids spawning three git processes per tick.
1761
- let gitPoll;
1762
- let gitPollStopped = false;
1763
- const scheduleGitPoll = (delay) => {
1764
- if (gitPollStopped)
1768
+ // Keep the dirty count, GitHub issue/PR counts and CI current while idle
1769
+ // (they change outside the agent: editor saves, commits, teammates). Branch/
1770
+ // repo state already refreshes after agent runs. The pollers are shared with
1771
+ // every other window on the same repo; each window broadcasts only changes.
1772
+ const repoKey = path.resolve(cwd);
1773
+ const dirtyFilesPoll = repoPolls.dirtyFiles.subscribe(repoKey, (next) => {
1774
+ if (next === gitDirtyFileCount)
1765
1775
  return;
1766
- gitPoll = setTimeout(() => {
1767
- void getGitDirtyFileCount(cwd)
1768
- .catch(() => gitDirtyFileCount)
1769
- .then((nextDirtyFileCount) => {
1770
- if (gitPollStopped)
1771
- return;
1772
- if (nextDirtyFileCount !== gitDirtyFileCount) {
1773
- gitDirtyFileCount = nextDirtyFileCount;
1774
- broadcast("extras", footerExtras());
1775
- }
1776
- scheduleGitPoll(5000);
1777
- });
1778
- }, delay);
1779
- gitPoll.unref?.();
1780
- };
1781
- scheduleGitPoll(5000);
1782
- // GitHub issue/PR counts change outside the app (web UI, teammates), so poll
1783
- // on a slow cadence. Network-bound, so keep it well under the search API's
1784
- // rate budget (2 calls per tick). No-op when the origin isn't a GitHub repo.
1785
- let gitHubPoll;
1786
- let gitHubPollStopped = false;
1787
- const scheduleGitHubPoll = (delay) => {
1788
- if (gitHubPollStopped)
1776
+ gitDirtyFileCount = next;
1777
+ broadcast("extras", footerExtras());
1778
+ });
1779
+ // Failed checks publish nothing, so the chips keep their last-known numbers
1780
+ // instead of flickering off on a timeout. None when origin isn't GitHub.
1781
+ const gitHubCountsPoll = gitHubSlug
1782
+ ? repoPolls.gitHubCounts.subscribe(gitHubSlug, (counts) => {
1783
+ if (counts.issues === gitHubIssues && counts.prs === gitHubPRs)
1784
+ return;
1785
+ gitHubIssues = counts.issues;
1786
+ gitHubPRs = counts.prs;
1787
+ broadcast("extras", footerExtras());
1788
+ })
1789
+ : null;
1790
+ const ciPoll = repoPolls.gitHubCI.subscribe(repoKey, (next) => {
1791
+ if (JSON.stringify(next) === JSON.stringify(gitHubCI))
1789
1792
  return;
1790
- gitHubPoll = setTimeout(() => {
1791
- void refreshGitHubCounts().finally(() => scheduleGitHubPoll(60_000));
1792
- }, delay);
1793
- gitHubPoll.unref?.();
1794
- };
1795
- scheduleGitHubPoll(2000);
1796
- const ciPoll = startGitHubCIPoll(cwd, (next) => {
1797
1793
  gitHubCI = next;
1798
1794
  broadcast("extras", footerExtras());
1799
1795
  });
1796
+ // Project Health is a code-workspace signal; chat and motion windows skip the scan.
1797
+ const healthPoll = mode === "code"
1798
+ ? repoPolls.projectHealth.subscribe(repoKey, (next) => {
1799
+ if (JSON.stringify(next) === JSON.stringify(projectHealthScan))
1800
+ return;
1801
+ projectHealthScan = next;
1802
+ broadcast("extras", footerExtras());
1803
+ })
1804
+ : null;
1800
1805
  const routeCtx = {
1801
1806
  get session() {
1802
1807
  return session;
@@ -2031,13 +2036,10 @@ async function createSession(deps, opts) {
2031
2036
  tasksPollStopped = true;
2032
2037
  if (tasksPoll)
2033
2038
  clearTimeout(tasksPoll);
2034
- gitPollStopped = true;
2035
- if (gitPoll)
2036
- clearTimeout(gitPoll);
2037
- gitHubPollStopped = true;
2038
- if (gitHubPoll)
2039
- clearTimeout(gitHubPoll);
2040
- ciPoll.stop();
2039
+ dirtyFilesPoll.unsubscribe();
2040
+ gitHubCountsPoll?.unsubscribe();
2041
+ ciPoll.unsubscribe();
2042
+ healthPoll?.unsubscribe();
2041
2043
  // Stop the Telegram serve loop + dispose its per-chat sessions.
2042
2044
  if (serveController)
2043
2045
  await serveController.stop().catch(() => { });