@morlay/session-rdb 0.1.9 → 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 (143) hide show
  1. package/README.md +24 -3
  2. package/dist/artifact.d.mts +118 -3
  3. package/dist/artifact.mjs +5 -3
  4. package/dist/{log-C0q5svm7.d.mts → backend-BKtJ5sO5.d.mts} +189 -291
  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 -3
  9. package/dist/deletion.mjs +2 -2
  10. package/dist/export-CfJQjQfr.mjs +123 -0
  11. package/dist/export.d.mts +1 -3
  12. package/dist/export.mjs +32 -57
  13. package/dist/import.d.mts +1 -3
  14. package/dist/import.mjs +32 -78
  15. package/dist/index-CUD2ZpTA.d.mts +71 -0
  16. package/dist/index.d.mts +20 -2
  17. package/dist/index.mjs +1562 -5
  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 -50
  23. package/dist/storage.mjs +3 -1
  24. package/dist/testing.d.mts +9 -5
  25. package/dist/testing.mjs +27 -8
  26. package/dist/usage-row-BQQM-_t6.mjs +36 -0
  27. package/dist/usage.d.mts +1 -1
  28. package/dist/usage.mjs +8 -42
  29. package/dist/write-guard-CYrY58GM.mjs +174 -0
  30. package/package.json +32 -36
  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} +125 -112
  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 -1630
  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 -272
  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-query.ts +17 -4
  74. package/src/session-store.ts +675 -0
  75. package/src/stats-fold.ts +44 -0
  76. package/src/storage-takeover/index.ts +2 -5
  77. package/src/storage-takeover/legacy-domain-migration.ts +118 -0
  78. package/src/storage-takeover/projection-cache.ts +139 -77
  79. package/src/storage-takeover/read-model.ts +189 -0
  80. package/src/storage-takeover/repository.ts +238 -425
  81. package/src/storage-takeover/storage-backend.ts +47 -149
  82. package/src/storage-takeover/types.ts +45 -14
  83. package/src/storage-takeover/workspace-documents.ts +65 -0
  84. package/src/storage.ts +4 -2
  85. package/src/testing.ts +21 -1
  86. package/src/usage.ts +11 -65
  87. package/src/version.ts +13 -0
  88. package/src/write-path.ts +286 -0
  89. package/dist/branch-DbFW3rJX.mjs +0 -391
  90. package/dist/deletion-ODZFcbZm.mjs +0 -2218
  91. package/dist/gc.d.mts +0 -6
  92. package/dist/gc.mjs +0 -49
  93. package/dist/log-DYxdjJ-l.mjs +0 -562
  94. package/dist/routes-DGBlBE_I.mjs +0 -10
  95. package/dist/sqlite-DjOnMRh2.mjs +0 -1777
  96. package/drizzle/postgres/20260908072805_v2_initial/migration.sql +0 -58
  97. package/drizzle/postgres/20260908072805_v2_initial/snapshot.json +0 -686
  98. package/drizzle/postgres/20260908072806_v3_drop_original_seq/migration.sql +0 -1
  99. package/drizzle/postgres/20260908072806_v3_drop_original_seq/snapshot.json +0 -673
  100. package/drizzle/postgres/20260910120001_v3_storage_tables/migration.sql +0 -65
  101. package/drizzle/postgres/20260910120001_v3_storage_tables/snapshot.json +0 -1183
  102. package/drizzle/postgres/20260910130001_v3_session_title_backfill/migration.sql +0 -10
  103. package/drizzle/postgres/20260910130001_v3_session_title_backfill/snapshot.json +0 -1183
  104. package/drizzle/postgres/20260918120000_v3_event_usage/migration.sql +0 -14
  105. package/drizzle/postgres/20260918120000_v3_event_usage/snapshot.json +0 -1309
  106. package/drizzle/postgres/20260921075900_v3_agent_preset/migration.sql +0 -1
  107. package/drizzle/postgres/20260922090001_v3_pinned_seq/migration.sql +0 -2
  108. package/drizzle/postgres/20260922093001_v3_last_event_at/migration.sql +0 -10
  109. package/drizzle/postgres/20260923120000_v3_usage_materialized/migration.sql +0 -48
  110. package/drizzle/postgres/20261008103001_v3_schedule_tasks/migration.sql +0 -11
  111. package/drizzle/sqlite/20260908072751_v2_initial/migration.sql +0 -53
  112. package/drizzle/sqlite/20260908072751_v2_initial/snapshot.json +0 -492
  113. package/drizzle/sqlite/20260908072752_v3_drop_original_seq/migration.sql +0 -6
  114. package/drizzle/sqlite/20260908072752_v3_drop_original_seq/snapshot.json +0 -513
  115. package/drizzle/sqlite/20260910120000_v3_storage_tables/migration.sql +0 -66
  116. package/drizzle/sqlite/20260910120000_v3_storage_tables/snapshot.json +0 -905
  117. package/drizzle/sqlite/20260910130000_v3_session_title_backfill/migration.sql +0 -13
  118. package/drizzle/sqlite/20260910130000_v3_session_title_backfill/snapshot.json +0 -905
  119. package/drizzle/sqlite/20260918120000_v3_event_usage/migration.sql +0 -14
  120. package/drizzle/sqlite/20260918120000_v3_event_usage/snapshot.json +0 -1031
  121. package/drizzle/sqlite/20260921075855_v3_agent_preset/migration.sql +0 -7
  122. package/drizzle/sqlite/20260921075855_v3_agent_preset/snapshot.json +0 -1041
  123. package/drizzle/sqlite/20260922090000_v3_pinned_seq/migration.sql +0 -4
  124. package/drizzle/sqlite/20260922093000_v3_last_event_at/migration.sql +0 -13
  125. package/drizzle/sqlite/20260923120000_v3_usage_materialized/migration.sql +0 -48
  126. package/drizzle/sqlite/20261008103000_v3_schedule_tasks/migration.sql +0 -14
  127. package/src/adapters/index.ts +0 -12
  128. package/src/adapters/to-postgres.ts +0 -93
  129. package/src/adapters/to-sqlite.ts +0 -83
  130. package/src/adapters/types.ts +0 -44
  131. package/src/drizzle/postgres-v2.ts +0 -10
  132. package/src/drizzle/postgres-v3.ts +0 -18
  133. package/src/drizzle/sqlite-v2.ts +0 -9
  134. package/src/drizzle/sqlite-v3.ts +0 -18
  135. package/src/entities/v2/index.ts +0 -20
  136. package/src/entities/v2/session-events.ts +0 -10
  137. package/src/entities/v3/schedule-tasks.ts +0 -16
  138. package/src/entities/v3/workspace-sessions.ts +0 -19
  139. package/src/entities/v3/workspace-state.ts +0 -12
  140. package/src/entities/v3/workspaces.ts +0 -14
  141. package/src/gc.ts +0 -77
  142. package/src/postgres.ts +0 -1015
  143. package/src/sqlite.ts +0 -1086
