@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,290 @@
|
|
|
1
|
+
import { XIAOMI_CREDITS_KEY, dualAuthProvider } from "@kenkaiiii/gg-core";
|
|
2
|
+
import { loginAnthropic } from "../core/oauth/anthropic.js";
|
|
3
|
+
import { loginOpenAI } from "../core/oauth/openai.js";
|
|
4
|
+
import { loginGemini } from "../core/oauth/gemini.js";
|
|
5
|
+
import { loginKimi } from "../core/oauth/kimi.js";
|
|
6
|
+
import { loginXai } from "../core/oauth/xai.js";
|
|
7
|
+
import { AUTH_PROVIDERS } from "../core/auth-providers.js";
|
|
8
|
+
import { readBody, json } from "./http.js";
|
|
9
|
+
export function handleAuthRoutes(ctx, req, res, url, method) {
|
|
10
|
+
// ── Provider auth (login) ───────────────────────────────
|
|
11
|
+
if (method === "GET" && url === "/auth/status") {
|
|
12
|
+
void ctx.authStatusPayload().then((payload) => json(res, 200, payload));
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
if (method === "POST" && url === "/auth/apikey") {
|
|
16
|
+
void readBody(req, res).then(async (raw) => {
|
|
17
|
+
if (raw === null)
|
|
18
|
+
return;
|
|
19
|
+
let provider = "";
|
|
20
|
+
let key;
|
|
21
|
+
let variant;
|
|
22
|
+
try {
|
|
23
|
+
const body = JSON.parse(raw);
|
|
24
|
+
provider = body.provider ?? "";
|
|
25
|
+
key = (body.key ?? "").trim();
|
|
26
|
+
variant = body.variant;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
json(res, 400, { error: "invalid JSON body" });
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const meta = AUTH_PROVIDERS.find((p) => p.value === provider);
|
|
33
|
+
if (!meta || !meta.methods.includes("apikey")) {
|
|
34
|
+
json(res, 400, { error: "provider does not support API key auth" });
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (!key) {
|
|
38
|
+
json(res, 400, { error: "API key is required" });
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// Providers with multiple API-key variants (currently only Xiaomi: Token
|
|
42
|
+
// Plan vs. API Credits) store under the chosen variant's key/baseUrl,
|
|
43
|
+
// defaulting to the first variant. Single-variant providers fall back to
|
|
44
|
+
// the legacy provider-id storage key + flat apiKeyBaseUrl.
|
|
45
|
+
const chosenVariant = meta.apiKeyVariants?.find((v) => v.key === variant) ?? meta.apiKeyVariants?.[0];
|
|
46
|
+
const storageKey = chosenVariant?.key ?? provider;
|
|
47
|
+
const baseUrl = chosenVariant?.baseUrl ?? meta.apiKeyBaseUrl;
|
|
48
|
+
const creds = {
|
|
49
|
+
accessToken: key,
|
|
50
|
+
refreshToken: "",
|
|
51
|
+
expiresAt: Date.now() + 365 * 24 * 60 * 60 * 1000 * 100, // ~100y
|
|
52
|
+
...(baseUrl ? { baseUrl } : {}),
|
|
53
|
+
};
|
|
54
|
+
await ctx.auth.setCredentials(storageKey, creds);
|
|
55
|
+
// auth.json is shared by every window, so this is a global change:
|
|
56
|
+
// close their login modals and refresh their provider lists too.
|
|
57
|
+
ctx.broadcastAll("auth_done", { provider });
|
|
58
|
+
// `auth_done` means "a login succeeded" (modals close on it).
|
|
59
|
+
// `auth_change` means "auth.json changed" — which a DISCONNECT also is,
|
|
60
|
+
// so connection state has one signal that covers both directions.
|
|
61
|
+
ctx.broadcastAll("auth_change", { provider });
|
|
62
|
+
// A newly connected provider unlocks its models. `/models` filters on
|
|
63
|
+
// who is logged in, so every window's picker is now stale — without
|
|
64
|
+
// this the new models don't appear until the session is reopened.
|
|
65
|
+
ctx.broadcastAll("models_change", {});
|
|
66
|
+
json(res, 200, { ok: true });
|
|
67
|
+
});
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
if (method === "POST" && url === "/auth/oauth/start") {
|
|
71
|
+
void readBody(req, res).then((raw) => {
|
|
72
|
+
if (raw === null)
|
|
73
|
+
return;
|
|
74
|
+
let provider = "";
|
|
75
|
+
try {
|
|
76
|
+
provider = JSON.parse(raw).provider ?? "";
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
json(res, 400, { error: "invalid JSON body" });
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const meta = AUTH_PROVIDERS.find((p) => p.value === provider);
|
|
83
|
+
if (!meta || !meta.methods.includes("oauth")) {
|
|
84
|
+
json(res, 400, { error: "provider does not support OAuth" });
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (ctx.oauthInFlight) {
|
|
88
|
+
json(res, 409, { error: "a login is already in progress" });
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// A login writes the shared ~/.gg/auth.json, so two windows racing the
|
|
92
|
+
// same provider means two browser tabs and two token exchanges whose
|
|
93
|
+
// writes clobber each other. The per-session flag above cannot see
|
|
94
|
+
// that — guard the provider daemon-wide as well.
|
|
95
|
+
if (ctx.oauthInFlightProviders.has(provider)) {
|
|
96
|
+
json(res, 409, {
|
|
97
|
+
error: `a ${meta.label} login is already in progress in another window`,
|
|
98
|
+
});
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
ctx.oauthInFlight = true;
|
|
102
|
+
ctx.oauthInFlightProviders.add(provider);
|
|
103
|
+
json(res, 202, { accepted: true });
|
|
104
|
+
void (async () => {
|
|
105
|
+
const cb = ctx.authCallbacks();
|
|
106
|
+
try {
|
|
107
|
+
let creds;
|
|
108
|
+
let storageKey = provider;
|
|
109
|
+
if (provider === "anthropic")
|
|
110
|
+
creds = await loginAnthropic(cb);
|
|
111
|
+
else if (provider === "openai")
|
|
112
|
+
creds = await loginOpenAI(cb);
|
|
113
|
+
else if (provider === "gemini")
|
|
114
|
+
creds = await loginGemini(cb);
|
|
115
|
+
else if (provider === "moonshot" || provider === "xai") {
|
|
116
|
+
// Subscription OAuth (Kimi plan / SuperGrok-X Premium) stores under
|
|
117
|
+
// a distinct key so it can coexist with the provider's API key.
|
|
118
|
+
creds = provider === "moonshot" ? await loginKimi(cb) : await loginXai(cb);
|
|
119
|
+
storageKey = dualAuthProvider(provider).oauthKey;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
throw new Error(`OAuth not implemented for ${provider}`);
|
|
123
|
+
}
|
|
124
|
+
await ctx.auth.setCredentials(storageKey, creds);
|
|
125
|
+
// Terminal outcome of a GLOBAL change: every window's login modal
|
|
126
|
+
// should close and its provider list refresh, not just the one
|
|
127
|
+
// that started the flow.
|
|
128
|
+
ctx.broadcastAll("auth_done", { provider });
|
|
129
|
+
ctx.broadcastAll("auth_change", { provider });
|
|
130
|
+
// The OAuth provider's models just became selectable everywhere.
|
|
131
|
+
ctx.broadcastAll("models_change", {});
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
// Deliberately session-scoped: this is the outcome of ONE window's
|
|
135
|
+
// attempt. Another window that never pressed Connect has nothing to
|
|
136
|
+
// show an error about, and its modal correctly still offers login.
|
|
137
|
+
ctx.broadcast("auth_error", {
|
|
138
|
+
provider,
|
|
139
|
+
message: err instanceof Error ? err.message : String(err),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
finally {
|
|
143
|
+
ctx.oauthInFlight = false;
|
|
144
|
+
ctx.oauthInFlightProviders.delete(provider);
|
|
145
|
+
ctx.pendingCode = null;
|
|
146
|
+
}
|
|
147
|
+
})();
|
|
148
|
+
});
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
if (method === "POST" && url === "/auth/oauth/code") {
|
|
152
|
+
void readBody(req, res).then((raw) => {
|
|
153
|
+
if (raw === null)
|
|
154
|
+
return;
|
|
155
|
+
let code;
|
|
156
|
+
try {
|
|
157
|
+
code = JSON.parse(raw).code ?? "";
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
json(res, 400, { error: "invalid JSON body" });
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (!ctx.pendingCode) {
|
|
164
|
+
json(res, 409, { error: "no login is awaiting a code" });
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
ctx.pendingCode(code.trim());
|
|
168
|
+
ctx.pendingCode = null;
|
|
169
|
+
json(res, 200, { ok: true });
|
|
170
|
+
});
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
if (method === "POST" && url.startsWith("/mcp/elicit/")) {
|
|
174
|
+
const id = decodeURIComponent(url.slice("/mcp/elicit/".length));
|
|
175
|
+
void readBody(req, res).then((raw) => {
|
|
176
|
+
if (raw === null)
|
|
177
|
+
return;
|
|
178
|
+
let result;
|
|
179
|
+
try {
|
|
180
|
+
const parsed = JSON.parse(raw);
|
|
181
|
+
if (parsed.action !== "accept" &&
|
|
182
|
+
parsed.action !== "decline" &&
|
|
183
|
+
parsed.action !== "cancel") {
|
|
184
|
+
json(res, 400, { error: "action must be accept, decline, or cancel" });
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
result =
|
|
188
|
+
parsed.action === "accept"
|
|
189
|
+
? { action: "accept", content: parsed.content ?? {} }
|
|
190
|
+
: { action: parsed.action };
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
json(res, 400, { error: "invalid JSON body" });
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
// Unknown id means it already timed out or was cancelled by an abort —
|
|
197
|
+
// the tool call has moved on, so the answer has nowhere to go.
|
|
198
|
+
if (!ctx.elicitations.settle(id, result)) {
|
|
199
|
+
json(res, 409, { error: "no elicitation is awaiting a response" });
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
json(res, 200, { ok: true });
|
|
203
|
+
});
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
// Answer (or dismiss) an `ask_user` question band. The turn is blocked on
|
|
207
|
+
// this, so both paths must land: "answer" carries the picked values,
|
|
208
|
+
// "cancel" releases the tool call with no answer.
|
|
209
|
+
if (method === "POST" && url.startsWith("/ask/")) {
|
|
210
|
+
const id = decodeURIComponent(url.slice("/ask/".length));
|
|
211
|
+
void readBody(req, res).then((raw) => {
|
|
212
|
+
if (raw === null)
|
|
213
|
+
return;
|
|
214
|
+
let result;
|
|
215
|
+
try {
|
|
216
|
+
const parsed = JSON.parse(raw);
|
|
217
|
+
if (parsed.action !== "answer" && parsed.action !== "cancel") {
|
|
218
|
+
json(res, 400, { error: "action must be answer or cancel" });
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
if (parsed.action === "cancel") {
|
|
222
|
+
result = { action: "cancel" };
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
// Only strings and string arrays are answers; anything else is a
|
|
226
|
+
// malformed client, not a value to hand the model.
|
|
227
|
+
const answers = {};
|
|
228
|
+
for (const [key, value] of Object.entries(parsed.answers ?? {})) {
|
|
229
|
+
if (typeof value === "string")
|
|
230
|
+
answers[key] = value;
|
|
231
|
+
else if (Array.isArray(value) && value.every((v) => typeof v === "string")) {
|
|
232
|
+
answers[key] = value;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
result = { action: "answer", answers };
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
json(res, 400, { error: "invalid JSON body" });
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
if (!ctx.asks.settle(id, result)) {
|
|
243
|
+
json(res, 409, { error: "no question is awaiting an answer" });
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
json(res, 200, { ok: true });
|
|
247
|
+
});
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
if (method === "POST" && url === "/auth/logout") {
|
|
251
|
+
void readBody(req, res).then(async (raw) => {
|
|
252
|
+
if (raw === null)
|
|
253
|
+
return;
|
|
254
|
+
let provider;
|
|
255
|
+
let logoutMethod;
|
|
256
|
+
try {
|
|
257
|
+
const body = JSON.parse(raw);
|
|
258
|
+
provider = body.provider ?? "";
|
|
259
|
+
logoutMethod =
|
|
260
|
+
body.method === "oauth" || body.method === "apikey" ? body.method : undefined;
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
json(res, 400, { error: "invalid JSON body" });
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
const dual = dualAuthProvider(provider);
|
|
267
|
+
// A dual-auth provider can be disconnected one method at a time: dropping
|
|
268
|
+
// a spent API key should not sign the user out of their subscription, and
|
|
269
|
+
// vice versa. Omitting `method` still clears everything (the plain
|
|
270
|
+
// "Disconnect" action).
|
|
271
|
+
if (logoutMethod !== "apikey") {
|
|
272
|
+
await ctx.auth.clearCredentials(dual ? dual.oauthKey : provider);
|
|
273
|
+
}
|
|
274
|
+
if (logoutMethod !== "oauth") {
|
|
275
|
+
// Non-dual providers store their only credential under the provider id,
|
|
276
|
+
// so this covers both them and a dual provider's API key.
|
|
277
|
+
await ctx.auth.clearCredentials(provider);
|
|
278
|
+
// Xiaomi's API Credits credential lives under a distinct key — clear it
|
|
279
|
+
// too so "disconnect" fully removes both the Token Plan and Credits keys.
|
|
280
|
+
if (provider === "xiaomi")
|
|
281
|
+
await ctx.auth.clearCredentials(XIAOMI_CREDITS_KEY);
|
|
282
|
+
}
|
|
283
|
+
ctx.broadcast("auth_done", { provider });
|
|
284
|
+
json(res, 200, { ok: true });
|
|
285
|
+
});
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=auth-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-routes.js","sourceRoot":"","sources":["../../src/app-sidecar/auth-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { Provider } from "@kenkaiiii/gg-ai";
|
|
2
|
+
import type { AgentSession } from "../core/agent-session.js";
|
|
3
|
+
import type { RunLifecycle } from "../core/run-lifecycle.js";
|
|
4
|
+
import { type AutopilotVerdict } from "../core/autopilot-verdict.js";
|
|
5
|
+
import { type WorkflowCommandSpec } from "../core/autopilot-gate.js";
|
|
6
|
+
import type { RunOutcome } from "../core/session-manager.js";
|
|
7
|
+
/** Closure state of one session that the autopilot / stranded-queue / task runners use. */
|
|
8
|
+
export interface AutopilotRunnerContext {
|
|
9
|
+
autopilotReviewing: boolean;
|
|
10
|
+
readonly broadcast: (type: string, data: unknown) => void;
|
|
11
|
+
readonly ensureKenAutoSession: () => Promise<AgentSession>;
|
|
12
|
+
readonly cwd: string;
|
|
13
|
+
gitBranch: string | null;
|
|
14
|
+
session: AgentSession;
|
|
15
|
+
injectedAutopilotPrompts: string[];
|
|
16
|
+
readonly loadWorkflowCommandSpecs: () => Promise<WorkflowCommandSpec[]>;
|
|
17
|
+
autopilotCancelled: boolean;
|
|
18
|
+
readonly broadcastError: (type: "error" | "ken_error" | "autopilot_error", logLabel: string, err: unknown) => void;
|
|
19
|
+
pendingKenAutoModel: {
|
|
20
|
+
provider: Provider;
|
|
21
|
+
model: string;
|
|
22
|
+
} | null;
|
|
23
|
+
readonly syncKenAutoModel: (provider: Provider, model: string) => Promise<void>;
|
|
24
|
+
pendingPlanPath: string | null;
|
|
25
|
+
planGeneration: number;
|
|
26
|
+
pendingPlanContent: string;
|
|
27
|
+
autopilot: boolean;
|
|
28
|
+
readonly runLifecycle: RunLifecycle;
|
|
29
|
+
readonly abortOwnedWork: () => void;
|
|
30
|
+
pendingCancelDrain: {
|
|
31
|
+
generation: number;
|
|
32
|
+
text: string;
|
|
33
|
+
} | null;
|
|
34
|
+
autopilotActive: boolean;
|
|
35
|
+
readonly MAX_AUTOPILOT_ROUNDS: number;
|
|
36
|
+
readonly activateApprovedPlan: (planPath: string | undefined) => Promise<number>;
|
|
37
|
+
readonly clearPendingPlan: () => void;
|
|
38
|
+
readonly planProgressPayload: () => {
|
|
39
|
+
total: number;
|
|
40
|
+
completed: number[];
|
|
41
|
+
};
|
|
42
|
+
readonly IMPLEMENT_PLAN_PROMPT: string;
|
|
43
|
+
readonly runAgent: (label: string, run: () => Promise<void>, reviewPending?: () => boolean) => Promise<void>;
|
|
44
|
+
kenAutoSession: AgentSession | null;
|
|
45
|
+
readonly reenterPlanModeForRevision: () => Promise<void>;
|
|
46
|
+
readonly finishOwnedGeneration: (generation: number, emitCancelledFallback: boolean, outcome?: RunOutcome) => boolean;
|
|
47
|
+
drainingStrandedQueue: boolean;
|
|
48
|
+
running: boolean;
|
|
49
|
+
readonly offerPendingPlan: () => void;
|
|
50
|
+
readonly deactivateApprovedPlan: () => void;
|
|
51
|
+
taskRunAll: boolean;
|
|
52
|
+
}
|
|
53
|
+
export interface AutopilotRunnerContextApi {
|
|
54
|
+
runAutopilotReview: (originalRequest: string) => Promise<AutopilotVerdict | null>;
|
|
55
|
+
runAutopilotPlanReview: (originalRequest: string) => Promise<AutopilotVerdict | null>;
|
|
56
|
+
runAutopilotCycle: (originalRequest: string) => Promise<void>;
|
|
57
|
+
runStrandedQueue: () => Promise<void>;
|
|
58
|
+
runTaskById: (taskId: string) => Promise<boolean>;
|
|
59
|
+
runTasks: (startId: string | null, all: boolean) => Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
export declare function createAutopilotRunner(ctx: AutopilotRunnerContext): AutopilotRunnerContextApi;
|