mirror of
https://github.com/aljazceru/claude-code-viewer.git
synced 2026-01-26 17:04:23 +01:00
feat: integrate @anthropic-ai/claude-agent-sdk for latest version
- Added @anthropic-ai/claude-agent-sdk as a dependency for improved functionality. - Updated controllablePromise to include a status property, allowing tracking of promise states (pending, resolved, rejected). - Adjusted query function to utilize the new agent SDK for enhanced query capabilities. - Updated i18n message files for better formatting and consistency.
This commit is contained in:
@@ -1,13 +1,24 @@
|
||||
import { query as originalQuery } from "@anthropic-ai/claude-code";
|
||||
import { query as agentSdkQuery } from "@anthropic-ai/claude-agent-sdk";
|
||||
import { query as claudeCodeQuery } from "@anthropic-ai/claude-code";
|
||||
import { Command, Path } from "@effect/platform";
|
||||
import { Effect } from "effect";
|
||||
import { EnvService } from "../../platform/services/EnvService";
|
||||
import * as ClaudeCodeVersion from "./ClaudeCodeVersion";
|
||||
|
||||
type CCQuery = typeof originalQuery;
|
||||
type CCQuery = typeof claudeCodeQuery;
|
||||
type CCQueryPrompt = Parameters<CCQuery>[0]["prompt"];
|
||||
type CCQueryOptions = NonNullable<Parameters<CCQuery>[0]["options"]>;
|
||||
|
||||
type AgentSdkQuery = typeof agentSdkQuery;
|
||||
type AgentSdkQueryOptions = NonNullable<
|
||||
Parameters<AgentSdkQuery>[0]["options"]
|
||||
>;
|
||||
|
||||
type SharedOptions = Pick<
|
||||
CCQueryOptions,
|
||||
Extract<keyof AgentSdkQueryOptions, keyof CCQueryOptions>
|
||||
>;
|
||||
|
||||
export const Config = Effect.gen(function* () {
|
||||
const path = yield* Path.Path;
|
||||
const envService = yield* EnvService;
|
||||
@@ -73,26 +84,47 @@ export const getAvailableFeatures = (
|
||||
patch: 86,
|
||||
})
|
||||
: false,
|
||||
agentSdk:
|
||||
claudeCodeVersion !== null
|
||||
? ClaudeCodeVersion.greaterThanOrEqual(claudeCodeVersion, {
|
||||
major: 1,
|
||||
minor: 0,
|
||||
patch: 125, // ClaudeCodeAgentSDK is available since v1.0.125
|
||||
})
|
||||
: false,
|
||||
});
|
||||
|
||||
export const query = (prompt: CCQueryPrompt, options: CCQueryOptions) => {
|
||||
export const query = (prompt: CCQueryPrompt, options: SharedOptions) => {
|
||||
const { canUseTool, permissionMode, ...baseOptions } = options;
|
||||
|
||||
return Effect.gen(function* () {
|
||||
const { claudeCodeExecutablePath, claudeCodeVersion } = yield* Config;
|
||||
const availableFeatures = getAvailableFeatures(claudeCodeVersion);
|
||||
|
||||
return originalQuery({
|
||||
const options: SharedOptions = {
|
||||
pathToClaudeCodeExecutable: claudeCodeExecutablePath,
|
||||
...baseOptions,
|
||||
...(availableFeatures.canUseTool
|
||||
? { canUseTool, permissionMode }
|
||||
: {
|
||||
permissionMode: "bypassPermissions",
|
||||
}),
|
||||
};
|
||||
|
||||
if (availableFeatures.agentSdk) {
|
||||
return agentSdkQuery({
|
||||
prompt,
|
||||
options: {
|
||||
systemPrompt: { type: "preset", preset: "claude_code" },
|
||||
settingSources: ["user", "project", "local"],
|
||||
...options,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
return claudeCodeQuery({
|
||||
prompt,
|
||||
options: {
|
||||
pathToClaudeCodeExecutable: claudeCodeExecutablePath,
|
||||
...baseOptions,
|
||||
...(availableFeatures.canUseTool
|
||||
? { canUseTool, permissionMode }
|
||||
: {
|
||||
permissionMode: "bypassPermissions",
|
||||
}),
|
||||
},
|
||||
options: options,
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
@@ -293,6 +293,14 @@ const LayerImpl = Effect.gen(function* () {
|
||||
}),
|
||||
);
|
||||
|
||||
if (sessionInitializedPromise.status === "pending") {
|
||||
sessionInitializedPromise.reject(error);
|
||||
}
|
||||
|
||||
if (sessionFileCreatedPromise.status === "pending") {
|
||||
sessionFileCreatedPromise.reject(error);
|
||||
}
|
||||
|
||||
return "continue" as const;
|
||||
});
|
||||
|
||||
@@ -302,6 +310,14 @@ const LayerImpl = Effect.gen(function* () {
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
if (sessionInitializedPromise.status === "pending") {
|
||||
sessionInitializedPromise.reject(error);
|
||||
}
|
||||
|
||||
if (sessionFileCreatedPromise.status === "pending") {
|
||||
sessionFileCreatedPromise.reject(error);
|
||||
}
|
||||
|
||||
await Effect.runPromise(
|
||||
sessionProcessService.changeTaskState({
|
||||
sessionProcessId: sessionProcess.def.sessionProcessId,
|
||||
@@ -319,6 +335,12 @@ const LayerImpl = Effect.gen(function* () {
|
||||
const daemonPromise = handleSessionProcessDaemon()
|
||||
.catch((error) => {
|
||||
console.error("Error occur in task daemon process", error);
|
||||
if (sessionInitializedPromise.status === "pending") {
|
||||
sessionInitializedPromise.reject(error);
|
||||
}
|
||||
if (sessionFileCreatedPromise.status === "pending") {
|
||||
sessionFileCreatedPromise.reject(error);
|
||||
}
|
||||
throw error;
|
||||
})
|
||||
.finally(() => {
|
||||
|
||||
Reference in New Issue
Block a user