feat(session-query): add model-facing tools (round 1)

This commit is contained in:
Hypatia May
2026-07-24 15:09:55 +08:00
parent b92235c490
commit a350e95165
40 changed files with 2781 additions and 13 deletions

View File

@@ -41,6 +41,7 @@
"@deepseek-ai/dsh-session": "workspace:^",
"@deepseek-ai/dsh-session-persistence": "workspace:^",
"@deepseek-ai/dsh-session-persistence-jsonl": "workspace:^",
"@deepseek-ai/dsh-session-query-sqlite": "workspace:^",
"@deepseek-ai/dsh-session-title": "workspace:^",
"@deepseek-ai/dsh-session-title-first-message-llm": "workspace:^",
"@deepseek-ai/dsh-skill": "workspace:^",
@@ -58,6 +59,7 @@
"@deepseek-ai/dsh-tool-fs": "workspace:^",
"@deepseek-ai/dsh-tool-fs-search": "workspace:^",
"@deepseek-ai/dsh-tool-skill": "workspace:^",
"@deepseek-ai/dsh-tool-session-query": "workspace:^",
"@deepseek-ai/dsh-tool-subagent": "workspace:^",
"@deepseek-ai/dsh-tool-tasks": "workspace:^",
"@deepseek-ai/dsh-tool-todo": "workspace:^",

View File

@@ -5,6 +5,7 @@
*/
import { Context } from 'cordis'
import { join } from 'node:path'
import Timer from '@cordisjs/plugin-timer'
import LlmService from '@deepseek-ai/dsh-llm'
import SessionStore from '@deepseek-ai/dsh-session'
@@ -18,6 +19,8 @@ import TaskService from '@deepseek-ai/dsh-tasks'
import AgentLoop from '@deepseek-ai/dsh-agent-loop'
import * as LlmDeepSeek from '@deepseek-ai/dsh-llm-deepseek'
import SessionPersistenceJsonl from '@deepseek-ai/dsh-session-persistence-jsonl'
import SessionQuerySqlite from '@deepseek-ai/dsh-session-query-sqlite'
import * as toolSessionQuery from '@deepseek-ai/dsh-tool-session-query'
import LocalBashExecutor from '@deepseek-ai/dsh-bash-local'
import * as toolBash from '@deepseek-ai/dsh-tool-bash'
import * as toolTodo from '@deepseek-ai/dsh-tool-todo'
@@ -61,7 +64,7 @@ const DEFAULT_SESSION_TITLE_LLM_CONFIG: SessionTitleLlmConfig = {
/** Options for bootHost — the assembly-layer composition knobs. */
export interface BootHostOptions {
/** Root directory for JSONL session persistence. */
/** Root for JSONL persistence and parent directory of the derived session-query SQLite index. */
persistenceRoot: string
/** Workspace-instruction byte budget/config, or false to disable AGENTS.md/CLAUDE.md loading. */
workspaceContext: workspaceContext.Config | false
@@ -131,6 +134,8 @@ export async function bootHost(options: BootHostOptions): Promise<HostHandle> {
await ctx.plugin(AgentLoop, { agents: [] })
await ctx.plugin(LlmDeepSeek, {})
await ctx.plugin(SessionPersistenceJsonl, { root: options.persistenceRoot })
await ctx.plugin(SessionQuerySqlite, { path: join(options.persistenceRoot, 'session-query.db') })
await ctx.plugin(toolSessionQuery, {})
await ctx.plugin(LocalBashExecutor, {})
// Tool suite mirroring the demo:repl composition (repl-agent/cordis.yml +
// the agent-spine bundle) so web sessions get the same coding-agent tool

View File

@@ -141,6 +141,24 @@ describe('bootHost / startHost', () => {
await handle.dispose()
})
it('assembles workspace-authorized session query tools over the derived SQLite index', async () => {
const persistenceRoot = mkdtempSync(join(tmpdir(), 'dsh-boot-session-query-'))
const handle = await bootHost({
persistenceRoot,
workspaceContext: false,
})
expect(handle.ctx.get('sessionQuery')).toBeDefined()
expect(handle.ctx.tools.schemas().map(schema => schema.name)).toEqual(expect.arrayContaining([
'session_search',
'session_event_search',
'session_trace',
'session_event_trace',
'session_event_read',
]))
expect(handle.ctx.tools.get('session_search')?.timeoutMs).toBe(30_000)
await handle.dispose()
})
it('startHost assembles api + handler over the same defaults and dedupes dispose', async () => {
const running = await boot()
expect(running.defaults).toMatchObject({ provider: 'scripted', model: 'test-model' })

View File

@@ -47,6 +47,12 @@
{
"path": "../../session-persistence/session-persistence-jsonl"
},
{
"path": "../../session-query/session-query-sqlite"
},
{
"path": "../../session-query/tool-session-query"
},
{
"path": "../../bash/bash-local"
},