mirror of
https://github.com/deepseek-ai/deepseek-harness
synced 2026-08-15 21:04:50 +00:00
150 lines
4.8 KiB
Markdown
150 lines
4.8 KiB
Markdown
# Session Query
|
|
|
|
Query vocabulary over the live-preferred logical session corpus. The [interface package](../../packages/session-query/session-query) owns exact reads, source precedence, semantic extraction and provider-independent filters, while the [SQLite package](../../packages/session-query/session-query-sqlite) owns the concrete full-text index lifecycle.
|
|
|
|
Source: [`packages/session-query/session-query/src/types.ts`](../../packages/session-query/session-query/src/types.ts)
|
|
|
|
## Logical records
|
|
|
|
`SessionRecord` is returned by the cross-corpus list. It exposes source availability independently from the cloned live-preferred header. `SessionEventRecord` is a lightweight raw-log projection; classification uses the same `foldSurface()` transitions as model-history derivation.
|
|
|
|
```ts type-equiv
|
|
export type SessionEventSurface = 'current' | 'shadowed' | 'log-only'
|
|
```
|
|
|
|
```ts type-equiv
|
|
export interface SessionRecord {
|
|
header: SessionHeader
|
|
live: boolean
|
|
persisted: boolean
|
|
}
|
|
```
|
|
|
|
```ts type-equiv
|
|
export interface SessionEventRecord {
|
|
sessionId: SessionId
|
|
seq: number
|
|
type: SessionEventType
|
|
time: number
|
|
surface: SessionEventSurface
|
|
}
|
|
```
|
|
|
|
## Provider-independent filters and documents
|
|
|
|
Session and event filter arrays are ANDed; values inside one list clause are ORed. Ranges are inclusive. The event `text` clause is a literal Unicode case-insensitive, whitespace-flexible regular-expression scan over extracted semantic text, independent of full-text providers.
|
|
|
|
```ts type-equiv
|
|
export type SessionResultFilter =
|
|
| { kind: 'id'; values: readonly SessionId[] }
|
|
| { kind: 'cwd'; values: readonly (string | null)[] }
|
|
| ({ kind: 'created-at' } & SessionResultRange)
|
|
| { kind: 'parent'; values: readonly (SessionId | null)[] }
|
|
| { kind: 'availability'; values: readonly SessionAvailability[] }
|
|
```
|
|
|
|
```ts type-equiv
|
|
export type SessionEventResultFilter =
|
|
| ({ kind: 'seq' } & SessionResultRange)
|
|
| ({ kind: 'time' } & SessionResultRange)
|
|
| { kind: 'type'; values: readonly SessionEventType[] }
|
|
| { kind: 'surface'; values: readonly SessionEventSurface[] }
|
|
| { kind: 'text'; text: string }
|
|
```
|
|
|
|
```ts type-equiv
|
|
export interface SessionEventSearchDocument extends SessionEventRecord {
|
|
text: string
|
|
}
|
|
```
|
|
|
|
`ctx.sessionQuery.filterEvents(sessionId, filters)` returns these documents in ascending seq order. Messages, reasoning, tool calls/results, blocked prompts, todos, and failure/status detail contribute semantic text; structural events and stream chunks do not.
|
|
|
|
## Full-text search pages
|
|
|
|
The independent `ctx.sessionSearch` seam has two scopes. `searchSessions()` groups the corpus by strongest matching event; `searchEvents()` searches one session. Requests bind an opaque cursor to the normalized query, metadata filters, and limit. The event text scan is intentionally absent from provider metadata filters.
|
|
|
|
```ts type-equiv
|
|
export interface SessionSearchRequest {
|
|
query: string
|
|
sessionFilters?: readonly SessionResultFilter[]
|
|
eventFilters?: readonly SessionEventMetadataFilter[]
|
|
limit?: number
|
|
cursor?: string
|
|
}
|
|
```
|
|
|
|
```ts type-equiv
|
|
export interface SessionEventSearchRequest {
|
|
sessionId: SessionId
|
|
query: string
|
|
filters?: readonly SessionEventMetadataFilter[]
|
|
limit?: number
|
|
cursor?: string
|
|
}
|
|
```
|
|
|
|
```ts type-equiv
|
|
export interface SessionSearchPage<T> {
|
|
items: readonly T[]
|
|
nextCursor?: string
|
|
}
|
|
```
|
|
|
|
```ts type-equiv
|
|
export interface SessionEventSearchHit extends SessionEventRecord {
|
|
snippet: string
|
|
}
|
|
```
|
|
|
|
```ts type-equiv
|
|
export interface SessionSearchHit extends SessionRecord {
|
|
bestMatch: SessionEventSearchHit
|
|
}
|
|
```
|
|
|
|
## Bounded event reads
|
|
|
|
The request addresses one raw seq and optional neighboring counts. The result carries a `SessionHeader` rather than availability flags so a known live target can remain independent of persistence health.
|
|
|
|
```ts type-equiv
|
|
export interface SessionEventReadRequest {
|
|
sessionId: SessionId
|
|
seq: number
|
|
before?: number
|
|
after?: number
|
|
}
|
|
```
|
|
|
|
```ts type-equiv
|
|
export interface SessionEventWindow {
|
|
session: SessionHeader
|
|
target: SessionEvent
|
|
events: SessionEvent[]
|
|
startSeq: number
|
|
endSeq: number
|
|
}
|
|
```
|
|
|
|
## Errors
|
|
|
|
The closed code union distinguishes request validation, missing targets, malformed surface logs, optional-backend failure, and contradictory source metadata.
|
|
|
|
```ts type-equiv
|
|
export type SessionQueryErrorCode =
|
|
| 'SESSION_QUERY_ABORTED'
|
|
| 'SESSION_QUERY_EVENT_NOT_FOUND'
|
|
| 'SESSION_QUERY_INDEX_FAILED'
|
|
| 'SESSION_QUERY_INVALID_CONFIG'
|
|
| 'SESSION_QUERY_INVALID_CURSOR'
|
|
| 'SESSION_QUERY_INVALID_FILTER'
|
|
| 'SESSION_QUERY_INVALID_LIMIT'
|
|
| 'SESSION_QUERY_INVALID_QUERY'
|
|
| 'SESSION_QUERY_INVALID_SURFACE'
|
|
| 'SESSION_QUERY_INVALID_WINDOW'
|
|
| 'SESSION_QUERY_PERSISTENCE_FAILED'
|
|
| 'SESSION_QUERY_SESSION_NOT_FOUND'
|
|
| 'SESSION_QUERY_STALE_CURSOR'
|
|
| 'SESSION_QUERY_SOURCE_CONFLICT'
|
|
```
|