@geminixiang/mikan 1.0.0-beta.87 → 1.0.0-beta.89

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 (249) hide show
  1. package/CHANGELOG.md +44 -1370
  2. package/README.md +2 -2
  3. package/dist/adapters/commands/session-view.d.ts.map +1 -1
  4. package/dist/adapters/commands/session-view.js +4 -4
  5. package/dist/adapters/commands/session-view.js.map +1 -1
  6. package/dist/adapters/discord/bot.d.ts +4 -1
  7. package/dist/adapters/discord/bot.d.ts.map +1 -1
  8. package/dist/adapters/discord/bot.js +6 -3
  9. package/dist/adapters/discord/bot.js.map +1 -1
  10. package/dist/adapters/discord/context.d.ts.map +1 -1
  11. package/dist/adapters/discord/context.js +3 -1
  12. package/dist/adapters/discord/context.js.map +1 -1
  13. package/dist/adapters/discord/types.d.ts +1 -0
  14. package/dist/adapters/discord/types.d.ts.map +1 -1
  15. package/dist/adapters/discord/types.js.map +1 -1
  16. package/dist/adapters/github/activity.d.ts.map +1 -1
  17. package/dist/adapters/github/activity.js +7 -13
  18. package/dist/adapters/github/activity.js.map +1 -1
  19. package/dist/adapters/github/bot.d.ts +4 -1
  20. package/dist/adapters/github/bot.d.ts.map +1 -1
  21. package/dist/adapters/github/bot.js +3 -3
  22. package/dist/adapters/github/bot.js.map +1 -1
  23. package/dist/adapters/github/context.d.ts.map +1 -1
  24. package/dist/adapters/github/context.js +3 -1
  25. package/dist/adapters/github/context.js.map +1 -1
  26. package/dist/adapters/github/types.d.ts +0 -3
  27. package/dist/adapters/github/types.d.ts.map +1 -1
  28. package/dist/adapters/github/types.js.map +1 -1
  29. package/dist/adapters/intake.d.ts.map +1 -1
  30. package/dist/adapters/intake.js +12 -2
  31. package/dist/adapters/intake.js.map +1 -1
  32. package/dist/adapters/shared.d.ts +2 -1
  33. package/dist/adapters/shared.d.ts.map +1 -1
  34. package/dist/adapters/shared.js +7 -2
  35. package/dist/adapters/shared.js.map +1 -1
  36. package/dist/adapters/slack/assistant.d.ts +2 -4
  37. package/dist/adapters/slack/assistant.d.ts.map +1 -1
  38. package/dist/adapters/slack/assistant.js +10 -16
  39. package/dist/adapters/slack/assistant.js.map +1 -1
  40. package/dist/adapters/slack/bot.d.ts +5 -1
  41. package/dist/adapters/slack/bot.d.ts.map +1 -1
  42. package/dist/adapters/slack/bot.js +15 -11
  43. package/dist/adapters/slack/bot.js.map +1 -1
  44. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  45. package/dist/adapters/slack/response-lifecycle.js +1 -1
  46. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  47. package/dist/adapters/slack/task-status.d.ts.map +1 -1
  48. package/dist/adapters/slack/task-status.js +1 -2
  49. package/dist/adapters/slack/task-status.js.map +1 -1
  50. package/dist/adapters/telegram/bot.d.ts +4 -1
  51. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  52. package/dist/adapters/telegram/bot.js +3 -3
  53. package/dist/adapters/telegram/bot.js.map +1 -1
  54. package/dist/adapters/telegram/context.d.ts.map +1 -1
  55. package/dist/adapters/telegram/context.js +3 -1
  56. package/dist/adapters/telegram/context.js.map +1 -1
  57. package/dist/adapters/types.d.ts +3 -1
  58. package/dist/adapters/types.d.ts.map +1 -1
  59. package/dist/adapters/types.js.map +1 -1
  60. package/dist/adapters/web/admin/client-assets.js +1 -1
  61. package/dist/adapters/web/admin/client-assets.js.map +1 -1
  62. package/dist/adapters/web/admin/portal.d.ts +0 -1
  63. package/dist/adapters/web/admin/portal.d.ts.map +1 -1
  64. package/dist/adapters/web/admin/portal.js +26 -42
  65. package/dist/adapters/web/admin/portal.js.map +1 -1
  66. package/dist/adapters/web/admin/types.d.ts +0 -2
  67. package/dist/adapters/web/admin/types.d.ts.map +1 -1
  68. package/dist/adapters/web/admin/types.js.map +1 -1
  69. package/dist/adapters/web/login/portal.d.ts.map +1 -1
  70. package/dist/adapters/web/login/portal.js +0 -8
  71. package/dist/adapters/web/login/portal.js.map +1 -1
  72. package/dist/adapters/web/server.d.ts.map +1 -1
  73. package/dist/adapters/web/server.js +0 -1
  74. package/dist/adapters/web/server.js.map +1 -1
  75. package/dist/adapters/web/session-view/portal.d.ts +1 -2
  76. package/dist/adapters/web/session-view/portal.d.ts.map +1 -1
  77. package/dist/adapters/web/session-view/portal.js +38 -328
  78. package/dist/adapters/web/session-view/portal.js.map +1 -1
  79. package/dist/adapters/web/session-view/types.d.ts +4 -6
  80. package/dist/adapters/web/session-view/types.d.ts.map +1 -1
  81. package/dist/adapters/web/session-view/types.js.map +1 -1
  82. package/dist/env-manifest.d.ts +0 -4
  83. package/dist/env-manifest.d.ts.map +1 -1
  84. package/dist/env-manifest.js +5 -8
  85. package/dist/env-manifest.js.map +1 -1
  86. package/dist/events/index.d.ts +2 -9
  87. package/dist/events/index.d.ts.map +1 -1
  88. package/dist/events/index.js +0 -1
  89. package/dist/events/index.js.map +1 -1
  90. package/dist/events/scheduler.d.ts +0 -1
  91. package/dist/events/scheduler.d.ts.map +1 -1
  92. package/dist/events/scheduler.js +2 -7
  93. package/dist/events/scheduler.js.map +1 -1
  94. package/dist/harness/execution-env.d.ts +1 -1
  95. package/dist/harness/execution-env.d.ts.map +1 -1
  96. package/dist/harness/execution-env.js +32 -32
  97. package/dist/harness/execution-env.js.map +1 -1
  98. package/dist/harness/index.d.ts +2 -3
  99. package/dist/harness/index.d.ts.map +1 -1
  100. package/dist/harness/index.js +0 -1
  101. package/dist/harness/index.js.map +1 -1
  102. package/dist/harness/mcp-result.d.ts +4 -3
  103. package/dist/harness/mcp-result.d.ts.map +1 -1
  104. package/dist/harness/mcp-result.js +27 -13
  105. package/dist/harness/mcp-result.js.map +1 -1
  106. package/dist/harness/mcp.js +4 -4
  107. package/dist/harness/mcp.js.map +1 -1
  108. package/dist/harness/presenter.d.ts.map +1 -1
  109. package/dist/harness/presenter.js +20 -25
  110. package/dist/harness/presenter.js.map +1 -1
  111. package/dist/harness/prompt.d.ts +0 -1
  112. package/dist/harness/prompt.d.ts.map +1 -1
  113. package/dist/harness/prompt.js +3 -32
  114. package/dist/harness/prompt.js.map +1 -1
  115. package/dist/harness/run-events.d.ts.map +1 -1
  116. package/dist/harness/run-events.js +4 -12
  117. package/dist/harness/run-events.js.map +1 -1
  118. package/dist/harness/runner.d.ts.map +1 -1
  119. package/dist/harness/runner.js +35 -38
  120. package/dist/harness/runner.js.map +1 -1
  121. package/dist/harness/session.d.ts +37 -38
  122. package/dist/harness/session.d.ts.map +1 -1
  123. package/dist/harness/session.js +387 -388
  124. package/dist/harness/session.js.map +1 -1
  125. package/dist/harness/subagent.d.ts +5 -5
  126. package/dist/harness/subagent.d.ts.map +1 -1
  127. package/dist/harness/subagent.js +40 -45
  128. package/dist/harness/subagent.js.map +1 -1
  129. package/dist/harness/tools/codemode.d.ts +3 -0
  130. package/dist/harness/tools/codemode.d.ts.map +1 -0
  131. package/dist/harness/tools/codemode.js +173 -0
  132. package/dist/harness/tools/codemode.js.map +1 -0
  133. package/dist/harness/tools/history.d.ts +20 -0
  134. package/dist/harness/tools/history.d.ts.map +1 -0
  135. package/dist/harness/tools/history.js +293 -0
  136. package/dist/harness/tools/history.js.map +1 -0
  137. package/dist/harness/tools/pi-tools.d.ts +1 -1
  138. package/dist/harness/tools/pi-tools.d.ts.map +1 -1
  139. package/dist/harness/tools/pi-tools.js +47 -21
  140. package/dist/harness/tools/pi-tools.js.map +1 -1
  141. package/dist/harness/tools/secret-redaction.d.ts.map +1 -1
  142. package/dist/harness/tools/secret-redaction.js +46 -2
  143. package/dist/harness/tools/secret-redaction.js.map +1 -1
  144. package/dist/harness/tools/tool-search.d.ts +5 -0
  145. package/dist/harness/tools/tool-search.d.ts.map +1 -0
  146. package/dist/harness/tools/tool-search.js +84 -0
  147. package/dist/harness/tools/tool-search.js.map +1 -0
  148. package/dist/harness/types.d.ts +75 -15
  149. package/dist/harness/types.d.ts.map +1 -1
  150. package/dist/harness/types.js.map +1 -1
  151. package/dist/index.d.ts +3 -7
  152. package/dist/index.d.ts.map +1 -1
  153. package/dist/index.js +0 -3
  154. package/dist/index.js.map +1 -1
  155. package/dist/log.d.ts +0 -3
  156. package/dist/log.d.ts.map +1 -1
  157. package/dist/log.js +0 -15
  158. package/dist/log.js.map +1 -1
  159. package/dist/main.js +2 -2
  160. package/dist/main.js.map +1 -1
  161. package/dist/memory-capture/index.js +0 -1
  162. package/dist/memory-capture/index.js.map +1 -1
  163. package/dist/migrations/index.d.ts.map +1 -1
  164. package/dist/migrations/index.js +2 -0
  165. package/dist/migrations/index.js.map +1 -1
  166. package/dist/migrations/session-files.d.ts +3 -2
  167. package/dist/migrations/session-files.d.ts.map +1 -1
  168. package/dist/migrations/session-files.js.map +1 -1
  169. package/dist/migrations/session-v4.d.ts +77 -0
  170. package/dist/migrations/session-v4.d.ts.map +1 -0
  171. package/dist/migrations/session-v4.js +177 -0
  172. package/dist/migrations/session-v4.js.map +1 -0
  173. package/dist/migrations/sessions-sqlite.d.ts +3 -0
  174. package/dist/migrations/sessions-sqlite.d.ts.map +1 -0
  175. package/dist/migrations/sessions-sqlite.js +215 -0
  176. package/dist/migrations/sessions-sqlite.js.map +1 -0
  177. package/dist/migrations/sessions-v3.d.ts +2 -2
  178. package/dist/migrations/sessions-v3.d.ts.map +1 -1
  179. package/dist/migrations/sessions-v3.js +8 -19
  180. package/dist/migrations/sessions-v3.js.map +1 -1
  181. package/dist/migrations/types.d.ts +0 -5
  182. package/dist/migrations/types.d.ts.map +1 -1
  183. package/dist/migrations/types.js.map +1 -1
  184. package/dist/observability/sentry.d.ts +2 -9
  185. package/dist/observability/sentry.d.ts.map +1 -1
  186. package/dist/observability/sentry.js +12 -64
  187. package/dist/observability/sentry.js.map +1 -1
  188. package/dist/observability/types.d.ts +0 -16
  189. package/dist/observability/types.d.ts.map +1 -1
  190. package/dist/observability/types.js.map +1 -1
  191. package/dist/office/index.d.ts +1 -4
  192. package/dist/office/index.d.ts.map +1 -1
  193. package/dist/office/index.js +2 -14
  194. package/dist/office/index.js.map +1 -1
  195. package/dist/office/projection.d.ts.map +1 -1
  196. package/dist/office/projection.js +0 -1
  197. package/dist/office/projection.js.map +1 -1
  198. package/dist/office/types.d.ts +1 -2
  199. package/dist/office/types.d.ts.map +1 -1
  200. package/dist/office/types.js.map +1 -1
  201. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  202. package/dist/runtime/conversation-runtime.js +2 -16
  203. package/dist/runtime/conversation-runtime.js.map +1 -1
  204. package/dist/runtime/session-lifecycle.d.ts +1 -2
  205. package/dist/runtime/session-lifecycle.d.ts.map +1 -1
  206. package/dist/runtime/session-lifecycle.js +7 -16
  207. package/dist/runtime/session-lifecycle.js.map +1 -1
  208. package/dist/runtime/types.d.ts +0 -1
  209. package/dist/runtime/types.d.ts.map +1 -1
  210. package/dist/runtime/types.js.map +1 -1
  211. package/dist/sandbox/provisioner.d.ts.map +1 -1
  212. package/dist/sandbox/provisioner.js +3 -4
  213. package/dist/sandbox/provisioner.js.map +1 -1
  214. package/dist/sessions/chat-history-sync.d.ts +8 -6
  215. package/dist/sessions/chat-history-sync.d.ts.map +1 -1
  216. package/dist/sessions/chat-history-sync.js +70 -143
  217. package/dist/sessions/chat-history-sync.js.map +1 -1
  218. package/dist/sessions/compaction-summary.d.ts +4 -0
  219. package/dist/sessions/compaction-summary.d.ts.map +1 -0
  220. package/dist/sessions/compaction-summary.js +16 -0
  221. package/dist/sessions/compaction-summary.js.map +1 -0
  222. package/dist/sessions/session-key.d.ts +1 -0
  223. package/dist/sessions/session-key.d.ts.map +1 -1
  224. package/dist/sessions/session-key.js +3 -0
  225. package/dist/sessions/session-key.js.map +1 -1
  226. package/dist/sessions/session-store.d.ts +47 -29
  227. package/dist/sessions/session-store.d.ts.map +1 -1
  228. package/dist/sessions/session-store.js +578 -484
  229. package/dist/sessions/session-store.js.map +1 -1
  230. package/dist/sessions/types.d.ts +60 -46
  231. package/dist/sessions/types.d.ts.map +1 -1
  232. package/dist/sessions/types.js +1 -1
  233. package/dist/sessions/types.js.map +1 -1
  234. package/dist/settings/apply.js +2 -2
  235. package/dist/settings/apply.js.map +1 -1
  236. package/dist/types.d.ts +10 -3
  237. package/dist/types.d.ts.map +1 -1
  238. package/dist/types.js.map +1 -1
  239. package/dist/vault/index.d.ts.map +1 -1
  240. package/dist/vault/index.js +0 -3
  241. package/dist/vault/index.js.map +1 -1
  242. package/dist/vault/types.d.ts +0 -3
  243. package/dist/vault/types.d.ts.map +1 -1
  244. package/dist/vault/types.js.map +1 -1
  245. package/package.json +8 -5
  246. package/dist/sessions/store.d.ts +0 -17
  247. package/dist/sessions/store.d.ts.map +0 -1
  248. package/dist/sessions/store.js +0 -211
  249. package/dist/sessions/store.js.map +0 -1
