Skip to content

Commit a457d5f

Browse files
committed
fix: restore vscode runtime modules and align workspace deps
Restore missing vscode legacy-approval and webview components, export SDK catalog/skill helpers, sort and unify sherif-flagged dependency ranges, and refresh the nix pnpmDeps hash.
1 parent c35f2f2 commit a457d5f

21 files changed

Lines changed: 857 additions & 124 deletions

File tree

‎apps/pythinker-code/package.json‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,12 @@
8686
"@pymodel/acp-server": "workspace:^",
8787
"@pymodel/agent-core-v2": "workspace:^",
8888
"@pymodel/agent-gateway": "workspace:^",
89-
"@pymodel/pythinker-code-oauth": "workspace:^",
90-
"@pymodel/pythinker-code-sdk": "workspace:^",
91-
"@pymodel/pythinker-telemetry": "workspace:^",
9289
"@pymodel/migration-legacy": "workspace:^",
9390
"@pymodel/minidb": "workspace:^",
9491
"@pymodel/pi-tui": "workspace:^",
92+
"@pymodel/pythinker-code-oauth": "workspace:^",
93+
"@pymodel/pythinker-code-sdk": "workspace:^",
94+
"@pymodel/pythinker-telemetry": "workspace:^",
9595
"@pymodel/remote-control": "workspace:^",
9696
"@pymodel/vis-server": "workspace:^",
9797
"@pymodel/vis-web": "workspace:*",
@@ -108,15 +108,15 @@
108108
"postject": "1.0.0-alpha.6",
109109
"semver": "^7.7.4",
110110
"smol-toml": "^1.6.1",
111-
"tsx": "^4.21.0",
111+
"tsx": "^4.23.5",
112112
"yazl": "^3.3.1",
113-
"zod": "^4.3.6"
113+
"zod": "catalog:"
114114
},
115115
"engines": {
116116
"node": ">=22.19.0"
117117
},
118118
"dependencies": {
119119
"qrcode": "^1.5.4",
120-
"ws": "^8.18.0"
120+
"ws": "^8.21.3"
121121
}
122122
}

‎apps/vscode/package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,10 +288,10 @@
288288
"dependencies": {
289289
"@base-ui/react": "^1.0.0",
290290
"@fontsource-variable/inter": "5.2.8",
291+
"@pymodel/migration-legacy": "workspace:^",
291292
"@pymodel/pythinker-code-oauth": "workspace:^",
292293
"@pymodel/pythinker-code-sdk": "workspace:^",
293294
"@pymodel/pythinker-telemetry": "workspace:^",
294-
"@pymodel/migration-legacy": "workspace:^",
295295
"@radix-ui/react-accordion": "^1.2.12",
296296
"@tabler/icons-react": "^3.36.0",
297297
"@tanstack/react-query": "^5.74.4",

‎apps/vscode/src/handlers/auth.handler.ts‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,23 @@ export const authHandlers: Record<string, Handler<any, any>> = {
5454
}
5555
},
5656
};
57+
58+
59+
export async function performLogout(
60+
harness: { auth: { logout: () => Promise<unknown> } },
61+
logError: (message: string, error?: unknown) => void,
62+
): Promise<LoginResult> {
63+
try {
64+
await harness.auth.logout();
65+
await updateLoginContext(harness as never);
66+
return { success: true };
67+
} catch (error) {
68+
logError("Pythinker logout failed", error);
69+
try {
70+
await updateLoginContext(harness as never);
71+
} catch (statusError) {
72+
logError("Unable to refresh login status after a failed logout", statusError);
73+
}
74+
return { success: false, error: error instanceof Error ? error.message : String(error) };
75+
}
76+
}

‎apps/vscode/src/handlers/config.handler.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ const getModels: Handler<void, WebviewPythinkerConfig> = async (_, ctx) => {
8989
return toWebviewConfig(config);
9090
};
9191

