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 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); }