@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.
Files changed (48) hide show
  1. package/README.md +17 -166
  2. package/dist/artifact.d.mts +2 -2
  3. package/dist/artifact.mjs +3 -2
  4. package/dist/{branch-D4nVzQQM.mjs → branch-IQii6Muq.mjs} +1 -8
  5. package/dist/deletion.d.mts +1 -2
  6. package/dist/deletion.mjs +2 -1
  7. package/dist/export.d.mts +1 -3
  8. package/dist/export.mjs +1 -4
  9. package/dist/gc.d.mts +1 -3
  10. package/dist/gc.mjs +1 -3
  11. package/dist/import.d.mts +1 -2
  12. package/dist/import.mjs +2 -7
  13. package/dist/index.d.mts +1 -1
  14. package/dist/index.mjs +4 -3
  15. package/dist/{log-BWVFYAh5.mjs → log-D5C8-TGs.mjs} +0 -52
  16. package/dist/{log-CUjKQbOR.d.mts → log-tZMKFRKi.d.mts} +17 -168
  17. package/dist/routes-DGBlBE_I.mjs +10 -0
  18. package/dist/{sqlite-SCiSnwaz.mjs → sqlite-CMMSn5kE.mjs} +24 -62
  19. package/dist/{src-BZ1tffd5.mjs → src-dsd2H70D.mjs} +59 -97
  20. package/dist/storage.d.mts +2 -22
  21. package/dist/storage.mjs +1 -1
  22. package/dist/testing.d.mts +1 -1
  23. package/dist/testing.mjs +1 -1
  24. package/dist/usage.d.mts +1 -1
  25. package/dist/usage.mjs +1 -17
  26. package/package.json +19 -19
  27. package/src/backend.ts +35 -54
  28. package/src/branch.ts +3 -5
  29. package/src/deletion.ts +2 -1
  30. package/src/entities/v3/event-usage.ts +3 -6
  31. package/src/entities/v3/session-counts.ts +3 -5
  32. package/src/entities/v3/session-usage.ts +3 -5
  33. package/src/export.ts +5 -4
  34. package/src/gc.ts +4 -3
  35. package/src/import.ts +5 -6
  36. package/src/index.ts +47 -45
  37. package/src/legacy.ts +3 -5
  38. package/src/log.ts +24 -53
  39. package/src/postgres.ts +70 -61
  40. package/src/routes.ts +16 -0
  41. package/src/rows.ts +11 -15
  42. package/src/session-query.ts +3 -7
  43. package/src/sqlite.ts +70 -58
  44. package/src/storage-takeover/projection-cache.ts +6 -8
  45. package/src/storage-takeover/repository.ts +2 -2
  46. package/src/storage-takeover/types.ts +1 -1
  47. package/src/usage.ts +22 -34
  48. 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<void>;
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<void>;
3935
- /** 批量删除整条会话:桥接行、workspace 归属行、投影行与会话行。 */
3936
- deleteSessions(ids: SessionId[]): Promise<number>;
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 { SessionDeletionError as $, SessionRow as A, tWorkspaceState as At, UsageTokenTotals as B, usageRowOf as C, tSessionCounts as Ct, SessionCountBucket as D, tSessions as Dt, EventRow as E, tSessionUsage as Et, UsageActivityTotals as F, addTotals as G, addActivityCount as H, UsageAggregate as I, registerSessionUsage as J, emptyTotals as K, UsageBucket as L, COUNTED_EVENT_TYPES as M, WriteGuard as Mt, SESSION_USAGE_PATH as N, StorageRepository as Nt, SessionListRowsPage as O, tStorageUnits as Ot, SessionUsageReport as P, ResolvedConfig as Q, UsageRangeKey as R, toJsonlArtifact as S, tSchemaMeta as St, BackendTx as T, tSessionProjcacheRows as Tt, addActivityTotals as U, UsageTotals as V, addTokenTotals as W, Config$1 as X, resolveUsageSince as Y, ProjectionCacheOptions as Z, sealOwnEvents as _, eventDimensions as _t, normalizeToCurrentShape as a, locateTurnEnd as at, syncMeteringRanges as b, tEvents as bt, renameLegacyPtcEvents as c, SessionRowsItem as ct, repairReadView as d, EVENT_ENCODING as dt, SessionDeletionErrorCode as et, repairRequestHeaders as f, EventKind as ft, scanRows as g, SESSION_PERSISTENCE_SQLITE_APPLICATION_ID as gt, rowToMeta as h, SCHEMA_VERSION as ht, needsShapeAdoption as i, SessionBranchRdbProvider as it, SessionUsageBucket as j, tWorkspaces as jt, SessionListRowsQuery as k, tWorkspaceSessions as kt, repairAssistantSettlement as l, SessionRowsValue as lt, rowToEvent as m, JournalMode as mt, OWN_EVENT_TYPES as n, SessionPersistenceRdbInternals as nt, orphanInboxSpliceSeqs as o, truncateLiveSession as ot, repairSurfaceOps as p, EventRole as pt, localDayKey as q, findSurfaceRepairs as r, SessionBranchRdb as rt, recomputeReplaceProvenance as s, SESSION_ROWS_PATH as st, EventUsageRow as t, SessionPersistenceRdb as tt, repairOrphanInboxSplices as u, DEFAULT_BUSY_TIMEOUT_MS as ut, sessionConflictRow as v, eventKind as vt, Backend as w, tSessionEvents as wt, titleOfEventData as x, tPersistenceState as xt, sessionInsertRow as y, tEventUsage as yt, UsageSessionRow as z };
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 };