92-
const getSlashCommands: Handler<void, SlashCommandInfo[]> = async (_, ctx) => {
92+
export const getSlashCommands: Handler<void, SlashCommandInfo[]> = async (_, ctx) => {
9393
if (!ctx.workDir) return SLASH_COMMANDS;
9494
try {
9595
const skills = await ctx.harness.listWorkspaceSkills(ctx.workDir);
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { readFile } from "node:fs/promises";
2+
import { join } from "node:path";
3+
4+
import type { JsonObject, PermissionMode } from "@pymodel/pythinker-code-sdk";
5+
6+
export const LEGACY_APPROVAL_METADATA_KEY = "vscode_legacy_approval";
7+
8+
export interface LegacyApprovalFlags {
9+
readonly yolo: boolean;
10+
readonly afk: boolean;
11+
}
12+
13+
export function readLegacyApprovalFlags(
14+
metadata: Readonly<Record<string, unknown>> | undefined,
15+
): LegacyApprovalFlags | undefined {
16+
const value = metadata?.[LEGACY_APPROVAL_METADATA_KEY];
17+
return parseLegacyApprovalFlags(value);
18+
}
19+
20+
export async function readMigratedLegacyApprovalFlags(
21+
metadata: Readonly<Record<string, unknown>> | undefined,
22+
): Promise<LegacyApprovalFlags | undefined> {
23+
const sourcePath = metadata?.["pythinker_cli_source_path"];
24+
if (typeof sourcePath !== "string" || sourcePath.length === 0) return undefined;
25+
let text: string;
26+
try {
27+
text = await readFile(join(sourcePath, "state.json"), "utf8");
28+
} catch (error) {
29+
if ((error as NodeJS.ErrnoException).code === "ENOENT") return undefined;
30+
throw error;
31+
}
32+
const state = JSON.parse(text) as { readonly approval?: unknown };
33+
return parseLegacyApprovalFlags(state.approval);
34+
}
35+
36+
function parseLegacyApprovalFlags(value: unknown): LegacyApprovalFlags | undefined {
37+
if (typeof value !== "object" || value === null || Array.isArray(value)) return undefined;
38+
const yolo = Reflect.get(value, "yolo");
39+
const afk = Reflect.get(value, "afk");
40+
if (typeof yolo !== "boolean" && typeof afk !== "boolean") return undefined;
41+
return {
42+
yolo: typeof yolo === "boolean" ? yolo : false,
43+
afk: typeof afk === "boolean" ? afk : false,
44+
};
45+
}
46+
47+
export function legacyApprovalMetadata(flags: LegacyApprovalFlags): JsonObject {
48+
return {
49+
[LEGACY_APPROVAL_METADATA_KEY]: {
50+
yolo: flags.yolo,
51+
afk: flags.afk,
52+
},
53+
};
54+
}
55+
56+
export function corePermissionForLegacyApproval(flags: LegacyApprovalFlags): PermissionMode {
57+
if (flags.afk) return "auto";
58+
return flags.yolo ? "yolo" : "manual";
59+
}
60+
61+
/**
62+
* The global `pythinker.yoloMode` setting is authoritative whenever a session
63+
* attaches to the runtime; afk stays per-session because it has no global
64+
* setting counterpart.
65+
*/
66+
export function withGlobalYoloMode(
67+
flags: LegacyApprovalFlags,
68+
yoloMode: boolean,
69+
): LegacyApprovalFlags {
70+
return flags.yolo === yoloMode ? flags : { yolo: yoloMode, afk: flags.afk };
71+
}

‎apps/vscode/webview-ui/src/App.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { useQueryClient } from "@tanstack/react-query";
44
import { Header } from "./components/Header";
55
import { ChatArea } from "./components/ChatArea";
66
import { InputArea } from "./components/inputarea/InputArea";
7-
import { MCPServersModal } from "./components/MCPServersModal";
7+
import { MCPServersModal } from "./components/confighub/MCPServersSection";
88
import { WorkDirModal } from "./components/WorkDirModal";
99
import { ConfigErrorScreen } from "./components/ConfigErrorScreen";
1010
import { LoginScreen } from "./components/LoginScreen";

0 commit comments

Comments
 (0)