@morlay/session-rdb 0.1.10-alpha.0 → 0.1.10-alpha.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 (142) hide show
  1. package/README.md +18 -3
  2. package/dist/artifact.d.mts +118 -2
  3. package/dist/artifact.mjs +5 -3
  4. package/dist/{log-TYgd8Xkr.d.mts → backend-BKtJ5sO5.d.mts} +183 -284
  5. package/dist/backend-rdb-BDCntVDy.mjs +1341 -0
  6. package/dist/branch-CG1PUlO6.mjs +833 -0
  7. package/dist/deletion-SSX7IqU8.mjs +35 -0
  8. package/dist/deletion.d.mts +1 -1
  9. package/dist/deletion.mjs +2 -2
  10. package/dist/export-CfJQjQfr.mjs +123 -0
  11. package/dist/export.d.mts +1 -1
  12. package/dist/export.mjs +31 -55
  13. package/dist/import.d.mts +1 -1
  14. package/dist/import.mjs +31 -76
  15. package/dist/index-CUD2ZpTA.d.mts +71 -0
  16. package/dist/index.d.mts +20 -2
  17. package/dist/index.mjs +1561 -4
  18. package/dist/open-YoyD_kah.mjs +561 -0
  19. package/dist/organize.d.mts +9 -0
  20. package/dist/organize.mjs +30 -0
  21. package/dist/route-DpfY0zq-.mjs +114 -0
  22. package/dist/storage.d.mts +41 -48
  23. package/dist/storage.mjs +3 -1
  24. package/dist/testing.d.mts +9 -1
  25. package/dist/testing.mjs +25 -4
  26. package/dist/usage-row-BQQM-_t6.mjs +36 -0
  27. package/dist/usage.d.mts +1 -1
  28. package/dist/usage.mjs +7 -40
  29. package/dist/write-guard-CYrY58GM.mjs +174 -0
  30. package/package.json +10 -14
  31. package/src/artifact.ts +4 -1
  32. package/src/backend-rdb.ts +331 -0
  33. package/src/backend.ts +32 -15
  34. package/src/{branch.ts → branch/index.ts} +109 -110
  35. package/src/branch/port.ts +62 -0
  36. package/src/branch/semantics.ts +69 -0
  37. package/src/db/open.ts +180 -0
  38. package/src/db/stats.ts +449 -0
  39. package/src/deletion-error.ts +17 -0
  40. package/src/deletion.ts +19 -72
  41. package/src/entities/index.ts +16 -1
  42. package/src/entities/v3/event-usage.ts +3 -3
  43. package/src/entities/v3/events.ts +3 -3
  44. package/src/entities/v3/index.ts +4 -16
  45. package/src/entities/v3/persistence-state.ts +3 -3
  46. package/src/entities/v3/schema-meta.ts +3 -3
  47. package/src/entities/v3/session-counts.ts +3 -3
  48. package/src/entities/v3/session-events.ts +3 -3
  49. package/src/entities/v3/session-projcache-rows.ts +3 -3
  50. package/src/entities/v3/session-usage.ts +3 -3
  51. package/src/entities/v3/sessions.ts +3 -3
  52. package/src/entities/v3/storage-records.ts +17 -0
  53. package/src/entities/v3/storage-units.ts +3 -3
  54. package/src/{schema.ts → event-shape.ts} +0 -46
  55. package/src/export.ts +32 -78
  56. package/src/handles.ts +349 -0
  57. package/src/http/route.ts +178 -0
  58. package/src/import-storages.ts +5 -2
  59. package/src/import.ts +63 -125
  60. package/src/index.ts +15 -1666
  61. package/src/legacy.ts +3 -1
  62. package/src/live-routing.ts +205 -0
  63. package/src/log/export.ts +84 -0
  64. package/src/{log.ts → log/repair.ts} +1 -268
  65. package/src/log/rows.ts +107 -0
  66. package/src/log/usage-row.ts +64 -0
  67. package/src/migrations.ts +196 -0
  68. package/src/organize.ts +38 -0
  69. package/src/read-path.ts +190 -0
  70. package/src/routes.ts +2 -1
  71. package/src/rows.ts +25 -77
  72. package/src/session-ops.ts +444 -0
  73. package/src/session-store.ts +675 -0
  74. package/src/stats-fold.ts +44 -0
  75. package/src/storage-takeover/index.ts +2 -5
  76. package/src/storage-takeover/legacy-domain-migration.ts +118 -0
  77. package/src/storage-takeover/projection-cache.ts +122 -71
  78. package/src/storage-takeover/read-model.ts +189 -0
  79. package/src/storage-takeover/repository.ts +236 -442
  80. package/src/storage-takeover/storage-backend.ts +44 -159
  81. package/src/storage-takeover/types.ts +45 -19
  82. package/src/storage-takeover/workspace-documents.ts +65 -0
  83. package/src/storage.ts +4 -2
  84. package/src/testing.ts +21 -1
  85. package/src/usage.ts +11 -65
  86. package/src/version.ts +13 -0
  87. package/src/write-path.ts +286 -0
  88. package/dist/branch-CoPCRKer.mjs +0 -401
  89. package/dist/deletion-CWl89TIR.mjs +0 -2249
  90. package/dist/gc.d.mts +0 -4
  91. package/dist/gc.mjs +0 -48
  92. package/dist/log-CcWy46VE.mjs +0 -558
  93. package/dist/routes-hZjTcX_R.mjs +0 -9
  94. package/dist/sqlite-BNRd1aqR.mjs +0 -1778
  95. package/drizzle/postgres/20260908072805_v2_initial/migration.sql +0 -58
  96. package/drizzle/postgres/20260908072805_v2_initial/snapshot.json +0 -686
  97. package/drizzle/postgres/20260908072806_v3_drop_original_seq/migration.sql +0 -1
  98. package/drizzle/postgres/20260908072806_v3_drop_original_seq/snapshot.json +0 -673
  99. package/drizzle/postgres/20260910120001_v3_storage_tables/migration.sql +0 -65
  100. package/drizzle/postgres/20260910120001_v3_storage_tables/snapshot.json +0 -1183
  101. package/drizzle/postgres/20260910130001_v3_session_title_backfill/migration.sql +0 -10
  102. package/drizzle/postgres/20260910130001_v3_session_title_backfill/snapshot.json +0 -1183
  103. package/drizzle/postgres/20260918120000_v3_event_usage/migration.sql +0 -14
  104. package/drizzle/postgres/20260918120000_v3_event_usage/snapshot.json +0 -1309
  105. package/drizzle/postgres/20260921075900_v3_agent_preset/migration.sql +0 -1
  106. package/drizzle/postgres/20260922090001_v3_pinned_seq/migration.sql +0 -2
  107. package/drizzle/postgres/20260922093001_v3_last_event_at/migration.sql +0 -10
  108. package/drizzle/postgres/20260923120000_v3_usage_materialized/migration.sql +0 -48
  109. package/drizzle/postgres/20261008103001_v3_schedule_tasks/migration.sql +0 -11
  110. package/drizzle/sqlite/20260908072751_v2_initial/migration.sql +0 -53
  111. package/drizzle/sqlite/20260908072751_v2_initial/snapshot.json +0 -492
  112. package/drizzle/sqlite/20260908072752_v3_drop_original_seq/migration.sql +0 -6
  113. package/drizzle/sqlite/20260908072752_v3_drop_original_seq/snapshot.json +0 -513
  114. package/drizzle/sqlite/20260910120000_v3_storage_tables/migration.sql +0 -66
  115. package/drizzle/sqlite/20260910120000_v3_storage_tables/snapshot.json +0 -905
  116. package/drizzle/sqlite/20260910130000_v3_session_title_backfill/migration.sql +0 -13
  117. package/drizzle/sqlite/20260910130000_v3_session_title_backfill/snapshot.json +0 -905
  118. package/drizzle/sqlite/20260918120000_v3_event_usage/migration.sql +0 -14
  119. package/drizzle/sqlite/20260918120000_v3_event_usage/snapshot.json +0 -1031
  120. package/drizzle/sqlite/20260921075855_v3_agent_preset/migration.sql +0 -7
  121. package/drizzle/sqlite/20260921075855_v3_agent_preset/snapshot.json +0 -1041
  122. package/drizzle/sqlite/20260922090000_v3_pinned_seq/migration.sql +0 -4
  123. package/drizzle/sqlite/20260922093000_v3_last_event_at/migration.sql +0 -13
  124. package/drizzle/sqlite/20260923120000_v3_usage_materialized/migration.sql +0 -48
  125. package/drizzle/sqlite/20261008103000_v3_schedule_tasks/migration.sql +0 -14
  126. package/src/adapters/index.ts +0 -12
  127. package/src/adapters/to-postgres.ts +0 -93
  128. package/src/adapters/to-sqlite.ts +0 -83
  129. package/src/adapters/types.ts +0 -44
  130. package/src/drizzle/postgres-v2.ts +0 -10
  131. package/src/drizzle/postgres-v3.ts +0 -18
  132. package/src/drizzle/sqlite-v2.ts +0 -9
  133. package/src/drizzle/sqlite-v3.ts +0 -18
  134. package/src/entities/v2/index.ts +0 -20
  135. package/src/entities/v2/session-events.ts +0 -10
  136. package/src/entities/v3/schedule-tasks.ts +0 -16
  137. package/src/entities/v3/workspace-sessions.ts +0 -19
  138. package/src/entities/v3/workspace-state.ts +0 -12
  139. package/src/entities/v3/workspaces.ts +0 -14
  140. package/src/gc.ts +0 -77
  141. package/src/postgres.ts +0 -1015
  142. package/src/sqlite.ts +0 -1096
