From c517dd4bf55d5d844b9f121f2bb3591e9599fdb6 Mon Sep 17 00:00:00 2001 From: liuxuezhuo Date: Thu, 6 Aug 2026 08:01:43 +0800 Subject: [PATCH 1/2] fix: restore standard MIT license text for GitHub license detection The explanatory prose between the title and the permission notice kept licensee from matching the MIT template, so the marketplace review bot reported the repository as having no recognized license. The Claudian derivation note moves to NOTICE and the upstream copyright line is kept verbatim in LICENSE. --- LICENSE | 11 ++--------- NOTICE | 3 ++- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/LICENSE b/LICENSE index 9a5fd09..11f2c95 100644 --- a/LICENSE +++ b/LICENSE @@ -1,14 +1,7 @@ MIT License -Portions of this software are derived from Claudian -(https://github.com/YishenTu/claudian), authored by Yishen Tu. Claudian's -upstream MIT copyright notice is retained verbatim: - - Copyright (c) 2025 - -Copyright for Qoderian's own changes and additions: - - Copyright (c) 2026 Qoder +Copyright (c) 2026 Qoder +Copyright (c) 2025 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/NOTICE b/NOTICE index 51c7fdd..4adbb08 100644 --- a/NOTICE +++ b/NOTICE @@ -5,7 +5,8 @@ This project contains code derived from Claudian: https://github.com/YishenTu/claudian Claudian is distributed under the MIT License. Its original copyright notice -and MIT permission notice are retained in this repository's LICENSE file. +("Copyright (c) 2025") is retained verbatim in this repository's LICENSE file +alongside Qoder's own notice, and the MIT permission notice applies to both. Qoder thanks the Claudian authors and contributors for their work. Qoderian also includes or bundles third-party dependencies. Those components From 460548cecbbd52466d99196b27f298e68a66f307 Mon Sep 17 00:00:00 2001 From: liuxuezhuo Date: Thu, 6 Aug 2026 08:10:53 +0800 Subject: [PATCH 2/2] fix: resolve remaining marketplace review source-code warnings - drop type assertions the compiler no longer needs, including the SDK effortLevel workaround that @qoder-ai/qoder-agent-sdk 1.0.16 made obsolete - stop awaiting the void leaf.detach() in duplicate-leaf cleanup - bind child.kill instead of extracting the unbound method in the Windows tree-aware kill shim - mark intentionally fire-and-forget closePersistentQuery calls with void in resetSession and setSessionId --- src/app/settings/settings-storage.ts | 2 +- src/features/chat/chat-view.ts | 2 +- src/features/chat/tabs/tab-qoder-context.ts | 2 +- src/features/chat/ui/status-panel.ts | 2 +- src/main.ts | 2 +- src/qoder/history/qoder-conversation-history-service.ts | 2 +- src/qoder/runtime/custom-spawn.ts | 4 +--- src/qoder/runtime/qoder-chat-runtime.ts | 4 ++-- src/qoder/runtime/qoder-dynamic-updates.ts | 4 +--- src/qoder/services/qoder-title-generation-service.ts | 2 +- 10 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/app/settings/settings-storage.ts b/src/app/settings/settings-storage.ts index 2770786..668e1ff 100644 --- a/src/app/settings/settings-storage.ts +++ b/src/app/settings/settings-storage.ts @@ -104,7 +104,7 @@ function normalizeKeyboardNavigation(value: unknown): KeyboardNavigationSettings const candidate = value as Partial>; const pick = (key: keyof KeyboardNavigationSettings): string => typeof candidate[key] === 'string' && candidate[key] - ? candidate[key] as string + ? candidate[key] : defaults[key]; return { diff --git a/src/features/chat/chat-view.ts b/src/features/chat/chat-view.ts index 86f69b0..5d0810a 100644 --- a/src/features/chat/chat-view.ts +++ b/src/features/chat/chat-view.ts @@ -61,7 +61,7 @@ export class QoderianView extends ItemView { // overwritten by prototype patching. Hover Editor patches QoderianView.prototype.load // after our class is defined, but instance methods take precedence over prototype methods. const prototype = Object.getPrototypeOf(this) as LoadableView; - const originalLoad = prototype.load.bind(this) as () => Promise | void; + const originalLoad = prototype.load.bind(this); Object.defineProperty(this, 'load', { value: async () => { // Ensure containerEl exists before any patched load code tries to use it diff --git a/src/features/chat/tabs/tab-qoder-context.ts b/src/features/chat/tabs/tab-qoder-context.ts index a24ff43..482e716 100644 --- a/src/features/chat/tabs/tab-qoder-context.ts +++ b/src/features/chat/tabs/tab-qoder-context.ts @@ -41,7 +41,7 @@ export function getTabSettingsSnapshot( _tab: TabQoderContext, plugin: QoderianPlugin, ): TabQoderSettings { - return plugin.settings as TabQoderSettings; + return plugin.settings; } export function getTabPermissionMode( diff --git a/src/features/chat/ui/status-panel.ts b/src/features/chat/ui/status-panel.ts index aa7a336..ac9f18d 100644 --- a/src/features/chat/ui/status-panel.ts +++ b/src/features/chat/ui/status-panel.ts @@ -129,7 +129,7 @@ export class StatusPanel { addBashOutput(info: PanelBashOutput): void { this.currentBashOutputs.set(info.id, info); while (this.currentBashOutputs.size > MAX_BASH_OUTPUTS) { - const oldest = this.currentBashOutputs.keys().next().value as string | undefined; + const oldest = this.currentBashOutputs.keys().next().value; if (!oldest) break; this.currentBashOutputs.delete(oldest); this.bashEntryExpanded.delete(oldest); diff --git a/src/main.ts b/src/main.ts index 7ac8a2a..a670497 100644 --- a/src/main.ts +++ b/src/main.ts @@ -202,7 +202,7 @@ export default class QoderianPlugin extends Plugin { for (const leaf of leaves) { if (leaf === keepLeaf) continue; try { - await leaf.detach(); + leaf.detach(); } catch { // Best-effort cleanup; the leaf may already be detached. } diff --git a/src/qoder/history/qoder-conversation-history-service.ts b/src/qoder/history/qoder-conversation-history-service.ts index a7862cd..ae46e1e 100644 --- a/src/qoder/history/qoder-conversation-history-service.ts +++ b/src/qoder/history/qoder-conversation-history-service.ts @@ -307,7 +307,7 @@ function sanitizeQoderState( return undefined; } - return Object.fromEntries(sanitizedEntries) as QoderState; + return Object.fromEntries(sanitizedEntries); } export function buildPersistedQoderState( diff --git a/src/qoder/runtime/custom-spawn.ts b/src/qoder/runtime/custom-spawn.ts index 5e01291..854f83d 100644 --- a/src/qoder/runtime/custom-spawn.ts +++ b/src/qoder/runtime/custom-spawn.ts @@ -73,9 +73,7 @@ function installTreeAwareKill(child: ChildProcess, spawnSpec: WindowsCmdShimSpaw return; } - const originalKill = child.kill; - const callOriginalKill = (signal?: NodeJS.Signals | number): boolean => - originalKill.call(child, signal); + const callOriginalKill = child.kill.bind(child); const killableChild = { get pid(): number | undefined { return child.pid; diff --git a/src/qoder/runtime/qoder-chat-runtime.ts b/src/qoder/runtime/qoder-chat-runtime.ts index 65bdd8f..e6c6e5e 100644 --- a/src/qoder/runtime/qoder-chat-runtime.ts +++ b/src/qoder/runtime/qoder-chat-runtime.ts @@ -1178,7 +1178,7 @@ export class QoderChatRuntime implements ChatRuntime { */ resetSession() { // Close persistent query (new session will use cold-start resume) - this.closePersistentQuery('session reset'); + void this.closePersistentQuery('session reset'); // Reset crash recovery for fresh start this.crashRecoveryAttempted = false; @@ -1258,7 +1258,7 @@ export class QoderChatRuntime implements ChatRuntime { // Close synchronously when session changes if (sessionChanged) { - this.closePersistentQuery('session switch'); + void this.closePersistentQuery('session switch'); this.crashRecoveryAttempted = false; } diff --git a/src/qoder/runtime/qoder-dynamic-updates.ts b/src/qoder/runtime/qoder-dynamic-updates.ts index ee6ace8..53915c0 100644 --- a/src/qoder/runtime/qoder-dynamic-updates.ts +++ b/src/qoder/runtime/qoder-dynamic-updates.ts @@ -79,9 +79,7 @@ export async function applyQoderDynamicUpdates( const currentEffort = deps.getCurrentConfig()?.effortLevel ?? null; if (effortLevel !== currentEffort) { try { - // SDK runtime accepts `max`, but the current type definition for - // Settings.effortLevel has not caught up yet. - await persistentQuery.applyFlagSettings({ effortLevel } as unknown as Parameters[0]); + await persistentQuery.applyFlagSettings({ effortLevel }); deps.mutateCurrentConfig(config => { config.effortLevel = effortLevel; }); diff --git a/src/qoder/services/qoder-title-generation-service.ts b/src/qoder/services/qoder-title-generation-service.ts index 96d6622..262082a 100644 --- a/src/qoder/services/qoder-title-generation-service.ts +++ b/src/qoder/services/qoder-title-generation-service.ts @@ -74,7 +74,7 @@ export class QoderTitleGenerationService { const titleModel = this.plugin.settings.titleGenerationModel || 'auto'; if (qoderModelConfig.isKnownModel( titleModel, - this.plugin.settings as unknown as Record, + this.plugin.settings, )) { return toQoderRuntimeModelId(titleModel); }