2026-07-23 01:05:50 +08:00
# 会话查询
2026-07-15 23:11:25 -07:00
[English ](session-query.md ) | 中文
2026-08-04 17:36:14 +08:00
本文定义逻辑会话语料库的查询词汇;当 live 数据存在时,该语料库优先使用 live 数据。[接口包 ](../../packages/session-query/session-query )负责精确读取、来源优先级、关系追踪、语义提取,以及与提供方无关的过滤器;[SQLite 包 ](../../packages/session-query/session-query-sqlite )负责具体全文索引的生命周期。
2026-07-15 23:11:25 -07:00
源码:[`packages/session-query/session-query/src/types.ts` ](../../packages/session-query/session-query/src/types.ts )
## 逻辑记录
2026-08-04 17:36:14 +08:00
`SessionRecord` 由全语料库列表返回。它除了克隆的、优先取自 live 源的 header 外,还单独公开各源的可用性。`SessionEventRecord` 是轻量的原始日志投影;分类使用与模型历史推导相同的 `foldSurface()` 状态转换。
2026-07-15 23:11:25 -07:00
```ts type-equiv
2026-07-22 22:58:05 +08:00
/** Whether an event is current model context, replaced context, or raw-log-only. */
type SessionEventSurface = 'current' | 'shadowed' | 'log-only'
2026-07-15 23:11:25 -07:00
` ``
` ``ts type-equiv
2026-07-22 22:58:05 +08:00
/** Lightweight identity and source availability for one logical session. */
interface SessionRecord {
/** Cloned session header selected from the live-preferred corpus. */
2026-07-15 23:11:25 -07:00
header: SessionHeader
2026-07-22 22:58:05 +08:00
/** Whether the id currently exists in ` ctx.sessions`. */
2026-07-15 23:11:25 -07:00
live: boolean
2026-07-22 22:58:05 +08:00
/** Whether the active persistence backend currently materializes the id. */
2026-07-15 23:11:25 -07:00
persisted: boolean
}
` ``
2026-07-24 17:07:23 +08:00
` SessionLogSnapshot` 是供恢复预检使用的完整原始日志:它脱离运行时,并经过回放验证。` SessionSurfaceSnapshot` 表示一次精确读取的 surface 观测结果,而不是持续保留的订阅。
` ``ts type-equiv
/** One validated detached observation of a logical session's complete raw log. */
interface SessionLogSnapshot {
/** Cloned session header selected from the same observation as ` events`. */
session: SessionHeader
/** Cloned contiguous raw events after persistence repair and replay validation. */
events: SessionEvent[]
}
` ``
2026-07-23 00:19:53 +08:00
` ``ts type-equiv
/** One atomic live-preferred observation of a session's current model surface. */
interface SessionSurfaceSnapshot {
/** Cloned session header selected from the same corpus observation as ` events`. */
session: SessionHeader
/** Highest raw-log seq included in the observation, or ` null` for an empty log. */
capturedThroughSeq: number | null
/** Cloned current surface events in model-history order. */
events: SurfaceEvent[]
}
` ``
2026-08-04 17:36:14 +08:00
` SessionTitleObservation` 将同样的原子观测规则应用于标题折叠,使执行授权检查的消费方能够验证提供标题的源 header。批量读取会按顺序为每个唯一请求 id 返回一个 ` SessionTitleObservationResult`:操作失败只影响对应 id,而取消会拒绝整个操作。
2026-07-25 14:17:24 +08:00
` ``ts type-equiv
/** Latest folded title bound to the same session-header observation. */
interface SessionTitleObservation {
/** Cloned header selected with the event log used for the title fold. */
session: SessionHeader
/** Latest title snapshot, absent when the observed log has no title. */
title?: SessionTitleSnapshot
}
` ``
` ``ts type-equiv
/** One ordered result from a batch title observation. */
type SessionTitleObservationResult =
| {
/** Requested session id. */
sessionId: SessionId
/** Successful atomic header/title observation. */
status: 'fulfilled'
/** Header and optional latest title from one logical source. */
value: SessionTitleObservation
}
| {
/** Requested session id. */
sessionId: SessionId
/** Operational failure isolated to this session. */
status: 'rejected'
/** Original failure from logical-source resolution or title folding. */
reason: unknown
}
` ``
2026-07-15 23:11:25 -07:00
` ``ts type-equiv
2026-07-22 22:58:05 +08:00
/** Lightweight metadata for one event within a logical session. */
interface SessionEventRecord {
/** Session that owns the event. */
2026-07-15 23:11:25 -07:00
sessionId: SessionId
2026-07-22 22:58:05 +08:00
/** Monotonic event seq within the session. */
2026-07-15 23:11:25 -07:00
seq: number
2026-07-22 22:58:05 +08:00
/** Discriminant of the session event. */
2026-07-15 23:11:25 -07:00
type: SessionEventType
2026-07-22 22:58:05 +08:00
/** Event timestamp in Unix epoch milliseconds. */
2026-07-15 23:11:25 -07:00
time: number
2026-07-22 22:58:05 +08:00
/** Event placement in the folded session surface. */
2026-07-15 23:11:25 -07:00
surface: SessionEventSurface
}
` ``
2026-07-24 00:00:04 +08:00
## 与提供方无关的过滤器和文档
2026-08-04 17:36:14 +08:00
会话和事件过滤器数组内的各项按逻辑与(AND)组合;单个列表子句中的各值按逻辑或(OR)组合。范围包含两端。事件的 ` text` 子句会对提取出的语义文本执行正则表达式扫描:搜索文本按字面量处理,按 Unicode 规则执行不区分大小写的匹配,并允许灵活匹配空白字符;该过程与全文搜索提供方无关。
2026-07-24 00:00:04 +08:00
` ``ts type-equiv
/**
* One logical-session predicate. A filter array is ANDed; ` values` within a
* clause are ORed.
*/
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
/**
* One event predicate. A filter array is ANDed; list-valued clauses are ORed.
* Text is a literal, case-insensitive, whitespace-flexible semantic-text scan.
*/
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
/** Searchable semantic document derived from one session event. */
interface SessionEventSearchDocument extends SessionEventRecord {
/** First-party semantic text used by scan filters and full-text indexes. */
text: string
}
` ``
` ctx.sessionQuery.filterSessions(filters)` 会对完整的逻辑会话语料库应用 ` SessionResultFilter`; ` ctx.sessionQuery.filterEvents(sessionId, filters)` 按 seq 升序返回匹配的文档。消息、推理(reasoning)、工具调用和工具结果、被阻止的提示词、待办事项,以及失败和状态详情会纳入语义文本;结构事件和流分片则不会。
## 全文搜索结果页
整合后的 ` ctx.sessionQuery` seam 提供两个全文搜索范围。` searchSessions()` 按匹配度最强的事件对语料库分组;` searchEvents()` 搜索单个会话。请求将不透明游标与规范化后的查询、元数据过滤器和结果数量上限绑定。提供方的元数据过滤器有意不包含事件文本扫描。
` ``ts type-equiv
/** Provider-owned opaque continuation token returned by session search. */
type SessionSearchCursor = Branded<'SessionSearchCursor'>
` ``
` ``ts type-equiv
/** Cross-session full-text search request. */
interface SessionSearchRequest {
/** Full-text query interpreted as data, never executable FTS syntax. */
query: string
/** Logical-session predicates applied before event ranking. */
sessionFilters?: readonly SessionResultFilter[]
/** Event predicates applied before event ranking. */
eventFilters?: readonly SessionEventMetadataFilter[]
/** Maximum sessions in this page. */
limit?: number
/** Opaque cursor returned for the identical normalized request. */
cursor?: SessionSearchCursor
}
` ``
` ``ts type-equiv
/** Within-session full-text search request. */
interface SessionEventSearchRequest {
/** Session whose live-preferred logical log is searched. */
sessionId: SessionId
/** Full-text query interpreted as data, never executable FTS syntax. */
query: string
/** Event predicates applied before ranking. */
filters?: readonly SessionEventMetadataFilter[]
/** Maximum events in this page. */
limit?: number
/** Opaque cursor returned for the identical normalized request. */
cursor?: SessionSearchCursor
}
` ``
` ``ts type-equiv
/** One cursor-paginated result page. */
interface SessionSearchPage<T> {
/** Results for this page in contract-defined order. */
items: readonly T[]
/** Opaque continuation cursor, absent on the final page. */
nextCursor?: SessionSearchCursor
}
` ``
2026-08-04 17:36:14 +08:00
与跨会话分组 hit 不同,会话内搜索结果即使没有命中项,也必须公开搜索时观测到的目标 header。
2026-07-25 14:17:24 +08:00
` ``ts type-equiv
/** Event-search results bound to the indexed target-session observation. */
interface SessionEventSearchPage extends SessionSearchPage<SessionEventSearchHit> {
/** Cloned target header from the same indexed generation as ` items`. */
session: SessionHeader
}
` ``
2026-07-24 00:00:04 +08:00
` ``ts type-equiv
/** One event full-text search hit with a bounded plain-text excerpt. */
interface SessionEventSearchHit extends SessionEventRecord {
/** Plain text excerpt selected around the match. */
snippet: string
}
` ``
` ``ts type-equiv
/** One grouped cross-session hit, ranked by its strongest matching event. */
interface SessionSearchHit extends SessionRecord {
/** Strongest matching event for this session. */
bestMatch: SessionEventSearchHit
}
` ``
2026-07-23 01:05:50 +08:00
## 会话谱系
2026-07-22 22:58:05 +08:00
2026-08-04 17:36:14 +08:00
` SessionLineageTrace` 按由近及远的顺序携带已知 parent,以及由直接 descendant 递归嵌套而成的森林。完整性判别字段使已知 root 与缺失 parent 互斥。
2026-07-22 22:58:05 +08:00
` ``ts type-equiv
/** Recursive descendant node in a session-lineage trace. */
interface SessionLineageNode {
/** Detached logical-corpus record for this descendant. */
session: SessionRecord
/** Direct children, each carrying its own recursive descendants. */
descendants: SessionLineageNode[]
}
` ``
` ``ts type-equiv
/** Known ancestry and descendants for one logical session. */
type SessionLineageTrace = {
/** Detached record for the session that was traced. */
target: SessionRecord
/** Known parents from the immediate parent outward. */
ancestors: SessionRecord[]
/** Complete known descendant trees rooted at the target's direct children. */
descendants: SessionLineageNode[]
} & (
| {
/** The complete parent chain is present in the logical corpus. */
complete: true
/** Detached record at the top of the complete lineage. */
root: SessionRecord
}
| {
/** The parent chain leaves the visible logical corpus. */
complete: false
/** First parent id that is not present in the logical corpus. */
unresolvedParentId: SessionId
}
)
` ``
2026-07-15 23:11:25 -07:00
## 有界事件读取
2026-07-22 03:06:01 -07:00
请求指定一个原始 seq 及可选的邻近数量。结果携带 ` SessionHeader` 而非可用性标志,使已知的实时目标可以独立于持久化健康状态。
2026-07-15 23:11:25 -07:00
` ``ts type-equiv
2026-07-22 22:58:05 +08:00
/** Request for one event plus raw neighboring log context. */
interface SessionEventReadRequest {
/** Session that owns the target event. */
2026-07-15 23:11:25 -07:00
sessionId: SessionId
2026-07-22 22:58:05 +08:00
/** Target event seq. */
2026-07-15 23:11:25 -07:00
seq: number
2026-07-22 22:58:05 +08:00
/** Number of preceding raw events to include. */
2026-07-15 23:11:25 -07:00
before?: number
2026-07-22 22:58:05 +08:00
/** Number of following raw events to include. */
2026-07-15 23:11:25 -07:00
after?: number
}
` ``
` ``ts type-equiv
2026-07-22 22:58:05 +08:00
/** Full target event and a bounded raw-log window. */
interface SessionEventWindow {
/** Cloned header for the live-preferred source read. */
2026-07-15 23:11:25 -07:00
session: SessionHeader
2026-07-22 22:58:05 +08:00
/** Full cloned target event. */
2026-07-15 23:11:25 -07:00
target: SessionEvent
2026-07-22 22:58:05 +08:00
/** Full cloned events from ` startSeq` through ` endSeq`. */
2026-07-15 23:11:25 -07:00
events: SessionEvent[]
2026-07-22 22:58:05 +08:00
/** First seq included in ` events`. */
2026-07-15 23:11:25 -07:00
startSeq: number
2026-07-22 22:58:05 +08:00
/** Last seq included in ` events`. */
2026-07-15 23:11:25 -07:00
endSeq: number
}
` ``
2026-07-22 22:58:05 +08:00
## 事件关系
2026-08-04 17:36:14 +08:00
事件追踪会区分位置替换与日志中记录的来源关系。除 ` replacementChain` 外,每个 seq 列表都只包含直接链接;该链从目标沿直接 replacer 追踪到最终的位置替换。
2026-07-22 22:58:05 +08:00
` ``ts type-equiv
/** Request for direct surface and provenance relationships around one event. */
interface SessionEventTraceRequest {
/** Session that owns the target event. */
sessionId: SessionId
/** Target event seq. */
seq: number
}
` ``
` ``ts type-equiv
/** Direct surface and provenance relationships for one event. */
interface SessionEventTrace {
/** Lightweight target record. */
target: SessionEventRecord
/** Immediate positional replacement event, when the target was shadowed. */
replacedBy?: number
/** Positional replacers from the immediate replacement to the final replacement. */
replacementChain: number[]
/** Surface nodes directly removed when the target itself performed a replacement. */
replacedEventSeqs: number[]
/** Direct logged provenance sources in their recorded order. */
sourceEventSeqs: number[]
/** Later events that directly name the target as a provenance source, in log order. */
derivedEventSeqs: number[]
}
` ``
2026-07-25 14:17:24 +08:00
` ``ts type-equiv
/** Event relationships bound to the same session-header observation. */
interface SessionEventTraceObservation extends SessionEventTrace {
/** Cloned header selected with the event log used for the trace. */
session: SessionHeader
}
` ``
2026-07-15 23:11:25 -07:00
## 错误
2026-07-22 03:06:01 -07:00
封闭的 code 联合类型区分请求校验、目标缺失、surface 日志格式错误、可选后端故障与矛盾的源元数据。
2026-07-15 23:11:25 -07:00
` ``ts type-equiv
2026-07-24 00:00:04 +08:00
/** Stable machine-routable failure taxonomy for session reads, traces, and search. */
2026-07-22 22:58:05 +08:00
type SessionQueryErrorCode =
2026-07-24 00:00:04 +08:00
| 'SESSION_QUERY_ABORTED'
2026-08-06 02:53:48 +08:00
| 'SESSION_QUERY_CORRUPT_SESSION'
2026-07-15 23:11:25 -07:00
| 'SESSION_QUERY_EVENT_NOT_FOUND'
2026-07-24 00:00:04 +08:00
| 'SESSION_QUERY_INDEX_FAILED'
2026-07-15 23:11:25 -07:00
| 'SESSION_QUERY_INVALID_CONFIG'
2026-07-24 00:00:04 +08:00
| 'SESSION_QUERY_INVALID_CURSOR'
| 'SESSION_QUERY_INVALID_FILTER'
| 'SESSION_QUERY_INVALID_LIMIT'
| 'SESSION_QUERY_INVALID_QUERY'
2026-07-22 22:58:05 +08:00
| 'SESSION_QUERY_INVALID_LINEAGE'
2026-07-15 23:11:25 -07:00
| 'SESSION_QUERY_INVALID_SURFACE'
| 'SESSION_QUERY_INVALID_WINDOW'
| 'SESSION_QUERY_PERSISTENCE_FAILED'
| 'SESSION_QUERY_SESSION_NOT_FOUND'
2026-07-24 00:00:04 +08:00
| 'SESSION_QUERY_STALE_CURSOR'
2026-07-15 23:11:25 -07:00
| 'SESSION_QUERY_SOURCE_CONFLICT'
` ``