package/README.md CHANGED
@@ -2,8 +2,9 @@
2
2
 
3
3
  会话持久化与分支回退的 RDB 后端(SQLite / PostgreSQL):提供 `ctx.sessionPersistence`(上游 `SessionHandle`
4
4
  模型:`create` / `open` / `flush` / `stat` / `list`)与 `ctx.sessionBranch`(`rewind` / `retry` / `fork` 的
5
- provider 面),并接管 `ctx.sessionQuery`(全文检索 disabled)与 `$DSH_HOME/storages` 的两个域
6
- (workspace、投影 checkpoint)。
5
+ provider 面),并接管 `ctx.sessionQuery`(全文检索 disabled)、`ctx.sessionProjectionCache`
6
+ (投影 checkpoint 落行级表)与 `$DSH_HOME/storages` 的**所有域**(workspace / schedule / cua 的授权域…):
7
+ 按 `(域, 表, 键)` 落同一张 `t_storage_records`(`rdb` KV 后端),新增域不需要再加表或映射。
7
8
 
8
9
  ## 用法
9
10
 
@@ -24,6 +25,11 @@ provider 面),并接管 `ctx.sessionQuery`(全文检索 disabled)与 `$D
24
25
  PostgreSQL 同理:`type: postgres` + `connectionString`(可加 `schema`,默认 `public`)。字段、默认值、装配默认值的
25
26
  来源与「改配置由 Loader 重挂这一行生效」见[设计总览](./.agents/designs/20260917-设计总览.md)的「配置门面」。
26
27
 
28
+ PG 的方言能力(连接、`PRAGMA` 库身份、聚合的 int8、JSON 提取、本地日、事务串行)由 `@morlay/rdbkit` 自己的
29
+ `pg.spec.ts` 等用例验证;本包的契约与接管用例只在 SQLite 上跑(两个方言共用同一个后端实现,同一份逻辑不重复测)。
30
+ 本地跑 rdbkit 的 PG 用例时用它的 dev 实例起库(`just pg up`,端口 25433),再设
31
+ `TEST_PG_URL=postgres://postgres:postgres@localhost:25433/postgres`。
32
+
27
33
  `preparedSessionCacheSize` 透传给上游 `session-query` 的冷会话观察缓存:缓存**按条目数**持有完整 `Session`
