@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.
Files changed (215) hide show
  1. package/README.md +1 -1
  2. package/assets/skills/bulletproof/SKILL.md +1 -1
  3. package/assets/skills/clarify/SKILL.md +1 -1
  4. package/assets/skills/code-review/SKILL.md +1 -1
  5. package/assets/skills/compliance-guard/SKILL.md +1 -1
  6. package/assets/skills/durable/SKILL.md +1 -1
  7. package/assets/skills/evidence-led-ui/SKILL.md +1 -1
  8. package/assets/skills/lean/SKILL.md +1 -1
  9. package/assets/skills/refactoring/SKILL.md +1 -1
  10. package/assets/skills/root-cause/SKILL.md +1 -1
  11. package/assets/skills/shared-language/SKILL.md +1 -1
  12. package/assets/skills/tdd/SKILL.md +1 -1
  13. package/dist/app-sidecar/app-settings.d.ts +65 -0
  14. package/dist/app-sidecar/app-settings.js +147 -0
  15. package/dist/app-sidecar/app-settings.js.map +1 -0
  16. package/dist/app-sidecar/attachments.d.ts +11 -0
  17. package/dist/app-sidecar/attachments.js +47 -0
  18. package/dist/app-sidecar/attachments.js.map +1 -0
  19. package/dist/app-sidecar/auth-routes.d.ts +3 -0
  20. package/dist/app-sidecar/auth-routes.js +290 -0
  21. package/dist/app-sidecar/auth-routes.js.map +1 -0
  22. package/dist/app-sidecar/autopilot-runner.d.ts +61 -0
  23. package/dist/app-sidecar/autopilot-runner.js +367 -0
  24. package/dist/app-sidecar/autopilot-runner.js.map +1 -0
  25. package/dist/app-sidecar/file-search.d.ts +15 -0
  26. package/dist/app-sidecar/file-search.js +103 -0
  27. package/dist/app-sidecar/file-search.js.map +1 -0
  28. package/dist/app-sidecar/hf-pull-manager.d.ts +20 -0
  29. package/dist/app-sidecar/hf-pull-manager.js +224 -0
  30. package/dist/app-sidecar/hf-pull-manager.js.map +1 -0
  31. package/dist/app-sidecar/history-routes.d.ts +3 -0
  32. package/dist/app-sidecar/history-routes.js +375 -0
  33. package/dist/app-sidecar/history-routes.js.map +1 -0
  34. package/dist/app-sidecar/history.d.ts +67 -0
  35. package/dist/app-sidecar/history.js +23 -0
  36. package/dist/app-sidecar/history.js.map +1 -0
  37. package/dist/app-sidecar/http.d.ts +5 -0
  38. package/dist/app-sidecar/http.js +27 -0
  39. package/dist/app-sidecar/http.js.map +1 -0
  40. package/dist/app-sidecar/integration-routes.d.ts +3 -0
  41. package/dist/app-sidecar/integration-routes.js +286 -0
  42. package/dist/app-sidecar/integration-routes.js.map +1 -0
  43. package/dist/app-sidecar/json-mode.d.ts +10 -0
  44. package/dist/app-sidecar/json-mode.js +73 -0
  45. package/dist/app-sidecar/json-mode.js.map +1 -0
  46. package/dist/app-sidecar/keep-awake.d.ts +4 -0
  47. package/dist/app-sidecar/keep-awake.js +5 -0
  48. package/dist/app-sidecar/keep-awake.js.map +1 -0
  49. package/dist/app-sidecar/ken-context.d.ts +20 -0
  50. package/dist/app-sidecar/ken-context.js +55 -0
  51. package/dist/app-sidecar/ken-context.js.map +1 -0
  52. package/dist/app-sidecar/mcp-routes.d.ts +3 -0
  53. package/dist/app-sidecar/mcp-routes.js +185 -0
  54. package/dist/app-sidecar/mcp-routes.js.map +1 -0
  55. package/dist/app-sidecar/mcp-rows.d.ts +31 -0
  56. package/dist/app-sidecar/mcp-rows.js +77 -0
  57. package/dist/app-sidecar/mcp-rows.js.map +1 -0
  58. package/dist/app-sidecar/progress-manager.d.ts +10 -0
  59. package/dist/app-sidecar/progress-manager.js +116 -0
  60. package/dist/app-sidecar/progress-manager.js.map +1 -0
  61. package/dist/app-sidecar/prompt-routes.d.ts +3 -0
  62. package/dist/app-sidecar/prompt-routes.js +354 -0
  63. package/dist/app-sidecar/prompt-routes.js.map +1 -0
  64. package/dist/app-sidecar/repo-polls.d.ts +15 -0
  65. package/dist/app-sidecar/repo-polls.js +25 -0
  66. package/dist/app-sidecar/repo-polls.js.map +1 -0
  67. package/dist/app-sidecar/route-context.d.ts +145 -0
  68. package/dist/app-sidecar/route-context.js +2 -0
  69. package/dist/app-sidecar/route-context.js.map +1 -0
  70. package/dist/app-sidecar/run-control-routes.d.ts +3 -0
  71. package/dist/app-sidecar/run-control-routes.js +430 -0
  72. package/dist/app-sidecar/run-control-routes.js.map +1 -0
  73. package/dist/app-sidecar/session-routes.d.ts +3 -0
  74. package/dist/app-sidecar/session-routes.js +115 -0
  75. package/dist/app-sidecar/session-routes.js.map +1 -0
  76. package/dist/app-sidecar/session-types.d.ts +39 -0
  77. package/dist/app-sidecar/session-types.js +5 -0
  78. package/dist/app-sidecar/session-types.js.map +1 -0
  79. package/dist/app-sidecar/task-routes.d.ts +3 -0
  80. package/dist/app-sidecar/task-routes.js +149 -0
  81. package/dist/app-sidecar/task-routes.js.map +1 -0
  82. package/dist/app-sidecar/usage.d.ts +19 -0
  83. package/dist/app-sidecar/usage.js +153 -0
  84. package/dist/app-sidecar/usage.js.map +1 -0
  85. package/dist/app-sidecar/workspace-routes.d.ts +3 -0
  86. package/dist/app-sidecar/workspace-routes.js +244 -0
  87. package/dist/app-sidecar/workspace-routes.js.map +1 -0
  88. package/dist/app-sidecar.js +467 -3775
  89. package/dist/app-sidecar.js.map +1 -1
  90. package/dist/cli.js +2 -2
  91. package/dist/cli.js.map +1 -1
  92. package/dist/config.js +1 -1
  93. package/dist/core/acceptance-checks.js +3 -9
  94. package/dist/core/acceptance-checks.js.map +1 -1
  95. package/dist/core/agent-session/helpers.d.ts +26 -0
  96. package/dist/core/agent-session/helpers.js +47 -0
  97. package/dist/core/agent-session/helpers.js.map +1 -0
  98. package/dist/core/agent-session/mcp-tools.d.ts +68 -0
  99. package/dist/core/agent-session/mcp-tools.js +195 -0
  100. package/dist/core/agent-session/mcp-tools.js.map +1 -0
  101. package/dist/core/agent-session/run-loop-monitor.d.ts +63 -0
  102. package/dist/core/agent-session/run-loop-monitor.js +164 -0
  103. package/dist/core/agent-session/run-loop-monitor.js.map +1 -0
  104. package/dist/core/agent-session/transcript-markers.d.ts +57 -0
  105. package/dist/core/agent-session/transcript-markers.js +166 -0
  106. package/dist/core/agent-session/transcript-markers.js.map +1 -0
  107. package/dist/core/agent-session/verification-tracker.d.ts +46 -0
  108. package/dist/core/agent-session/verification-tracker.js +246 -0
  109. package/dist/core/agent-session/verification-tracker.js.map +1 -0
  110. package/dist/core/agent-session.d.ts +21 -87
  111. package/dist/core/agent-session.js +141 -712
  112. package/dist/core/agent-session.js.map +1 -1
  113. package/dist/core/auth-providers.js +3 -3
  114. package/dist/core/auth-providers.js.map +1 -1
  115. package/dist/core/bundled-agents.js +6 -6
  116. package/dist/core/bundled-agents.js.map +1 -1
  117. package/dist/core/checklist-git.d.ts +19 -0
  118. package/dist/core/checklist-git.js +54 -0
  119. package/dist/core/checklist-git.js.map +1 -0
  120. package/dist/core/checklist-items.d.ts +10 -1
  121. package/dist/core/checklist-items.js +22 -0
  122. package/dist/core/checklist-items.js.map +1 -1
  123. package/dist/core/checklist-prompt.d.ts +5 -1
  124. package/dist/core/checklist-prompt.js +16 -5
  125. package/dist/core/checklist-prompt.js.map +1 -1
  126. package/dist/core/checklist-snapshot.d.ts +5 -1
  127. package/dist/core/checklist-snapshot.js +19 -2
  128. package/dist/core/checklist-snapshot.js.map +1 -1
  129. package/dist/core/context-limits.js +1 -1
  130. package/dist/core/context-limits.js.map +1 -1
  131. package/dist/core/skills.js +6 -9
  132. package/dist/core/skills.js.map +1 -1
  133. package/dist/core/style-packs/index.js +2 -11
  134. package/dist/core/style-packs/index.js.map +1 -1
  135. package/dist/core/style-packs/packs.d.ts +3 -12
  136. package/dist/core/style-packs/packs.js +132 -173
  137. package/dist/core/style-packs/packs.js.map +1 -1
  138. package/dist/system-prompt.js +55 -78
  139. package/dist/system-prompt.js.map +1 -1
  140. package/dist/tools/ask-user.js +13 -74
  141. package/dist/tools/ask-user.js.map +1 -1
  142. package/dist/tools/bash.js +13 -78
  143. package/dist/tools/bash.js.map +1 -1
  144. package/dist/tools/checklist.d.ts +2 -10
  145. package/dist/tools/checklist.js +7 -39
  146. package/dist/tools/checklist.js.map +1 -1
  147. package/dist/tools/code-nav.js +7 -29
  148. package/dist/tools/code-nav.js.map +1 -1
  149. package/dist/tools/edit.d.ts +3 -9
  150. package/dist/tools/edit.js +92 -65
  151. package/dist/tools/edit.js.map +1 -1
  152. package/dist/tools/enter-plan.js +2 -7
  153. package/dist/tools/enter-plan.js.map +1 -1
  154. package/dist/tools/exit-plan.js +2 -3
  155. package/dist/tools/exit-plan.js.map +1 -1
  156. package/dist/tools/find.js +3 -4
  157. package/dist/tools/find.js.map +1 -1
  158. package/dist/tools/grep.js +6 -18
  159. package/dist/tools/grep.js.map +1 -1
  160. package/dist/tools/ls.js +3 -3
  161. package/dist/tools/ls.js.map +1 -1
  162. package/dist/tools/prompt-hints.js +34 -47
  163. package/dist/tools/prompt-hints.js.map +1 -1
  164. package/dist/tools/read.js +8 -20
  165. package/dist/tools/read.js.map +1 -1
  166. package/dist/tools/search-code.js +4 -12
  167. package/dist/tools/search-code.js.map +1 -1
  168. package/dist/tools/skill.js +13 -7
  169. package/dist/tools/skill.js.map +1 -1
  170. package/dist/tools/subagent-control.js +7 -22
  171. package/dist/tools/subagent-control.js.map +1 -1
  172. package/dist/tools/subagent.js +4 -7
  173. package/dist/tools/subagent.js.map +1 -1
  174. package/dist/tools/task-output.js +4 -15
  175. package/dist/tools/task-output.js.map +1 -1
  176. package/dist/tools/task-send.js +5 -17
  177. package/dist/tools/task-send.js.map +1 -1
  178. package/dist/tools/task-stop.js +2 -2
  179. package/dist/tools/task-stop.js.map +1 -1
  180. package/dist/tools/tool-search.js +2 -7
  181. package/dist/tools/tool-search.js.map +1 -1
  182. package/dist/tools/tool-tiers.d.ts +17 -4
  183. package/dist/tools/tool-tiers.js +38 -15
  184. package/dist/tools/tool-tiers.js.map +1 -1
  185. package/dist/tools/web-fetch.js +7 -33
  186. package/dist/tools/web-fetch.js.map +1 -1
  187. package/dist/tools/write.js +3 -4
  188. package/dist/tools/write.js.map +1 -1
  189. package/dist/ui/components/Footer.js +1 -2
  190. package/dist/ui/components/Footer.js.map +1 -1
  191. package/dist/utils/shared-poll.d.ts +37 -0
  192. package/dist/utils/shared-poll.js +104 -0
  193. package/dist/utils/shared-poll.js.map +1 -0
  194. package/package.json +7 -4
  195. package/dist/core/api-benchmark.d.ts +0 -63
  196. package/dist/core/api-benchmark.js +0 -381
  197. package/dist/core/api-benchmark.js.map +0 -1
  198. package/dist/core/bash-spawn-benchmark.d.ts +0 -1
  199. package/dist/core/bash-spawn-benchmark.js +0 -139
  200. package/dist/core/bash-spawn-benchmark.js.map +0 -1
  201. package/dist/core/cache-warm-benchmark.d.ts +0 -21
  202. package/dist/core/cache-warm-benchmark.js +0 -170
  203. package/dist/core/cache-warm-benchmark.js.map +0 -1
  204. package/dist/core/fast-apply-benchmark.d.ts +0 -25
  205. package/dist/core/fast-apply-benchmark.js +0 -284
  206. package/dist/core/fast-apply-benchmark.js.map +0 -1
  207. package/dist/core/hashline-edit-benchmark.d.ts +0 -88
  208. package/dist/core/hashline-edit-benchmark.js +0 -518
  209. package/dist/core/hashline-edit-benchmark.js.map +0 -1
  210. package/dist/core/semantic-search-benchmark.d.ts +0 -36
  211. package/dist/core/semantic-search-benchmark.js +0 -211
  212. package/dist/core/semantic-search-benchmark.js.map +0 -1
  213. package/dist/core/speed-benchmark.d.ts +0 -132
  214. package/dist/core/speed-benchmark.js +0 -410
  215. package/dist/core/speed-benchmark.js.map +0 -1
