mirror of
https://github.com/wu736139669/hapi.git
synced 2026-10-07 19:06:11 +00:00
* feat(dsh): add DeepSeek Harness ACP flavor * fix(dsh): update mobile flavor catalogs * fix(dsh): keep mobile spawn policy managed * fix(dsh): keep managed policy and prompt retry * fix(dsh): suppress unsupported runner policy flags * fix(dsh): align native managed-policy UX
97 lines
3.8 KiB
TypeScript
97 lines
3.8 KiB
TypeScript
import { describe, expect, test } from 'bun:test'
|
|
import {
|
|
AgentConfigDescriptorSchema,
|
|
getAgentConfigDescriptor,
|
|
getBuiltinAgentConfigDescriptors,
|
|
resolveHapiYoloPermissionMode
|
|
} from './agentConfig'
|
|
|
|
describe('agent config descriptors', () => {
|
|
test('exposes the three primary fields with their intended placements', () => {
|
|
const descriptor = getAgentConfigDescriptor('codex')
|
|
expect(descriptor.fields.map((field) => [field.id, field.section])).toEqual([
|
|
['model', 'model'],
|
|
['effort', 'effort'],
|
|
['permission', 'permission'],
|
|
['serviceTier', 'settings'],
|
|
['collaborationMode', 'settings']
|
|
])
|
|
})
|
|
|
|
test('models Cursor variant as a dependent model field rather than a page-specific control', () => {
|
|
const descriptor = getAgentConfigDescriptor('cursor')
|
|
expect(descriptor.fields).toContainEqual(expect.objectContaining({
|
|
id: 'model',
|
|
kind: 'dependent-select',
|
|
optionSource: 'machine'
|
|
}))
|
|
})
|
|
|
|
test('reports DSH permission as managed by its ACP composition', () => {
|
|
const descriptor = getAgentConfigDescriptor('dsh')
|
|
expect(descriptor.fields).toEqual([expect.objectContaining({
|
|
id: 'permission',
|
|
kind: 'status',
|
|
availability: 'managed'
|
|
})])
|
|
expect(resolveHapiYoloPermissionMode('dsh')).toBeNull()
|
|
})
|
|
|
|
test('reports Pi permission as managed rather than pretending YOLO applies', () => {
|
|
const descriptor = getAgentConfigDescriptor('pi')
|
|
expect(descriptor.fields).toContainEqual(expect.objectContaining({
|
|
id: 'permission',
|
|
kind: 'status',
|
|
availability: 'managed'
|
|
}))
|
|
expect(descriptor.fields).toContainEqual(expect.objectContaining({
|
|
id: 'model',
|
|
kind: 'grouped-select',
|
|
optionSource: 'machine',
|
|
availability: 'both'
|
|
}))
|
|
expect(descriptor.fields).toContainEqual(expect.objectContaining({
|
|
id: 'effort',
|
|
optionSource: 'static',
|
|
availability: 'both'
|
|
}))
|
|
expect(resolveHapiYoloPermissionMode('pi')).toBeNull()
|
|
})
|
|
|
|
test('maps HAPI YOLO to each supported agent native permission mode', () => {
|
|
expect(resolveHapiYoloPermissionMode('claude')).toBe('bypassPermissions')
|
|
expect(resolveHapiYoloPermissionMode('grok')).toBe('bypassPermissions')
|
|
expect(resolveHapiYoloPermissionMode('codex')).toBe('yolo')
|
|
expect(resolveHapiYoloPermissionMode('cursor')).toBe('yolo')
|
|
expect(resolveHapiYoloPermissionMode('opencode')).toBe('yolo')
|
|
expect(resolveHapiYoloPermissionMode('kimi')).toBe('yolo')
|
|
})
|
|
|
|
test('validates descriptors received from a runner', () => {
|
|
expect(AgentConfigDescriptorSchema.safeParse({
|
|
flavor: 'example-agent',
|
|
fields: [{
|
|
id: 'model',
|
|
section: 'model',
|
|
kind: 'grouped-select',
|
|
optionSource: 'directory',
|
|
availability: 'both'
|
|
}]
|
|
}).success).toBe(true)
|
|
})
|
|
|
|
test('every builtin descriptor validates and carries a permission field', () => {
|
|
const descriptors = getBuiltinAgentConfigDescriptors()
|
|
expect(descriptors.length).toBeGreaterThan(0)
|
|
for (const descriptor of descriptors) {
|
|
expect(AgentConfigDescriptorSchema.safeParse(descriptor).success).toBe(true)
|
|
expect(descriptor.fields.some((field) => field.id === 'permission')).toBe(true)
|
|
}
|
|
})
|
|
})
|
|
|
|
test('runner capabilities carry descriptors for every built-in agent', async () => {
|
|
const { RUNNER_CAPABILITIES } = await import('./runnerCapabilities')
|
|
expect(RUNNER_CAPABILITIES.agentConfigs.map((descriptor) => descriptor.flavor)).toContain('cursor')
|
|
})
|