28
34
  (含整份 append-only log),被活跃观察租约钉住的条目不淘汰;一次读取中途转成 live 时会重试 live 路径,但不会
29
35
  顺手清掉已缓存的 cold 条目——同一个 id 因此可能同时有两份 log 驻留。上游默认 5,**本行默认 1**(本地单用户、
@@ -31,6 +37,15 @@ rdb 后端,冷读复用的收益不值这份内存放大);上游校验下
31
37
 
32
38
  管理面的 HTTP 通道统一挂在 `/api/morlay/v1/session` 前缀下(均为 `POST`,body `{ sessionId }` 或列表请求
33
39
  `{ query?, includeSubagents?, page?, pageSize? }`):`/rows`(完整语料,含归档)、`/export`、`/import`、
34
- `/delete`、`/gc`、`/usage`(前缀与上游分家的理由见
40
+ `/delete`、`/organize`、`/usage`(前缀与上游分家的理由见
35
41
  [ADR-管理面HTTP路由前缀与上游分家](./.agents/adrs/20260929-管理面HTTP路由前缀与上游分家.md))。旧
36
42
  `$DSH_HOME/storages` JSON 的导入是包内 API `importStorages`(`src/import-storages.ts`,不在包出口里)。
43
+
44
+ ## 与数据库的交互
45
+
46
+ **本包不写 SQL**:所有查询、写入、结构与迁移都经 `@morlay/rdbkit` 的表句柄与表达式(`E.eq` / `E.coalesce` /
47
+ `E.localDay` / `E.jsonInt` …);方言相关的渲染落在 rdbkit 里,本包只表达语义。连接、事务、库身份(`PRAGMA`)、
48
+ `VACUUM` 同样由 rdbkit 提供入口,本包看不到驱动与方言。
49
+
50
+ SQLite 与 PostgreSQL 共用同一个后端实现 `src/backend-rdb.ts`(`RdbBackend`):读模型、写事务、统计与域存储
51
+ 都只有一份代码,方言差异只出现在表达式层([设计 数据库交互经 rdbkit](./.agents/designs/20261103-数据库交互经-rdbkit.md))。
@@ -1,3 +1,119 @@
1
- import { C as usageRowOf, It as SESSION_IMPORT_PATH, S as toJsonlArtifact, _ as sealOwnEvents, a as normalizeToCurrentShape, b as syncMeteringRanges, c as renameLegacyPtcEvents, d as repairReadView, f as repairRequestHeaders, g as scanRows, h as rowToMeta, i as needsShapeAdoption, l as repairAssistantSettlement, m as rowToEvent, n as OWN_EVENT_TYPES, o as orphanInboxSpliceSeqs, p as repairSurfaceOps, r as findSurfaceRepairs, s as recomputeReplaceProvenance, t as EventUsageRow, u as repairOrphanInboxSplices, v as sessionConflictRow, x as titleOfEventData, y as sessionInsertRow } from "./log-TYgd8Xkr.mjs";
1
+ import { K as EventUsageRow, V as SESSION_IMPORT_PATH, c as SessionRow, q as usageRowOf, r as EventRow } from "./backend-BKtJ5sO5.mjs";
2
2
  import { SESSION_LOG_ARTIFACT_FILENAME, parseImportZip, parseJsonlArtifact, persistImport, registerSessionImport } from "./import.mjs";
3
- export { EventUsageRow, OWN_EVENT_TYPES, SESSION_IMPORT_PATH, SESSION_LOG_ARTIFACT_FILENAME, findSurfaceRepairs, needsShapeAdoption, normalizeToCurrentShape, orphanInboxSpliceSeqs, parseImportZip, parseJsonlArtifact, persistImport, recomputeReplaceProvenance, registerSessionImport, renameLegacyPtcEvents, repairAssistantSettlement, repairOrphanInboxSplices, repairReadView, repairRequestHeaders, repairSurfaceOps, rowToEvent, rowToMeta, scanRows, sealOwnEvents, sessionConflictRow, sessionInsertRow, syncMeteringRanges, titleOfEventData, toJsonlArtifact, usageRowOf };
3
+ import { InsertRow, RowOf } from "@morlay/rdbkit";
4
+ import { SessionEvent, SessionHeader } from "@deepseek-ai/dsh-session";
5
+ import { SessionStorageMetadata } from "@deepseek-ai/dsh-session-persistence";
6
+ declare const sessions: import("@morlay/rdbkit").Table<{
7
+ readonly name: "t_sessions";
8
+ readonly columns: {
9
+ readonly f_id: {
10
+ readonly type: "serial";
11
+ readonly primaryKey: true;
12
+ };
13
+ readonly f_session_id: {
14
+ readonly type: "text";
15
+ readonly notNull: true;
16
+ readonly unique: true;
17
+ };
18
+ readonly f_head_event_id: {
19
+ readonly type: "text";
20
+ readonly notNull: true;
21
+ readonly default: "";
22
+ };
23
+ readonly f_head_sequence: {
24
+ readonly type: "integer";
25
+ readonly notNull: true;
26
+ readonly default: -1;
27
+ };
28
+ readonly f_version: {
29
+ readonly type: "integer";
30
+ readonly notNull: true;
31
+ };
32
+ readonly f_created_at: {
33
+ readonly type: "bigint";
34
+ readonly notNull: true;
35
+ };
36
+ readonly f_cwd: {
37
+ readonly type: "text";
38
+ };
39
+ readonly f_parent_session: {
40
+ readonly type: "text";
41
+ };
42
+ readonly f_seed_length: {
43
+ readonly type: "integer";
44
+ };
45
+ readonly f_origin: {
46
+ readonly type: "text";
47
+ };
48
+ readonly f_delegation_depth: {
49
+ readonly type: "integer";
50
+ };
51
+ readonly f_agent_preset: {
52
+ readonly type: "text";
53
+ };
54
+ readonly f_incarnation: {
55
+ readonly type: "text";
56
+ readonly notNull: true;
57
+ };
58
+ readonly f_revision: {
59
+ readonly type: "integer";
60
+ readonly notNull: true;
61
+ };
62
+ readonly f_archived_at: {
63
+ readonly type: "bigint";
64
+ };
65
+ readonly f_pinned_seq: {
66
+ readonly type: "integer";
67
+ };
68
+ readonly f_last_event_at: {
69
+ readonly type: "bigint";
70
+ };
71
+ readonly f_title: {
72
+ readonly type: "text";
73
+ };
74
+ readonly f_title_seq: {
75
+ readonly type: "integer";
76
+ };
77
+ };
78
+ }>;
79
+ export declare function rowToMeta(row: SessionRow): SessionHeader;
80
+ /** 新建会话行(列名即表定义里的列,值全部显式给出)。 */
81
+ export declare function sessionInsertColumns(storage: SessionStorageMetadata, incarnation: string): InsertRow<RowOf<typeof sessions>>;
82
+ /** header 的八列(`upsert` 时「变了的列才写」判据也用它)。 */
83
+ export declare function sessionHeaderColumns(storage: SessionStorageMetadata): {
84
+ f_version: number;
85
+ f_created_at: number;
86
+ f_cwd: string | null;
87
+ f_parent_session: string | null;
88
+ f_seed_length: number | null;
89
+ f_origin: string | null;
90
+ f_delegation_depth: number | null;
91
+ f_agent_preset: string | null;
92
+ };
93
+ export declare function rowToEvent(row: EventRow): SessionEvent;
94
+ export declare function recomputeReplaceProvenance(events: SessionEvent[]): void;
95
+ export declare function findSurfaceRepairs(events: readonly SessionEvent[]): {
96
+ degradeToAppend: Set<number>;
97
+ addAppendMarker: Set<number>;
98
+ clearSurfaceOp: Set<number>;
99
+ clampEnd: Map<number, number>;
100
+ };
101
+ export declare function repairSurfaceOps(events: SessionEvent[]): void;
102
+ export declare function repairAssistantSettlement(events: SessionEvent[]): void;
103
+ export declare function repairRequestHeaders(events: SessionEvent[]): void;
104
+ export declare function syncMeteringRanges(events: SessionEvent[]): void;
105
+ export declare function renameLegacyPtcEvents(events: SessionEvent[]): void;
106
+ export declare function normalizeToCurrentShape(events: SessionEvent[]): void;
107
+ export declare function sealOwnEvents(events: readonly SessionEvent[]): void;
108
+ export declare const OWN_EVENT_TYPES: ReadonlySet<string>;
109
+ export declare function needsShapeAdoption(events: readonly SessionEvent[]): boolean;
110
+ export declare function repairReadView(events: SessionEvent[]): void;
111
+ export declare function orphanInboxSpliceSeqs(events: readonly SessionEvent[]): Set<number>;
112
+ export declare function repairOrphanInboxSplices(events: SessionEvent[]): void;
113
+ export declare function scanRows(rows: readonly EventRow[], base?: number): {
114
+ preserved: SessionEvent[];
115
+ tornFrom?: number;
116
+ };
117
+ export declare function toJsonlArtifact(meta: SessionHeader, inheritedEventCount: number, events: readonly SessionEvent[]): string;
118
+ export declare function titleOfEventData(data: string): string | undefined;
119
+ export { EventUsageRow, SESSION_IMPORT_PATH, SESSION_LOG_ARTIFACT_FILENAME, parseImportZip, parseJsonlArtifact, persistImport, registerSessionImport, usageRowOf };
package/dist/artifact.mjs CHANGED
@@ -1,4 +1,6 @@
1
- import { i as SESSION_IMPORT_PATH } from "./routes-hZjTcX_R.mjs";
2
- import { S as usageRowOf, _ as sessionConflictRow, a as orphanInboxSpliceSeqs, b as titleOfEventData, c as repairAssistantSettlement, d as repairRequestHeaders, f as repairSurfaceOps, g as sealOwnEvents, h as scanRows, i as normalizeToCurrentShape, l as repairOrphanInboxSplices, m as rowToMeta, n as findSurfaceRepairs, o as recomputeReplaceProvenance, p as rowToEvent, r as needsShapeAdoption, s as renameLegacyPtcEvents, t as OWN_EVENT_TYPES, u as repairReadView, v as sessionInsertRow, x as toJsonlArtifact, y as syncMeteringRanges } from "./log-CcWy46VE.mjs";
1
+ import { a as rowToMeta, i as rowToEvent, n as titleOfEventData, o as sessionHeaderColumns, r as toJsonlArtifact, s as sessionInsertColumns, t as scanRows } from "./export-CfJQjQfr.mjs";
2
+ import { C as sealOwnEvents, S as repairSurfaceOps, _ as renameLegacyPtcEvents, b as repairReadView, d as OWN_EVENT_TYPES, f as findSurfaceRepairs, g as recomputeReplaceProvenance, h as orphanInboxSpliceSeqs, m as normalizeToCurrentShape, p as needsShapeAdoption, v as repairAssistantSettlement, w as syncMeteringRanges, x as repairRequestHeaders, y as repairOrphanInboxSplices } from "./branch-CG1PUlO6.mjs";
3
+ import { o as SESSION_IMPORT_PATH } from "./route-DpfY0zq-.mjs";
4
+ import { t as usageRowOf } from "./usage-row-BQQM-_t6.mjs";
3
5
  import { SESSION_LOG_ARTIFACT_FILENAME, parseImportZip, parseJsonlArtifact, persistImport, registerSessionImport } from "./import.mjs";
4
- export { OWN_EVENT_TYPES, SESSION_IMPORT_PATH, SESSION_LOG_ARTIFACT_FILENAME, findSurfaceRepairs, needsShapeAdoption, normalizeToCurrentShape, orphanInboxSpliceSeqs, parseImportZip, parseJsonlArtifact, persistImport, recomputeReplaceProvenance, registerSessionImport, renameLegacyPtcEvents, repairAssistantSettlement, repairOrphanInboxSplices, repairReadView, repairRequestHeaders, repairSurfaceOps, rowToEvent, rowToMeta, scanRows, sealOwnEvents, sessionConflictRow, sessionInsertRow, syncMeteringRanges, titleOfEventData, toJsonlArtifact, usageRowOf };
6
+ export { OWN_EVENT_TYPES, SESSION_IMPORT_PATH, SESSION_LOG_ARTIFACT_FILENAME, findSurfaceRepairs, needsShapeAdoption, normalizeToCurrentShape, orphanInboxSpliceSeqs, parseImportZip, parseJsonlArtifact, persistImport, recomputeReplaceProvenance, registerSessionImport, renameLegacyPtcEvents, repairAssistantSettlement, repairOrphanInboxSplices, repairReadView, repairRequestHeaders, repairSurfaceOps, rowToEvent, rowToMeta, scanRows, sealOwnEvents, sessionHeaderColumns, sessionInsertColumns, syncMeteringRanges, titleOfEventData, toJsonlArtifact, usageRowOf };