mirror of
https://github.com/deepseek-ai/deepseek-harness
synced 2026-08-15 21:04:50 +00:00
New top-level packages/cordis/ group with the self-referential toolset: cordis_inspect (services / plugin tree / tools / dynamic mounts / api / events, the api section intersecting the generated catalog with the live service store), cordis_mount (model-written code evaluated in a node:vm sandbox, mounted under one cordis-dynamic group fiber as dyn-<n>), cordis_unmount (awaited disposal to quiescence). Boundary mechanisms: dual-realm instanceof, JSON realm normalization of dynamic tool results, marker-guarded registration, SchemaSpec teaching errors, parse failures surfaced with the offending line + caret and a line-scoped TypeScript hint, and the unmount-first recipe on tool-name collisions. Config: vmTimeoutMs (schemastery, default 5000). Design record: docs/rfc/implemented/feature/2026-07-08-self-referential-cordis-toolset.md. The tool-catalog boot manifest, its regenerated output, and the pinned tool-name list land here rather than with the other repo registration: the completeness guard globs packages/*/tool-* and fails the generator (and the core/tools spec) the moment the package directory exists.
42 lines
1.9 KiB
TypeScript
42 lines
1.9 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import { presentInspectCall, presentMountCall, presentUnmountCall } from '../src/present.ts'
|
|
import { setup } from './helpers.ts'
|
|
|
|
/**
|
|
* Render-intent presenters: pure functions of the call args (no I/O, no
|
|
* session state — they run on replay too), wired onto the registered tools.
|
|
*/
|
|
|
|
describe('presenters', () => {
|
|
it('cordis_inspect renders a generic read card titled with the section', () => {
|
|
expect(presentInspectCall({})).toEqual({ card: 'generic', kind: 'read', title: 'Inspect cordis runtime' })
|
|
expect(presentInspectCall({ what: 'api' })).toEqual({ card: 'generic', kind: 'read', title: 'Inspect cordis runtime: api' })
|
|
})
|
|
|
|
it('cordis_mount renders a generic execute card carrying the code as raw input', () => {
|
|
expect(presentMountCall({ code: 'return (ctx) => {}' })).toEqual({
|
|
card: 'generic',
|
|
kind: 'execute',
|
|
title: 'Mount plugin into live cordis runtime',
|
|
rawInput: { code: 'return (ctx) => {}' },
|
|
})
|
|
})
|
|
|
|
it('cordis_unmount renders a generic delete card titled with the id', () => {
|
|
expect(presentUnmountCall({ id: 'dyn-1' })).toEqual({ card: 'generic', kind: 'delete', title: 'Unmount dyn-1' })
|
|
})
|
|
|
|
it('is wired onto the registered definitions through the defineTool soft-validation path', async () => {
|
|
const ctx = await setup()
|
|
expect(ctx.tools.get('cordis_inspect')!.presentCall!({ what: 'tools' })).toEqual({
|
|
card: 'generic',
|
|
kind: 'read',
|
|
title: 'Inspect cordis runtime: tools',
|
|
})
|
|
expect(ctx.tools.get('cordis_mount')!.presentCall!({ code: 'return 1' })).toMatchObject({ kind: 'execute' })
|
|
expect(ctx.tools.get('cordis_unmount')!.presentCall!({ id: 'dyn-2' })).toMatchObject({ title: 'Unmount dyn-2' })
|
|
// Soft validation: presenter args that fail the schema render as no card, never a throw.
|
|
expect(ctx.tools.get('cordis_unmount')!.presentCall!({ id: 42 })).toBeUndefined()
|
|
})
|
|
})
|