package/dist/gc.d.mts DELETED
@@ -1,6 +0,0 @@
1
- import { Pt as SESSION_GC_PATH, et as SessionPersistenceRdb } from "./log-C0q5svm7.mjs";
2
- import { Context } from "@deepseek-ai/cordis";
3
- //#region src/gc.d.ts
4
- export declare function registerSessionGc(ctx: Context, persistence: SessionPersistenceRdb): void;
5
- //#endregion
6
- export { SESSION_GC_PATH };
package/dist/gc.mjs DELETED
@@ -1,49 +0,0 @@
1
- import { r as SESSION_GC_PATH } from "./routes-DGBlBE_I.mjs";
2
- //#region src/gc.ts
3
- async function stopRunningAgents(ctx) {
4
- const running = ctx.get("agents")?.list() ?? [];
5
- for (const agent of running) agent.cancel?.({ kind: "user" }, { keepInbox: true });
6
- await Promise.all(running.map((agent) => agent.whenIdle()));
7
- return running.length;
8
- }
9
- function registerSessionGc(ctx, persistence) {
10
- ctx.inject(["webServer", "connection"], (webCtx) => {
11
- const webServer = webCtx.webServer;
12
- const connection = webCtx.get("connection");
13
- return webCtx.effect(() => webServer.register({
14
- kind: "exact",
15
- path: SESSION_GC_PATH,
16
- handler: async (req, res) => {
17
- const rejection = connection.requestRejection(req);
18
- if (rejection !== void 0) {
19
- res.writeHead(rejection);
20
- res.end(rejection === 401 ? "unauthorized" : "forbidden");
21
- return;
22
- }
23
- if (req.method !== "POST") {
24
- res.writeHead(405, { "content-type": "application/json" });
25
- res.end(JSON.stringify({ error: "method not allowed" }));
26
- return;
27
- }
28
- try {
29
- const stoppedAgents = await stopRunningAgents(webCtx);
30
- const orphanSessions = await persistence.collectOrphanSessions();
31
- const orphanEvents = await persistence.collectOrphans();
32
- await persistence.vacuum();
33
- res.writeHead(200, { "content-type": "application/json" });
34
- res.end(JSON.stringify({
35
- orphanSessions,
36
- orphanEvents,
37
- stoppedAgents,
38
- vacuumed: true
39
- }));
40
- } catch (error) {
41
- res.writeHead(500, { "content-type": "application/json" });
42
- res.end(JSON.stringify({ error: error instanceof Error ? error.message : "gc failed" }));
43
- }
44
- }
45
- }), `session-rdb: ${SESSION_GC_PATH} route`);
46
- });
47
- }
48
- //#endregion
49
- export { SESSION_GC_PATH, registerSessionGc };
@@ -1,562 +0,0 @@
1
- import { localDayKey } from "./usage.mjs";
2
- import { SessionSeq } from "@deepseek-ai/dsh-session";
3
- import { sessionFormatCatalog } from "@deepseek-ai/dsh-session-format-catalog";
4
- //#region src/log.ts
5
- function normalizeSurfaceOp(value) {
6
- if (typeof value !== "object" || value === null || Array.isArray(value)) return value;
7
- const record = value;
8
- if (record["op"] !== "replace") return value;
9
- const startSeq = record["startSeq"] ?? record["start"];
10
- const endSeq = record["endSeq"] ?? record["end"];
11
- if (typeof startSeq !== "number" || typeof endSeq !== "number") return value;
12
- return {
13
- op: "replace",
14
- startSeq: SessionSeq(startSeq),
15
- endSeq: SessionSeq(endSeq)
16
- };
17
- }
18
- function rowToMeta(row) {
19
- if (!Number.isSafeInteger(row.fCreatedAt) || row.fCreatedAt < 0) throw new Error("stored session createdAt must be a non-negative safe integer");
20
- return {
21
- version: row.fVersion,
22
- id: row.fSessionId,
23
- createdAt: row.fCreatedAt,
24
- ...row.fCwd !== null ? { cwd: row.fCwd } : {},
25
- ...row.fParentSession !== null ? { parentSession: row.fParentSession } : {},
26
- isSeeded: row.fSeedLength !== null,
27
- ...row.fOrigin !== null ? { origin: row.fOrigin } : {},
28
- ...row.fDelegationDepth === null ? {} : { delegationDepth: row.fDelegationDepth },
29
- ...row.fAgentPreset === null ? {} : { agentPreset: row.fAgentPreset }
30
- };
31
- }
32
- function sessionInsertRow(storage, incarnation) {
33
- const meta = storage.meta;
34
- return {
35
- fSessionId: meta.id,
36
- fHeadEventId: "",
37
- fHeadSequence: -1,
38
- fVersion: meta.version,
39
- fCreatedAt: meta.createdAt,
40
- fCwd: meta.cwd ?? null,
41
- fParentSession: meta.parentSession ?? null,
42
- fSeedLength: meta.isSeeded ? storage.inheritedEventCount : null,
43
- fOrigin: meta.origin ?? null,
44
- fDelegationDepth: meta.delegationDepth ?? null,
45
- fAgentPreset: meta.agentPreset ?? null,
46
- fIncarnation: incarnation,
47
- fRevision: 0
48
- };
49
- }
50
- function sessionConflictRow(storage) {
51
- const meta = storage.meta;
52
- return {
53
- fVersion: meta.version,
54
- fCreatedAt: meta.createdAt,
55
- fCwd: meta.cwd ?? null,
56
- fParentSession: meta.parentSession ?? null,
57
- fSeedLength: meta.isSeeded ? storage.inheritedEventCount : null,
58
- fOrigin: meta.origin ?? null,
59
- fDelegationDepth: meta.delegationDepth ?? null,
60
- fAgentPreset: meta.agentPreset ?? null
61
- };
62
- }
63
- function rowToEvent(row) {
64
- const surfaceOp = row.fSurfaceOp !== null ? normalizeSurfaceOp(JSON.parse(row.fSurfaceOp)) : void 0;
65
- const record = JSON.parse(row.fData);
66
- if (typeof record === "object" && record !== null && !Array.isArray(record) && typeof record["type"] === "string" && typeof record["seq"] === "number" && typeof record["time"] === "number" && "data" in record) return {
67
- ...record,
68
- seq: row.fSequence,
69
- time: row.fCreatedAt,
70
- ...surfaceOp === void 0 ? {} : { surfaceOp }
71
- };
72
- return {
73
- type: row.fType,
74
- seq: row.fSequence,
75
- time: row.fCreatedAt,
76
- data: record,
77
- ...surfaceOp === void 0 ? {} : { surfaceOp }
78
- };
79
- }
80
- const SURFACE_EVENT_TYPES = /* @__PURE__ */ new Set([
81
- "system/message",
82
- "developer/message",
83
- "user/message",
84
- "assistant/message",
85
- "tool/result"
86
- ]);
87
- const METERING_EVENT_TYPES = /* @__PURE__ */ new Set(["compaction/summary", "compaction/prune"]);
88
- function surfaceSeqIndex(events) {
89
- const seqs = [];
90
- for (const event of events) if (SURFACE_EVENT_TYPES.has(event.type)) seqs.push(event.seq);
91
- return seqs;
92
- }
93
- function surfaceSeqsInRange(seqs, startSeq, endSeq) {
94
- let low = 0;
95
- let high = seqs.length;
96
- while (low < high) {
97
- const mid = low + high >> 1;
98
- if (seqs[mid] < startSeq) low = mid + 1;
99
- else high = mid;
100
- }
101
- const from = low;
102
- high = seqs.length;
103
- while (low < high) {
104
- const mid = low + high >> 1;
105
- if (seqs[mid] <= endSeq) low = mid + 1;
106
- else high = mid;
107
- }
108
- return seqs.slice(from, low);
109
- }
110
- function recomputeReplaceProvenance(events) {
111
- const seqs = surfaceSeqIndex(events);
112
- for (let i = 0; i < events.length; i++) {
113
- const raw = events[i];
114
- const op = raw.surfaceOp;
115
- if (typeof op !== "object" || op === null || op.op !== "replace") continue;
116
- const { startSeq, endSeq } = op;
117
- const metering = i > 0 ? events[i - 1] : void 0;
118
- const meteringData = metering !== void 0 && METERING_EVENT_TYPES.has(metering.type) ? metering.data : void 0;
119
- if (meteringData?.shadowedSeqs !== void 0) {
120
- raw.sourceEventSeqs = meteringData.shadowedSeqs;
121
- continue;
122
- }
123
- raw.sourceEventSeqs = surfaceSeqsInRange(seqs, startSeq, endSeq);
124
- }
125
- }
126
- function isEventSeqLike(value) {
127
- return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 && !Object.is(value, -0);
128
- }
129
- function isDeepEqualJson(a, b) {
130
- if (a === b) return true;
131
- if (Array.isArray(a) || Array.isArray(b)) {
132
- if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;
133
- return a.every((item, i) => isDeepEqualJson(item, b[i]));
134
- }
135
- if (typeof a !== "object" || typeof b !== "object" || a === null || b === null) return false;
136
- const aKeys = Object.keys(a);
137
- const bRecord = b;
138
- if (aKeys.length !== Object.keys(bRecord).length) return false;
139
- return aKeys.every((key) => Object.hasOwn(bRecord, key) && isDeepEqualJson(a[key], bRecord[key]));
140
- }
141
- function toolResultRewriteContentOnly(original, replacement) {
142
- const originalData = original.data;
143
- const replacementData = replacement.data;
144
- const originalMessage = originalData["message"];
145
- const replacementMessage = replacementData["message"];
146
- if (!Array.isArray(originalMessage?.content) || !Array.isArray(replacementMessage?.content)) return false;
147
- const rest = (data, message) => ({
148
- ...data,
149
- message: {
150
- ...message,
151
- content: null
152
- }
153
- });
154
- return isDeepEqualJson(rest(originalData, originalMessage), rest(replacementData, replacementMessage));
155
- }
156
- function findSurfaceRepairs(events) {
157
- const nodes = [];
158
- const degradeToAppend = /* @__PURE__ */ new Set();
159
- const addAppendMarker = /* @__PURE__ */ new Set();
160
- const clearSurfaceOp = /* @__PURE__ */ new Set();
161
- const clampEnd = /* @__PURE__ */ new Map();
162
- for (let index = 0; index < events.length; index++) {
163
- const event = events[index];
164
- const op = event.surfaceOp;
165
- if (op === void 0) {
166
- if (SURFACE_EVENT_TYPES.has(event.type)) {
167
- addAppendMarker.add(event.seq);
168
- nodes.push(event.seq);
169
- }
170
- continue;
171
- }
172
- if (op === "append") {
173
- if (SURFACE_EVENT_TYPES.has(event.type)) nodes.push(event.seq);
174
- else clearSurfaceOp.add(event.seq);
175
- continue;
176
- }
177
- if (!SURFACE_EVENT_TYPES.has(event.type)) {
178
- clearSurfaceOp.add(event.seq);
179
- continue;
180
- }
181
- const replace = typeof op === "object" && op !== null && !Array.isArray(op) ? op : void 0;
182
- const start = replace?.["startSeq"];
183
- const end = replace?.["endSeq"];
184
- const shapeOk = replace !== void 0 && replace["op"] === "replace" && isEventSeqLike(start) && isEventSeqLike(end);
185
- const startIdx = shapeOk ? nodes.indexOf(start) : -1;
186
- let endIdx = shapeOk ? nodes.indexOf(end) : -1;
187
- let clamped;
188
- if (shapeOk && startIdx !== -1 && endIdx === -1) {
189
- clamped = clampReplaceEnd(events, index, nodes, startIdx);
190
- if (clamped !== void 0) endIdx = nodes.indexOf(clamped);
191
- }
192
- const rangeOk = shapeOk && startIdx !== -1 && endIdx !== -1 && startIdx <= endIdx;
193
- const provenanceOk = event.type !== "assistant/message";
194
- let rewriteOk = true;
195
- if (rangeOk && event.type === "tool/result") {
196
- const shadowed = nodes.slice(startIdx, endIdx + 1);
197
- if (shadowed.length !== 1) rewriteOk = false;
198
- else {
199
- const original = events[shadowed[0]];
200
- rewriteOk = original?.type === "tool/result" && toolResultRewriteContentOnly(original, event);
201
- }
202
- }
203
- if (!rangeOk || !rewriteOk || !provenanceOk) {
204
- degradeToAppend.add(event.seq);
205
- nodes.push(event.seq);
206
- continue;
207
- }
208
- if (clamped !== void 0) clampEnd.set(event.seq, clamped);
209
- nodes.splice(startIdx, endIdx - startIdx + 1, event.seq);
210
- }
211
- return {
212
- degradeToAppend,
213
- addAppendMarker,
214
- clearSurfaceOp,
215
- clampEnd
216
- };
217
- }
218
- function clampReplaceEnd(events, index, nodes, startIdx) {
219
- const metering = index > 0 ? events[index - 1] : void 0;
220
- if (metering === void 0 || !METERING_EVENT_TYPES.has(metering.type)) return void 0;
221
- const shadowedSeqs = metering.data.shadowedSeqs;
222
- if (!Array.isArray(shadowedSeqs) || shadowedSeqs.length === 0) return void 0;
223
- return nodes[Math.min(startIdx + shadowedSeqs.length - 1, nodes.length - 1)];
224
- }
225
- function repairSurfaceOps(events) {
226
- const repairs = findSurfaceRepairs(events);
227
- if (repairs.degradeToAppend.size === 0 && repairs.addAppendMarker.size === 0 && repairs.clearSurfaceOp.size === 0 && repairs.clampEnd.size === 0) return;
228
- for (const event of events) {
229
- const raw = event;
230
- const clamped = repairs.clampEnd.get(event.seq);
231
- if (repairs.degradeToAppend.has(event.seq)) raw.surfaceOp = "append";
232
- else if (clamped !== void 0) {
233
- const op = raw.surfaceOp;
234
- raw.surfaceOp = {
235
- op: "replace",
236
- startSeq: SessionSeq(op.startSeq),
237
- endSeq: SessionSeq(clamped)
238
- };
239
- } else if (repairs.addAppendMarker.has(event.seq)) raw.surfaceOp = "append";
240
- else if (repairs.clearSurfaceOp.has(event.seq)) delete raw.surfaceOp;
241
- }
242
- }
243
- function repairAssistantSettlement(events) {
244
- for (const event of events) {
245
- if (event.type !== "assistant/message" && event.type !== "assistant/attempt") continue;
246
- const data = event.data;
247
- if (!Array.isArray(data["stream"])) data["stream"] = [];
248
- }
249
- }
250
- function repairRequestHeaders(events) {
251
- for (const event of events) {
252
- if (event.type !== "request/header") continue;
253
- const header = event.data["header"];
254
- if (typeof header !== "object" || header === null || Array.isArray(header)) continue;
255
- const record = header;
256
- delete record["system"];
257
- if (Array.isArray(record["tools"]) && record["tools"].length === 0) delete record["tools"];
258
- const defaults = record["adapterDefaults"];
259
- if (typeof defaults === "object" && defaults !== null && !Array.isArray(defaults) && Object.keys(defaults).length === 0) delete record["adapterDefaults"];
260
- }
261
- }
262
- function syncMeteringRanges(events) {
263
- const seqs = surfaceSeqIndex(events);
264
- for (let i = 1; i < events.length; i++) {
265
- const metering = events[i - 1];
266
- if (!METERING_EVENT_TYPES.has(metering.type)) continue;
267
- const op = events[i].surfaceOp;
268
- if (typeof op !== "object" || op === null || op.op !== "replace") continue;
269
- const { startSeq, endSeq } = op;
270
- const data = metering.data;
271
- if (data.shadowedRange?.start === startSeq && data.shadowedRange.end === endSeq) continue;
272
- data.shadowedRange = {
273
- start: startSeq,
274
- end: endSeq
275
- };
276
- data.shadowedSeqs = surfaceSeqsInRange(seqs, startSeq, endSeq);
277
- }
278
- }
279
- const PTC_EVENT_RENAMES = {
280
- "tool/code-dispatch-start": "tool/ptc-dispatch-start",
281
- "tool/code-dispatch": "tool/ptc-dispatch"
282
- };
283
- function renamePtcMessageSource(message) {
284
- if (typeof message !== "object" || message === null || Array.isArray(message)) return message;
285
- const record = message;
286
- const source = record["source"];
287
- if (typeof source !== "object" || source === null || Array.isArray(source)) return message;
288
- const sourceRecord = source;
289
- if (sourceRecord["kind"] !== "plugin" || sourceRecord["plugin"] !== "tools-code-mode") return message;
290
- return {
291
- ...record,
292
- source: {
293
- ...sourceRecord,
294
- plugin: "tools-ptc"
295
- }
296
- };
297
- }
298
- function renameLegacyPtcEvents(events) {
299
- for (let index = 0; index < events.length; index++) {
300
- const event = events[index];
301
- const renamedType = PTC_EVENT_RENAMES[event.type];
302
- if (renamedType !== void 0) {
303
- events[index] = {
304
- ...event,
305
- type: renamedType
306
- };
307
- continue;
308
- }
309
- if (event.type === "agent-preset/selected") {
310
- const data = event.data;
311
- if (data["agentPreset"] === "code") events[index] = {
312
- ...event,
313
- data: {
314
- ...data,
315
- agentPreset: "ptc"
316
- }
317
- };
318
- continue;
319
- }
320
- if (event.type === "user/message") {
321
- const renamed = renamePtcMessageSource(event.data);
322
- if (renamed !== event.data) events[index] = {
323
- ...event,
324
- data: renamed
325
- };
326
- continue;
327
- }
328
- if (event.type === "agent/inbox/spliced" || event.type === "session/title-llm-request") {
329
- const data = event.data;
330
- const key = event.type === "agent/inbox/spliced" ? "inserted" : "messages";
331
- const list = data[key];
332
- if (!Array.isArray(list)) continue;
333
- const renamed = list.map(renamePtcMessageSource);
334
- if (renamed.some((message, position) => message !== list[position])) events[index] = {
335
- ...event,
336
- data: {
337
- ...data,
338
- [key]: renamed
339
- }
340
- };
341
- }
342
- }
343
- }
344
- function normalizeToCurrentShape(events) {
345
- for (const event of events) {
346
- const type = event.type;
347
- if (OWN_EVENT_TYPES.has(type)) {
348
- event.ignorable = true;
349
- continue;
350
- }
351
- if (type === "system/message") {
352
- const message = event.data["message"];
353
- liftSystemMessageSource(message);
354
- continue;
355
- }
356
- if (type === "tool/result") {
357
- const message = event.data["message"];
358
- liftToolResultMessage(message);
359
- }
360
- }
361
- }
362
- function liftSystemMessageSource(message) {
363
- if (typeof message !== "object" || message === null) return;
364
- const record = message;
365
- const source = record["source"];
366
- if (typeof source !== "object" || source === null) return;
367
- if (source["kind"] !== "plugin") return;
368
- record["source"] = { kind: "system-prompt" };
369
- }
370
- function liftToolResultMessage(message) {
371
- if (typeof message !== "object" || message === null) return;
372
- const record = message;
373
- if (record["role"] === "tool" && typeof record["toolCallId"] === "string") return;
374
- const source = record["source"];
375
- const block = Array.isArray(record["content"]) ? record["content"][0] : void 0;
376
- if (typeof block !== "object" || block === null) return;
377
- const lifted = block;
378
- const callId = lifted["toolCallId"] ?? source?.["callId"];
379
- if (typeof callId !== "string") return;
380
- record["role"] = "tool";
381
- record["toolCallId"] = callId;
382
- record["content"] = Array.isArray(lifted["content"]) ? lifted["content"] : [];
383
- if (typeof lifted["isError"] === "boolean") record["isError"] = lifted["isError"];
384
- record["source"] = {
385
- kind: "tool",
386
- callId
387
- };
388
- }
389
- function sealOwnEvents(events) {
390
- for (const event of events) if (OWN_EVENT_TYPES.has(event.type)) event.ignorable = true;
391
- }
392
- const OWN_EVENT_TYPES = /* @__PURE__ */ new Set(["session-branch/version", "session-mode/selected"]);
393
- function needsShapeAdoption(events) {
394
- for (const event of events) {
395
- const type = event.type;
396
- if (OWN_EVENT_TYPES.has(type)) return true;
397
- if (type === "system/message") {
398
- if ((event.data["message"]?.["source"])?.["kind"] === "plugin") return true;
399
- continue;
400
- }
401
- if (type === "tool/result") {
402
- const message = event.data["message"];
403
- if (message !== void 0 && message["role"] !== "tool") return true;
404
- }
405
- }
406
- return false;
407
- }
408
- function repairReadView(events) {
409
- repairAssistantSettlement(events);
410
- repairRequestHeaders(events);
411
- renameLegacyPtcEvents(events);
412
- repairSurfaceOps(events);
413
- syncMeteringRanges(events);
414
- recomputeReplaceProvenance(events);
415
- repairOrphanInboxSplices(events);
416
- }
417
- function orphanInboxSpliceSeqs(events) {
418
- const inbox = {
419
- "next-turn": [],
420
- "next-step": []
421
- };
422
- const orphan = /* @__PURE__ */ new Set();
423
- for (const raw of events) {
424
- const event = raw;
425
- if (event.type !== "agent/inbox/spliced") continue;
426
- const { target, start, removedCount, inserted } = event.data;
427
- const list = typeof target === "string" ? inbox[target] : void 0;
428
- if (list === void 0) {
429
- orphan.add(event.seq);
430
- continue;
431
- }
432
- const removed = removedCount ?? 0;
433
- const parsedInserted = (inserted ?? []).map((m) => ({ id: typeof m.id === "string" ? m.id : "" }));
434
- if (!Number.isSafeInteger(start) || start < 0 || start > list.length || !Number.isSafeInteger(removed) || removed < 0 || start + removed > list.length) {
435
- orphan.add(event.seq);
436
- continue;
437
- }
438
- const candidate = [
439
- ...list.slice(0, start),
440
- ...parsedInserted,
441
- ...list.slice(start + removed)
442
- ];
443
- const other = (target === "next-turn" ? inbox["next-step"] : inbox["next-turn"]) ?? [];
444
- const seen = /* @__PURE__ */ new Set();
445
- let dup = false;
446
- for (const m of [...candidate, ...other]) {
447
- if (m.id === "") continue;
448
- if (seen.has(m.id)) {
449
- dup = true;
450
- break;
451
- }
452
- seen.add(m.id);
453
- }
454
- if (dup) {
455
- orphan.add(event.seq);
456
- continue;
457
- }
458
- list.splice(start, removed, ...parsedInserted);
459
- }
460
- return orphan;
461
- }
462
- function repairOrphanInboxSplices(events) {
463
- const orphan = orphanInboxSpliceSeqs(events);
464
- if (orphan.size === 0) return;
465
- for (const event of events) {
466
- if (!orphan.has(event.seq)) continue;
467
- const target = event.data.target;
468
- event.data = {
469
- ...typeof target === "string" ? { target } : { target: "next-turn" },
470
- start: 0,
471
- removedCount: 0,
472
- inserted: []
473
- };
474
- }
475
- }
476
- function scanRows(rows, base = 0) {
477
- const parsed = rows.map((row) => {
478
- try {
479
- return {
480
- ok: true,
481
- event: rowToEvent(row)
482
- };
483
- } catch {
484
- return { ok: false };
485
- }
486
- });
487
- let lastTurnEnd = -1;
488
- for (let i = parsed.length - 1; i >= 0; i--) if (parsed[i]?.ok && rows[i]?.fType === "turn/end") {
489
- lastTurnEnd = i;
490
- break;
491
- }
492
- const preserved = [];
493
- for (let i = 0; i < rows.length; i++) {
494
- const p = parsed[i];
495
- if (!p?.ok || p.event === void 0) {
496
- if (i <= lastTurnEnd) throw new Error(`corrupt session log: unparsable committed event at seq ${rows[i]?.fSequence}`);
497
- break;
498
- }
499
- if (p.event.seq !== base + i) {
500
- if (i <= lastTurnEnd) throw new Error(`corrupt session log: seq gap in committed region (expected ${base + i}, got ${p.event.seq})`);
501
- break;
502
- }
503
- preserved.push(p.event);
504
- }
505
- return preserved.length < rows.length ? {
506
- preserved,
507
- tornFrom: base + preserved.length
508
- } : { preserved };
509
- }
510
- function toJsonlArtifact(meta, inheritedEventCount, events) {
511
- const header = sessionFormatCatalog.encodeCurrentHeader({
512
- ...meta,
513
- delegationDepth: meta.delegationDepth ?? 0
514
- }, inheritedEventCount);
515
- const lines = [JSON.stringify(header)];
516
- for (const event of events) lines.push(JSON.stringify(sessionFormatCatalog.encodeCurrentEvent(event)));
517
- return lines.join("\n");
518
- }
519
- function titleOfEventData(data) {
520
- try {
521
- const value = JSON.parse(data);
522
- const title = value.data?.title ?? value.title;
523
- return typeof title === "string" ? title : void 0;
524
- } catch {
525
- return;
526
- }
527
- }
528
- function numericField(value) {
529
- return typeof value === "number" && Number.isFinite(value) ? Math.max(0, Math.trunc(value)) : 0;
530
- }
531
- function textField(value) {
532
- return typeof value === "string" && value !== "" ? value : null;
533
- }
534
- function usageRowOf(event, subagent) {
535
- if (event.fType !== "assistant/message") return void 0;
536
- let parsed;
537
- try {
538
- parsed = JSON.parse(event.fData);
539
- } catch {
540
- return;
541
- }
542
- const envelope = parsed["data"] ?? parsed;
543
- const usage = envelope["usage"];
544
- if (typeof usage !== "object" || usage === null) return void 0;
545
- const source = envelope["message"]?.source;
546
- return {
547
- fEventId: event.fEventId,
548
- fCreatedAt: event.fCreatedAt,
549
- fDay: localDayKey(event.fCreatedAt),
550
- fProvider: textField(source?.["provider"]),
551
- fModel: textField(source?.["model"]),
552
- fReferenced: 1,
553
- fSubagent: subagent ? 1 : 0,
554
- fInputTokens: numericField(usage["inputTokens"]),
555
- fOutputTokens: numericField(usage["outputTokens"]),
556
- fCacheReadTokens: numericField(usage["cacheReadTokens"]),
557
- fReasoningTokens: numericField(usage["reasoningTokens"]),
558
- fTotalTokens: numericField(usage["totalTokens"])
559
- };
560
- }
561
- //#endregion
562
- export { usageRowOf as S, sessionConflictRow as _, orphanInboxSpliceSeqs as a, titleOfEventData as b, repairAssistantSettlement as c, repairRequestHeaders as d, repairSurfaceOps as f, sealOwnEvents as g, scanRows as h, normalizeToCurrentShape as i, repairOrphanInboxSplices as l, rowToMeta as m, findSurfaceRepairs as n, recomputeReplaceProvenance as o, rowToEvent as p, needsShapeAdoption as r, renameLegacyPtcEvents as s, OWN_EVENT_TYPES as t, repairReadView as u, sessionInsertRow as v, toJsonlArtifact as x, syncMeteringRanges as y };
@@ -1,10 +0,0 @@
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 };