@@ -0,0 +1,77 @@
1
+ import type { JsonValue } from "@earendil-works/chord";
2
+ import type { AssistantMessage, ImageContent, Message, TextContent, ToolResultMessage, UserMessage, Usage } from "@earendil-works/pi-ai";
3
+ declare const V4_SESSION_VERSION = 4;
4
+ export interface V4CompactionSummaryMessage {
5
+ role: "compactionSummary";
6
+ summary: string;
7
+ tokensBefore: number;
8
+ timestamp: number;
9
+ }
10
+ export interface V4BranchSummaryMessage {
11
+ role: "branchSummary";
12
+ summary: string;
13
+ fromId: string | null;
14
+ timestamp: number;
15
+ }
16
+ export interface V4CustomMessage {
17
+ role: "custom";
18
+ customType: string;
19
+ content: string | (TextContent | ImageContent)[];
20
+ display: boolean;
21
+ details?: unknown;
22
+ timestamp: number;
23
+ }
24
+ export type V4Message = Message | V4CompactionSummaryMessage | V4BranchSummaryMessage | V4CustomMessage;
25
+ interface V4EntryBase {
26
+ id: string;
27
+ parentId: string | null;
28
+ timestamp: number;
29
+ }
30
+ export type V4Entry = V4EntryBase & ({
31
+ type: "message";
32
+ message: V4Message;
33
+ } | {
34
+ type: "compaction";
35
+ summary: string;
36
+ retainedTail: V4Message[];
37
+ tokensBefore: number;
38
+ details?: JsonValue;
39
+ usage?: Usage;
40
+ } | {
41
+ type: "branch_summary";
42
+ fromId: string | null;
43
+ summary: string;
44
+ details?: JsonValue;
45
+ usage?: Usage;
46
+ } | {
47
+ type: "custom";
48
+ customType: string;
49
+ data?: JsonValue;
50
+ });
51
+ export interface V4SessionHeader {
52
+ v: typeof V4_SESSION_VERSION;
53
+ kind: "header";
54
+ id: string;
55
+ createdAt: number;
56
+ cwd: string;
57
+ parentSessionId?: string;
58
+ }
59
+ export interface V4Session {
60
+ header: V4SessionHeader;
61
+ branch: V4Entry[];
62
+ name?: string;
63
+ source?: {
64
+ [key: string]: JsonValue;
65
+ };
66
+ open: boolean;
67
+ }
68
+ export declare function compactionSummaryMessage(summary: string, tokensBefore: number, timestamp: number): V4CompactionSummaryMessage;
69
+ export declare function branchSummaryMessage(summary: string, fromId: string | null, timestamp: number): V4BranchSummaryMessage;
70
+ export declare function customMessage(customType: string, content: V4CustomMessage["content"], display: boolean, details: unknown, timestamp: number): V4CustomMessage;
71
+ export declare function readV4Header(path: string): V4SessionHeader | undefined;
72
+ export declare function readV4Session(path: string): V4Session;
73
+ export declare function isContextMessage(message: V4Message): boolean;
74
+ export declare function buildV4Context(branch: V4Entry[]): V4Message[];
75
+ export declare function toModelMessage(message: V4Message): UserMessage | AssistantMessage | ToolResultMessage | undefined;
76
+ export {};
77
+ //# sourceMappingURL=session-v4.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-v4.d.ts","sourceRoot":"","sources":["../../src/migrations/session-v4.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ import { closeSync, openSync, readFileSync, readSync } from "node:fs";
2
+ import { isRecord } from "../unknown-values.js";
3
+ import { wrapCompactionSummary } from "../sessions/compaction-summary.js";
4
+ const V4_SESSION_VERSION = 4;
5
+ export function compactionSummaryMessage(summary, tokensBefore, timestamp) {
6
+ return { role: "compactionSummary", summary, tokensBefore, timestamp };
7
+ }
8
+ export function branchSummaryMessage(summary, fromId, timestamp) {
9
+ return { role: "branchSummary", summary, fromId, timestamp };
10
+ }
11
+ export function customMessage(customType, content, display, details, timestamp) {
12
+ return { role: "custom", customType, content, display, details, timestamp };
13
+ }
14
+ const BRANCH_SUMMARY_PREFIX = "The following is a summary of a branch that this conversation came back from:\n\n<summary>\n";
15
+ const BRANCH_SUMMARY_SUFFIX = "</summary>";
16
+ const HEADER_PROBE_BYTES = 64 * 1024;
17
+ function readFirstLine(path) {
18
+ const fd = openSync(path, "r");
19
+ try {
20
+ const buffer = Buffer.alloc(HEADER_PROBE_BYTES);
21
+ const bytes = readSync(fd, buffer, 0, buffer.length, 0);
22
+ return buffer.subarray(0, bytes).toString("utf-8").split("\n", 1)[0] ?? "";
23
+ }
24
+ finally {
25
+ closeSync(fd);
26
+ }
27
+ }
28
+ export function readV4Header(path) {
29
+ const firstLine = readFirstLine(path);
30
+ let value;
31
+ try {
32
+ value = JSON.parse(firstLine);
33
+ }
34
+ catch {
35
+ return undefined;
36
+ }
37
+ if (!isRecord(value) ||
38
+ value.kind !== "header" ||
39
+ value.v !== V4_SESSION_VERSION ||
40
+ typeof value.id !== "string" ||
41
+ typeof value.createdAt !== "number" ||
42
+ typeof value.cwd !== "string") {
43
+ return undefined;
44
+ }
45
+ return {
46
+ v: V4_SESSION_VERSION,
47
+ kind: "header",
48
+ id: value.id,
49
+ createdAt: value.createdAt,
50
+ cwd: value.cwd,
51
+ parentSessionId: typeof value.parentSessionId === "string" ? value.parentSessionId : undefined,
52
+ };
53
+ }
54
+ function isV4Entry(record) {
55
+ return (record.kind === "entry" &&
56
+ typeof record.id === "string" &&
57
+ (record.parentId === null || typeof record.parentId === "string") &&
58
+ typeof record.type === "string");
59
+ }
60
+ function asV4Entry(record) {
61
+ const { kind: _kind, seq: _seq, ...entry } = record;
62
+ const parsed = JSON.parse(JSON.stringify(entry));
63
+ return parsed;
64
+ }
65
+ export function readV4Session(path) {
66
+ const header = readV4Header(path);
67
+ if (!header)
68
+ throw new Error(`Not a v4 session file: ${path}`);
69
+ const content = readFileSync(path, "utf-8");
70
+ const complete = content.endsWith("\n") ? content : content.slice(0, content.lastIndexOf("\n"));
71
+ const entries = new Map();
72
+ const values = new Map();
73
+ const lines = complete.split("\n").slice(1);
74
+ for (const [index, line] of lines.entries()) {
75
+ if (!line.trim())
76
+ continue;
77
+ let transaction;
78
+ try {
79
+ transaction = JSON.parse(line);
80
+ }
81
+ catch (error) {
82
+ throw new Error(`Invalid v4 session ${path}: line ${index + 2}`, { cause: error });
83
+ }
84
+ for (const record of Array.isArray(transaction) ? transaction : [transaction]) {
85
+ if (!isRecord(record))
86
+ continue;
87
+ if (isV4Entry(record)) {
88
+ const entry = asV4Entry(record);
89
+ entries.set(entry.id, entry);
90
+ }
91
+ else if (record.kind === "value" &&
92
+ typeof record.namespace === "string" &&
93
+ typeof record.key === "string") {
94
+ const address = `${record.namespace}\u0000${record.key}`;
95
+ if (record.op === "delete")
96
+ values.delete(address);
97
+ else if (record.op === "set")
98
+ values.set(address, record.value);
99
+ }
100
+ }
101
+ }
102
+ const tip = values.get("pi.branch.tip\u0000main");
103
+ const branch = [];
104
+ let current = typeof tip === "string" ? entries.get(tip) : undefined;
105
+ while (current) {
106
+ branch.push(current);
107
+ current = current.parentId === null ? undefined : entries.get(current.parentId);
108
+ }
109
+ const name = values.get("pi.session.name\u0000");
110
+ const metadata = values.get("mikan\u0000metadata");
111
+ const lane = values.get("pi.lane.state\u0000main");
112
+ return {
113
+ header,
114
+ branch: branch.toReversed(),
115
+ name: typeof name === "string" && name.trim() ? name.trim() : undefined,
116
+ source: isRecord(metadata) && isRecord(metadata.source)
117
+ ? JSON.parse(JSON.stringify(metadata.source))
118
+ : undefined,
119
+ open: isRecord(lane) && lane.currentOperationId != null,
120
+ };
121
+ }
122
+ export function isContextMessage(message) {
123
+ return (message.role !== "assistant" ||
124
+ (message.stopReason !== "error" &&
125
+ message.stopReason !== "aborted" &&
126
+ message.stopReason !== "deferred"));
127
+ }
128
+ export function buildV4Context(branch) {
129
+ const compactionIndex = branch.findLastIndex((entry) => entry.type === "compaction");
130
+ const messages = [];
131
+ for (const entry of branch.slice(Math.max(0, compactionIndex))) {
132
+ if (entry.type === "message") {
133
+ if (isContextMessage(entry.message))
134
+ messages.push(entry.message);
135
+ }
136
+ else if (entry.type === "compaction") {
137
+ messages.push(compactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp), ...entry.retainedTail.filter(isContextMessage));
138
+ }
139
+ else if (entry.type === "branch_summary" && entry.summary) {
140
+ messages.push(branchSummaryMessage(entry.summary, entry.fromId, entry.timestamp));
141
+ }
142
+ }
143
+ return messages;
144
+ }
145
+ export function toModelMessage(message) {
146
+ switch (message.role) {
147
+ case "user":
148
+ case "assistant":
149
+ case "toolResult":
150
+ return message;
151
+ case "custom":
152
+ return {
153
+ role: "user",
154
+ content: typeof message.content === "string"
155
+ ? [{ type: "text", text: message.content }]
156
+ : message.content,
157
+ timestamp: message.timestamp,
158
+ };
159
+ case "branchSummary":
160
+ return {
161
+ role: "user",
162
+ content: [
163
+ { type: "text", text: BRANCH_SUMMARY_PREFIX + message.summary + BRANCH_SUMMARY_SUFFIX },
164
+ ],
165
+ timestamp: message.timestamp,
166
+ };
167
+ case "compactionSummary":
168
+ return {
169
+ role: "user",
170
+ content: [{ type: "text", text: wrapCompactionSummary(message.summary) }],
171
+ timestamp: message.timestamp,
172
+ };
173
+ default:
174
+ return undefined;
175
+ }
176
+ }
177
+ //# sourceMappingURL=session-v4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-v4.js","sourceRoot":"","sources":["../../src/migrations/session-v4.ts"],"names":[],"mappings":"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","sourcesContent":["import { closeSync, openSync, readFileSync, readSync } from \"node:fs\";\nimport type { JsonValue } from \"@earendil-works/chord\";\nimport type {\n AssistantMessage,\n ImageContent,\n Message,\n TextContent,\n ToolResultMessage,\n UserMessage,\n Usage,\n} from \"@earendil-works/pi-ai\";\nimport { isRecord } from \"../unknown-values.js\";\nimport { wrapCompactionSummary } from \"../sessions/compaction-summary.js\";\n\nconst V4_SESSION_VERSION = 4;\n\nexport interface V4CompactionSummaryMessage {\n role: \"compactionSummary\";\n summary: string;\n tokensBefore: number;\n timestamp: number;\n}\n\nexport interface V4BranchSummaryMessage {\n role: \"branchSummary\";\n summary: string;\n fromId: string | null;\n timestamp: number;\n}\n\nexport interface V4CustomMessage {\n role: \"custom\";\n customType: string;\n content: string | (TextContent | ImageContent)[];\n display: boolean;\n details?: unknown;\n timestamp: number;\n}\n\nexport type V4Message =\n | Message\n | V4CompactionSummaryMessage\n | V4BranchSummaryMessage\n | V4CustomMessage;\n\ninterface V4EntryBase {\n id: string;\n parentId: string | null;\n timestamp: number;\n}\n\nexport type V4Entry = V4EntryBase &\n (\n | { type: \"message\"; message: V4Message }\n | {\n type: \"compaction\";\n summary: string;\n retainedTail: V4Message[];\n tokensBefore: number;\n details?: JsonValue;\n usage?: Usage;\n }\n | {\n type: \"branch_summary\";\n fromId: string | null;\n summary: string;\n details?: JsonValue;\n usage?: Usage;\n }\n | { type: \"custom\"; customType: string; data?: JsonValue }\n );\n\nexport interface V4SessionHeader {\n v: typeof V4_SESSION_VERSION;\n kind: \"header\";\n id: string;\n createdAt: number;\n cwd: string;\n parentSessionId?: string;\n}\n\nexport interface V4Session {\n header: V4SessionHeader;\n branch: V4Entry[];\n name?: string;\n source?: { [key: string]: JsonValue };\n open: boolean;\n}\n\nexport function compactionSummaryMessage(\n summary: string,\n tokensBefore: number,\n timestamp: number,\n): V4CompactionSummaryMessage {\n return { role: \"compactionSummary\", summary, tokensBefore, timestamp };\n}\n\nexport function branchSummaryMessage(\n summary: string,\n fromId: string | null,\n timestamp: number,\n): V4BranchSummaryMessage {\n return { role: \"branchSummary\", summary, fromId, timestamp };\n}\n\nexport function customMessage(\n customType: string,\n content: V4CustomMessage[\"content\"],\n display: boolean,\n details: unknown,\n timestamp: number,\n): V4CustomMessage {\n return { role: \"custom\", customType, content, display, details, timestamp };\n}\n\nconst BRANCH_SUMMARY_PREFIX =\n \"The following is a summary of a branch that this conversation came back from:\\n\\n<summary>\\n\";\nconst BRANCH_SUMMARY_SUFFIX = \"</summary>\";\n\nconst HEADER_PROBE_BYTES = 64 * 1024;\n\nfunction readFirstLine(path: string): string {\n const fd = openSync(path, \"r\");\n try {\n const buffer = Buffer.alloc(HEADER_PROBE_BYTES);\n const bytes = readSync(fd, buffer, 0, buffer.length, 0);\n return buffer.subarray(0, bytes).toString(\"utf-8\").split(\"\\n\", 1)[0] ?? \"\";\n } finally {\n closeSync(fd);\n }\n}\n\nexport function readV4Header(path: string): V4SessionHeader | undefined {\n const firstLine = readFirstLine(path);\n let value: unknown;\n try {\n value = JSON.parse(firstLine);\n } catch {\n return undefined;\n }\n if (\n !isRecord(value) ||\n value.kind !== \"header\" ||\n value.v !== V4_SESSION_VERSION ||\n typeof value.id !== \"string\" ||\n typeof value.createdAt !== \"number\" ||\n typeof value.cwd !== \"string\"\n ) {\n return undefined;\n }\n return {\n v: V4_SESSION_VERSION,\n kind: \"header\",\n id: value.id,\n createdAt: value.createdAt,\n cwd: value.cwd,\n parentSessionId: typeof value.parentSessionId === \"string\" ? value.parentSessionId : undefined,\n };\n}\n\nfunction isV4Entry(record: Record<string, unknown>): boolean {\n return (\n record.kind === \"entry\" &&\n typeof record.id === \"string\" &&\n (record.parentId === null || typeof record.parentId === \"string\") &&\n typeof record.type === \"string\"\n );\n}\n\nfunction asV4Entry(record: Record<string, unknown>): V4Entry {\n const { kind: _kind, seq: _seq, ...entry } = record;\n const parsed: V4Entry = JSON.parse(JSON.stringify(entry));\n return parsed;\n}\n\nexport function readV4Session(path: string): V4Session {\n const header = readV4Header(path);\n if (!header) throw new Error(`Not a v4 session file: ${path}`);\n const content = readFileSync(path, \"utf-8\");\n const complete = content.endsWith(\"\\n\") ? content : content.slice(0, content.lastIndexOf(\"\\n\"));\n const entries = new Map<string, V4Entry>();\n const values = new Map<string, unknown>();\n const lines = complete.split(\"\\n\").slice(1);\n for (const [index, line] of lines.entries()) {\n if (!line.trim()) continue;\n let transaction: unknown;\n try {\n transaction = JSON.parse(line);\n } catch (error) {\n throw new Error(`Invalid v4 session ${path}: line ${index + 2}`, { cause: error });\n }\n for (const record of Array.isArray(transaction) ? transaction : [transaction]) {\n if (!isRecord(record)) continue;\n if (isV4Entry(record)) {\n const entry = asV4Entry(record);\n entries.set(entry.id, entry);\n } else if (\n record.kind === \"value\" &&\n typeof record.namespace === \"string\" &&\n typeof record.key === \"string\"\n ) {\n const address = `${record.namespace}\\u0000${record.key}`;\n if (record.op === \"delete\") values.delete(address);\n else if (record.op === \"set\") values.set(address, record.value);\n }\n }\n }\n const tip = values.get(\"pi.branch.tip\\u0000main\");\n const branch: V4Entry[] = [];\n let current = typeof tip === \"string\" ? entries.get(tip) : undefined;\n while (current) {\n branch.push(current);\n current = current.parentId === null ? undefined : entries.get(current.parentId);\n }\n const name = values.get(\"pi.session.name\\u0000\");\n const metadata = values.get(\"mikan\\u0000metadata\");\n const lane = values.get(\"pi.lane.state\\u0000main\");\n return {\n header,\n branch: branch.toReversed(),\n name: typeof name === \"string\" && name.trim() ? name.trim() : undefined,\n source:\n isRecord(metadata) && isRecord(metadata.source)\n ? JSON.parse(JSON.stringify(metadata.source))\n : undefined,\n open: isRecord(lane) && lane.currentOperationId != null,\n };\n}\n\nexport function isContextMessage(message: V4Message): boolean {\n return (\n message.role !== \"assistant\" ||\n (message.stopReason !== \"error\" &&\n message.stopReason !== \"aborted\" &&\n message.stopReason !== \"deferred\")\n );\n}\n\nexport function buildV4Context(branch: V4Entry[]): V4Message[] {\n const compactionIndex = branch.findLastIndex((entry) => entry.type === \"compaction\");\n const messages: V4Message[] = [];\n for (const entry of branch.slice(Math.max(0, compactionIndex))) {\n if (entry.type === \"message\") {\n if (isContextMessage(entry.message)) messages.push(entry.message);\n } else if (entry.type === \"compaction\") {\n messages.push(\n compactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp),\n ...entry.retainedTail.filter(isContextMessage),\n );\n } else if (entry.type === \"branch_summary\" && entry.summary) {\n messages.push(branchSummaryMessage(entry.summary, entry.fromId, entry.timestamp));\n }\n }\n return messages;\n}\n\nexport function toModelMessage(\n message: V4Message,\n): UserMessage | AssistantMessage | ToolResultMessage | undefined {\n switch (message.role) {\n case \"user\":\n case \"assistant\":\n case \"toolResult\":\n return message;\n case \"custom\":\n return {\n role: \"user\",\n content:\n typeof message.content === \"string\"\n ? [{ type: \"text\", text: message.content }]\n : message.content,\n timestamp: message.timestamp,\n };\n case \"branchSummary\":\n return {\n role: \"user\",\n content: [\n { type: \"text\", text: BRANCH_SUMMARY_PREFIX + message.summary + BRANCH_SUMMARY_SUFFIX },\n ],\n timestamp: message.timestamp,\n };\n case \"compactionSummary\":\n return {\n role: \"user\",\n content: [{ type: \"text\", text: wrapCompactionSummary(message.summary) }],\n timestamp: message.timestamp,\n };\n default:\n return undefined;\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Migration } from "./types.js";
2
+ export declare const sessionsSqliteMigration: Migration;
3
+ //# sourceMappingURL=sessions-sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions-sqlite.d.ts","sourceRoot":"","sources":["../../src/migrations/sessions-sqlite.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,YAAY,CAAC;AAwN9D,eAAO,MAAM,uBAAuB,EAAE,SAWpC,CAAC"}
@@ -0,0 +1,215 @@
1
+ import { existsSync, readdirSync, renameSync, rmSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { OfficeRegistry, officeStateDir } from "../office/index.js";
4
+ import { earlierSessionKey, importOfficeSessions, readImportedContexts, } from "../sessions/session-store.js";
5
+ import { makeThreadSessionKey } from "../sessions/session-key.js";
6
+ import { readTextFileIfExists } from "../file-guards.js";
7
+ import { branchSummaryMessage, isContextMessage, readV4Header, readV4Session, toModelMessage, } from "./session-v4.js";
8
+ const V4_SESSIONS_DIR = "sessions";
9
+ const ARCHIVE_DIR = "sessions-v4";
10
+ const STORAGE_FILENAME = "sessions.db";
11
+ const TEMP_SUFFIX = ".importing";
12
+ const MAIN_SESSION_FILENAME = /^\d{4}-\d{2}-\d{2}T.+_[0-9a-f]{8}\.jsonl$/i;
13
+ const ARCHIVED_THREAD_PREFIX = "scoped-archive-";
14
+ const INTERRUPTED_RESULT = "This tool call was interrupted by the upgrade to Pi 1.0; its outcome is unknown.";
15
+ class EntryCollector {
16
+ constructor() {
17
+ this.entries = [];
18
+ this.openCalls = new Map();
19
+ }
20
+ get messageCount() {
21
+ return this.entries.filter((entry) => entry.type !== "custom").length;
22
+ }
23
+ message(v4) {
24
+ if (!isContextMessage(v4))
25
+ return;
26
+ const message = toModelMessage(v4);
27
+ if (!message)
28
+ return;
29
+ if (message.role === "toolResult") {
30
+ if (!this.openCalls.delete(message.toolCallId))
31
+ return;
32
+ }
33
+ else {
34
+ this.closeOpenCalls();
35
+ }
36
+ this.push(message);
37
+ if (message.role === "assistant")
38
+ this.trackCalls(message);
39
+ }
40
+ compaction(summary, timestamp) {
41
+ this.closeOpenCalls();
42
+ this.entries.push({ type: "compaction", summary, timestamp });
43
+ }
44
+ custom(customType, data, timestamp) {
45
+ this.entries.push({ type: "custom", customType, data, timestamp });
46
+ }
47
+ closeOpenCalls() {
48
+ for (const [toolCallId, call] of this.openCalls) {
49
+ this.push({
50
+ role: "toolResult",
51
+ toolCallId,
52
+ toolName: call.name,
53
+ content: [{ type: "text", text: INTERRUPTED_RESULT }],
54
+ isError: true,
55
+ timestamp: call.timestamp,
56
+ });
57
+ }
58
+ this.openCalls.clear();
59
+ }
60
+ push(message) {
61
+ this.entries.push({ type: "message", message });
62
+ }
63
+ trackCalls(message) {
64
+ for (const part of message.content) {
65
+ if (part.type === "toolCall") {
66
+ this.openCalls.set(part.id, { name: part.name, timestamp: message.timestamp });
67
+ }
68
+ }
69
+ }
70
+ }
71
+ function collectEntries(session) {
72
+ const collector = new EntryCollector();
73
+ const visibleStart = session.branch.findLastIndex((entry) => entry.type === "compaction");
74
+ for (const [index, entry] of session.branch.entries()) {
75
+ if (entry.type === "custom") {
76
+ collector.custom(entry.customType, entry.data, entry.timestamp);
77
+ continue;
78
+ }
79
+ if (index < visibleStart)
80
+ continue;
81
+ switch (entry.type) {
82
+ case "compaction":
83
+ collector.compaction(entry.summary, entry.timestamp);
84
+ for (const message of entry.retainedTail)
85
+ collector.message(message);
86
+ break;
87
+ case "message":
88
+ collector.message(entry.message);
89
+ break;
90
+ case "branch_summary":
91
+ if (entry.summary) {
92
+ collector.message(branchSummaryMessage(entry.summary, entry.fromId, entry.timestamp));
93
+ }
94
+ break;
95
+ default:
96
+ entry;
97
+ }
98
+ }
99
+ collector.closeOpenCalls();
100
+ return collector;
101
+ }
102
+ function sessionKeyFor(conversationId, fileName, current) {
103
+ if (fileName === current)
104
+ return { key: conversationId, root: true };
105
+ const stem = fileName.slice(0, -".jsonl".length);
106
+ if (MAIN_SESSION_FILENAME.test(fileName) || fileName.startsWith(ARCHIVED_THREAD_PREFIX)) {
107
+ return { key: undefined, root: false };
108
+ }
109
+ return { key: makeThreadSessionKey(conversationId, stem), root: false };
110
+ }
111
+ function planOfficeImport(conversationId, sessionsDir) {
112
+ const current = readTextFileIfExists(join(sessionsDir, "current"))?.trim() || undefined;
113
+ return readdirSync(sessionsDir, { withFileTypes: true })
114
+ .filter((entry) => entry.isFile() && entry.name.endsWith(".jsonl"))
115
+ .filter((entry) => readV4Header(join(sessionsDir, entry.name)) !== undefined)
116
+ .map((entry) => {
117
+ const file = join(sessionsDir, entry.name);
118
+ const v4 = readV4Session(file);
119
+ const collected = collectEntries(v4);
120
+ const { key, root } = sessionKeyFor(conversationId, entry.name, current);
121
+ return {
122
+ file,
123
+ expectedMessages: collected.messageCount,
124
+ session: {
125
+ key: key ?? earlierSessionKey(v4.header.id),
126
+ id: v4.header.id,
127
+ createdAt: v4.header.createdAt,
128
+ root,
129
+ name: v4.name,
130
+ entries: collected.entries,
131
+ },
132
+ };
133
+ });
134
+ }
135
+ async function verifyImport(temp, planned) {
136
+ const contexts = await readImportedContexts(temp);
137
+ for (const { file, session, expectedMessages } of planned) {
138
+ const imported = contexts.get(session.key)?.length ?? 0;
139
+ if (imported < expectedMessages) {
140
+ throw new Error(`Imported context of ${file} has ${imported} messages; expected at least ${expectedMessages}`);
141
+ }
142
+ }
143
+ }
144
+ function hasV4Sessions(sessionsDir) {
145
+ if (!existsSync(sessionsDir))
146
+ return false;
147
+ return readdirSync(sessionsDir, { withFileTypes: true }).some((entry) => entry.isFile() &&
148
+ entry.name.endsWith(".jsonl") &&
149
+ readV4Header(join(sessionsDir, entry.name)) !== undefined);
150
+ }
151
+ async function migrateOffice(conversationId, officeDir, context) {
152
+ const sessionsDir = join(officeDir, V4_SESSIONS_DIR);
153
+ const archive = join(officeDir, ARCHIVE_DIR);
154
+ const storage = join(officeDir, STORAGE_FILENAME);
155
+ const temp = `${storage}${TEMP_SUFFIX}`;
156
+ if (!existsSync(sessionsDir) && existsSync(temp) && existsSync(archive)) {
157
+ context.report(` finish ${storage}`);
158
+ if (!context.dryRun)
159
+ renameSync(temp, storage);
160
+ return;
161
+ }
162
+ if (!hasV4Sessions(sessionsDir))
163
+ return;
164
+ if (existsSync(storage))
165
+ throw new Error(`Session storage already exists: ${storage}`);
166
+ if (existsSync(archive))
167
+ throw new Error(`Archived v4 sessions already exist: ${archive}`);
168
+ const planned = planOfficeImport(conversationId, sessionsDir);
169
+ context.report(` ${planned.length} sessions -> ${storage}`);
170
+ if (context.dryRun)
171
+ return;
172
+ rmSync(temp, { force: true });
173
+ try {
174
+ await importOfficeSessions(temp, planned.map((plan) => plan.session));
175
+ await verifyImport(temp, planned);
176
+ }
177
+ catch (error) {
178
+ for (const file of [temp, `${temp}-wal`, `${temp}-shm`])
179
+ rmSync(file, { force: true });
180
+ throw new Error(`Session migration failed for ${sessionsDir}`, { cause: error });
181
+ }
182
+ renameSync(sessionsDir, archive);
183
+ renameSync(temp, storage);
184
+ }
185
+ function registeredOffices(stateDir) {
186
+ return new OfficeRegistry(stateDir).getOffices().map((record) => ({
187
+ conversationId: record.conversationId,
188
+ dir: officeStateDir(stateDir, record),
189
+ }));
190
+ }
191
+ function assertEveryOfficeRegistered(stateDir, registered) {
192
+ const root = join(stateDir, "conversations");
193
+ if (!existsSync(root))
194
+ return;
195
+ for (const entry of readdirSync(root, { withFileTypes: true })) {
196
+ if (!entry.isDirectory())
197
+ continue;
198
+ const dir = join(root, entry.name);
199
+ if (!registered.has(dir) && hasV4Sessions(join(dir, V4_SESSIONS_DIR))) {
200
+ throw new Error(`Sessions in ${dir} belong to no office in office-registry.json; record the office before migrating`);
201
+ }
202
+ }
203
+ }
204
+ export const sessionsSqliteMigration = Object.freeze({
205
+ id: "0009-sessions-sqlite",
206
+ summary: "import v4 session files into one pi-durable SQLite storage per office, keeping originals under sessions-v4/",
207
+ async run(context) {
208
+ const offices = registeredOffices(context.stateDir);
209
+ assertEveryOfficeRegistered(context.stateDir, new Set(offices.map((office) => office.dir)));
210
+ for (const office of offices) {
211
+ await migrateOffice(office.conversationId, office.dir, context);
212
+ }
213
+ },
214
+ });
215
+ //# sourceMappingURL=sessions-sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions-sqlite.js","sourceRoot":"","sources":["../../src/migrations/sessions-sqlite.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, renameSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AssistantMessage, Message } from \"@earendil-works/pi-ai\";\nimport { OfficeRegistry, officeStateDir } from \"../office/index.js\";\nimport {\n earlierSessionKey,\n importOfficeSessions,\n readImportedContexts,\n} from \"../sessions/session-store.js\";\nimport { makeThreadSessionKey } from \"../sessions/session-key.js\";\nimport type { ImportedSession, ImportedSessionEntry } from \"../sessions/types.js\";\nimport { readTextFileIfExists } from \"../file-guards.js\";\nimport {\n branchSummaryMessage,\n isContextMessage,\n readV4Header,\n readV4Session,\n toModelMessage,\n type V4Message,\n type V4Session,\n} from \"./session-v4.js\";\nimport type { Migration, MigrationContext } from \"./types.js\";\n\nconst V4_SESSIONS_DIR = \"sessions\";\nconst ARCHIVE_DIR = \"sessions-v4\";\nconst STORAGE_FILENAME = \"sessions.db\";\nconst TEMP_SUFFIX = \".importing\";\nconst MAIN_SESSION_FILENAME = /^\\d{4}-\\d{2}-\\d{2}T.+_[0-9a-f]{8}\\.jsonl$/i;\nconst ARCHIVED_THREAD_PREFIX = \"scoped-archive-\";\nconst INTERRUPTED_RESULT =\n \"This tool call was interrupted by the upgrade to Pi 1.0; its outcome is unknown.\";\n\nclass EntryCollector {\n readonly entries: ImportedSessionEntry[] = [];\n private readonly openCalls = new Map<string, { name: string; timestamp: number }>();\n\n get messageCount(): number {\n return this.entries.filter((entry) => entry.type !== \"custom\").length;\n }\n\n message(v4: V4Message): void {\n if (!isContextMessage(v4)) return;\n const message = toModelMessage(v4);\n if (!message) return;\n if (message.role === \"toolResult\") {\n if (!this.openCalls.delete(message.toolCallId)) return;\n } else {\n this.closeOpenCalls();\n }\n this.push(message);\n if (message.role === \"assistant\") this.trackCalls(message);\n }\n\n compaction(summary: string, timestamp: number): void {\n this.closeOpenCalls();\n this.entries.push({ type: \"compaction\", summary, timestamp });\n }\n\n custom(customType: string, data: unknown, timestamp: number): void {\n this.entries.push({ type: \"custom\", customType, data, timestamp });\n }\n\n closeOpenCalls(): void {\n for (const [toolCallId, call] of this.openCalls) {\n this.push({\n role: \"toolResult\",\n toolCallId,\n toolName: call.name,\n content: [{ type: \"text\", text: INTERRUPTED_RESULT }],\n isError: true,\n timestamp: call.timestamp,\n });\n }\n this.openCalls.clear();\n }\n\n private push(message: Message): void {\n this.entries.push({ type: \"message\", message });\n }\n\n private trackCalls(message: AssistantMessage): void {\n for (const part of message.content) {\n if (part.type === \"toolCall\") {\n this.openCalls.set(part.id, { name: part.name, timestamp: message.timestamp });\n }\n }\n }\n}\n\nfunction collectEntries(session: V4Session): EntryCollector {\n const collector = new EntryCollector();\n const visibleStart = session.branch.findLastIndex((entry) => entry.type === \"compaction\");\n for (const [index, entry] of session.branch.entries()) {\n if (entry.type === \"custom\") {\n collector.custom(entry.customType, entry.data, entry.timestamp);\n continue;\n }\n if (index < visibleStart) continue;\n switch (entry.type) {\n case \"compaction\":\n collector.compaction(entry.summary, entry.timestamp);\n for (const message of entry.retainedTail) collector.message(message);\n break;\n case \"message\":\n collector.message(entry.message);\n break;\n case \"branch_summary\":\n if (entry.summary) {\n collector.message(branchSummaryMessage(entry.summary, entry.fromId, entry.timestamp));\n }\n break;\n default:\n entry satisfies never;\n }\n }\n collector.closeOpenCalls();\n return collector;\n}\n\ninterface PlannedSession {\n file: string;\n session: ImportedSession;\n expectedMessages: number;\n}\n\nfunction sessionKeyFor(conversationId: string, fileName: string, current: string | undefined) {\n if (fileName === current) return { key: conversationId, root: true };\n const stem = fileName.slice(0, -\".jsonl\".length);\n if (MAIN_SESSION_FILENAME.test(fileName) || fileName.startsWith(ARCHIVED_THREAD_PREFIX)) {\n return { key: undefined, root: false };\n }\n return { key: makeThreadSessionKey(conversationId, stem), root: false };\n}\n\nfunction planOfficeImport(conversationId: string, sessionsDir: string): PlannedSession[] {\n const current = readTextFileIfExists(join(sessionsDir, \"current\"))?.trim() || undefined;\n return readdirSync(sessionsDir, { withFileTypes: true })\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".jsonl\"))\n .filter((entry) => readV4Header(join(sessionsDir, entry.name)) !== undefined)\n .map((entry) => {\n const file = join(sessionsDir, entry.name);\n const v4 = readV4Session(file);\n const collected = collectEntries(v4);\n const { key, root } = sessionKeyFor(conversationId, entry.name, current);\n return {\n file,\n expectedMessages: collected.messageCount,\n session: {\n key: key ?? earlierSessionKey(v4.header.id),\n id: v4.header.id,\n createdAt: v4.header.createdAt,\n root,\n name: v4.name,\n entries: collected.entries,\n },\n };\n });\n}\n\nasync function verifyImport(temp: string, planned: readonly PlannedSession[]): Promise<void> {\n const contexts = await readImportedContexts(temp);\n for (const { file, session, expectedMessages } of planned) {\n const imported = contexts.get(session.key)?.length ?? 0;\n if (imported < expectedMessages) {\n throw new Error(\n `Imported context of ${file} has ${imported} messages; expected at least ${expectedMessages}`,\n );\n }\n }\n}\n\nfunction hasV4Sessions(sessionsDir: string): boolean {\n if (!existsSync(sessionsDir)) return false;\n return readdirSync(sessionsDir, { withFileTypes: true }).some(\n (entry) =>\n entry.isFile() &&\n entry.name.endsWith(\".jsonl\") &&\n readV4Header(join(sessionsDir, entry.name)) !== undefined,\n );\n}\n\nasync function migrateOffice(\n conversationId: string,\n officeDir: string,\n context: MigrationContext,\n): Promise<void> {\n const sessionsDir = join(officeDir, V4_SESSIONS_DIR);\n const archive = join(officeDir, ARCHIVE_DIR);\n const storage = join(officeDir, STORAGE_FILENAME);\n const temp = `${storage}${TEMP_SUFFIX}`;\n if (!existsSync(sessionsDir) && existsSync(temp) && existsSync(archive)) {\n context.report(` finish ${storage}`);\n if (!context.dryRun) renameSync(temp, storage);\n return;\n }\n if (!hasV4Sessions(sessionsDir)) return;\n if (existsSync(storage)) throw new Error(`Session storage already exists: ${storage}`);\n if (existsSync(archive)) throw new Error(`Archived v4 sessions already exist: ${archive}`);\n const planned = planOfficeImport(conversationId, sessionsDir);\n context.report(` ${planned.length} sessions -> ${storage}`);\n if (context.dryRun) return;\n rmSync(temp, { force: true });\n try {\n await importOfficeSessions(\n temp,\n planned.map((plan) => plan.session),\n );\n await verifyImport(temp, planned);\n } catch (error) {\n for (const file of [temp, `${temp}-wal`, `${temp}-shm`]) rmSync(file, { force: true });\n throw new Error(`Session migration failed for ${sessionsDir}`, { cause: error });\n }\n renameSync(sessionsDir, archive);\n renameSync(temp, storage);\n}\n\nfunction registeredOffices(stateDir: string): Array<{ conversationId: string; dir: string }> {\n return new OfficeRegistry(stateDir).getOffices().map((record) => ({\n conversationId: record.conversationId,\n dir: officeStateDir(stateDir, record),\n }));\n}\n\nfunction assertEveryOfficeRegistered(stateDir: string, registered: ReadonlySet<string>): void {\n const root = join(stateDir, \"conversations\");\n if (!existsSync(root)) return;\n for (const entry of readdirSync(root, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const dir = join(root, entry.name);\n if (!registered.has(dir) && hasV4Sessions(join(dir, V4_SESSIONS_DIR))) {\n throw new Error(\n `Sessions in ${dir} belong to no office in office-registry.json; record the office before migrating`,\n );\n }\n }\n}\n\nexport const sessionsSqliteMigration: Migration = Object.freeze({\n id: \"0009-sessions-sqlite\",\n summary:\n \"import v4 session files into one pi-durable SQLite storage per office, keeping originals under sessions-v4/\",\n async run(context: MigrationContext): Promise<void> {\n const offices = registeredOffices(context.stateDir);\n assertEveryOfficeRegistered(context.stateDir, new Set(offices.map((office) => office.dir)));\n for (const office of offices) {\n await migrateOffice(office.conversationId, office.dir, context);\n }\n },\n});\n"]}
@@ -1,8 +1,8 @@
1
- import type { Migration, SessionMigrationResult } from "./types.js";
1
+ import type { Migration } from "./types.js";
2
2
  export declare function isV3SessionFile(filePath: string): boolean;
3
3
  export declare function migrateSessionFile(filePath: string, options?: {
4
4
  dryRun?: boolean;
5
- }): Promise<SessionMigrationResult>;
5
+ }): Promise<void>;
6
6
  export declare function findV3SessionFiles(root: string): string[];
7
7
  export declare const sessionsV3Migration: Migration;
8
8
  //# sourceMappingURL=sessions-v3.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sessions-v3.d.ts","sourceRoot":"","sources":["../../src/migrations/sessions-v3.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,SAAS,EAAoB,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAmEtF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAUzD;AAoVD,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,OAAO,CAAC,sBAAsB,CAAC,CAejC;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEzD;AAED,eAAO,MAAM,mBAAmB,EAAE,SAShC,CAAC"}
1
+ {"version":3,"file":"sessions-v3.d.ts","sourceRoot":"","sources":["../../src/migrations/sessions-v3.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,YAAY,CAAC;AAmE9D,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAUzD;AA4UD,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEzD;AAED,eAAO,MAAM,mBAAmB,EAAE,SAShC,CAAC"}