@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.
- package/README.md +1 -1
- package/assets/skills/bulletproof/SKILL.md +1 -1
- package/assets/skills/clarify/SKILL.md +1 -1
- package/assets/skills/code-review/SKILL.md +1 -1
- package/assets/skills/compliance-guard/SKILL.md +1 -1
- package/assets/skills/durable/SKILL.md +1 -1
- package/assets/skills/evidence-led-ui/SKILL.md +1 -1
- package/assets/skills/lean/SKILL.md +1 -1
- package/assets/skills/refactoring/SKILL.md +1 -1
- package/assets/skills/root-cause/SKILL.md +1 -1
- package/assets/skills/shared-language/SKILL.md +1 -1
- package/assets/skills/tdd/SKILL.md +1 -1
- package/dist/app-sidecar/app-settings.d.ts +65 -0
- package/dist/app-sidecar/app-settings.js +147 -0
- package/dist/app-sidecar/app-settings.js.map +1 -0
- package/dist/app-sidecar/attachments.d.ts +11 -0
- package/dist/app-sidecar/attachments.js +47 -0
- package/dist/app-sidecar/attachments.js.map +1 -0
- package/dist/app-sidecar/auth-routes.d.ts +3 -0
- package/dist/app-sidecar/auth-routes.js +290 -0
- package/dist/app-sidecar/auth-routes.js.map +1 -0
- package/dist/app-sidecar/autopilot-runner.d.ts +61 -0
- package/dist/app-sidecar/autopilot-runner.js +367 -0
- package/dist/app-sidecar/autopilot-runner.js.map +1 -0
- package/dist/app-sidecar/file-search.d.ts +15 -0
- package/dist/app-sidecar/file-search.js +103 -0
- package/dist/app-sidecar/file-search.js.map +1 -0
- package/dist/app-sidecar/hf-pull-manager.d.ts +20 -0
- package/dist/app-sidecar/hf-pull-manager.js +224 -0
- package/dist/app-sidecar/hf-pull-manager.js.map +1 -0
- package/dist/app-sidecar/history-routes.d.ts +3 -0
- package/dist/app-sidecar/history-routes.js +375 -0
- package/dist/app-sidecar/history-routes.js.map +1 -0
- package/dist/app-sidecar/history.d.ts +67 -0
- package/dist/app-sidecar/history.js +23 -0
- package/dist/app-sidecar/history.js.map +1 -0
- package/dist/app-sidecar/http.d.ts +5 -0
- package/dist/app-sidecar/http.js +27 -0
- package/dist/app-sidecar/http.js.map +1 -0
- package/dist/app-sidecar/integration-routes.d.ts +3 -0
- package/dist/app-sidecar/integration-routes.js +286 -0
- package/dist/app-sidecar/integration-routes.js.map +1 -0
- package/dist/app-sidecar/json-mode.d.ts +10 -0
- package/dist/app-sidecar/json-mode.js +73 -0
- package/dist/app-sidecar/json-mode.js.map +1 -0
- package/dist/app-sidecar/keep-awake.d.ts +4 -0
- package/dist/app-sidecar/keep-awake.js +5 -0
- package/dist/app-sidecar/keep-awake.js.map +1 -0
- package/dist/app-sidecar/ken-context.d.ts +20 -0
- package/dist/app-sidecar/ken-context.js +55 -0
- package/dist/app-sidecar/ken-context.js.map +1 -0
- package/dist/app-sidecar/mcp-routes.d.ts +3 -0
- package/dist/app-sidecar/mcp-routes.js +185 -0
- package/dist/app-sidecar/mcp-routes.js.map +1 -0
- package/dist/app-sidecar/mcp-rows.d.ts +31 -0
- package/dist/app-sidecar/mcp-rows.js +77 -0
- package/dist/app-sidecar/mcp-rows.js.map +1 -0
- package/dist/app-sidecar/progress-manager.d.ts +10 -0
- package/dist/app-sidecar/progress-manager.js +116 -0
- package/dist/app-sidecar/progress-manager.js.map +1 -0
- package/dist/app-sidecar/prompt-routes.d.ts +3 -0
- package/dist/app-sidecar/prompt-routes.js +354 -0
- package/dist/app-sidecar/prompt-routes.js.map +1 -0
- package/dist/app-sidecar/route-context.d.ts +145 -0
- package/dist/app-sidecar/route-context.js +2 -0
- package/dist/app-sidecar/route-context.js.map +1 -0
- package/dist/app-sidecar/run-control-routes.d.ts +3 -0
- package/dist/app-sidecar/run-control-routes.js +430 -0
- package/dist/app-sidecar/run-control-routes.js.map +1 -0
- package/dist/app-sidecar/session-routes.d.ts +3 -0
- package/dist/app-sidecar/session-routes.js +115 -0
- package/dist/app-sidecar/session-routes.js.map +1 -0
- package/dist/app-sidecar/session-types.d.ts +39 -0
- package/dist/app-sidecar/session-types.js +5 -0
- package/dist/app-sidecar/session-types.js.map +1 -0
- package/dist/app-sidecar/task-routes.d.ts +3 -0
- package/dist/app-sidecar/task-routes.js +149 -0
- package/dist/app-sidecar/task-routes.js.map +1 -0
- package/dist/app-sidecar/usage.d.ts +19 -0
- package/dist/app-sidecar/usage.js +153 -0
- package/dist/app-sidecar/usage.js.map +1 -0
- package/dist/app-sidecar/workspace-routes.d.ts +3 -0
- package/dist/app-sidecar/workspace-routes.js +244 -0
- package/dist/app-sidecar/workspace-routes.js.map +1 -0
- package/dist/app-sidecar.js +440 -3720
- package/dist/app-sidecar.js.map +1 -1
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/core/acceptance-checks.js +3 -9
- package/dist/core/acceptance-checks.js.map +1 -1
- package/dist/core/agent-session/helpers.d.ts +26 -0
- package/dist/core/agent-session/helpers.js +47 -0
- package/dist/core/agent-session/helpers.js.map +1 -0
- package/dist/core/agent-session/mcp-tools.d.ts +68 -0
- package/dist/core/agent-session/mcp-tools.js +195 -0
- package/dist/core/agent-session/mcp-tools.js.map +1 -0
- package/dist/core/agent-session/run-loop-monitor.d.ts +63 -0
- package/dist/core/agent-session/run-loop-monitor.js +164 -0
- package/dist/core/agent-session/run-loop-monitor.js.map +1 -0
- package/dist/core/agent-session/transcript-markers.d.ts +57 -0
- package/dist/core/agent-session/transcript-markers.js +166 -0
- package/dist/core/agent-session/transcript-markers.js.map +1 -0
- package/dist/core/agent-session/verification-tracker.d.ts +46 -0
- package/dist/core/agent-session/verification-tracker.js +246 -0
- package/dist/core/agent-session/verification-tracker.js.map +1 -0
- package/dist/core/agent-session.d.ts +21 -87
- package/dist/core/agent-session.js +141 -712
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-providers.js +3 -3
- package/dist/core/auth-providers.js.map +1 -1
- package/dist/core/bundled-agents.js +6 -6
- package/dist/core/bundled-agents.js.map +1 -1
- package/dist/core/checklist-git.d.ts +19 -0
- package/dist/core/checklist-git.js +54 -0
- package/dist/core/checklist-git.js.map +1 -0
- package/dist/core/checklist-items.d.ts +10 -1
- package/dist/core/checklist-items.js +22 -0
- package/dist/core/checklist-items.js.map +1 -1
- package/dist/core/checklist-prompt.d.ts +5 -1
- package/dist/core/checklist-prompt.js +16 -5
- package/dist/core/checklist-prompt.js.map +1 -1
- package/dist/core/checklist-snapshot.d.ts +5 -1
- package/dist/core/checklist-snapshot.js +19 -2
- package/dist/core/checklist-snapshot.js.map +1 -1
- package/dist/core/context-limits.js +1 -1
- package/dist/core/context-limits.js.map +1 -1
- package/dist/core/skills.js +6 -9
- package/dist/core/skills.js.map +1 -1
- package/dist/core/style-packs/index.js +2 -11
- package/dist/core/style-packs/index.js.map +1 -1
- package/dist/core/style-packs/packs.d.ts +3 -12
- package/dist/core/style-packs/packs.js +132 -173
- package/dist/core/style-packs/packs.js.map +1 -1
- package/dist/system-prompt.js +55 -78
- package/dist/system-prompt.js.map +1 -1
- package/dist/tools/ask-user.js +13 -74
- package/dist/tools/ask-user.js.map +1 -1
- package/dist/tools/bash.js +13 -78
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/checklist.d.ts +2 -10
- package/dist/tools/checklist.js +7 -39
- package/dist/tools/checklist.js.map +1 -1
- package/dist/tools/code-nav.js +7 -29
- package/dist/tools/code-nav.js.map +1 -1
- package/dist/tools/edit.d.ts +3 -9
- package/dist/tools/edit.js +66 -65
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/enter-plan.js +2 -7
- package/dist/tools/enter-plan.js.map +1 -1
- package/dist/tools/exit-plan.js +2 -3
- package/dist/tools/exit-plan.js.map +1 -1
- package/dist/tools/find.js +3 -4
- package/dist/tools/find.js.map +1 -1
- package/dist/tools/grep.js +6 -18
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/ls.js +3 -3
- package/dist/tools/ls.js.map +1 -1
- package/dist/tools/prompt-hints.js +34 -47
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/read.js +8 -20
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/search-code.js +4 -12
- package/dist/tools/search-code.js.map +1 -1
- package/dist/tools/skill.js +13 -7
- package/dist/tools/skill.js.map +1 -1
- package/dist/tools/subagent-control.js +7 -22
- package/dist/tools/subagent-control.js.map +1 -1
- package/dist/tools/subagent.js +4 -7
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/task-output.js +4 -15
- package/dist/tools/task-output.js.map +1 -1
- package/dist/tools/task-send.js +5 -17
- package/dist/tools/task-send.js.map +1 -1
- package/dist/tools/task-stop.js +2 -2
- package/dist/tools/task-stop.js.map +1 -1
- package/dist/tools/tool-search.js +2 -7
- package/dist/tools/tool-search.js.map +1 -1
- package/dist/tools/tool-tiers.d.ts +17 -4
- package/dist/tools/tool-tiers.js +38 -15
- package/dist/tools/tool-tiers.js.map +1 -1
- package/dist/tools/web-fetch.js +7 -33
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/tools/write.js +3 -4
- package/dist/tools/write.js.map +1 -1
- package/dist/ui/components/Footer.js +1 -2
- package/dist/ui/components/Footer.js.map +1 -1
- package/package.json +7 -4
- package/dist/core/api-benchmark.d.ts +0 -63
- package/dist/core/api-benchmark.js +0 -381
- package/dist/core/api-benchmark.js.map +0 -1
- package/dist/core/bash-spawn-benchmark.d.ts +0 -1
- package/dist/core/bash-spawn-benchmark.js +0 -139
- package/dist/core/bash-spawn-benchmark.js.map +0 -1
- package/dist/core/cache-warm-benchmark.d.ts +0 -21
- package/dist/core/cache-warm-benchmark.js +0 -170
- package/dist/core/cache-warm-benchmark.js.map +0 -1
- package/dist/core/fast-apply-benchmark.d.ts +0 -25
- package/dist/core/fast-apply-benchmark.js +0 -284
- package/dist/core/fast-apply-benchmark.js.map +0 -1
- package/dist/core/hashline-edit-benchmark.d.ts +0 -88
- package/dist/core/hashline-edit-benchmark.js +0 -518
- package/dist/core/hashline-edit-benchmark.js.map +0 -1
- package/dist/core/semantic-search-benchmark.d.ts +0 -36
- package/dist/core/semantic-search-benchmark.js +0 -211
- package/dist/core/semantic-search-benchmark.js.map +0 -1
- package/dist/core/speed-benchmark.d.ts +0 -132
- package/dist/core/speed-benchmark.js +0 -410
- package/dist/core/speed-benchmark.js.map +0 -1
|
@@ -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,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 @@
|
|
|
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"}
|