@morlay/session-rdb 0.0.19 → 0.0.21-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -31
- package/dist/artifact.d.mts +25 -65
- package/dist/artifact.mjs +3 -3
- package/dist/{schema-DPcuEh_a.d.mts → backend-DpdtxYpz.d.mts} +360 -107
- package/dist/branch-5JzX9rUq.mjs +390 -0
- package/dist/deletion.d.mts +7 -0
- package/dist/deletion.mjs +2 -0
- package/dist/dist-vIVO6bA-.mjs +1524 -0
- package/dist/import.d.mts +4 -4
- package/dist/import.mjs +214 -1
- package/dist/index.d.mts +2 -3
- package/dist/index.mjs +4 -1630
- package/dist/{log-DO69NQnn.mjs → log-CnYct2Dv.mjs} +37 -82
- package/dist/{sqlite-DYExtbLo.mjs → sqlite-fpvm5Dzs.mjs} +205 -75
- package/dist/src-CWTWV7vx.mjs +1904 -0
- package/dist/storage.d.mts +14 -5
- package/dist/storage.mjs +2 -2
- package/dist/testing.d.mts +2 -26
- package/dist/testing.mjs +10504 -9614
- package/drizzle/postgres/20260918120000_v3_event_usage/migration.sql +14 -0
- package/drizzle/postgres/20260918120000_v3_event_usage/snapshot.json +1309 -0
- package/drizzle/sqlite/20260918120000_v3_event_usage/migration.sql +14 -0
- package/drizzle/sqlite/20260918120000_v3_event_usage/snapshot.json +1031 -0
- package/package.json +29 -30
- package/src/adapters/to-postgres.ts +1 -3
- package/src/adapters/to-sqlite.ts +0 -2
- package/src/adapters/types.ts +0 -3
- package/src/artifact.ts +0 -2
- package/src/backend.ts +31 -2
- package/src/branch.ts +223 -135
- package/src/deletion.ts +87 -0
- package/src/drizzle/postgres-v2.ts +0 -1
- package/src/drizzle/postgres-v3.ts +0 -1
- package/src/drizzle/sqlite-v2.ts +0 -1
- package/src/drizzle/sqlite-v3.ts +0 -1
- package/src/entities/v2/session-events.ts +0 -1
- package/src/entities/v3/event-usage.ts +25 -0
- package/src/entities/v3/events.ts +1 -3
- package/src/entities/v3/index.ts +4 -0
- package/src/entities/v3/session-events.ts +1 -2
- package/src/entities/v3/session-projcache-rows.ts +0 -8
- package/src/entities/v3/sessions.ts +3 -3
- package/src/entities/v3/storage-units.ts +0 -1
- package/src/entities/v3/workspace-sessions.ts +0 -5
- package/src/entities/v3/workspace-state.ts +0 -6
- package/src/entities/v3/workspaces.ts +0 -5
- package/src/export.ts +103 -0
- package/src/gc.ts +76 -0
- package/src/import-storages.ts +4 -37
- package/src/import.ts +54 -31
- package/src/index.ts +150 -114
- package/src/legacy.ts +4 -42
- package/src/log.ts +63 -106
- package/src/postgres.ts +249 -22
- package/src/schema.ts +6 -6
- package/src/session-query.ts +0 -4
- package/src/sqlite.ts +231 -55
- package/src/storage-takeover/index.ts +2 -28
- package/src/storage-takeover/projection-cache.ts +30 -134
- package/src/storage-takeover/repository.ts +20 -59
- package/src/storage-takeover/storage-backend.ts +3 -33
- package/src/storage-takeover/types.ts +14 -56
- package/src/storage.ts +0 -2
- package/src/testing/contract.ts +19 -50
- package/src/testing/coordinator-contract.ts +10 -25
- package/src/testing.ts +2 -2
- package/src/usage.ts +191 -0
- package/dist/import-Bc2QQa5G.mjs +0 -473
- package/dist/index-CCcK9tia.d.mts +0 -270
- package/dist/magic-string.es-BgJoa-3K.mjs +0 -1017
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
import { a as JournalMode, b as WriteGuard, x as Backend } from "./schema-DPcuEh_a.mjs";
|
|
2
|
-
import z from "@deepseek-ai/schemastery";
|
|
3
|
-
import { SessionAccess, SessionHandle, SessionHandleAppendOptions, SessionHandleFlushOptions, SessionHandleReadOptions, SessionHandleReadResult, SessionPersistence, SessionPersistenceCreateOptions, SessionPersistenceListOptions, SessionPersistenceOpenOptions, SessionPersistenceRevision, SessionPersistenceSnapshot, SessionPersistenceStatOptions } from "@deepseek-ai/dsh-session-persistence";
|
|
4
|
-
import { Session, SessionEvent, SessionHeader, SessionId, SessionLogOffset } from "@deepseek-ai/dsh-session";
|
|
5
|
-
import { BranchAnchorMode, BranchBoundary, ForkFromOptions, SessionBranch, SessionBranchProvider } from "@morlay/session-branch";
|
|
6
|
-
import { Context } from "@deepseek-ai/cordis";
|
|
7
|
-
//#region src/branch.d.ts
|
|
8
|
-
declare function locateTurnEnd(events: readonly SessionEvent[], atSeq?: number, mode?: BranchAnchorMode): number;
|
|
9
|
-
interface LiveSessionHooks {
|
|
10
|
-
getSession(id: SessionId): Session | undefined;
|
|
11
|
-
getAgent(id: SessionId): LiveAgentLike | undefined;
|
|
12
|
-
flush(session: Session): Promise<boolean>;
|
|
13
|
-
resetProjections?(session: Session): void;
|
|
14
|
-
refreshProjectionCache?(session: ProjectionCacheSession): Promise<void>;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* 投影检查点刷新所需的最小会话面:cold rewind 没有 live Session 可复用,
|
|
18
|
-
* 而截断后的前缀未必是合法的独立会话(surface 引用可能悬空),不能走
|
|
19
|
-
* `Session.create` 的校验;缓存服务只读 id / header / inheritedEventCount
|
|
20
|
-
* 与事件前缀,用普通对象承载即可。
|
|
21
|
-
*/
|
|
22
|
-
interface ProjectionCacheSession {
|
|
23
|
-
readonly id: SessionId;
|
|
24
|
-
readonly header: SessionHeader;
|
|
25
|
-
readonly inheritedEventCount: SessionLogOffset;
|
|
26
|
-
snapshotEvents(): readonly SessionEvent[];
|
|
27
|
-
}
|
|
28
|
-
interface LiveAgentLike {
|
|
29
|
-
session: Session;
|
|
30
|
-
requestHeaderLogged?: boolean;
|
|
31
|
-
inbox?: {
|
|
32
|
-
clear(): void;
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
declare class SessionBranchRdbProvider implements SessionBranchProvider {
|
|
36
|
-
private readonly persistence;
|
|
37
|
-
private readonly live;
|
|
38
|
-
readonly name = "session-rdb";
|
|
39
|
-
constructor(persistence: SessionPersistenceRdb, live?: LiveSessionHooks);
|
|
40
|
-
readBranchPrefix(id: SessionId, atSeq?: number, mode?: BranchAnchorMode, signal?: AbortSignal): Promise<BranchBoundary>;
|
|
41
|
-
readRawEvents(id: SessionId, signal?: AbortSignal): Promise<{
|
|
42
|
-
meta: SessionHeader;
|
|
43
|
-
events: readonly SessionEvent[];
|
|
44
|
-
}>;
|
|
45
|
-
forkFrom(sourceId: SessionId, options?: ForkFromOptions, signal?: AbortSignal): Promise<SessionId>;
|
|
46
|
-
rewind(id: SessionId, toBoundary: number, signal?: AbortSignal): Promise<SessionPersistenceSnapshot>;
|
|
47
|
-
/**
|
|
48
|
-
* 让持久化投影检查点跟随截断后的 log(见 {@link LiveSessionHooks.refreshProjectionCache})。
|
|
49
|
-
* 缓存是派生数据:刷新失败只让缓存多滞后一轮,不能让 rewind 失败。
|
|
50
|
-
*/
|
|
51
|
-
private refreshProjectionCache;
|
|
52
|
-
}
|
|
53
|
-
declare class SessionBranchRdb extends SessionBranch {
|
|
54
|
-
static inject: string[];
|
|
55
|
-
constructor(ctx: import("@deepseek-ai/cordis").Context);
|
|
56
|
-
private readonly provider;
|
|
57
|
-
readBranchPrefix(id: SessionId, atSeq?: number, mode?: BranchAnchorMode, signal?: AbortSignal): Promise<BranchBoundary>;
|
|
58
|
-
readRawEvents(id: SessionId, signal?: AbortSignal): Promise<{
|
|
59
|
-
meta: SessionHeader;
|
|
60
|
-
events: readonly SessionEvent[];
|
|
61
|
-
}>;
|
|
62
|
-
forkFrom(sourceId: SessionId, options?: ForkFromOptions, signal?: AbortSignal): Promise<SessionId>;
|
|
63
|
-
rewind(id: SessionId, toBoundary: number, signal?: AbortSignal): Promise<SessionPersistenceSnapshot>;
|
|
64
|
-
timeline(sessionId: SessionId, signal?: AbortSignal): Promise<import("@morlay/session-branch").BranchTimeline>;
|
|
65
|
-
}
|
|
66
|
-
//#endregion
|
|
67
|
-
//#region src/index.d.ts
|
|
68
|
-
interface SessionPersistenceRdbInternals {
|
|
69
|
-
readonly backend: Backend;
|
|
70
|
-
readonly writeGuard: WriteGuard;
|
|
71
|
-
create(meta: SessionHeader, inheritedEventCount?: number): Promise<SessionHandle>;
|
|
72
|
-
append(id: SessionId, events: readonly SessionEvent[]): Promise<void>;
|
|
73
|
-
load(id: SessionId): Promise<import("@deepseek-ai/dsh-session-persistence").SessionInspection>;
|
|
74
|
-
inspect(id: SessionId, signal?: AbortSignal): Promise<import("@deepseek-ai/dsh-session-persistence").SessionInspection>;
|
|
75
|
-
readFrom(id: SessionId, fromSeq: number, signal?: AbortSignal): Promise<{
|
|
76
|
-
meta: SessionHeader;
|
|
77
|
-
inheritedEventCount: number;
|
|
78
|
-
events: readonly SessionEvent[];
|
|
79
|
-
}>;
|
|
80
|
-
listSnapshots(signal?: AbortSignal): Promise<SessionPersistenceSnapshot[]>;
|
|
81
|
-
readStoredRevision(id: SessionId, signal?: AbortSignal): Promise<import("@deepseek-ai/dsh-session-persistence").SessionPersistenceRevision | undefined>;
|
|
82
|
-
registerReuseEventIds(childId: SessionId, map: ReadonlyMap<number, string>): void;
|
|
83
|
-
}
|
|
84
|
-
/** 投影 checkpoint 写节流(替换上游 `session-projection-cache` 的 Config)。 */
|
|
85
|
-
interface ProjectionCacheOptions {
|
|
86
|
-
/** 两次强制点之间累积多少已提交事件强制落盘(默认 200)。 */
|
|
87
|
-
writeEveryEvents?: number;
|
|
88
|
-
/** 脏 checkpoint 在强制点之间允许滞留的最长毫秒数(默认 5000)。 */
|
|
89
|
-
writeIntervalMs?: number;
|
|
90
|
-
}
|
|
91
|
-
type Config = {
|
|
92
|
-
type: "sqlite";
|
|
93
|
-
path: string;
|
|
94
|
-
journalMode?: JournalMode;
|
|
95
|
-
busyTimeout?: number;
|
|
96
|
-
projectionCache?: ProjectionCacheOptions;
|
|
97
|
-
} | {
|
|
98
|
-
type: "postgres";
|
|
99
|
-
connectionString: string;
|
|
100
|
-
schema?: string;
|
|
101
|
-
projectionCache?: ProjectionCacheOptions;
|
|
102
|
-
};
|
|
103
|
-
/** 一个已创建但未 materialize 的会话(本进程可见,其他进程不可见)。 */
|
|
104
|
-
interface PendingSession {
|
|
105
|
-
readonly header: SessionHeader;
|
|
106
|
-
readonly revision: SessionPersistenceRevision;
|
|
107
|
-
readonly inheritedEventCount: SessionLogOffset;
|
|
108
|
-
/** 输入空间 cursor(全 delta 批次也推进)。 */
|
|
109
|
-
readonly cursor: number;
|
|
110
|
-
/** 是否调用过 append(close 时保留 pending)。 */
|
|
111
|
-
readonly everAppended: boolean;
|
|
112
|
-
}
|
|
113
|
-
/** 会话级写所有权与 live 路由簿记。 */
|
|
114
|
-
declare class RdbBackendTracker {
|
|
115
|
-
private readonly name;
|
|
116
|
-
/** 每个 id 的活跃 write handle;`null` 表示 claim 构造中。 */
|
|
117
|
-
private readonly writers;
|
|
118
|
-
private readonly pending;
|
|
119
|
-
private readonly openHandles;
|
|
120
|
-
private counter;
|
|
121
|
-
constructor(name: string);
|
|
122
|
-
registerCreated(header: SessionHeader, inheritedEventCount: SessionLogOffset): void;
|
|
123
|
-
/** 更新 pending 的 cursor / everAppended(handle append 后同步)。 */
|
|
124
|
-
updatePending(id: SessionId, cursor: number, everAppended: boolean): void;
|
|
125
|
-
claimWrite(id: SessionId): void;
|
|
126
|
-
releaseClaim(id: SessionId): void;
|
|
127
|
-
pendingOf(id: SessionId): PendingSession | undefined;
|
|
128
|
-
hasPending(id: SessionId): boolean;
|
|
129
|
-
pendingEntries(): IterableIterator<[SessionId, PendingSession]>;
|
|
130
|
-
materialized(id: SessionId): void;
|
|
131
|
-
adopt(handle: RdbSessionHandle): RdbSessionHandle;
|
|
132
|
-
release(handle: RdbSessionHandle, materialized: boolean): void;
|
|
133
|
-
writerOf(id: SessionId): RdbSessionHandle | undefined;
|
|
134
|
-
flushAll(): Promise<void>;
|
|
135
|
-
closeAll(): Promise<void>;
|
|
136
|
-
}
|
|
137
|
-
/** 一个打开会话的存储句柄:read / append / flush / close。 */
|
|
138
|
-
declare class RdbSessionHandle implements SessionHandle {
|
|
139
|
-
private readonly persistence;
|
|
140
|
-
readonly id: SessionId;
|
|
141
|
-
readonly header: SessionHeader;
|
|
142
|
-
readonly access: SessionAccess;
|
|
143
|
-
private readonly state;
|
|
144
|
-
private chain;
|
|
145
|
-
private closing;
|
|
146
|
-
/** 稠密 next-seq(输入空间计数,与旧版 coordinator cursor 同语义)。 */
|
|
147
|
-
private cursor;
|
|
148
|
-
private materialized;
|
|
149
|
-
/** live 路由缓冲(上游 seq 事件,drain 时过滤 delta 后重编号稠密)。 */
|
|
150
|
-
private buffered;
|
|
151
|
-
private batchTimer;
|
|
152
|
-
private drainPaused;
|
|
153
|
-
private draining;
|
|
154
|
-
/** write open 时发现的 torn tail 起点(append 前先截断)。 */
|
|
155
|
-
private tornTruncateTo;
|
|
156
|
-
/** 是否调用过 append(即使全 delta 未落库)——close 时保留 pending。 */
|
|
157
|
-
private everAppended;
|
|
158
|
-
constructor(persistence: SessionPersistenceRdb, id: SessionId, header: SessionHeader, access: SessionAccess, state: {
|
|
159
|
-
cursor: number;
|
|
160
|
-
materialized: boolean;
|
|
161
|
-
inheritedEventCount: SessionLogOffset;
|
|
162
|
-
tornTruncateTo?: number;
|
|
163
|
-
});
|
|
164
|
-
get inheritedEventCount(): SessionLogOffset;
|
|
165
|
-
/** 输入空间 cursor(下一个待落库的上游 seq)。 */
|
|
166
|
-
get cursorValue(): number;
|
|
167
|
-
read(offset?: number, length?: number, options?: SessionHandleReadOptions): Promise<SessionHandleReadResult>;
|
|
168
|
-
append(events: readonly SessionEvent[], options?: SessionHandleAppendOptions): Promise<void>;
|
|
169
|
-
flush(options?: SessionHandleFlushOptions): Promise<void>;
|
|
170
|
-
close(): Promise<void>;
|
|
171
|
-
[Symbol.asyncDispose](): Promise<void>;
|
|
172
|
-
/** live 路由:缓冲一个已发布事件(持久化自有副本),并启动批量窗口。 */
|
|
173
|
-
enqueueLive(event: SessionEvent, reportBackgroundFailure: (error: unknown) => void): void;
|
|
174
|
-
/** rewind 截断后对齐 handle 的稠密 cursor 与继承前缀(DB 已截断)。 */
|
|
175
|
-
resetAfterRewind(cursor: number, inheritedEventCount?: number): void;
|
|
176
|
-
/** 排空 live 缓冲(过滤 delta + 重编号稠密 + append)。 */
|
|
177
|
-
drainLive(): Promise<void>;
|
|
178
|
-
private drainBuffered;
|
|
179
|
-
private enqueueChain;
|
|
180
|
-
private run;
|
|
181
|
-
private assertOpen;
|
|
182
|
-
static readonly LIVE_WRITE_BATCH_MAX_DELAY_MS = 200;
|
|
183
|
-
}
|
|
184
|
-
declare class SessionPersistenceRdb extends SessionPersistence {
|
|
185
|
-
config: Config;
|
|
186
|
-
static inject: string[];
|
|
187
|
-
static Config: z<Config>;
|
|
188
|
-
static readonly settingsNs = "session-rdb";
|
|
189
|
-
readonly name = "session-rdb";
|
|
190
|
-
readonly tracker: RdbBackendTracker;
|
|
191
|
-
private readonly backend;
|
|
192
|
-
private storeIdentity;
|
|
193
|
-
private readonly ready;
|
|
194
|
-
private readonly writeGuard;
|
|
195
|
-
private readonly reuseEventIds;
|
|
196
|
-
/** live 路由:session/created 后 handle 就绪前的缓冲。 */
|
|
197
|
-
private readonly liveBuffers;
|
|
198
|
-
private readonly liveReady;
|
|
199
|
-
constructor(ctx: Context, config: Config, injectedBackend?: Backend);
|
|
200
|
-
private init;
|
|
201
|
-
create(header: SessionHeader, options?: SessionPersistenceCreateOptions): Promise<SessionHandle>;
|
|
202
|
-
open(id: SessionId, access: SessionAccess, options?: SessionPersistenceOpenOptions): Promise<SessionHandle>;
|
|
203
|
-
flush(): Promise<void>;
|
|
204
|
-
stat(id: SessionId, options?: SessionPersistenceStatOptions): Promise<SessionPersistenceSnapshot | undefined>;
|
|
205
|
-
list(options?: SessionPersistenceListOptions): Promise<readonly SessionPersistenceSnapshot[]>;
|
|
206
|
-
/** 导出当前世代的 jsonl artifact,视图只读不落库。 */
|
|
207
|
-
readRaw(id: SessionId, signal?: AbortSignal): Promise<{
|
|
208
|
-
meta: SessionHeader;
|
|
209
|
-
inheritedEventCount: number;
|
|
210
|
-
filename: string;
|
|
211
|
-
content: string;
|
|
212
|
-
} | undefined>;
|
|
213
|
-
/** 空会话 materialize(flush 的持久化屏障)。 */
|
|
214
|
-
materializeEmpty(meta: SessionHeader, inheritedEventCount: SessionLogOffset): Promise<void>;
|
|
215
|
-
/** 原样 append 落库(handle 已校验 contiguity;torn tail 先截断)。
|
|
216
|
-
* 与上游 JSONL 一致:ignorable 事件原样存储,不做过滤。写路径校验当前
|
|
217
|
-
* 格式形状(fail-closed):未知类型(非 ignorable)与非法消息形状拒绝入库;
|
|
218
|
-
* 非当前格式(v0/v1/v2)数据只在读取时经 legacy 转换链动态转换,不落新库。 */
|
|
219
|
-
appendBatch(meta: SessionHeader, inheritedEventCount: SessionLogOffset, events: readonly SessionEvent[], tornTruncateTo?: number): Promise<boolean>;
|
|
220
|
-
/** 读取一个会话的稠密 log(含 torn tail 检测,不含修复改写)。 */
|
|
221
|
-
readLog(id: SessionId, options?: {
|
|
222
|
-
fromSeq?: number;
|
|
223
|
-
}, signal?: AbortSignal): Promise<{
|
|
224
|
-
meta: SessionHeader;
|
|
225
|
-
inheritedEventCount: number;
|
|
226
|
-
events: SessionEvent[];
|
|
227
|
-
tornFrom?: number;
|
|
228
|
-
incarnation: string;
|
|
229
|
-
revision: number;
|
|
230
|
-
/** 存储桥接行数(迁移链可能生成/合并事件,与 `events.length` 不同)。 */
|
|
231
|
-
storedCount: number;
|
|
232
|
-
/** 是否经上游迁移链转换(非当前格式 → 当前格式)。 */
|
|
233
|
-
migrated: boolean;
|
|
234
|
-
} | undefined>;
|
|
235
|
-
/**
|
|
236
|
-
* 把迁移链读出的当前格式视图整体落库(非当前格式会话写打开时的一次性迁移)。
|
|
237
|
-
*
|
|
238
|
-
* 迁移链会生成/合并事件(end-seed / attempt / chunk 合并),事件 seq 空间
|
|
239
|
-
* 与存储桥接行数不再相等;写路径以存储 head 为锚点重编号,二者不一致会让
|
|
240
|
-
* append 撞上已有行。这里在同一事务内删光本会话桥接行、按迁移视图重建
|
|
241
|
-
* (新事件行,完整信封),并更新 head 与 revision;旧事件行保留(可能被
|
|
242
|
-
* fork 子会话引用,孤儿由惰性 GC 处理)。
|
|
243
|
-
*/
|
|
244
|
-
private rewriteMigratedLog;
|
|
245
|
-
listSnapshots(signal?: AbortSignal): Promise<Array<SessionPersistenceSnapshot & {
|
|
246
|
-
inheritedEventCount: number;
|
|
247
|
-
}>>;
|
|
248
|
-
readStoredRevision(id: SessionId, signal?: AbortSignal): Promise<SessionPersistenceRevision | undefined>;
|
|
249
|
-
/** 便捷:create + append + close(测试与导入路径共用)。 */
|
|
250
|
-
createAndAppend(header: SessionHeader, events: readonly SessionEvent[], inheritedEventCount?: number): Promise<void>;
|
|
251
|
-
/** 便捷:open(read) + read 全量 + close。 */
|
|
252
|
-
load(id: SessionId, signal?: AbortSignal): Promise<import("@deepseek-ai/dsh-session-persistence").SessionInspection>;
|
|
253
|
-
/** 便捷:open(write) + append + close。 */
|
|
254
|
-
append(id: SessionId, events: readonly SessionEvent[]): Promise<void>;
|
|
255
|
-
/** 便捷:readFrom(稠密后缀)。 */
|
|
256
|
-
readFrom(id: SessionId, fromSeq: number, signal?: AbortSignal): Promise<{
|
|
257
|
-
meta: SessionHeader;
|
|
258
|
-
inheritedEventCount: number;
|
|
259
|
-
events: readonly SessionEvent[];
|
|
260
|
-
}>;
|
|
261
|
-
close(): Promise<void>;
|
|
262
|
-
registerReuseEventIds(childId: SessionId, map: ReadonlyMap<number, string>): void;
|
|
263
|
-
internals(): SessionPersistenceRdbInternals;
|
|
264
|
-
private rowRevision;
|
|
265
|
-
private installLiveRouting;
|
|
266
|
-
/** session/created 后为 live 会话建立 write handle(create 或 adopt)。 */
|
|
267
|
-
private ensureLiveHandle;
|
|
268
|
-
}
|
|
269
|
-
//#endregion
|
|
270
|
-
export { SessionBranchRdb as a, SessionPersistenceRdbInternals as i, ProjectionCacheOptions as n, SessionBranchRdbProvider as o, SessionPersistenceRdb as r, locateTurnEnd as s, Config as t };
|