@kenkaiiii/ggcoder 5.74.3 → 5.75.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 (209) 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/route-context.d.ts +145 -0
  65. package/dist/app-sidecar/route-context.js +2 -0
  66. package/dist/app-sidecar/route-context.js.map +1 -0
  67. package/dist/app-sidecar/run-control-routes.d.ts +3 -0
  68. package/dist/app-sidecar/run-control-routes.js +430 -0
  69. package/dist/app-sidecar/run-control-routes.js.map +1 -0
  70. package/dist/app-sidecar/session-routes.d.ts +3 -0
  71. package/dist/app-sidecar/session-routes.js +115 -0
  72. package/dist/app-sidecar/session-routes.js.map +1 -0
  73. package/dist/app-sidecar/session-types.d.ts +39 -0
  74. package/dist/app-sidecar/session-types.js +5 -0
  75. package/dist/app-sidecar/session-types.js.map +1 -0
  76. package/dist/app-sidecar/task-routes.d.ts +3 -0
  77. package/dist/app-sidecar/task-routes.js +149 -0
  78. package/dist/app-sidecar/task-routes.js.map +1 -0
  79. package/dist/app-sidecar/usage.d.ts +19 -0
  80. package/dist/app-sidecar/usage.js +153 -0
  81. package/dist/app-sidecar/usage.js.map +1 -0
  82. package/dist/app-sidecar/workspace-routes.d.ts +3 -0
  83. package/dist/app-sidecar/workspace-routes.js +244 -0
  84. package/dist/app-sidecar/workspace-routes.js.map +1 -0
  85. package/dist/app-sidecar.js +440 -3720
  86. package/dist/app-sidecar.js.map +1 -1
  87. package/dist/cli.js +2 -2
  88. package/dist/cli.js.map +1 -1
  89. package/dist/config.js +1 -1
  90. package/dist/core/acceptance-checks.js +3 -9
  91. package/dist/core/acceptance-checks.js.map +1 -1
  92. package/dist/core/agent-session/helpers.d.ts +26 -0
  93. package/dist/core/agent-session/helpers.js +47 -0
  94. package/dist/core/agent-session/helpers.js.map +1 -0
  95. package/dist/core/agent-session/mcp-tools.d.ts +68 -0
  96. package/dist/core/agent-session/mcp-tools.js +195 -0
  97. package/dist/core/agent-session/mcp-tools.js.map +1 -0
  98. package/dist/core/agent-session/run-loop-monitor.d.ts +63 -0
  99. package/dist/core/agent-session/run-loop-monitor.js +164 -0
  100. package/dist/core/agent-session/run-loop-monitor.js.map +1 -0
  101. package/dist/core/agent-session/transcript-markers.d.ts +57 -0
  102. package/dist/core/agent-session/transcript-markers.js +166 -0
  103. package/dist/core/agent-session/transcript-markers.js.map +1 -0
  104. package/dist/core/agent-session/verification-tracker.d.ts +46 -0
  105. package/dist/core/agent-session/verification-tracker.js +246 -0
  106. package/dist/core/agent-session/verification-tracker.js.map +1 -0
  107. package/dist/core/agent-session.d.ts +21 -87
  108. package/dist/core/agent-session.js +141 -712
  109. package/dist/core/agent-session.js.map +1 -1
  110. package/dist/core/auth-providers.js +3 -3
  111. package/dist/core/auth-providers.js.map +1 -1
  112. package/dist/core/bundled-agents.js +6 -6
  113. package/dist/core/bundled-agents.js.map +1 -1
  114. package/dist/core/checklist-git.d.ts +19 -0
  115. package/dist/core/checklist-git.js +54 -0
  116. package/dist/core/checklist-git.js.map +1 -0
  117. package/dist/core/checklist-items.d.ts +10 -1
  118. package/dist/core/checklist-items.js +22 -0
  119. package/dist/core/checklist-items.js.map +1 -1
  120. package/dist/core/checklist-prompt.d.ts +5 -1
  121. package/dist/core/checklist-prompt.js +16 -5
  122. package/dist/core/checklist-prompt.js.map +1 -1
  123. package/dist/core/checklist-snapshot.d.ts +5 -1
  124. package/dist/core/checklist-snapshot.js +19 -2
  125. package/dist/core/checklist-snapshot.js.map +1 -1
  126. package/dist/core/context-limits.js +1 -1
  127. package/dist/core/context-limits.js.map +1 -1
  128. package/dist/core/skills.js +6 -9
  129. package/dist/core/skills.js.map +1 -1
  130. package/dist/core/style-packs/index.js +2 -11
  131. package/dist/core/style-packs/index.js.map +1 -1
  132. package/dist/core/style-packs/packs.d.ts +3 -12
  133. package/dist/core/style-packs/packs.js +132 -173
  134. package/dist/core/style-packs/packs.js.map +1 -1
  135. package/dist/system-prompt.js +55 -78
  136. package/dist/system-prompt.js.map +1 -1
  137. package/dist/tools/ask-user.js +13 -74
  138. package/dist/tools/ask-user.js.map +1 -1
  139. package/dist/tools/bash.js +13 -78
  140. package/dist/tools/bash.js.map +1 -1
  141. package/dist/tools/checklist.d.ts +2 -10
  142. package/dist/tools/checklist.js +7 -39
  143. package/dist/tools/checklist.js.map +1 -1
  144. package/dist/tools/code-nav.js +7 -29
  145. package/dist/tools/code-nav.js.map +1 -1
  146. package/dist/tools/edit.d.ts +3 -9
  147. package/dist/tools/edit.js +66 -65
  148. package/dist/tools/edit.js.map +1 -1
  149. package/dist/tools/enter-plan.js +2 -7
  150. package/dist/tools/enter-plan.js.map +1 -1
  151. package/dist/tools/exit-plan.js +2 -3
  152. package/dist/tools/exit-plan.js.map +1 -1
  153. package/dist/tools/find.js +3 -4
  154. package/dist/tools/find.js.map +1 -1
  155. package/dist/tools/grep.js +6 -18
  156. package/dist/tools/grep.js.map +1 -1
  157. package/dist/tools/ls.js +3 -3
  158. package/dist/tools/ls.js.map +1 -1
  159. package/dist/tools/prompt-hints.js +34 -47
  160. package/dist/tools/prompt-hints.js.map +1 -1
  161. package/dist/tools/read.js +8 -20
  162. package/dist/tools/read.js.map +1 -1
  163. package/dist/tools/search-code.js +4 -12
  164. package/dist/tools/search-code.js.map +1 -1
  165. package/dist/tools/skill.js +13 -7
  166. package/dist/tools/skill.js.map +1 -1
  167. package/dist/tools/subagent-control.js +7 -22
  168. package/dist/tools/subagent-control.js.map +1 -1
  169. package/dist/tools/subagent.js +4 -7
  170. package/dist/tools/subagent.js.map +1 -1
  171. package/dist/tools/task-output.js +4 -15
  172. package/dist/tools/task-output.js.map +1 -1
  173. package/dist/tools/task-send.js +5 -17
  174. package/dist/tools/task-send.js.map +1 -1
  175. package/dist/tools/task-stop.js +2 -2
  176. package/dist/tools/task-stop.js.map +1 -1
  177. package/dist/tools/tool-search.js +2 -7
  178. package/dist/tools/tool-search.js.map +1 -1
  179. package/dist/tools/tool-tiers.d.ts +17 -4
  180. package/dist/tools/tool-tiers.js +38 -15
  181. package/dist/tools/tool-tiers.js.map +1 -1
  182. package/dist/tools/web-fetch.js +7 -33
  183. package/dist/tools/web-fetch.js.map +1 -1
  184. package/dist/tools/write.js +3 -4
  185. package/dist/tools/write.js.map +1 -1
  186. package/dist/ui/components/Footer.js +1 -2
  187. package/dist/ui/components/Footer.js.map +1 -1
  188. package/package.json +7 -4
  189. package/dist/core/api-benchmark.d.ts +0 -63
  190. package/dist/core/api-benchmark.js +0 -381
  191. package/dist/core/api-benchmark.js.map +0 -1
  192. package/dist/core/bash-spawn-benchmark.d.ts +0 -1
  193. package/dist/core/bash-spawn-benchmark.js +0 -139
  194. package/dist/core/bash-spawn-benchmark.js.map +0 -1
  195. package/dist/core/cache-warm-benchmark.d.ts +0 -21
  196. package/dist/core/cache-warm-benchmark.js +0 -170
  197. package/dist/core/cache-warm-benchmark.js.map +0 -1
  198. package/dist/core/fast-apply-benchmark.d.ts +0 -25
  199. package/dist/core/fast-apply-benchmark.js +0 -284
  200. package/dist/core/fast-apply-benchmark.js.map +0 -1
  201. package/dist/core/hashline-edit-benchmark.d.ts +0 -88
  202. package/dist/core/hashline-edit-benchmark.js +0 -518
  203. package/dist/core/hashline-edit-benchmark.js.map +0 -1
  204. package/dist/core/semantic-search-benchmark.d.ts +0 -36
  205. package/dist/core/semantic-search-benchmark.js +0 -211
  206. package/dist/core/semantic-search-benchmark.js.map +0 -1
  207. package/dist/core/speed-benchmark.d.ts +0 -132
  208. package/dist/core/speed-benchmark.js +0 -410
  209. package/dist/core/speed-benchmark.js.map +0 -1