@@ -0,0 +1,430 @@
1
+ import { findProbedModel, parseLocalModelId } from "@kenkaiiii/gg-core";
2
+ import { getModel, getAllModels } from "../core/model-registry.js";
3
+ import { getNextThinkingLevel, getSupportedThinkingLevels, isThinkingLevelSupported, } from "../core/thinking-level.js";
4
+ import { log } from "../core/logger.js";
5
+ import { readBody, json } from "./http.js";
6
+ import { ALL_PROVIDERS, saveProjectModelPrefs, saveKenModelPref, persistModelSelection, persistThinkingLevel, } from "./app-settings.js";
7
+ export function handleRunControlRoutes(ctx, req, res, url, method) {
8
+ if (method === "GET" && url === "/models") {
9
+ void (async () => {
10
+ const loggedIn = [];
11
+ for (const p of ALL_PROVIDERS) {
12
+ if (await ctx.auth.hasProviderAuth(p))
13
+ loggedIn.push(p);
14
+ }
15
+ // Just the names, grouped by provider in registry order — the UI shows
16
+ // a clean multi-column list of model ids. Local models come from the
17
+ // runtime registry (populated by the background scan) and are always
18
+ // listed: their "login" is the endpoint answering a probe.
19
+ const models = getAllModels()
20
+ .filter((m) => m.provider === "local" || loggedIn.includes(m.provider))
21
+ .map((m) => {
22
+ if (m.provider !== "local") {
23
+ return { id: m.id, name: m.name, provider: m.provider };
24
+ }
25
+ const probed = findProbedModel(ctx.localProbes, m.id);
26
+ return {
27
+ id: m.id,
28
+ name: m.name,
29
+ provider: m.provider,
30
+ local: true,
31
+ endpoint: probed?.endpoint.label ?? parseLocalModelId(m.id)?.endpointId,
32
+ // A local model that can't call tools can't run the agent — the UI
33
+ // renders it disabled rather than hiding it, so the user learns why.
34
+ supportsTools: probed?.model.supportsTools ?? true,
35
+ contextWindow: m.contextWindow,
36
+ contextWindowKnown: probed?.model.contextWindowKnown ?? false,
37
+ supportsThinking: m.supportsThinking,
38
+ };
39
+ });
40
+ json(res, 200, { models });
41
+ })();
42
+ return true;
43
+ }
44
+ if (method === "POST" && url === "/model") {
45
+ void readBody(req, res).then(async (raw) => {
46
+ if (raw === null)
47
+ return;
48
+ let modelId;
49
+ try {
50
+ modelId = JSON.parse(raw).model ?? "";
51
+ }
52
+ catch {
53
+ json(res, 400, { error: "invalid JSON body" });
54
+ return;
55
+ }
56
+ const target = getModel(modelId);
57
+ if (!target) {
58
+ json(res, 404, { error: `unknown model: ${modelId}` });
59
+ return;
60
+ }
61
+ if (ctx.running) {
62
+ json(res, 409, { error: "cannot switch model while running" });
63
+ return;
64
+ }
65
+ if (target.provider === "local") {
66
+ const problem = await ctx.localModelBlocker(target.id);
67
+ if (problem) {
68
+ json(res, 409, { error: problem });
69
+ return;
70
+ }
71
+ }
72
+ await ctx.session.switchModel(target.provider, target.id);
73
+ // Ken follows GG Coder's model only while un-pinned; a user-set Ken
74
+ // override survives GG model switches untouched.
75
+ if (!ctx.kenModelOverride) {
76
+ await ctx.syncKenModel(target.provider, target.id);
77
+ await ctx.syncKenAutoModel(target.provider, target.id);
78
+ }
79
+ // Clamp the reasoning level to what the new model supports (mirrors the
80
+ // CLI): keep thinking on at the first supported tier if it was on but
81
+ // the prior level is unsupported here; leave it off if it was off.
82
+ const prevLevel = ctx.session.getThinkingLevel();
83
+ if (prevLevel && !isThinkingLevelSupported(target.provider, target.id, prevLevel)) {
84
+ ctx.session.setThinkingLevel(getNextThinkingLevel(target.provider, target.id, undefined));
85
+ }
86
+ // Persist per-project so THIS window/project restores its own model on
87
+ // restart (not the single global slot every window shares). Keep the
88
+ // global write too as a "last used" fallback for never-opened projects
89
+ // and so the CLI stays in sync.
90
+ await saveProjectModelPrefs(ctx.cwd, {
91
+ provider: target.provider,
92
+ model: target.id,
93
+ thinkingEnabled: !!ctx.session.getThinkingLevel(),
94
+ thinkingLevel: ctx.session.getThinkingLevel() ?? undefined,
95
+ });
96
+ await persistModelSelection(ctx.paths.settingsFile, target.provider, target.id);
97
+ await persistThinkingLevel(ctx.paths.settingsFile, ctx.session.getThinkingLevel());
98
+ const payload = {
99
+ thinkingLevel: ctx.session.getThinkingLevel() ?? null,
100
+ supportedThinkingLevels: getSupportedThinkingLevels(target.provider, target.id),
101
+ };
102
+ // model_change is emitted by switchModel; follow with thinking_change so
103
+ // the footer toggle reflects the new model's supported levels.
104
+ ctx.broadcast("thinking_change", payload);
105
+ // Un-pinned Ken just followed the switch — update his footer chip too.
106
+ // When Ken is pinned, his effective model did not change, so skip the
107
+ // no-op event (keeps footer/event tests from treating a GG switch as a
108
+ // Ken switch).
109
+ if (!ctx.kenModelOverride)
110
+ ctx.broadcast("ken_model_change", ctx.kenStatePayload());
111
+ // The new model usually has a different context window — push extras so
112
+ // the footer's context meter rescales immediately.
113
+ ctx.broadcast("extras", ctx.footerExtras());
114
+ json(res, 200, { provider: target.provider, model: target.id, ...payload });
115
+ });
116
+ return true;
117
+ }
118
+ // Set or clear Ken's model pin. Body: { model: "<id>" } to pin, or
119
+ // { model: null } / "" to clear (Ken resumes following GG Coder). Applies
120
+ // to BOTH Ken sessions (chat + autopilot reviewer); a switch landing while
121
+ // either is mid-run defers via the pending-model mechanics.
122
+ if (method === "POST" && url === "/ken/model") {
123
+ void readBody(req, res).then(async (raw) => {
124
+ if (raw === null)
125
+ return;
126
+ let modelId;
127
+ try {
128
+ const parsed = JSON.parse(raw).model;
129
+ modelId = typeof parsed === "string" && parsed.trim() ? parsed.trim() : null;
130
+ }
131
+ catch {
132
+ json(res, 400, { error: "invalid JSON body" });
133
+ return;
134
+ }
135
+ // Same lock as POST /model, for the same reason: this retargets Ken's
136
+ // chat session AND the autopilot reviewer, and `switchModel` on a
137
+ // session mid-turn races the stream it is already consuming. The
138
+ // footer picker is disabled to match; this is the enforcement.
139
+ if (ctx.running || ctx.kenRunning || ctx.autopilotReviewing) {
140
+ json(res, 409, { error: "cannot switch Ken's model while running" });
141
+ return;
142
+ }
143
+ if (modelId === null) {
144
+ // Clear the pin → follow GG Coder again, syncing both sessions back.
145
+ ctx.kenModelOverride = null;
146
+ await saveKenModelPref(ctx.cwd, null);
147
+ const st = ctx.session.getState();
148
+ await ctx.syncKenModel(st.provider, st.model);
149
+ await ctx.syncKenAutoModel(st.provider, st.model);
150
+ log("INFO", "app-sidecar", "ken model pin cleared — following GG", {
151
+ provider: st.provider,
152
+ model: st.model,
153
+ });
154
+ }
155
+ else {
156
+ const target = getModel(modelId);
157
+ if (!target) {
158
+ json(res, 404, { error: `unknown model: ${modelId}` });
159
+ return;
160
+ }
161
+ ctx.kenModelOverride = { provider: target.provider, model: target.id };
162
+ await saveKenModelPref(ctx.cwd, ctx.kenModelOverride);
163
+ await ctx.syncKenModel(target.provider, target.id);
164
+ await ctx.syncKenAutoModel(target.provider, target.id);
165
+ log("INFO", "app-sidecar", "ken model pinned", {
166
+ provider: target.provider,
167
+ model: target.id,
168
+ });
169
+ }
170
+ const payload = ctx.kenStatePayload();
171
+ ctx.broadcast("ken_model_change", payload);
172
+ json(res, 200, payload);
173
+ });
174
+ return true;
175
+ }
176
+ // Pending queued steering, for the composer's cancel affordance.
177
+ if (method === "GET" && url === "/queued") {
178
+ json(res, 200, { queued: ctx.session.listQueuedMessages() });
179
+ return true;
180
+ }
181
+ // Cancel one pending queued message by id.
182
+ if (method === "POST" && url === "/queued/cancel") {
183
+ void readBody(req, res).then((raw) => {
184
+ if (raw === null)
185
+ return;
186
+ let id;
187
+ try {
188
+ id = JSON.parse(raw).id ?? "";
189
+ }
190
+ catch {
191
+ json(res, 400, { error: "invalid JSON body" });
192
+ return;
193
+ }
194
+ if (!id.trim()) {
195
+ json(res, 400, { error: "missing queued message id" });
196
+ return;
197
+ }
198
+ // `false` means it already drained into the run between render and
199
+ // click. That is a race, not an error, so report it as a normal result
200
+ // and let the client reconcile through the ordered event stream.
201
+ const cancelled = ctx.session.cancelQueuedMessage(id);
202
+ const queued = ctx.session.listQueuedMessages();
203
+ ctx.broadcast("queued", {
204
+ count: queued.length,
205
+ messages: queued,
206
+ ...(cancelled ? { cancelledId: id } : {}),
207
+ });
208
+ json(res, 200, { cancelled, queued });
209
+ });
210
+ return true;
211
+ }
212
+ if (method === "POST" && url === "/kill") {
213
+ void readBody(req, res).then(async (raw) => {
214
+ if (raw === null)
215
+ return;
216
+ let id;
217
+ try {
218
+ id = JSON.parse(raw).id ?? "";
219
+ }
220
+ catch {
221
+ json(res, 400, { error: "invalid JSON body" });
222
+ return;
223
+ }
224
+ if (!id.trim()) {
225
+ json(res, 400, { error: "missing task id" });
226
+ return;
227
+ }
228
+ const message = await ctx.session.killBackgroundProcess(id);
229
+ // Push the updated task list right away rather than waiting for the poll.
230
+ ctx.broadcast("tasks", { tasks: ctx.session.listBackgroundProcesses() });
231
+ json(res, 200, { message });
232
+ });
233
+ return true;
234
+ }
235
+ // Import a Claude Code / Codex / Cursor transcript into a resumable GG
236
+ // Coder session. The importer never throws — it returns a typed failure so
237
+ // the app can show the reason verbatim.
238
+ if (method === "POST" && url === "/import-transcript") {
239
+ void readBody(req, res).then(async (raw) => {
240
+ if (raw === null)
241
+ return;
242
+ let body;
243
+ try {
244
+ body = JSON.parse(raw);
245
+ }
246
+ catch {
247
+ json(res, 400, { error: "invalid JSON body" });
248
+ return;
249
+ }
250
+ const filePath = body.path?.trim();
251
+ if (!filePath) {
252
+ json(res, 400, { error: "missing transcript path" });
253
+ return;
254
+ }
255
+ const result = await ctx.session.importForeignTranscript(filePath, {
256
+ ...(body.cwd ? { cwd: body.cwd } : {}),
257
+ });
258
+ json(res, result.ok ? 200 : 400, result);
259
+ });
260
+ return true;
261
+ }
262
+ if (method === "POST" && url === "/thinking") {
263
+ // The in-flight request already carries its reasoning config, so a
264
+ // mid-run cycle cannot affect the turn the user is watching — it just
265
+ // persists a level the footer then reports for a run that never used it.
266
+ // Locked like POST /model; the footer button is disabled to match.
267
+ if (ctx.running) {
268
+ json(res, 409, { error: "cannot change reasoning level while running" });
269
+ return true;
270
+ }
271
+ const st = ctx.session.getState();
272
+ const next = getNextThinkingLevel(st.provider, st.model, ctx.session.getThinkingLevel());
273
+ ctx.session.setThinkingLevel(next);
274
+ // Persist per-project so THIS window restores its thinking state on
275
+ // restart; keep the global write as a fallback (mirrors the CLI).
276
+ void saveProjectModelPrefs(ctx.cwd, {
277
+ provider: st.provider,
278
+ model: st.model,
279
+ thinkingEnabled: !!next,
280
+ thinkingLevel: next ?? undefined,
281
+ }).then(() => persistThinkingLevel(ctx.paths.settingsFile, next));
282
+ const payload = {
283
+ thinkingLevel: next ?? null,
284
+ supportedThinkingLevels: getSupportedThinkingLevels(st.provider, st.model),
285
+ };
286
+ ctx.broadcast("thinking_change", payload);
287
+ json(res, 200, payload);
288
+ return true;
289
+ }
290
+ if (method === "POST" && url === "/prewarm") {
291
+ // Best-effort Anthropic cache prewarm on the composer's first keystroke.
292
+ // Fire-and-forget: AgentSession.prewarm() applies its own gating (provider,
293
+ // setting, history size, TTL, in-flight) and swallows request errors.
294
+ if (!ctx.running) {
295
+ void ctx.session.prewarm().catch((err) => {
296
+ log("WARN", "app-sidecar", "prewarm failed", { err: String(err) });
297
+ });
298
+ }
299
+ json(res, 202, { accepted: !ctx.running });
300
+ return true;
301
+ }
302
+ if (method === "POST" && url === "/cancel") {
303
+ void (async () => {
304
+ // Even between task runs, cancellation stops the sweep. Active provider
305
+ // ownership invokes the full abort hook exactly once through lifecycle.
306
+ ctx.taskRunAll = false;
307
+ ctx.autopilotCancelled = true;
308
+ if (!ctx.runLifecycle.running) {
309
+ ctx.kenAutoAbort.abort();
310
+ ctx.kenAutoAbort = new AbortController();
311
+ ctx.kenAutoSession?.setSignal(ctx.kenAutoAbort.signal);
312
+ }
313
+ const generation = ctx.runLifecycle.generation;
314
+ if (!ctx.pendingCancelDrain || ctx.pendingCancelDrain.generation !== generation) {
315
+ ctx.pendingCancelDrain = { generation, text: ctx.session.drainQueue() };
316
+ ctx.broadcast("queued", { count: 0, messages: [] });
317
+ }
318
+ const result = await ctx.runLifecycle.cancel(ctx.CANCEL_TIMEOUT_MS);
319
+ const drained = ctx.pendingCancelDrain.text;
320
+ if (result.status === "failed") {
321
+ ctx.broadcast("cancel_failed", {
322
+ error: "cancel_failed",
323
+ reason: result.reason,
324
+ runState: ctx.runLifecycle.state,
325
+ });
326
+ json(res, 504, {
327
+ error: "cancel_failed",
328
+ reason: result.reason,
329
+ runState: ctx.runLifecycle.state,
330
+ drained,
331
+ });
332
+ return;
333
+ }
334
+ json(res, 200, {
335
+ cancelled: result.status === "cancelled",
336
+ runState: ctx.runLifecycle.state,
337
+ drained,
338
+ });
339
+ })().catch((error) => {
340
+ ctx.broadcast("cancel_failed", { error: "cancel_failed", runState: ctx.runLifecycle.state });
341
+ json(res, 500, {
342
+ error: "cancel_failed",
343
+ message: error instanceof Error ? error.message : String(error),
344
+ runState: ctx.runLifecycle.state,
345
+ });
346
+ });
347
+ return true;
348
+ }
349
+ if (method === "POST" && url === "/new-session") {
350
+ if (ctx.running) {
351
+ json(res, 409, { error: "cannot start a new session while running" });
352
+ return true;
353
+ }
354
+ void ctx.session
355
+ .newSession()
356
+ .then(async () => {
357
+ if (ctx.mode === "chat") {
358
+ await ctx.session.persistAppMarker("agent_handoff", { chatAgent: ctx.chatAgent });
359
+ }
360
+ ctx.deactivateApprovedPlan();
361
+ ctx.injectedAutopilotPrompts = [];
362
+ ctx.clearPendingPlan();
363
+ ctx.broadcast("session_reset", {});
364
+ json(res, 200, { ok: true });
365
+ })
366
+ .catch((err) => {
367
+ json(res, 500, { error: err instanceof Error ? err.message : String(err) });
368
+ });
369
+ return true;
370
+ }
371
+ // Accept an approved plan and begin implementation in a FRESH session
372
+ // (mirrors the CLI's handleApprovePlan). The plan-mode conversation — all the
373
+ // research, file reads, and exploration done while drafting — must NOT bleed
374
+ // into the build, or it bloats the context and distracts the model. So:
375
+ // 1. newSession() wipes history + starts a new session file.
376
+ // 2. setApprovedPlan() bakes the plan into the fresh system prompt so the
377
+ // model emits `[DONE:n]` markers the plan-progress widget reads.
378
+ // 3. session_reset tells the webview to clear its transcript; it then runs
379
+ // the "implement it now" prompt in the clean session.
380
+ if (method === "POST" && url === "/plan/accept") {
381
+ void readBody(req, res).then(async (raw) => {
382
+ if (raw === null)
383
+ return;
384
+ let planPath;
385
+ try {
386
+ planPath = JSON.parse(raw).planPath || undefined;
387
+ }
388
+ catch {
389
+ json(res, 400, { error: "invalid JSON body" });
390
+ return;
391
+ }
392
+ if (ctx.running || ctx.runClaim.active) {
393
+ json(res, 409, { error: "cannot accept a plan while the agent is running" });
394
+ return;
395
+ }
396
+ // Manual accept, possibly racing Ken's autopilot plan review: the user
397
+ // always wins. Bump the plan generation (invalidates any in-flight
398
+ // review's verdict), stop the cycle, abort a mid-prompt review on the
399
+ // kenAuto session, and clear the spinner — autopilot_ignored renders
400
+ // nothing, so no stale "approve or reject" bubble ever lands. The
401
+ // webview's follow-up "implement" /prompt arrives as a fresh turn
402
+ // (resetting autopilotCancelled), so the implementation still gets its
403
+ // normal post-run review; if it lands while the cycle is winding down
404
+ // it queues and runStrandedQueue drains it as a fresh turn.
405
+ ctx.clearPendingPlan();
406
+ ctx.autopilotCancelled = true;
407
+ ctx.kenAutoAbort.abort();
408
+ ctx.kenAutoAbort = new AbortController();
409
+ ctx.kenAutoSession?.setSignal(ctx.kenAutoAbort.signal);
410
+ if (ctx.autopilotReviewing) {
411
+ ctx.autopilotReviewing = false;
412
+ ctx.broadcast("autopilot_ignored", {});
413
+ }
414
+ try {
415
+ await ctx.session.newSession(true);
416
+ ctx.injectedAutopilotPrompts = [];
417
+ const planTotal = await ctx.activateApprovedPlan(planPath);
418
+ ctx.broadcast("session_reset", { planTotal });
419
+ ctx.broadcast("plan_progress", ctx.planProgressPayload());
420
+ json(res, 200, { ok: true, planTotal });
421
+ }
422
+ catch (err) {
423
+ json(res, 500, { error: err instanceof Error ? err.message : String(err) });
424
+ }
425
+ });
426
+ return true;
427
+ }
428
+ return false;
429
+ }
430
+ //# sourceMappingURL=run-control-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-control-routes.js","sourceRoot":"","sources":["../../src/app-sidecar/run-control-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type http from "node:http";
2
+ import type { SessionRouteContext } from "./route-context.js";
3
+ export declare function handleSessionRoutes(ctx: SessionRouteContext, req: http.IncomingMessage, res: http.ServerResponse, url: string, method: string): boolean;
@@ -0,0 +1,115 @@
1
+ import { getModel } from "../core/model-registry.js";
2
+ import { getSupportedThinkingLevels } from "../core/thinking-level.js";
3
+ import { json } from "./http.js";
4
+ export function handleSessionRoutes(ctx, req, res, url, method) {
5
+ if (method === "GET" && url === "/state") {
6
+ const st = ctx.session.getState();
7
+ json(res, 200, {
8
+ ...st,
9
+ mode: ctx.mode,
10
+ chatAgent: ctx.chatAgent,
11
+ running: ctx.running,
12
+ runState: ctx.runLifecycle.state,
13
+ ready: true,
14
+ thinkingLevel: ctx.session.getThinkingLevel() ?? null,
15
+ supportedThinkingLevels: getSupportedThinkingLevels(st.provider, st.model),
16
+ supportsVideo: getModel(st.model)?.supportsVideo ?? false,
17
+ autopilot: ctx.autopilot,
18
+ cacheExpiry: ctx.session.getCacheExpiryStatus(),
19
+ ...ctx.kenStatePayload(),
20
+ ...ctx.footerExtras(),
21
+ });
22
+ return true;
23
+ }
24
+ if (method === "GET" && url === "/progress") {
25
+ json(res, 200, ctx.progress.snapshot());
26
+ return true;
27
+ }
28
+ if (method === "GET" && url === "/memories") {
29
+ void ctx.memoryStore
30
+ .snapshot()
31
+ .then((snapshot) => json(res, 200, snapshot))
32
+ .catch((error) => {
33
+ json(res, 500, { error: error instanceof Error ? error.message : String(error) });
34
+ });
35
+ return true;
36
+ }
37
+ if (method === "DELETE" && url.startsWith("/memories/")) {
38
+ const id = decodeURIComponent(url.slice("/memories/".length));
39
+ if (!id) {
40
+ json(res, 400, { error: "memory id is required" });
41
+ return true;
42
+ }
43
+ void ctx.memoryStore
44
+ .forget(id)
45
+ .then(() => ctx.memoryStore.snapshot())
46
+ .then((snapshot) => json(res, 200, snapshot))
47
+ .catch((error) => {
48
+ json(res, 500, { error: error instanceof Error ? error.message : String(error) });
49
+ });
50
+ return true;
51
+ }
52
+ if (method === "GET" && url === "/jiwa") {
53
+ void ctx.jiwaStore
54
+ .snapshot()
55
+ .then((snapshot) => json(res, 200, snapshot))
56
+ .catch((error) => {
57
+ json(res, 500, { error: error instanceof Error ? error.message : String(error) });
58
+ });
59
+ return true;
60
+ }
61
+ if (method === "DELETE" && url.startsWith("/jiwa/")) {
62
+ const id = decodeURIComponent(url.slice("/jiwa/".length));
63
+ if (!id) {
64
+ json(res, 400, { error: "Jiwa entry id is required" });
65
+ return true;
66
+ }
67
+ void ctx.jiwaStore
68
+ .forget(id)
69
+ .then(() => ctx.jiwaStore.snapshot())
70
+ .then((snapshot) => json(res, 200, snapshot))
71
+ .catch((error) => {
72
+ json(res, 500, { error: error instanceof Error ? error.message : String(error) });
73
+ });
74
+ return true;
75
+ }
76
+ if (method === "GET" && (url === "/events" || url.startsWith("/events?"))) {
77
+ res.writeHead(200, {
78
+ "content-type": "text/event-stream",
79
+ "cache-control": "no-cache",
80
+ connection: "keep-alive",
81
+ });
82
+ res.write(`retry: 1000\n\n`);
83
+ const client = { id: ++ctx.clientSeq, res };
84
+ ctx.clients.add(client);
85
+ const st = ctx.session.getState();
86
+ res.write(`data: ${JSON.stringify({
87
+ type: "ready",
88
+ data: {
89
+ ...st,
90
+ mode: ctx.mode,
91
+ chatAgent: ctx.chatAgent,
92
+ running: ctx.running,
93
+ reviewPending: ctx.autopilotActive,
94
+ // A reconnecting window (reload/reopen) re-opens the review box for
95
+ // a plan still waiting on the user, regardless of earlier offers.
96
+ pendingPlan: ctx.pendingPlanForHuman(-1),
97
+ runState: ctx.runLifecycle.state,
98
+ thinkingLevel: ctx.session.getThinkingLevel() ?? null,
99
+ supportedThinkingLevels: getSupportedThinkingLevels(st.provider, st.model),
100
+ supportsVideo: getModel(st.model)?.supportsVideo ?? false,
101
+ autopilot: ctx.autopilot,
102
+ ...ctx.kenStatePayload(),
103
+ ...ctx.footerExtras(),
104
+ },
105
+ })}\n\n`);
106
+ const keepAlive = setInterval(() => res.write(`: ping\n\n`), 15000);
107
+ req.on("close", () => {
108
+ clearInterval(keepAlive);
109
+ ctx.clients.delete(client);
110
+ });
111
+ return true;
112
+ }
113
+ return false;
114
+ }
115
+ //# sourceMappingURL=session-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-routes.js","sourceRoot":"","sources":["../../src/app-sidecar/session-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type http from "node:http";
2
+ import type { AgentSession } from "../core/agent-session.js";
3
+ import type { ChatAgentId } from "../chat-agents/index.js";
4
+ import type { ChildProcess } from "node:child_process";
5
+ import type { PullPhase } from "../hf-pull.js";
6
+ export interface SseClient {
7
+ id: number;
8
+ res: http.ServerResponse;
9
+ }
10
+ export type WorkspaceMode = "code" | "chat" | "motion";
11
+ /** Unknown or missing modes fall back to the coding agent. */
12
+ export declare function parseWorkspaceMode(value: unknown): WorkspaceMode;
13
+ export interface SessionContext {
14
+ id: string;
15
+ mode: WorkspaceMode;
16
+ chatAgent: ChatAgentId;
17
+ cwd: string;
18
+ sessionPath?: string;
19
+ session: AgentSession;
20
+ clients: Set<SseClient>;
21
+ broadcast: (type: string, data: unknown) => void;
22
+ /** Handle one HTTP request for this session. Owns its own 404 fallthrough. */
23
+ handle: (req: http.IncomingMessage, res: http.ServerResponse, url: string, method: string) => void;
24
+ dispose: () => Promise<void>;
25
+ /** Synchronously stop this context's background commands (all its sessions). */
26
+ stopBackgroundProcesses: () => void;
27
+ }
28
+ export interface HfPullState {
29
+ repo: string;
30
+ model: string;
31
+ tag: string | null;
32
+ file: string;
33
+ sizeBytes: number;
34
+ phase: PullPhase;
35
+ percent: number;
36
+ detail?: string;
37
+ error?: string;
38
+ child: ChildProcess | null;
39
+ }
@@ -0,0 +1,5 @@
1
+ /** Unknown or missing modes fall back to the coding agent. */
2
+ export function parseWorkspaceMode(value) {
3
+ return value === "chat" || value === "motion" ? value : "code";
4
+ }
5
+ //# sourceMappingURL=session-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-types.js","sourceRoot":"","sources":["../../src/app-sidecar/session-types.ts"],"names":[],"mappings":"AAaA,8DAA8D;AAC9D,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AACjE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type http from "node:http";
2
+ import type { SessionRouteContext } from "./route-context.js";
3
+ export declare function handleTaskRoutes(ctx: SessionRouteContext, req: http.IncomingMessage, res: http.ServerResponse, url: string, method: string): boolean;