# Conflicts: # .agents/notes/implemented/feature/2026-06-14-acp-agent-client-protocol.md # .agents/notes/implemented/feature/2026-06-14-acp-agent-client-protocol.zh.md # .agents/notes/implemented/feature/2026-06-30-hook-bridges.i18n.yaml # .agents/notes/implemented/feature/2026-06-30-interception-seams.i18n.yaml # .agents/notes/implemented/feature/2026-07-06-sandbox.i18n.yaml # .agents/notes/implemented/feature/2026-07-06-sandbox.md # .agents/notes/implemented/feature/2026-07-06-sandbox.zh.md # .agents/notes/implemented/feature/2026-07-19-model-facing-goal-tools.i18n.yaml # .agents/notes/implemented/feature/2026-07-19-same-session-goal-round-driver.i18n.yaml # .agents/notes/implemented/feature/2026-07-25-workspace-ui-product-flow.i18n.yaml # .agents/notes/implemented/simplification/2026-07-02-remove-stream-chunk-mirror.i18n.yaml # docs/architecture.i18n.yaml # docs/cookbook/adding-a-tool.i18n.yaml # docs/cookbook/extension-cookbook.i18n.yaml # docs/core-data-structures/llm-streaming.i18n.yaml # docs/core-data-structures/session.i18n.yaml # docs/core-data-structures/tools.i18n.yaml # docs/event-producer-consumer.md # docs/persistence-catalog.md # examples/acp-agent/tests/snapshots/cordis-inspect-jsdoc/stdout.expected.jsonl # examples/acp-agent/tests/snapshots/escalation-approved/session.jsonl # examples/acp-agent/tests/snapshots/escalation-rejected/session.jsonl # examples/acp-agent/tests/snapshots/fs-escalation-approved/session.jsonl # examples/acp-agent/tests/snapshots/hook-cc-pretool-ask/session.jsonl # examples/acp-agent/tests/snapshots/permission-switching/session.jsonl # examples/acp-agent/tests/snapshots/plan-mode-reject/session.jsonl # examples/acp-agent/tests/snapshots/plan-mode/session.jsonl # examples/acp-agent/tests/snapshots/session-sandbox-root/session.jsonl # packages/context/session-reference/README.md # packages/core/agent-loop/tests/agent.spec.ts # packages/hooks/hooks-claude/tests/coverage-cases.ts # packages/host/runtime/tests/host-runtime.spec.ts # packages/llm/llm-retry/tests/retry.spec.ts # packages/session-persistence/session-persistence/src/coordinator.ts # packages/support/acp-snapshot/README.md # packages/support/acp-snapshot/src/normalize.ts # packages/ui/acp/acp-feature-support.md # packages/ui/acp/src/codec.ts # packages/ui/acp/src/index.ts # packages/ui/acp/tests/bridge.spec.ts # packages/ui/acp/tests/codec.spec.ts # packages/ui/acp/tests/config-options.spec.ts # packages/ui/acp/tests/dispose.spec.ts # packages/ui/acp/tests/edges.spec.ts # packages/ui/acp/tests/stream-update.spec.ts # packages/ui/acp/tests/turns.spec.ts
38 lines
1.6 KiB
TypeScript
38 lines
1.6 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import type { TurnEndReason } from '@deepseek-ai/dsh-session'
|
|
import { acpPromptToText, promptHasUnsupportedContent, turnEndToStopReason } from '../src/codec.ts'
|
|
|
|
describe('ACP automation codec', () => {
|
|
it('maps every known turn outcome to a legal stop reason', () => {
|
|
const cases: [TurnEndReason, string][] = [
|
|
[{ kind: 'completed' }, 'end_turn'],
|
|
[{ kind: 'max-tokens' }, 'max_tokens'],
|
|
[{ kind: 'aborted' }, 'cancelled'],
|
|
[{ kind: 'disposed' }, 'cancelled'],
|
|
[{ kind: 'interrupted' }, 'cancelled'],
|
|
[{ kind: 'error', step: 1, message: 'boom' }, 'end_turn'],
|
|
]
|
|
for (const [reason, expected] of cases) expect(turnEndToStopReason(reason)).toBe(expected)
|
|
})
|
|
|
|
it('uses a legal fallback for merge-extensible future outcomes', () => {
|
|
expect(turnEndToStopReason({ kind: 'future' } as unknown as TurnEndReason)).toBe('end_turn')
|
|
})
|
|
|
|
it('flattens baseline blocks and rejects everything richer', () => {
|
|
expect(acpPromptToText([{ type: 'text', text: 'a' }, { type: 'text', text: 'b' }])).toBe('ab')
|
|
expect(acpPromptToText([
|
|
{ type: 'text', text: 'see' },
|
|
{ type: 'resource_link', name: 'x', uri: 'file:///x' },
|
|
])).toBe('see\n[resource_link name="x" uri="file:///x"]\n')
|
|
expect(acpPromptToText([{ type: 'image', data: '', mimeType: 'image/png' }])).toBe('')
|
|
expect(promptHasUnsupportedContent([
|
|
{ type: 'text', text: 'ok' },
|
|
{ type: 'resource_link', name: 'x', uri: 'file:///x' },
|
|
])).toBe(false)
|
|
expect(promptHasUnsupportedContent([
|
|
{ type: 'image', data: '', mimeType: 'image/png' },
|
|
])).toBe(true)
|
|
})
|
|
})
|