@@ -0,0 +1,354 @@
1
+ import { isWorkflowCommandText, countAssistantMessages, shouldStartAutopilotCycle, extractTurnToolCalls, isMechanicalOnlyTurn, } from "../core/autopilot-gate.js";
2
+ import { PROMPT_COMMANDS } from "../core/prompt-commands.js";
3
+ import { loadCustomCommands } from "../core/custom-commands.js";
4
+ import { log } from "../core/logger.js";
5
+ import { readBody, json } from "./http.js";
6
+ import { prepareAttachments } from "./attachments.js";
7
+ import { saveAutopilot } from "./app-settings.js";
8
+ import { lastAssistantText, buildKenContext } from "./ken-context.js";
9
+ import { keepAwake } from "./keep-awake.js";
10
+ export function handlePromptRoutes(ctx, req, res, url, method) {
11
+ if (method === "GET" && url === "/commands") {
12
+ if (ctx.mode !== "code") {
13
+ json(res, 200, { commands: [] });
14
+ return true;
15
+ }
16
+ // Workflow commands with agent functionality: built-in prompt templates +
17
+ // the user's own `.gg/commands/*.md`.
18
+ void (async () => {
19
+ const builtins = PROMPT_COMMANDS.map((c) => ({
20
+ name: c.name,
21
+ aliases: c.aliases,
22
+ description: c.description,
23
+ source: "built-in",
24
+ }));
25
+ // Desktop-safe registry actions belong in the same picker as workflows.
26
+ // Most registry commands have dedicated app controls or TUI-only flows;
27
+ // multi-root management has no other affordance, so expose only these.
28
+ const workspaceActions = [
29
+ {
30
+ name: "add-dir",
31
+ aliases: ["adddir"],
32
+ description: "Add another project folder to this workspace",
33
+ source: "built-in",
34
+ },
35
+ {
36
+ name: "remove-dir",
37
+ aliases: ["removedir"],
38
+ description: "Remove an added project folder from this workspace",
39
+ source: "built-in",
40
+ },
41
+ ];
42
+ const custom = (await loadCustomCommands(ctx.cwd))
43
+ // A custom command can't shadow a built-in name or app action.
44
+ .filter((c) => !PROMPT_COMMANDS.some((b) => b.name === c.name) &&
45
+ !workspaceActions.some((action) => action.name === c.name))
46
+ .map((c) => ({
47
+ name: c.name,
48
+ aliases: [],
49
+ description: c.description,
50
+ source: "custom",
51
+ }));
52
+ json(res, 200, { commands: [...workspaceActions, ...builtins, ...custom] });
53
+ })();
54
+ return true;
55
+ }
56
+ if (method === "POST" && url === "/prompt") {
57
+ // Per-request: only the prompt that actually claimed the start may release
58
+ // it. A bare release would let an early-returning request (bad JSON, or a
59
+ // prompt that queued) clear a claim another request is still holding.
60
+ let claimedStart = false;
61
+ void readBody(req, res)
62
+ .then(async (raw) => {
63
+ if (raw === null)
64
+ return;
65
+ let text;
66
+ let attachments;
67
+ let meta;
68
+ try {
69
+ const body = JSON.parse(raw);
70
+ text = body.text ?? "";
71
+ attachments = Array.isArray(body.attachments) ? body.attachments : [];
72
+ meta = typeof body.meta === "object" && body.meta !== null ? body.meta : undefined;
73
+ }
74
+ catch {
75
+ json(res, 400, { error: "invalid JSON body" });
76
+ return;
77
+ }
78
+ if (!text.trim() && attachments.length === 0) {
79
+ json(res, 400, { error: "empty prompt" });
80
+ return;
81
+ }
82
+ // A typed prompt supersedes any question parked on the user: they
83
+ // answered with a message of their own. Release the blocked tool call
84
+ // NOW — otherwise it waits out its ten-minute timeout while this very
85
+ // message sits behind it as steering that only drains once the tool
86
+ // returns, so the turn looks frozen. The webview closes the band on
87
+ // send; a racing /ask POST just 409s.
88
+ ctx.asks.cancelAll({ action: "cancel", superseded: true });
89
+ if (ctx.runLifecycle.running &&
90
+ ctx.runLifecycle.isCancellationRequested(ctx.runLifecycle.generation)) {
91
+ json(res, 409, {
92
+ error: ctx.runLifecycle.state === "cancelling" ? "run_cancelling" : "cancel_failed",
93
+ runState: ctx.runLifecycle.state,
94
+ });
95
+ return;
96
+ }
97
+ // `runClaim` covers the gap before `runAgent` flips `running`: a
98
+ // prompt arriving in that window must queue, not start a second run.
99
+ if (ctx.running || ctx.runClaim.active || ctx.autopilotActive) {
100
+ // Queue prompts as mid-run steering (mirrors the CLI). Also queue while
101
+ // an autopilot cycle is active but between injected runs (build idle,
102
+ // Ken reviewing) so the message never starts a run that collides with
103
+ // an injected one on the same session. Attachments are persisted to
104
+ // .gg/uploads first so the queued media rides the same native-block
105
+ // path as a non-queued attachment prompt when it drains.
106
+ const prepared = attachments.length > 0 ? await prepareAttachments(ctx.cwd, attachments) : [];
107
+ const count = ctx.session.queueMessage(text, prepared);
108
+ ctx.broadcast("queued", { count, messages: ctx.session.listQueuedMessages() });
109
+ json(res, 202, { queued: true, count });
110
+ return;
111
+ }
112
+ // Claim the run NOW, synchronously. Everything below this line may
113
+ // yield, and `running` does not flip until runAgent begins.
114
+ claimedStart = ctx.runClaim.claim();
115
+ // A scheduled prompt has nobody watching: short ask deadline.
116
+ ctx.scheduledRunActive = meta?.scheduled === true;
117
+ json(res, 202, { accepted: true });
118
+ // Gate inputs captured around the run: whether this turn is a workflow
119
+ // slash command (attachment prompts skip slash expansion entirely), and
120
+ // how many assistant messages the run actually adds. Computed even when
121
+ // autopilot is currently off — the toggle can flip ON mid-run, and the
122
+ // gate reads the post-run value.
123
+ const workflowCommand = attachments.length === 0 &&
124
+ isWorkflowCommandText(text, await ctx.loadWorkflowCommandSpecs());
125
+ // Does this input actually expand into a persisted user message? Asked
126
+ // of the session itself, because only it knows whether the command
127
+ // resolves here (name/alias casing, custom `.gg/commands`, non-coder
128
+ // agents that don't expand at all). A looser guess would anchor the
129
+ // hint at +1 with no message to land on — decorating an unrelated
130
+ // later bubble with the wrong `/name`.
131
+ const expandsToTemplate = attachments.length === 0 && (await ctx.session.willExpandPromptTemplate(text));
132
+ // Webview display hint for this prompt's user bubble (kenSent shimmer
133
+ // label / enhancer highlight segments / the `/name` a command was typed
134
+ // as). Anchored +1 so it attaches to the user message the prompt below
135
+ // is about to push. Queued prompts skip this (their position in the run
136
+ // is unpredictable).
137
+ //
138
+ // Recording the invocation matters because the agent persists the
139
+ // EXPANDED template as the user message. Resume used to recover
140
+ // `/name` by matching that body against the current templates, which
141
+ // silently fails the moment a template is edited or reworded — the
142
+ // reopened session then rendered the raw multi-KB prompt instead of
143
+ // the command chip.
144
+ if (expandsToTemplate ||
145
+ (meta && (meta.kenSent === true || Array.isArray(meta.enhancements)))) {
146
+ void ctx.session
147
+ .persistAppMarker("user_hint", {
148
+ ...(expandsToTemplate ? { command: text.trim() } : {}),
149
+ ...(meta?.kenSent === true ? { kenSent: true } : {}),
150
+ ...(Array.isArray(meta?.enhancements) ? { enhancements: meta.enhancements } : {}),
151
+ }, 1)
152
+ .catch(() => { });
153
+ }
154
+ // Fresh user turn: clear any cancel flag left from a prior cycle so this
155
+ // turn's autopilot review can run.
156
+ ctx.autopilotCancelled = false;
157
+ // A typed message while a plan modal/review is pending (reject,
158
+ // feedback, anything) supersedes the pending plan — the bump also
159
+ // invalidates any in-flight Ken plan review.
160
+ ctx.clearPendingPlan();
161
+ const assistantsBefore = countAssistantMessages(ctx.session.getMessages());
162
+ const messagesBefore = ctx.session.getMessages().length;
163
+ await ctx.runAgent(text, async () => {
164
+ // The review box's Feedback: revise read-only, like Ken's feedback.
165
+ if (meta?.planRevision === true)
166
+ await ctx.reenterPlanModeForRevision();
167
+ if (attachments.length > 0) {
168
+ // Persist each attachment under .gg/uploads so files are inspectable
169
+ // by the agent's tools, then prompt with the media as native blocks.
170
+ const prepared = await prepareAttachments(ctx.cwd, attachments);
171
+ await ctx.session.promptWithAttachments(text, prepared);
172
+ }
173
+ else {
174
+ // Pass the raw text straight through. AgentSession.prompt() is the
175
+ // single source of truth for slash-command expansion (built-in +
176
+ // `.gg/commands/*.md` custom), so the agent gets the right body
177
+ // while the webview keeps showing the short `/name`.
178
+ await ctx.session.prompt(text);
179
+ }
180
+ }, () => ctx.autopilot);
181
+ // After the user's run settles, kick off Ken's auto-review loop — but
182
+ // only when the turn is actually reviewable (shouldStartAutopilotCycle):
183
+ // workflow commands (/compare, /expand, …) end with reports or
184
+ // A/B/C choices reserved for the USER; registry commands (/help) and
185
+ // failed runs add no assistant work to judge; a turn that ended in plan
186
+ // mode has a pending Accept/Reject modal Ken must not preempt. This is
187
+ // the ONLY entry point into the cycle besides the stranded-queue drain —
188
+ // it drives any follow-up GG Coder runs itself, so the shared runAgent
189
+ // finally never recurses.
190
+ const decision = shouldStartAutopilotCycle({
191
+ enabled: ctx.autopilot,
192
+ cancelled: ctx.autopilotCancelled,
193
+ planMode: ctx.session.getPlanMode(),
194
+ // A submitted plan (exit_plan fired) routes into the PLAN review
195
+ // branch — the cycle reviews the plan itself instead of skipping.
196
+ planPending: ctx.pendingPlanPath !== null,
197
+ workflowCommand,
198
+ assistantMessagesAdded: countAssistantMessages(ctx.session.getMessages()) - assistantsBefore,
199
+ // Skip the review API call outright for turns that only started a
200
+ // background process (dev server/watcher), ran a read-only lookup, or
201
+ // committed/pushed — Ken's autopilot contract already IGNOREs these,
202
+ // so there's no reason to pay for that verdict.
203
+ mechanicalOnly: isMechanicalOnlyTurn(extractTurnToolCalls(ctx.session.getMessages(), messagesBefore)),
204
+ });
205
+ if (decision.start) {
206
+ log("INFO", "app-sidecar", "autopilot cycle starting", { kind: decision.kind });
207
+ await ctx.runAutopilotCycle(text);
208
+ }
209
+ else {
210
+ ctx.broadcast("autopilot_ignored", { reason: decision.reason });
211
+ log("INFO", "app-sidecar", "autopilot skipped", { reason: decision.reason });
212
+ }
213
+ // A prompt sent while Ken was reviewing (build idle) queued but had no
214
+ // run to steer into — run it now as a fresh turn so it never strands.
215
+ await ctx.runStrandedQueue();
216
+ })
217
+ .finally(() => {
218
+ if (claimedStart) {
219
+ ctx.scheduledRunActive = false;
220
+ ctx.runClaim.release();
221
+ // The claim held the plan back until the turn fully settled.
222
+ ctx.offerPendingPlan();
223
+ }
224
+ });
225
+ return true;
226
+ }
227
+ // Ken Kai (mentor): an independent read-only advisory run on the kenSession.
228
+ // Runs concurrently with a build run — its events are ken_-prefixed so the
229
+ // webview keeps the bubbles separate. The context digest is assembled fresh
230
+ // from the BUILD session's transcript each turn (one-way mirror).
231
+ if (method === "POST" && url === "/ken/prompt") {
232
+ if (ctx.mode !== "code") {
233
+ json(res, 404, {
234
+ error: `Ken is not available in GG ${ctx.mode === "chat" ? "Chat" : "Motion"}.`,
235
+ });
236
+ return true;
237
+ }
238
+ void readBody(req, res).then(async (raw) => {
239
+ if (raw === null)
240
+ return;
241
+ let text;
242
+ try {
243
+ text = JSON.parse(raw).text ?? "";
244
+ }
245
+ catch {
246
+ json(res, 400, { error: "invalid JSON body" });
247
+ return;
248
+ }
249
+ if (!text.trim()) {
250
+ json(res, 400, { error: "empty prompt" });
251
+ return;
252
+ }
253
+ if (ctx.kenRunning) {
254
+ json(res, 409, { error: "Ken is already thinking — wait for his reply." });
255
+ return;
256
+ }
257
+ json(res, 202, { accepted: true });
258
+ ctx.kenRunning = true;
259
+ const releaseKenAwake = keepAwake.acquire("ken");
260
+ ctx.broadcast("ken_run_start", { text });
261
+ try {
262
+ const ken = await ctx.ensureKenSession();
263
+ const digest = await buildKenContext(ctx.session, ctx.cwd, ctx.gitBranch, text, await ctx.loadWorkflowCommandSpecs(), ctx.injectedAutopilotPrompts);
264
+ await ken.prompt(digest);
265
+ // Record the turn against the BUILD session so it persists + survives
266
+ // resume (advisory custom entry, never an LLM message). Reply is Ken's
267
+ // last assistant message; skip persistence if he produced nothing.
268
+ const reply = lastAssistantText(ken.getMessages());
269
+ if (reply.trim())
270
+ await ctx.session.persistKenTurn(text, reply);
271
+ }
272
+ catch (err) {
273
+ ctx.broadcastError("ken_error", "ken run failed", err);
274
+ }
275
+ finally {
276
+ releaseKenAwake();
277
+ ctx.kenRunning = false;
278
+ ctx.broadcast("ken_run_end", {});
279
+ const pending = ctx.pendingKenModel;
280
+ ctx.pendingKenModel = null;
281
+ if (pending)
282
+ await ctx.syncKenModel(pending.provider, pending.model);
283
+ }
284
+ });
285
+ return true;
286
+ }
287
+ if (method === "POST" && url === "/ken/cancel") {
288
+ ctx.kenAbort.abort();
289
+ ctx.kenAbort = new AbortController();
290
+ ctx.kenSession?.setSignal(ctx.kenAbort.signal);
291
+ ctx.kenRunning = false;
292
+ ctx.broadcast("ken_run_end", { cancelled: true });
293
+ json(res, 200, { cancelled: true });
294
+ return true;
295
+ }
296
+ if (method === "POST" && url === "/autopilot") {
297
+ if (ctx.mode !== "code") {
298
+ json(res, 404, {
299
+ error: `Autopilot is not available in GG ${ctx.mode === "chat" ? "Chat" : "Motion"}.`,
300
+ });
301
+ return true;
302
+ }
303
+ void readBody(req, res).then(async (raw) => {
304
+ if (raw === null)
305
+ return;
306
+ let enabled;
307
+ try {
308
+ enabled = Boolean(JSON.parse(raw).enabled);
309
+ }
310
+ catch {
311
+ json(res, 400, { error: "invalid JSON body" });
312
+ return;
313
+ }
314
+ ctx.autopilot = enabled;
315
+ await saveAutopilot(ctx.cwd, enabled);
316
+ log("INFO", "app-sidecar", "autopilot toggled", { enabled: String(enabled) });
317
+ ctx.broadcast("autopilot", { autopilot: enabled });
318
+ json(res, 200, { autopilot: enabled });
319
+ });
320
+ return true;
321
+ }
322
+ if (method === "POST" && url === "/enhance") {
323
+ void readBody(req, res).then(async (raw) => {
324
+ if (raw === null)
325
+ return;
326
+ let text;
327
+ try {
328
+ text = JSON.parse(raw).text ?? "";
329
+ }
330
+ catch {
331
+ json(res, 400, { error: "invalid JSON body" });
332
+ return;
333
+ }
334
+ if (!text.trim()) {
335
+ json(res, 400, { error: "empty prompt" });
336
+ return;
337
+ }
338
+ // An independent read-only LLM call — touches no session state, so it's
339
+ // allowed even while a run is in flight.
340
+ try {
341
+ const result = await ctx.session.enhancePrompt(text);
342
+ json(res, 200, result);
343
+ }
344
+ catch (err) {
345
+ const message = err instanceof Error ? err.message : String(err);
346
+ log("ERROR", "app-sidecar", "enhance failed", { message });
347
+ json(res, 500, { error: message });
348
+ }
349
+ });
350
+ return true;
351
+ }
352
+ return false;
353
+ }
354
+ //# sourceMappingURL=prompt-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-routes.js","sourceRoot":"","sources":["../../src/app-sidecar/prompt-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ import type { JiwaStore } from "../chat-agents/jiwa.js";
2
+ import type { MemoryStore } from "../chat-agents/memory.js";
3
+ import type { AgentSession } from "../core/agent-session.js";
4
+ import type { AskUserBridge } from "../core/ask-user.js";
5
+ import type { AuthMethod, AuthMethodMeta, AuthProviderMeta } from "../core/auth-providers.js";
6
+ import type { WorkflowCommandSpec } from "../core/autopilot-gate.js";
7
+ import type { EffectiveKenModel, KenModelPref } from "../core/ken-model.js";
8
+ import type { ElicitationBridge } from "../core/mcp/elicitation-bridge.js";
9
+ import type { BackgroundProcess } from "../core/process-manager.js";
10
+ import type { RunClaim } from "../core/run-claim.js";
11
+ import type { RunLifecycle } from "../core/run-lifecycle.js";
12
+ import type { HfSearchRow } from "../hf-pull.js";
13
+ import type { ServeController } from "../modes/serve-mode.js";
14
+ import type { GitHubCI } from "../utils/github-ci.js";
15
+ import type { ProgressManager } from "./progress-manager.js";
16
+ import type { HfPullState, SseClient, WorkspaceMode } from "./session-types.js";
17
+ import type { Provider } from "@kenkaiiii/gg-ai";
18
+ import type { AppPaths, AuthStorage, LocalEndpointKind, LocalEndpointProbe, OAuthLoginCallbacks } from "@kenkaiiii/gg-core";
19
+ /** Closure state of one `createSession` context that the per-session route
20
+ * handlers read and write. Built in `createSession`; `let` bindings are
21
+ * exposed as getter/setter pairs so writes land on the closure variable. */
22
+ export interface SessionRouteContext {
23
+ session: AgentSession;
24
+ readonly mode: WorkspaceMode;
25
+ chatAgent: "general" | "therapist" | "research";
26
+ running: boolean;
27
+ readonly runLifecycle: RunLifecycle;
28
+ autopilot: boolean;
29
+ readonly kenStatePayload: () => EffectiveKenModel;
30
+ readonly footerExtras: () => {
31
+ contextWindow: number;
32
+ gitBranch: string | null;
33
+ isGitRepo: boolean;
34
+ gitDirtyFileCount: number;
35
+ gitHubIssues: number | null;
36
+ gitHubPRs: number | null;
37
+ gitHubRepoUrl: string | null;
38
+ gitHubCI: GitHubCI | null;
39
+ tasks: BackgroundProcess[];
40
+ additionalRoots: string[];
41
+ };
42
+ readonly progress: ProgressManager;
43
+ readonly memoryStore: MemoryStore;
44
+ readonly jiwaStore: JiwaStore;
45
+ clientSeq: number;
46
+ readonly clients: Set<SseClient>;
47
+ autopilotActive: boolean;
48
+ readonly pendingPlanForHuman: (offeredGeneration: number) => {
49
+ planPath: string;
50
+ content: string;
51
+ } | null;
52
+ readonly paths: AppPaths;
53
+ readonly host: string;
54
+ readonly cwd: string;
55
+ readonly asks: AskUserBridge;
56
+ readonly runClaim: RunClaim;
57
+ readonly broadcast: (type: string, data: unknown) => void;
58
+ scheduledRunActive: boolean;
59
+ readonly loadWorkflowCommandSpecs: () => Promise<WorkflowCommandSpec[]>;
60
+ autopilotCancelled: boolean;
61
+ readonly clearPendingPlan: () => void;
62
+ readonly runAgent: (label: string, run: () => Promise<void>, reviewPending?: () => boolean) => Promise<void>;
63
+ readonly reenterPlanModeForRevision: () => Promise<void>;
64
+ pendingPlanPath: string | null;
65
+ readonly runAutopilotCycle: (originalRequest: string) => Promise<void>;
66
+ readonly runStrandedQueue: () => Promise<void>;
67
+ readonly offerPendingPlan: () => void;
68
+ kenRunning: boolean;
69
+ readonly ensureKenSession: () => Promise<AgentSession>;
70
+ gitBranch: string | null;
71
+ injectedAutopilotPrompts: string[];
72
+ readonly broadcastError: (type: "error" | "ken_error" | "autopilot_error", logLabel: string, err: unknown) => void;
73
+ pendingKenModel: {
74
+ provider: Provider;
75
+ model: string;
76
+ } | null;
77
+ readonly syncKenModel: (provider: Provider, model: string) => Promise<void>;
78
+ kenAbort: AbortController;
79
+ kenSession: AgentSession | null;
80
+ readonly runTasks: (startId: string | null, all: boolean) => Promise<void>;
81
+ readonly auth: AuthStorage;
82
+ localProbes: LocalEndpointProbe[];
83
+ readonly localModelBlocker: (modelId: string) => Promise<string | undefined>;
84
+ kenModelOverride: KenModelPref | null;
85
+ readonly syncKenAutoModel: (provider: Provider, model: string) => Promise<void>;
86
+ autopilotReviewing: boolean;
87
+ taskRunAll: boolean;
88
+ kenAutoAbort: AbortController;
89
+ kenAutoSession: AgentSession | null;
90
+ pendingCancelDrain: {
91
+ generation: number;
92
+ text: string;
93
+ } | null;
94
+ readonly CANCEL_TIMEOUT_MS: number;
95
+ readonly deactivateApprovedPlan: () => void;
96
+ readonly activateApprovedPlan: (planPath: string | undefined) => Promise<number>;
97
+ readonly planProgressPayload: () => {
98
+ total: number;
99
+ completed: number[];
100
+ };
101
+ readonly authStatusPayload: () => Promise<{
102
+ providers: (AuthProviderMeta & {
103
+ connected: boolean;
104
+ connectedMethods: AuthMethod[];
105
+ activeMethod?: AuthMethod | undefined;
106
+ oauthExhaustedUntil?: number | undefined;
107
+ priorityNote?: string | undefined;
108
+ methodGuidance: AuthMethodMeta[];
109
+ })[];
110
+ }>;
111
+ readonly broadcastAll: (type: string, data: unknown) => void;
112
+ oauthInFlight: boolean;
113
+ readonly oauthInFlightProviders: Set<string>;
114
+ readonly authCallbacks: () => OAuthLoginCallbacks;
115
+ pendingCode: ((code: string) => void) | null;
116
+ readonly elicitations: ElicitationBridge;
117
+ readonly localStatePayload: () => {
118
+ endpoints: {
119
+ id: string;
120
+ label: string;
121
+ baseUrl: string;
122
+ kind: LocalEndpointKind;
123
+ custom: boolean;
124
+ reachable: boolean;
125
+ reason?: string | undefined;
126
+ models: {
127
+ id: string;
128
+ rawId: string;
129
+ contextWindow: number;
130
+ contextWindowKnown: boolean;
131
+ supportsTools: boolean;
132
+ supportsImages: boolean;
133
+ supportsThinking: boolean;
134
+ loaded?: boolean | undefined;
135
+ }[];
136
+ }[];
137
+ };
138
+ readonly scanLocalModels: (force: boolean) => Promise<LocalEndpointProbe[]>;
139
+ hfPull: HfPullState | null;
140
+ readonly hfPullPayload: (s: HfPullState) => Record<string, unknown>;
141
+ readonly hfSearch: (query: string) => Promise<HfSearchRow[]>;
142
+ readonly startHfPull: (repo: string) => Promise<Record<string, unknown>>;
143
+ readonly cancelHfPull: () => boolean;
144
+ serveController: ServeController | null;
145
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=route-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-context.js","sourceRoot":"","sources":["../../src/app-sidecar/route-context.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type http from "node:http";
2
+ import type { SessionRouteContext } from "./route-context.js";
3
+ export declare function handleRunControlRoutes(ctx: SessionRouteContext, req: http.IncomingMessage, res: http.ServerResponse, url: string, method: string): boolean;