@morlay/session-rdb 0.1.0 → 0.1.2
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 +17 -166
- package/dist/artifact.d.mts +2 -2
- package/dist/artifact.mjs +3 -2
- package/dist/{branch-D4nVzQQM.mjs → branch-IQii6Muq.mjs} +1 -8
- package/dist/deletion.d.mts +1 -2
- package/dist/deletion.mjs +2 -1
- package/dist/export.d.mts +1 -3
- package/dist/export.mjs +1 -4
- package/dist/gc.d.mts +1 -3
- package/dist/gc.mjs +1 -3
- package/dist/import.d.mts +1 -2
- package/dist/import.mjs +2 -7
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +4 -3
- package/dist/{log-BWVFYAh5.mjs → log-D5C8-TGs.mjs} +0 -52
- package/dist/{log-CUjKQbOR.d.mts → log-tZMKFRKi.d.mts} +17 -168
- package/dist/routes-DGBlBE_I.mjs +10 -0
- package/dist/{sqlite-SCiSnwaz.mjs → sqlite-CMMSn5kE.mjs} +24 -62
- package/dist/{src-BZ1tffd5.mjs → src-dsd2H70D.mjs} +59 -97
- package/dist/storage.d.mts +2 -22
- package/dist/storage.mjs +1 -1
- package/dist/testing.d.mts +1 -1
- package/dist/testing.mjs +1 -1
- package/dist/usage.d.mts +1 -1
- package/dist/usage.mjs +1 -17
- package/package.json +19 -19
- package/src/backend.ts +35 -54
- package/src/branch.ts +3 -5
- package/src/deletion.ts +2 -1
- package/src/entities/v3/event-usage.ts +3 -6
- package/src/entities/v3/session-counts.ts +3 -5
- package/src/entities/v3/session-usage.ts +3 -5
- package/src/export.ts +5 -4
- package/src/gc.ts +4 -3
- package/src/import.ts +5 -6
- package/src/index.ts +47 -45
- package/src/legacy.ts +3 -5
- package/src/log.ts +24 -53
- package/src/postgres.ts +70 -61
- package/src/routes.ts +16 -0
- package/src/rows.ts +11 -15
- package/src/session-query.ts +3 -7
- package/src/sqlite.ts +70 -58
- package/src/storage-takeover/projection-cache.ts +6 -8
- package/src/storage-takeover/repository.ts +2 -2
- package/src/storage-takeover/types.ts +1 -1
- package/src/usage.ts +22 -34
- package/src/write-guard.ts +1 -1
|
@@ -3444,7 +3444,6 @@ interface StorageRepository {
|
|
|
3444
3444
|
readWorkspaceState(): Promise<WorkspaceDomainState | null>;
|
|
3445
3445
|
writeWorkspaceState(state: WorkspaceDomainState): Promise<void>;
|
|
3446
3446
|
loadProjcache(): Promise<StoredProjcacheEntry[]>;
|
|
3447
|
-
/** 不经 await、直接读的路径(供同步的 `cachedSnapshot` 消费);宿主提供不了则缺省。 */
|
|
3448
3447
|
readProjcacheDirect?(sessionId: string): StoredProjcacheEntry | undefined;
|
|
3449
3448
|
readSessionTitleDirect?(sessionId: string): {
|
|
3450
3449
|
title: string;
|
|
@@ -3454,11 +3453,18 @@ interface StorageRepository {
|
|
|
3454
3453
|
pruneStaleProjcache(): Promise<number>;
|
|
3455
3454
|
}
|
|
3456
3455
|
//#endregion
|
|
3456
|
+
//#region src/routes.d.ts
|
|
3457
|
+
declare const SESSION_ROWS_PATH = "/api/morlay/v1/session/rows";
|
|
3458
|
+
declare const SESSION_EXPORT_PATH = "/api/morlay/v1/session/export";
|
|
3459
|
+
declare const SESSION_IMPORT_PATH = "/api/morlay/v1/session/import";
|
|
3460
|
+
declare const SESSION_DELETE_PATH = "/api/morlay/v1/session/delete";
|
|
3461
|
+
declare const SESSION_GC_PATH = "/api/morlay/v1/session/gc";
|
|
3462
|
+
declare const SESSION_USAGE_PATH = "/api/morlay/v1/session/usage";
|
|
3463
|
+
//#endregion
|
|
3457
3464
|
//#region src/write-guard.d.ts
|
|
3458
3465
|
declare class WriteGuard {
|
|
3459
3466
|
private readonly headSeqs;
|
|
3460
3467
|
confirmHead(id: SessionId, head: number): void;
|
|
3461
|
-
/** 本实例有没有这条会话的 head 记录(迁移重写用它决定是"登记基准"还是"严格比较")。 */
|
|
3462
3468
|
has(id: SessionId): boolean;
|
|
3463
3469
|
assertNoConcurrentWriter(id: SessionId, storedHead: number): void;
|
|
3464
3470
|
}
|
|
@@ -3496,30 +3502,18 @@ declare function eventDimensions(event: SessionEvent): {
|
|
|
3496
3502
|
};
|
|
3497
3503
|
//#endregion
|
|
3498
3504
|
//#region src/rows.d.ts
|
|
3499
|
-
/**
|
|
3500
|
-
* 管理面的会话列表:**我们自己的**一条路由(完整语料,含归档),与官方 `session/list` 分开。
|
|
3501
|
-
*
|
|
3502
|
-
* 官方那条(`session/list` → `ctx.sessionQuery.listSessions`)按部署策略默认排除已归档——那是给上游
|
|
3503
|
-
* UI 用的。归档集的管理动作要有完整列表,所以这里单独给一条:标题直接从会话列取,最后活动时间用
|
|
3504
|
-
* 该会话最后一个事件的时间。
|
|
3505
|
-
*/
|
|
3506
|
-
declare const SESSION_ROWS_PATH = "/api/session.rows";
|
|
3507
3505
|
interface SessionRowsItem {
|
|
3508
3506
|
sessionId: string;
|
|
3509
3507
|
title: string | null;
|
|
3510
|
-
/** 会话 header 的 origin(`subagent` 表示子代理会话)。 */
|
|
3511
3508
|
origin: string | null;
|
|
3512
3509
|
cwd: string | null;
|
|
3513
3510
|
createdAt: number;
|
|
3514
|
-
/** 最后一个事件的时间(无事件时等于 `createdAt`)。 */
|
|
3515
3511
|
updatedAt: number;
|
|
3516
3512
|
archived: boolean;
|
|
3517
|
-
/** 所属工作区标题;不属于任何工作区时为 null。 */
|
|
3518
3513
|
workspace: string | null;
|
|
3519
3514
|
}
|
|
3520
3515
|
interface SessionRowsValue {
|
|
3521
3516
|
items: SessionRowsItem[];
|
|
3522
|
-
/** 过滤后的总数(分页前),前端据此算页数。 */
|
|
3523
3517
|
total: number;
|
|
3524
3518
|
page: number;
|
|
3525
3519
|
pageSize: number;
|
|
@@ -3600,7 +3594,6 @@ interface SessionPersistenceRdbInternals {
|
|
|
3600
3594
|
listSnapshots(signal?: AbortSignal): Promise<SessionPersistenceSnapshot[]>;
|
|
3601
3595
|
readStoredRevision(id: SessionId, signal?: AbortSignal): Promise<import("@deepseek-ai/dsh-session-persistence").SessionPersistenceRevision | undefined>;
|
|
3602
3596
|
registerReuseEventIds(childId: SessionId, map: ReadonlyMap<number, string>): void;
|
|
3603
|
-
/** fork 失败时丢弃还没被消费的映射。 */
|
|
3604
3597
|
dropReuseEventIds(childId: SessionId): void;
|
|
3605
3598
|
}
|
|
3606
3599
|
interface ProjectionCacheOptions {
|
|
@@ -3619,7 +3612,6 @@ type Config$1 = {
|
|
|
3619
3612
|
schema?: string | undefined;
|
|
3620
3613
|
projectionCache?: ProjectionCacheOptions | undefined;
|
|
3621
3614
|
};
|
|
3622
|
-
/** schema 解析之后的形状:整段 Config 是 **volatile 稳定引用**(页面可编辑),读它要过 `.get()`。 */
|
|
3623
3615
|
type ResolvedConfig = Volatile<Config$1>;
|
|
3624
3616
|
type SessionDeletionErrorCode = "SESSION_NOT_FOUND" | "SESSION_NOT_ARCHIVED" | "SESSION_LIVE";
|
|
3625
3617
|
declare class SessionDeletionError extends Error {
|
|
@@ -3705,7 +3697,6 @@ declare class SessionPersistenceRdb extends SessionPersistence {
|
|
|
3705
3697
|
private readonly reuseEventIds;
|
|
3706
3698
|
private readonly liveBuffers;
|
|
3707
3699
|
private readonly liveReady;
|
|
3708
|
-
/** 本次装配用的配置快照(整段 Config 是 volatile,重挂会给新的)。 */
|
|
3709
3700
|
readonly config: Config$1;
|
|
3710
3701
|
constructor(ctx: Context, config: ResolvedConfig, injectedBackend?: Backend);
|
|
3711
3702
|
private init;
|
|
@@ -3715,13 +3706,9 @@ declare class SessionPersistenceRdb extends SessionPersistence {
|
|
|
3715
3706
|
stat(id: SessionId, options?: SessionPersistenceStatOptions): Promise<SessionPersistenceSnapshot | undefined>;
|
|
3716
3707
|
list(options?: SessionPersistenceListOptions): Promise<readonly SessionPersistenceSnapshot[]>;
|
|
3717
3708
|
deleteSession(id: SessionId, signal?: AbortSignal): Promise<void>;
|
|
3718
|
-
/** GC 通道:回收已无桥接行引用的事件行(孤儿),返回删除行数。 */
|
|
3719
3709
|
collectOrphans(): Promise<number>;
|
|
3720
|
-
/** GC 通道:回收父已不存在的 subagent 会话(live 的跳过),返回删除的会话数。 */
|
|
3721
3710
|
collectOrphanSessions(): Promise<number>;
|
|
3722
|
-
/** 用量统计:SQL 聚合的按天 × 模型桶与按会话行(事件行去重、排除孤儿行)。 */
|
|
3723
3711
|
usageReport(sinceMs?: number): Promise<UsageAggregate>;
|
|
3724
|
-
/** GC 通道:VACUUM;调用方需先停止运行中的写路径(见 `registerSessionGc`)。 */
|
|
3725
3712
|
vacuum(): Promise<void>;
|
|
3726
3713
|
private unarchiveBeforeDeletion;
|
|
3727
3714
|
readRaw(id: SessionId, signal?: AbortSignal): Promise<{
|
|
@@ -3744,18 +3731,9 @@ declare class SessionPersistenceRdb extends SessionPersistence {
|
|
|
3744
3731
|
storedCount: number;
|
|
3745
3732
|
migrated: boolean;
|
|
3746
3733
|
} | undefined>;
|
|
3747
|
-
/**
|
|
3748
|
-
* 统计衍生表的**旁路累加**:不在写事务里、失败只 warn——两张会话汇总表都是可销毁重建的
|
|
3749
|
-
* 派生表,丢几次累加不影响可用性(需要时用 `rebuildSessionStats` 重算)。
|
|
3750
|
-
* token 走写路径已折好的用量行,活动计数走本批事件类型。
|
|
3751
|
-
*/
|
|
3752
3734
|
private recordSessionStats;
|
|
3753
|
-
/**
|
|
3754
|
-
* 重算一个会话的统计(rewind / fork 之后;best-effort,同 `recordSessionStats`):
|
|
3755
|
-
* 两张汇总表按会话重算,用量行的引用标记全量重算(引用可能跨会话消失)。
|
|
3756
|
-
*/
|
|
3757
3735
|
rebuildSessionStats(id: SessionId): Promise<void>;
|
|
3758
|
-
|
|
3736
|
+
private refreshEventUsageFlags;
|
|
3759
3737
|
private dropSessionStats;
|
|
3760
3738
|
private rewriteMigratedLog;
|
|
3761
3739
|
listSnapshots(signal?: AbortSignal): Promise<Array<SessionPersistenceSnapshot & {
|
|
@@ -3772,7 +3750,6 @@ declare class SessionPersistenceRdb extends SessionPersistence {
|
|
|
3772
3750
|
}>;
|
|
3773
3751
|
close(): Promise<void>;
|
|
3774
3752
|
registerReuseEventIds(childId: SessionId, map: ReadonlyMap<number, string>): void;
|
|
3775
|
-
/** 丢弃一个还没被消费的复用映射(fork 失败时):留着会让同一个 childId 之后的落写复用父会话的事件行。 */
|
|
3776
3753
|
dropReuseEventIds(childId: SessionId): void;
|
|
3777
3754
|
internals(): SessionPersistenceRdbInternals;
|
|
3778
3755
|
private rowRevision;
|
|
@@ -3784,22 +3761,8 @@ declare class SessionPersistenceRdb extends SessionPersistence {
|
|
|
3784
3761
|
}
|
|
3785
3762
|
//#endregion
|
|
3786
3763
|
//#region src/usage.d.ts
|
|
3787
|
-
declare const SESSION_USAGE_PATH = "/api/session.usage";
|
|
3788
|
-
/**
|
|
3789
|
-
* 时间范围的语义键:`all` 不限;`day` / `week` 是**本地自然日 / 自然周**(周一起算);
|
|
3790
|
-
* `7d` / `30d` / `90d` 是**最近 N 个自然日**(含今天)。
|
|
3791
|
-
*/
|
|
3792
3764
|
type UsageRangeKey = "all" | "day" | "week" | "7d" | "30d" | "90d";
|
|
3793
|
-
/**
|
|
3794
|
-
* 范围起点(含),不限时为 undefined。**所有起点都对齐到 host 本地时区的零点**——`day` / `week` 是
|
|
3795
|
-
* 今天 / 本周一的零点,`7d` / `30d` / `90d` 是「今天零点往前 N-1 天」(含今天共 N 个自然日)。
|
|
3796
|
-
* 对齐的意义:事件级表按毫秒过滤、会话汇总表按本地日过滤,两者因此严格等价。
|
|
3797
|
-
* @param range - 语义键。
|
|
3798
|
-
* @param now - 当前时刻。
|
|
3799
|
-
* @returns 起点毫秒时间戳,或 undefined。
|
|
3800
|
-
*/
|
|
3801
3765
|
declare function resolveUsageSince(range: UsageRangeKey, now: number): number | undefined;
|
|
3802
|
-
/** 一段 token 用量(字段直接取事件里模型报的 usage)。 */
|
|
3803
3766
|
interface UsageTokenTotals {
|
|
3804
3767
|
inputTokens: number;
|
|
3805
3768
|
outputTokens: number;
|
|
@@ -3807,36 +3770,25 @@ interface UsageTokenTotals {
|
|
|
3807
3770
|
reasoningTokens: number;
|
|
3808
3771
|
totalTokens: number;
|
|
3809
3772
|
}
|
|
3810
|
-
/**
|
|
3811
|
-
* 活动计数:与 token 用量同一时间范围、同一去重口径(只算被会话引用的事件行),
|
|
3812
|
-
* 按事件类型数出来——「轮次 / 步骤 / 用户输入 / 工具调用」比「事件行数」有信息量。
|
|
3813
|
-
*/
|
|
3814
3773
|
interface UsageActivityTotals {
|
|
3815
3774
|
turns: number;
|
|
3816
3775
|
steps: number;
|
|
3817
3776
|
userInputs: number;
|
|
3818
3777
|
toolCalls: number;
|
|
3819
3778
|
}
|
|
3820
|
-
/** 总量与按会话行用的一整套指标(token + 活动)。 */
|
|
3821
3779
|
interface UsageTotals extends UsageTokenTotals, UsageActivityTotals {}
|
|
3822
|
-
/**
|
|
3823
|
-
* 一天 × 一个模型 × 是否子代理 的用量桶:总览、按天、按模型都由它折叠。
|
|
3824
|
-
* 只有 token 用量——活动计数没有模型归属(一个轮次可能跨模型),挂在总量与按会话行上。
|
|
3825
|
-
*/
|
|
3826
3780
|
interface UsageBucket extends UsageTokenTotals {
|
|
3827
3781
|
day: string;
|
|
3828
3782
|
provider: string | null;
|
|
3829
3783
|
model: string | null;
|
|
3830
3784
|
subagent: boolean;
|
|
3831
3785
|
}
|
|
3832
|
-
/** 一条会话的用量行。 */
|
|
3833
3786
|
interface UsageSessionRow extends UsageTotals {
|
|
3834
3787
|
sessionId: string;
|
|
3835
3788
|
title: string | null;
|
|
3836
3789
|
subagent: boolean;
|
|
3837
3790
|
archived: boolean;
|
|
3838
3791
|
}
|
|
3839
|
-
/** 后端的原始聚合结果(总量 / 其中子代理 / 人类、按天×模型的桶、按会话的行)。 */
|
|
3840
3792
|
interface UsageAggregate {
|
|
3841
3793
|
totals: UsageTotals;
|
|
3842
3794
|
subagent: UsageTotals;
|
|
@@ -3844,23 +3796,14 @@ interface UsageAggregate {
|
|
|
3844
3796
|
buckets: UsageBucket[];
|
|
3845
3797
|
sessions: UsageSessionRow[];
|
|
3846
3798
|
}
|
|
3847
|
-
/** 一次统计请求的完整回报。 */
|
|
3848
3799
|
type SessionUsageReport = UsageAggregate;
|
|
3849
|
-
/** 计入活动计数的事件类型(轮次 / 步骤 / 用户输入 / 工具调用)。 */
|
|
3850
3800
|
declare const COUNTED_EVENT_TYPES: readonly ["turn/start", "step/start", "user/message", "tool/call"];
|
|
3851
|
-
/** 按事件类型把计数累加到活动指标上(表里按类型存,读的时候折成四项)。 */
|
|
3852
3801
|
declare function addActivityCount(target: UsageActivityTotals, type: string, count: number): UsageActivityTotals;
|
|
3853
|
-
/** 毫秒时间戳 → host 本地日(`YYYY-MM-DD`,与 SQL 的 localtime 口径一致)。 */
|
|
3854
3802
|
declare function localDayKey(ms: number): string;
|
|
3855
3803
|
declare function emptyTotals(): UsageTotals;
|
|
3856
3804
|
declare function addTokenTotals(target: UsageTokenTotals, row: UsageTokenTotals): UsageTokenTotals;
|
|
3857
3805
|
declare function addActivityTotals(target: UsageActivityTotals, row: UsageActivityTotals): UsageActivityTotals;
|
|
3858
|
-
/** 把一行的整套指标累加进目标(后端合并「是否子代理」两组时用)。 */
|
|
3859
3806
|
declare function addTotals(target: UsageTotals, row: UsageTotals): UsageTotals;
|
|
3860
|
-
/**
|
|
3861
|
-
* 用量统计通道:一次请求回报总览(含 subagent 拆分)、按天 × 模型的桶与按会话的行。
|
|
3862
|
-
* 聚合只算被会话引用的事件行——fork 共享行因此只计一次,已删会话留下的孤儿行不计。
|
|
3863
|
-
*/
|
|
3864
3807
|
declare function registerSessionUsage(ctx: Context, persistence: SessionPersistenceRdb): void;
|
|
3865
3808
|
//#endregion
|
|
3866
3809
|
//#region src/backend.d.ts
|
|
@@ -3912,10 +3855,6 @@ interface BackendTx {
|
|
|
3912
3855
|
getSeedLength(id: SessionId): Promise<number | null>;
|
|
3913
3856
|
updateSeedLength(id: SessionId, seedLength: number): Promise<void>;
|
|
3914
3857
|
refreshTitle(id: SessionId): Promise<void>;
|
|
3915
|
-
/**
|
|
3916
|
-
* 插入事件行与它们的用量行(`usageRows` 由写路径一次折好,读侧维度已物化在行上)。
|
|
3917
|
-
* 这一批事件与桥接行同事务,提交即「被引用」。
|
|
3918
|
-
*/
|
|
3919
3858
|
insertEvents(events: EventInsert[], usageRows: readonly EventUsageRow[]): Promise<void>;
|
|
3920
3859
|
insertBridges(rows: Array<{
|
|
3921
3860
|
fSessionId: SessionId;
|
|
@@ -3924,55 +3863,42 @@ interface BackendTx {
|
|
|
3924
3863
|
fSurfaceOp: string | null;
|
|
3925
3864
|
}>): Promise<void>;
|
|
3926
3865
|
updateHead(id: SessionId, headEventId: string, headSequence: number): Promise<void>;
|
|
3927
|
-
/** 写批次提交时递增 revision;给了 `lastEventAt` 就一并把「最后活动时间」往前推(只增不减)。 */
|
|
3928
3866
|
bumpRevision(id: SessionId, lastEventAt?: number): Promise<void>;
|
|
3929
|
-
deleteBridgeTail(id: SessionId, fromSequence: number): Promise<
|
|
3867
|
+
deleteBridgeTail(id: SessionId, fromSequence: number): Promise<readonly string[]>;
|
|
3930
3868
|
getPrevBridge(id: SessionId, sequence: number): Promise<{
|
|
3931
3869
|
fEventId: string;
|
|
3932
3870
|
fSequence: number;
|
|
3933
3871
|
} | undefined>;
|
|
3934
|
-
deleteSession(id: SessionId): Promise<
|
|
3935
|
-
|
|
3936
|
-
|
|
3872
|
+
deleteSession(id: SessionId): Promise<readonly string[]>;
|
|
3873
|
+
deleteSessions(ids: SessionId[]): Promise<{
|
|
3874
|
+
deleted: number;
|
|
3875
|
+
eventIds: readonly string[];
|
|
3876
|
+
}>;
|
|
3937
3877
|
}
|
|
3938
|
-
/**
|
|
3939
|
-
* 「会话行」列表项:管理面自己的列表用(完整语料,含归档)+ 标题 + 最后活动时间。
|
|
3940
|
-
*
|
|
3941
|
-
* 与官方列表(`session/list` → `ctx.sessionQuery.listSessions`)的区别:那条按部署策略**默认排除归档**,
|
|
3942
|
-
* 这里给的是完整集合,标题也直接带出来(官方那条的标题走投影缓存)。
|
|
3943
|
-
*/
|
|
3944
3878
|
interface SessionListRowRecord {
|
|
3945
3879
|
sessionId: string;
|
|
3946
3880
|
title: string | null;
|
|
3947
3881
|
origin: string | null;
|
|
3948
3882
|
cwd: string | null;
|
|
3949
3883
|
createdAt: number;
|
|
3950
|
-
/** 该会话最后一个事件的时间(没有事件时回落 `createdAt`)。 */
|
|
3951
3884
|
updatedAt: number;
|
|
3952
3885
|
archived: boolean;
|
|
3953
3886
|
subagent: boolean;
|
|
3954
|
-
/** 所属工作区标题;不属于任何工作区时为 null。 */
|
|
3955
3887
|
workspace: string | null;
|
|
3956
3888
|
}
|
|
3957
|
-
/** 会话行列表的查询条件:搜索、子代理过滤与分页都在后端做(前端分页等于每次拉全量)。 */
|
|
3958
3889
|
interface SessionListRowsQuery {
|
|
3959
|
-
/** 匹配标题或所属工作区标题(大小写不敏感);空串即不过滤。 */
|
|
3960
3890
|
query?: string;
|
|
3961
|
-
/** 是否连子代理派生会话一起返回(默认不含)。 */
|
|
3962
3891
|
includeSubagents?: boolean;
|
|
3963
3892
|
limit?: number;
|
|
3964
3893
|
offset?: number;
|
|
3965
3894
|
}
|
|
3966
3895
|
interface SessionListRowsPage {
|
|
3967
3896
|
items: SessionListRowRecord[];
|
|
3968
|
-
/** 过滤后的总数(分页前的),前端据此算页数。 */
|
|
3969
3897
|
total: number;
|
|
3970
3898
|
}
|
|
3971
|
-
/** 活动计数的一个桶:本地日 + 四项计数(轮次 / 步骤 / 用户输入 / 工具调用)。 */
|
|
3972
3899
|
interface SessionCountBucket extends UsageActivityTotals {
|
|
3973
3900
|
day: string;
|
|
3974
3901
|
}
|
|
3975
|
-
/** 用量累加的一个桶:本地日 + 模型归属 + 五个 token 列。 */
|
|
3976
3902
|
interface SessionUsageBucket extends UsageTokenTotals {
|
|
3977
3903
|
day: string;
|
|
3978
3904
|
provider: string | null;
|
|
@@ -3989,45 +3915,15 @@ interface Backend {
|
|
|
3989
3915
|
getEventTypesBefore(id: SessionId, beforeSequence: number, limit: number): Promise<Array<Pick<EventRow, "fSequence" | "fType">>>;
|
|
3990
3916
|
listSessions(): Promise<SessionRow[]>;
|
|
3991
3917
|
transaction<T>(fn: (tx: BackendTx) => Promise<T>): Promise<T>;
|
|
3992
|
-
/** 删除已无桥接行引用的事件行(孤儿),返回删除行数。 */
|
|
3993
3918
|
collectOrphans(): Promise<number>;
|
|
3994
|
-
/** 父会话已不存在(或没有父)的 subagent 会话:父被删后它们成了孤儿。 */
|
|
3995
3919
|
listOrphanSubagentSessions(): Promise<SessionId[]>;
|
|
3996
|
-
/**
|
|
3997
|
-
* 用量统计的原始聚合:读三张派生统计表(`t_event_usage` + 两张会话汇总表),
|
|
3998
|
-
* 给出总量 / subagent 拆分、按天×模型的桶与按会话的行(事件行去重、排除孤儿)。
|
|
3999
|
-
* @param sinceMs - 只算该时刻(含)之后的用量;省略即全量。会话汇总表按本地日过滤,
|
|
4000
|
-
* 与毫秒过滤等价的前提是调用方把起点对齐到本地零点(见 `resolveUsageSince`)。
|
|
4001
|
-
*/
|
|
4002
3920
|
usageReport(sinceMs?: number): Promise<UsageAggregate>;
|
|
4003
|
-
/** 管理面的会话行列表:完整语料(含归档)+ 标题 + 最后活动时间,按活动倒序分页。 */
|
|
4004
3921
|
listSessionRows(query?: SessionListRowsQuery): Promise<SessionListRowsPage>;
|
|
4005
|
-
/**
|
|
4006
|
-
* token 用量**旁路累加**(派生表 `t_session_usage`,不参与写事务、失败可丢——表可销毁重建):
|
|
4007
|
-
* 每个 (会话, 本地日, 模型) 记一行累加。
|
|
4008
|
-
* @param id - 会话 id。
|
|
4009
|
-
* @param buckets - 本批要累加的 (day, provider, model, tokens)。
|
|
4010
|
-
*/
|
|
4011
3922
|
incrementSessionUsage(id: SessionId, buckets: readonly SessionUsageBucket[]): Promise<void>;
|
|
4012
|
-
/**
|
|
4013
|
-
* 活动计数**旁路累加**(派生表 `t_session_counts`,同上):每个 (会话, 本地日) 累加四项计数。
|
|
4014
|
-
* @param id - 会话 id。
|
|
4015
|
-
* @param buckets - 本批要累加的 (day, turns, steps, userInputs, toolCalls)。
|
|
4016
|
-
*/
|
|
4017
3923
|
incrementSessionCounts(id: SessionId, buckets: readonly SessionCountBucket[]): Promise<void>;
|
|
4018
|
-
/**
|
|
4019
|
-
* 按会话从事件表重算两张会话汇总表(rewind / fork 之后调用):先删该会话的行再重算。
|
|
4020
|
-
* @param id - 会话 id。
|
|
4021
|
-
*/
|
|
4022
3924
|
rebuildSessionStats(id: SessionId): Promise<void>;
|
|
4023
|
-
|
|
4024
|
-
* 全量重算 `t_event_usage` 的引用标记(`f_referenced` / `f_subagent`):rewind / fork / 会话删除之后调用。
|
|
4025
|
-
* 引用可能跨会话消失(截断、删除),只按本会话判定不够,故这里是全量。
|
|
4026
|
-
*/
|
|
4027
|
-
refreshEventUsageFlags(): Promise<void>;
|
|
4028
|
-
/** 删掉一个会话的汇总行(会话删除时;外键 CASCADE 之外再显式清一次)。 */
|
|
3925
|
+
refreshEventUsageFlags(eventIds: readonly string[]): Promise<void>;
|
|
4029
3926
|
deleteSessionStats(id: SessionId): Promise<void>;
|
|
4030
|
-
/** 回收空间与统计(含 VACUUM);不得在事务内执行。 */
|
|
4031
3927
|
vacuum(): Promise<void>;
|
|
4032
3928
|
close(): Promise<void>;
|
|
4033
3929
|
}
|
|
@@ -4072,46 +3968,9 @@ declare function repairAssistantSettlement(events: SessionEvent[]): void;
|
|
|
4072
3968
|
declare function repairRequestHeaders(events: SessionEvent[]): void;
|
|
4073
3969
|
declare function syncMeteringRanges(events: SessionEvent[]): void;
|
|
4074
3970
|
declare function renameLegacyPtcEvents(events: SessionEvent[]): void;
|
|
4075
|
-
/**
|
|
4076
|
-
* 把**旧代(v3 及更早)的消息形状**归一到当前格式(v4):迁移链(严格)拒绝那些形状时,读路径仍要
|
|
4077
|
-
* 能把它们读出来——只动字段与标记,不改坐标、不改内容。
|
|
4078
|
-
*
|
|
4079
|
-
* 三件事:
|
|
4080
|
-
* - `system/message` 的 source:`{ kind: 'plugin', plugin: '@deepseek-ai/dsh-system-prompt' }` → `{ kind: 'system-prompt' }`
|
|
4081
|
-
* (v4 起 system 消息只认这个 kind);
|
|
4082
|
-
* - `tool/result` 的消息:v3 是 user 角色、结果块包在 `content[0]`;v4 是 `role: 'tool'` + 顶层
|
|
4083
|
-
* `toolCallId` + `content` 就是结果块;
|
|
4084
|
-
* - **本仓库自造、上游不认识的事件类型**(见 `OWN_EVENT_TYPES`:历史遗留的与我们当前在写的)标
|
|
4085
|
-
* `ignorable: true`——v4 的校验对未知类型只接受可忽略信封。
|
|
4086
|
-
*
|
|
4087
|
-
* 只认这张白名单:**其它未知类型保持 fail loud**(那是「数据来自更新的 harness」的信号,不能吞掉)。
|
|
4088
|
-
*/
|
|
4089
3971
|
declare function normalizeToCurrentShape(events: SessionEvent[]): void;
|
|
4090
|
-
/**
|
|
4091
|
-
* 落库前给**本仓库自造的事件类型**补上 `ignorable: true` 信封。
|
|
4092
|
-
*
|
|
4093
|
-
* 上游的持久化校验(`validateStoredEvents`)只放行「已知类型」或「带可忽略信封的未知类型」,我们的类型
|
|
4094
|
-
* 按构造就在已知表之外——不补的话连**写入**都会被拒(`appendBatch` 里那道校验)。上游 `Session.append`
|
|
4095
|
-
* 没有承载这个信封的口子(第三个参数只服务 surface 事件),所以这一笔由持久化层补:canonical log 里的
|
|
4096
|
-
* 形状不变,落库的那一份带上信封。
|
|
4097
|
-
* @param events - 即将落库的批次(`materializeAppendBatch` 的 JSON 快照副本,可写)。
|
|
4098
|
-
*/
|
|
4099
3972
|
declare function sealOwnEvents(events: readonly SessionEvent[]): void;
|
|
4100
|
-
/**
|
|
4101
|
-
* 本仓库自造、上游不认识的事件类型:读的时候标 `ignorable: true`,v4 的持久化校验才肯跳过它们
|
|
4102
|
-
* (`validateStoredEvents` 只放行「已知类型」或「带可忽略信封的未知类型」)。
|
|
4103
|
-
*
|
|
4104
|
-
* 两类都在这张表里:
|
|
4105
|
-
* - **历史遗留**:写过、后来连同机制一起删除的(`session-branch/version`);
|
|
4106
|
-
* - **当前在写**:本仓库的插件自己声明的事件类型(`session-mode/selected`)——上游的
|
|
4107
|
-
* `KNOWN_SESSION_EVENT_TYPES` 由上游仓库的声明生成,外部插件的事件按构造就在它之外。
|
|
4108
|
-
*
|
|
4109
|
-
* 新增自造事件类型时**必须**登记到这里,否则读路径 fail loud(真回归:`session-mode/selected` 漏登记,
|
|
4110
|
-
* 会话打不开)。**不要**用「所有未知类型」代替(那会掩盖更新版本的未知事件——那种必须拒读)。
|
|
4111
|
-
*/
|
|
4112
3973
|
declare const OWN_EVENT_TYPES: ReadonlySet<string>;
|
|
4113
|
-
/** 这批事件是否需要按当前形状归一(旧代消息形状,或尚未标 `ignorable` 的自造事件类型)——写路径曾把回退
|
|
4114
|
-
* 视图的结果以当前版本号落库,所以**版本号不可信**,读之前要按内容判一次。 */
|
|
4115
3974
|
declare function needsShapeAdoption(events: readonly SessionEvent[]): boolean;
|
|
4116
3975
|
declare function repairReadView(events: SessionEvent[]): void;
|
|
4117
3976
|
declare function orphanInboxSpliceSeqs(events: readonly SessionEvent[]): Set<number>;
|
|
@@ -4122,7 +3981,6 @@ declare function scanRows(rows: readonly EventRow[], base?: number): {
|
|
|
4122
3981
|
};
|
|
4123
3982
|
declare function toJsonlArtifact(meta: SessionHeader, inheritedEventCount: number, events: readonly SessionEvent[]): string;
|
|
4124
3983
|
declare function titleOfEventData(data: string): string | undefined;
|
|
4125
|
-
/** 用量行的列(`t_event_usage`):读侧维度(本地日与两个归属标记)在写入时一起物化。 */
|
|
4126
3984
|
interface EventUsageRow {
|
|
4127
3985
|
fEventId: string;
|
|
4128
3986
|
fCreatedAt: number;
|
|
@@ -4137,15 +3995,6 @@ interface EventUsageRow {
|
|
|
4137
3995
|
fReasoningTokens: number;
|
|
4138
3996
|
fTotalTokens: number;
|
|
4139
3997
|
}
|
|
4140
|
-
/**
|
|
4141
|
-
* 一条事件行的用量(只有带 `usage` 的 `assistant/message` 才有):写路径据此记录
|
|
4142
|
-
* `t_event_usage`,统计因此不必逐行解析 JSON。两种 `f_data` 结构(带信封 / 老格式)都认。
|
|
4143
|
-
* 读侧维度一起物化:本地日由事件时间算,`f_referenced` 直接 1(这一批事件行与桥接行同事务,
|
|
4144
|
-
* 提交即被引用),`f_subagent` 取写入它的会话是否子代理。
|
|
4145
|
-
* @param event - 待写入的事件行。
|
|
4146
|
-
* @param subagent - 写入它的会话是否 `origin === 'subagent'`。
|
|
4147
|
-
* @returns 用量行,或该事件没有用量时的 undefined。
|
|
4148
|
-
*/
|
|
4149
3998
|
declare function usageRowOf(event: {
|
|
4150
3999
|
fEventId: string;
|
|
4151
4000
|
fCreatedAt: number;
|
|
@@ -4153,4 +4002,4 @@ declare function usageRowOf(event: {
|
|
|
4153
4002
|
fData: string;
|
|
4154
4003
|
}, subagent: boolean): EventUsageRow | undefined;
|
|
4155
4004
|
//#endregion
|
|
4156
|
-
export {
|
|
4005
|
+
export { SessionDeletionErrorCode as $, SessionRow as A, WriteGuard as At, UsageTotals as B, usageRowOf as C, tSessionProjcacheRows as Ct, SessionCountBucket as D, tWorkspaceSessions as Dt, EventRow as E, tStorageUnits as Et, UsageAggregate as F, SESSION_ROWS_PATH as Ft, emptyTotals as G, addActivityTotals as H, UsageBucket as I, SESSION_USAGE_PATH as It, resolveUsageSince as J, localDayKey as K, UsageRangeKey as L, StorageRepository as Lt, COUNTED_EVENT_TYPES as M, SESSION_EXPORT_PATH as Mt, SessionUsageReport as N, SESSION_GC_PATH as Nt, SessionListRowsPage as O, tWorkspaceState as Ot, UsageActivityTotals as P, SESSION_IMPORT_PATH as Pt, SessionDeletionError as Q, UsageSessionRow as R, toJsonlArtifact as S, tSessionEvents as St, BackendTx as T, tSessions as Tt, addTokenTotals as U, addActivityCount as V, addTotals as W, ProjectionCacheOptions as X, Config$1 as Y, ResolvedConfig as Z, sealOwnEvents as _, tEventUsage as _t, normalizeToCurrentShape as a, truncateLiveSession as at, syncMeteringRanges as b, tSchemaMeta as bt, renameLegacyPtcEvents as c, DEFAULT_BUSY_TIMEOUT_MS as ct, repairReadView as d, EventRole as dt, SessionPersistenceRdb as et, repairRequestHeaders as f, JournalMode as ft, scanRows as g, eventKind as gt, rowToMeta as h, eventDimensions as ht, needsShapeAdoption as i, locateTurnEnd as it, SessionUsageBucket as j, SESSION_DELETE_PATH as jt, SessionListRowsQuery as k, tWorkspaces as kt, repairAssistantSettlement as l, EVENT_ENCODING as lt, rowToEvent as m, SESSION_PERSISTENCE_SQLITE_APPLICATION_ID as mt, OWN_EVENT_TYPES as n, SessionBranchRdb as nt, orphanInboxSpliceSeqs as o, SessionRowsItem as ot, repairSurfaceOps as p, SCHEMA_VERSION as pt, registerSessionUsage as q, findSurfaceRepairs as r, SessionBranchRdbProvider as rt, recomputeReplaceProvenance as s, SessionRowsValue as st, EventUsageRow as t, SessionPersistenceRdbInternals as tt, repairOrphanInboxSplices as u, EventKind as ut, sessionConflictRow as v, tEvents as vt, Backend as w, tSessionUsage as wt, titleOfEventData as x, tSessionCounts as xt, sessionInsertRow as y, tPersistenceState as yt, UsageTokenTotals as z };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//#region src/routes.ts
|
|
2
|
+
const MORLAY_SESSION_API_PREFIX = "/api/morlay/v1/session";
|
|
3
|
+
const SESSION_ROWS_PATH = `${MORLAY_SESSION_API_PREFIX}/rows`;
|
|
4
|
+
const SESSION_EXPORT_PATH = `${MORLAY_SESSION_API_PREFIX}/export`;
|
|
5
|
+
const SESSION_IMPORT_PATH = `${MORLAY_SESSION_API_PREFIX}/import`;
|
|
6
|
+
const SESSION_DELETE_PATH = `${MORLAY_SESSION_API_PREFIX}/delete`;
|
|
7
|
+
const SESSION_GC_PATH = `${MORLAY_SESSION_API_PREFIX}/gc`;
|
|
8
|
+
const SESSION_USAGE_PATH = `${MORLAY_SESSION_API_PREFIX}/usage`;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { SESSION_ROWS_PATH as a, SESSION_IMPORT_PATH as i, SESSION_EXPORT_PATH as n, SESSION_USAGE_PATH as o, SESSION_GC_PATH as r, SESSION_DELETE_PATH as t };
|