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:
d-kimsuon
2025-10-20 01:03:13 +09:00
parent d55d52f659
commit 81a5d31f6e
8 changed files with 113 additions and 32 deletions

View File

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

View File

@@ -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(() => {