* feat: 适配 zed acp 协议 * docs: 完善 acp 文档 * feat: integrate feature branches + daemon/job 命令层级化 + 跨平台后台引擎 Cherry-picked from origin/lint/preview (637c908), excluding lint-only changes. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: correct detectMimeFromBase64 to decode raw bytes from base64 Cherry-picked from origin/lint/preview (ee36954). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: daemon 子进程 spawn 跨平台修复 + CliLaunchSpec 集中化重构 Cherry-picked from origin/lint/preview (c5f52cd), excluding lint-only formatting changes. - 新建 src/utils/cliLaunch.ts: 集中化 CLI 子进程启动层 - 修复 --daemon-worker=kind 等号格式解析 - 修复 daemon/bg fast path 缺少 setShellIfWindows() - 修复 checkPathExists 用 existsSync 替代 execSync('dir') - 7 个 spawn 站点迁移到 CliLaunchSpec Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: merge tsconfig.base.json into tsconfig.json with full compiler options The cherry-pick from637c908dropped jsx/strict/etc settings when removing tsconfig.base.json. This commit restores them in a single tsconfig.json. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: merge tsconfig.base.json into tsconfig.json with full compiler options The cherry-pick from637c908dropped jsx/strict/etc settings when removing tsconfig.base.json. This commit restores them in a single tsconfig.json. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
94 lines
2.8 KiB
TypeScript
94 lines
2.8 KiB
TypeScript
/**
|
|
* Tests for src/utils/taskSummary.ts
|
|
*
|
|
* Covers: shouldGenerateTaskSummary, maybeGenerateTaskSummary
|
|
*
|
|
* Note: bun:bundle's feature() is a compile-time construct and cannot be
|
|
* trivially mocked at test time. We test maybeGenerateTaskSummary (which
|
|
* is called unconditionally) and the rate-limit behavior indirectly.
|
|
*/
|
|
import { describe, expect, test, mock, beforeEach } from 'bun:test'
|
|
|
|
// ─── mocks ──────────────────────────────────────────────────────────────────
|
|
|
|
let _updateCalls: any[] = []
|
|
|
|
mock.module('bun:bundle', () => ({
|
|
feature: (_name: string) => false,
|
|
}))
|
|
|
|
mock.module('../concurrentSessions.js', () => ({
|
|
isBgSession: () => false,
|
|
updateSessionActivity: async (data: any) => {
|
|
_updateCalls.push(data)
|
|
},
|
|
}))
|
|
|
|
mock.module('../debug.js', () => ({
|
|
logForDebugging: () => {},
|
|
}))
|
|
|
|
// ─── import after mocks ─────────────────────────────────────────────────────
|
|
|
|
const { shouldGenerateTaskSummary, maybeGenerateTaskSummary } = await import(
|
|
'../taskSummary.js'
|
|
)
|
|
|
|
// ─── tests ──────────────────────────────────────────────────────────────────
|
|
|
|
beforeEach(() => {
|
|
_updateCalls = []
|
|
})
|
|
|
|
describe('shouldGenerateTaskSummary', () => {
|
|
test('returns false when feature is disabled', () => {
|
|
// bun:bundle feature mock returns false
|
|
expect(shouldGenerateTaskSummary()).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('maybeGenerateTaskSummary', () => {
|
|
test('does not throw with empty messages', () => {
|
|
expect(() =>
|
|
maybeGenerateTaskSummary({ forkContextMessages: [] }),
|
|
).not.toThrow()
|
|
})
|
|
|
|
test('does not throw with undefined messages', () => {
|
|
expect(() => maybeGenerateTaskSummary({})).not.toThrow()
|
|
})
|
|
|
|
test('does not throw with assistant message containing tool_use', () => {
|
|
expect(() =>
|
|
maybeGenerateTaskSummary({
|
|
forkContextMessages: [
|
|
{
|
|
type: 'assistant',
|
|
message: {
|
|
content: [
|
|
{ type: 'text', text: 'Let me check' },
|
|
{ type: 'tool_use', name: 'bash' },
|
|
],
|
|
},
|
|
},
|
|
],
|
|
}),
|
|
).not.toThrow()
|
|
})
|
|
|
|
test('does not throw with non-array content', () => {
|
|
expect(() =>
|
|
maybeGenerateTaskSummary({
|
|
forkContextMessages: [
|
|
{
|
|
type: 'assistant',
|
|
message: {
|
|
content: 'plain text response',
|
|
},
|
|
},
|
|
],
|
|
}),
|
|
).not.toThrow()
|
|
})
|
|
})
|