mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-18 06:15:51 +00:00
* feat: 第一版大重构 * fix: 修复类型问题 * chore: 更新版本到 1.3.2 * Add brave as alternative WebSearchTool * fix: 修正顺序 * fix: 修复对穷鬼模式的 auto dream 和 session memory 越过 * feat: 穷鬼模式去除 session-summary * feat: 创建 builtin-tools 包,搬运所有工具实现 将 src/tools/ 下的全部 60 个工具目录迁移至 packages/builtin-tools/src/tools/, 内部导入路径已更新为 src/ alias 模式。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: 更新 src/ 中所有工具引用至 builtin-tools 包,删除 src/tools/ - src/tools.ts 及 178 个 src/ 文件的 import 路径从 ./tools/ 改为 builtin-tools/tools/ - 删除 src/tools/ 整个目录(已迁移至 packages/builtin-tools/) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * chore: 添加 builtin-tools 路径别名至 tsconfig,更新 bun.lock - tsconfig.json 新增 builtin-tools/* 和 builtin-tools 路径映射 - 新增 packages/builtin-tools/src 至 include Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: 为 builtin-tools、mcp-client、agent-tools 添加 @claude-code-best 作用域前缀 所有包名及 import 路径统一添加 @claude-code-best/ 前缀: - builtin-tools → @claude-code-best/builtin-tools - mcp-client → @claude-code-best/mcp-client - agent-tools → @claude-code-best/agent-tools Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: 修复 node 环境没有 bun 的问题 --------- Co-authored-by: Eric-Guo <eric.guocz@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
135 lines
3.6 KiB
TypeScript
135 lines
3.6 KiB
TypeScript
import { feature } from 'bun:bundle'
|
|
import { z } from 'zod/v4'
|
|
import type { ToolResultBlockParam } from 'src/Tool.js'
|
|
import { buildTool } from 'src/Tool.js'
|
|
import { lazySchema } from 'src/utils/lazySchema.js'
|
|
import { SLEEP_TOOL_NAME, DESCRIPTION, SLEEP_TOOL_PROMPT } from './prompt.js'
|
|
|
|
const inputSchema = lazySchema(() =>
|
|
z.strictObject({
|
|
duration_seconds: z
|
|
.number()
|
|
.describe(
|
|
'How long to sleep in seconds. Can be interrupted by the user at any time.',
|
|
),
|
|
}),
|
|
)
|
|
type InputSchema = ReturnType<typeof inputSchema>
|
|
type SleepInput = z.infer<InputSchema>
|
|
|
|
type SleepOutput = { slept_seconds: number; interrupted: boolean }
|
|
|
|
export const SleepTool = buildTool({
|
|
name: SLEEP_TOOL_NAME,
|
|
searchHint: 'wait pause sleep rest idle duration timer',
|
|
maxResultSizeChars: 1_000,
|
|
strict: true,
|
|
|
|
get inputSchema(): InputSchema {
|
|
return inputSchema()
|
|
},
|
|
|
|
async description() {
|
|
return DESCRIPTION
|
|
},
|
|
async prompt() {
|
|
return SLEEP_TOOL_PROMPT
|
|
},
|
|
|
|
isConcurrencySafe() {
|
|
return true
|
|
},
|
|
isReadOnly() {
|
|
return true
|
|
},
|
|
|
|
userFacingName() {
|
|
return SLEEP_TOOL_NAME
|
|
},
|
|
|
|
renderToolUseMessage(input: Partial<SleepInput>) {
|
|
const secs = input.duration_seconds ?? '?'
|
|
return `Sleep: ${secs}s`
|
|
},
|
|
|
|
mapToolResultToToolResultBlockParam(
|
|
content: SleepOutput,
|
|
toolUseID: string,
|
|
): ToolResultBlockParam {
|
|
const msg = content.interrupted
|
|
? `Sleep interrupted after ${content.slept_seconds}s`
|
|
: `Slept for ${content.slept_seconds}s`
|
|
return {
|
|
tool_use_id: toolUseID,
|
|
type: 'tool_result',
|
|
content: msg,
|
|
}
|
|
},
|
|
|
|
async call(input: SleepInput, context) {
|
|
// Refuse to sleep when proactive mode is off — prevents the model from
|
|
// re-issuing Sleep after an interruption caused by /proactive disable.
|
|
if (feature('PROACTIVE') || feature('KAIROS')) {
|
|
const mod =
|
|
require('src/proactive/index.js') as typeof import('src/proactive/index.js')
|
|
if (!mod.isProactiveActive()) {
|
|
return {
|
|
data: {
|
|
slept_seconds: 0,
|
|
interrupted: true,
|
|
},
|
|
}
|
|
}
|
|
}
|
|
|
|
const { duration_seconds } = input
|
|
const startTime = Date.now()
|
|
|
|
try {
|
|
await new Promise<void>((resolve, reject) => {
|
|
const timer = setTimeout(resolve, duration_seconds * 1000)
|
|
|
|
// Abort via user interrupt
|
|
context.abortController.signal.addEventListener(
|
|
'abort',
|
|
() => {
|
|
clearTimeout(timer)
|
|
clearInterval(proactiveCheck)
|
|
reject(new Error('interrupted'))
|
|
},
|
|
{ once: true },
|
|
)
|
|
|
|
// Poll proactive state — if deactivated mid-sleep, interrupt early
|
|
// so the user doesn't have to wait for the full duration.
|
|
const proactiveCheck =
|
|
feature('PROACTIVE') || feature('KAIROS')
|
|
? setInterval(() => {
|
|
const mod =
|
|
require('src/proactive/index.js') as typeof import('src/proactive/index.js')
|
|
if (!mod.isProactiveActive()) {
|
|
clearTimeout(timer)
|
|
clearInterval(proactiveCheck)
|
|
reject(new Error('interrupted'))
|
|
}
|
|
}, 500)
|
|
: (null as unknown as ReturnType<typeof setInterval>)
|
|
})
|
|
return {
|
|
data: {
|
|
slept_seconds: duration_seconds,
|
|
interrupted: false,
|
|
},
|
|
}
|
|
} catch {
|
|
const elapsed = Math.round((Date.now() - startTime) / 1000)
|
|
return {
|
|
data: {
|
|
slept_seconds: elapsed,
|
|
interrupted: true,
|
|
},
|
|
}
|
|
}
|
|
},
|
|
})
|