@threadbase-sh/streamer 1.63.0 → 1.65.0

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 (300) hide show
  1. package/dist/agent/agent-client.d.ts +14 -0
  2. package/dist/agent/agent-client.d.ts.map +1 -0
  3. package/dist/agent/agent-config.d.ts +24 -0
  4. package/dist/agent/agent-config.d.ts.map +1 -0
  5. package/dist/agent/conversation-writer.d.ts +13 -0
  6. package/dist/agent/conversation-writer.d.ts.map +1 -0
  7. package/dist/agent/dedupe.d.ts +6 -0
  8. package/dist/agent/dedupe.d.ts.map +1 -0
  9. package/dist/agent/errors.d.ts +23 -0
  10. package/dist/agent/errors.d.ts.map +1 -0
  11. package/dist/agent/handle-send-agent-input.d.ts +21 -0
  12. package/dist/agent/handle-send-agent-input.d.ts.map +1 -0
  13. package/dist/agent/handle-start-agent-session.d.ts +21 -0
  14. package/dist/agent/handle-start-agent-session.d.ts.map +1 -0
  15. package/dist/agent/history-mapper.d.ts +4 -0
  16. package/dist/agent/history-mapper.d.ts.map +1 -0
  17. package/dist/agent/payload-guard.d.ts +29 -0
  18. package/dist/agent/payload-guard.d.ts.map +1 -0
  19. package/dist/api/app.d.ts +28 -0
  20. package/dist/api/app.d.ts.map +1 -0
  21. package/dist/api/handlers/conversations.handlers.d.ts +69 -0
  22. package/dist/api/handlers/conversations.handlers.d.ts.map +1 -0
  23. package/dist/api/handlers/http-helpers.d.ts +50 -0
  24. package/dist/api/handlers/http-helpers.d.ts.map +1 -0
  25. package/dist/api/handlers/sessions.handlers.d.ts +236 -0
  26. package/dist/api/handlers/sessions.handlers.d.ts.map +1 -0
  27. package/dist/api/middleware/auth.middleware.d.ts +5 -0
  28. package/dist/api/middleware/auth.middleware.d.ts.map +1 -0
  29. package/dist/api/middleware/cors.middleware.d.ts +5 -0
  30. package/dist/api/middleware/cors.middleware.d.ts.map +1 -0
  31. package/dist/api/middleware/error.middleware.d.ts +4 -0
  32. package/dist/api/middleware/error.middleware.d.ts.map +1 -0
  33. package/dist/api/routes/backup.routes.d.ts +5 -0
  34. package/dist/api/routes/backup.routes.d.ts.map +1 -0
  35. package/dist/api/routes/browse.routes.d.ts +5 -0
  36. package/dist/api/routes/browse.routes.d.ts.map +1 -0
  37. package/dist/api/routes/cacheAlert.routes.d.ts +5 -0
  38. package/dist/api/routes/cacheAlert.routes.d.ts.map +1 -0
  39. package/dist/api/routes/config.routes.d.ts +5 -0
  40. package/dist/api/routes/config.routes.d.ts.map +1 -0
  41. package/dist/api/routes/conversations.routes.d.ts +5 -0
  42. package/dist/api/routes/conversations.routes.d.ts.map +1 -0
  43. package/dist/api/routes/devices.routes.d.ts +17 -0
  44. package/dist/api/routes/devices.routes.d.ts.map +1 -0
  45. package/dist/api/routes/diagnostics.routes.d.ts +5 -0
  46. package/dist/api/routes/diagnostics.routes.d.ts.map +1 -0
  47. package/dist/api/routes/health.routes.d.ts +5 -0
  48. package/dist/api/routes/health.routes.d.ts.map +1 -0
  49. package/dist/api/routes/logs.routes.d.ts +3 -0
  50. package/dist/api/routes/logs.routes.d.ts.map +1 -0
  51. package/dist/api/routes/misc.routes.d.ts +77 -0
  52. package/dist/api/routes/misc.routes.d.ts.map +1 -0
  53. package/dist/api/routes/pair.routes.d.ts +5 -0
  54. package/dist/api/routes/pair.routes.d.ts.map +1 -0
  55. package/dist/api/routes/progress.routes.d.ts +39 -0
  56. package/dist/api/routes/progress.routes.d.ts.map +1 -0
  57. package/dist/api/routes/projects.routes.d.ts +5 -0
  58. package/dist/api/routes/projects.routes.d.ts.map +1 -0
  59. package/dist/api/routes/providers.routes.d.ts +19 -0
  60. package/dist/api/routes/providers.routes.d.ts.map +1 -0
  61. package/dist/api/routes/scanner.routes.d.ts +5 -0
  62. package/dist/api/routes/scanner.routes.d.ts.map +1 -0
  63. package/dist/api/routes/sessions.routes.d.ts +6 -0
  64. package/dist/api/routes/sessions.routes.d.ts.map +1 -0
  65. package/dist/api/routes/ws.routes.d.ts +7 -0
  66. package/dist/api/routes/ws.routes.d.ts.map +1 -0
  67. package/dist/api/types/api-deps.d.ts +114 -0
  68. package/dist/api/types/api-deps.d.ts.map +1 -0
  69. package/dist/auth.d.ts +81 -0
  70. package/dist/auth.d.ts.map +1 -0
  71. package/dist/browse.d.ts +17 -0
  72. package/dist/browse.d.ts.map +1 -0
  73. package/dist/claude-flags.d.ts +76 -0
  74. package/dist/claude-flags.d.ts.map +1 -0
  75. package/dist/cli.cjs +121 -7
  76. package/dist/cli.cjs.map +1 -1
  77. package/dist/codex-pty-runner.d.ts +90 -0
  78. package/dist/codex-pty-runner.d.ts.map +1 -0
  79. package/dist/config/update-config.d.ts +13 -0
  80. package/dist/config/update-config.d.ts.map +1 -0
  81. package/dist/conversation-cache.d.ts +336 -0
  82. package/dist/conversation-cache.d.ts.map +1 -0
  83. package/dist/db/config.d.ts +11 -0
  84. package/dist/db/config.d.ts.map +1 -0
  85. package/dist/db/index.d.ts +5 -0
  86. package/dist/db/index.d.ts.map +1 -0
  87. package/dist/db/migrations.d.ts +3 -0
  88. package/dist/db/migrations.d.ts.map +1 -0
  89. package/dist/db/pool.d.ts +5 -0
  90. package/dist/db/pool.d.ts.map +1 -0
  91. package/dist/db/query-timing.d.ts +52 -0
  92. package/dist/db/query-timing.d.ts.map +1 -0
  93. package/dist/db/repositories/cacheMetadata.repository.d.ts +12 -0
  94. package/dist/db/repositories/cacheMetadata.repository.d.ts.map +1 -0
  95. package/dist/db/repositories/conversations.repository.d.ts +27 -0
  96. package/dist/db/repositories/conversations.repository.d.ts.map +1 -0
  97. package/dist/db/repositories/devices.repository.d.ts +137 -0
  98. package/dist/db/repositories/devices.repository.d.ts.map +1 -0
  99. package/dist/db/repositories/managed-sessions.repository.d.ts +127 -0
  100. package/dist/db/repositories/managed-sessions.repository.d.ts.map +1 -0
  101. package/dist/db/repositories/projects.repository.d.ts +28 -0
  102. package/dist/db/repositories/projects.repository.d.ts.map +1 -0
  103. package/dist/db/repositories/push.repository.d.ts +186 -0
  104. package/dist/db/repositories/push.repository.d.ts.map +1 -0
  105. package/dist/db/repositories/sessions.repository.d.ts +16 -0
  106. package/dist/db/repositories/sessions.repository.d.ts.map +1 -0
  107. package/dist/db/runtime-store.d.ts +80 -0
  108. package/dist/db/runtime-store.d.ts.map +1 -0
  109. package/dist/db/sqlite-migrate.d.ts +13 -0
  110. package/dist/db/sqlite-migrate.d.ts.map +1 -0
  111. package/dist/db/upload-records.d.ts +11 -0
  112. package/dist/db/upload-records.d.ts.map +1 -0
  113. package/dist/e2ee/noise.d.ts +261 -0
  114. package/dist/e2ee/noise.d.ts.map +1 -0
  115. package/dist/e2ee/pair-payload.d.ts +60 -0
  116. package/dist/e2ee/pair-payload.d.ts.map +1 -0
  117. package/dist/e2ee/pair-request.d.ts +24 -0
  118. package/dist/e2ee/pair-request.d.ts.map +1 -0
  119. package/dist/external-tails.d.ts +91 -0
  120. package/dist/external-tails.d.ts.map +1 -0
  121. package/dist/feature-flags.d.ts +212 -0
  122. package/dist/feature-flags.d.ts.map +1 -0
  123. package/dist/handlers/handleListProjects.d.ts +3 -0
  124. package/dist/handlers/handleListProjects.d.ts.map +1 -0
  125. package/dist/index.cjs +101 -2
  126. package/dist/index.cjs.map +1 -1
  127. package/dist/index.d.ts +18 -2571
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +101 -2
  130. package/dist/index.js.map +1 -1
  131. package/dist/lifecycle/constants.d.ts +21 -0
  132. package/dist/lifecycle/constants.d.ts.map +1 -0
  133. package/dist/lifecycle/process-liveness.d.ts +7 -0
  134. package/dist/lifecycle/process-liveness.d.ts.map +1 -0
  135. package/dist/live-session-manager.d.ts +59 -0
  136. package/dist/live-session-manager.d.ts.map +1 -0
  137. package/dist/logger.d.ts +14 -0
  138. package/dist/logger.d.ts.map +1 -0
  139. package/dist/pair-store.d.ts +60 -0
  140. package/dist/pair-store.d.ts.map +1 -0
  141. package/dist/platform.d.ts +25 -0
  142. package/dist/platform.d.ts.map +1 -0
  143. package/dist/process-discovery.d.ts +35 -0
  144. package/dist/process-discovery.d.ts.map +1 -0
  145. package/dist/providers.d.ts +7 -0
  146. package/dist/providers.d.ts.map +1 -0
  147. package/dist/pty-host/protocol.d.ts +270 -0
  148. package/dist/pty-host/protocol.d.ts.map +1 -0
  149. package/dist/pty-host/remote-session-runner.d.ts +133 -0
  150. package/dist/pty-host/remote-session-runner.d.ts.map +1 -0
  151. package/dist/pty-host/socket.d.ts +54 -0
  152. package/dist/pty-host/socket.d.ts.map +1 -0
  153. package/dist/pty-host/spawn-host.d.ts +30 -0
  154. package/dist/pty-host/spawn-host.d.ts.map +1 -0
  155. package/dist/pty-manager.d.ts +65 -0
  156. package/dist/pty-manager.d.ts.map +1 -0
  157. package/dist/pty-shared.d.ts +27 -0
  158. package/dist/pty-shared.d.ts.map +1 -0
  159. package/dist/scanner-manager.d.ts +126 -0
  160. package/dist/scanner-manager.d.ts.map +1 -0
  161. package/dist/schemas/cacheAlert.schema.d.ts +14 -0
  162. package/dist/schemas/cacheAlert.schema.d.ts.map +1 -0
  163. package/dist/schemas/claudeFlags.schema.d.ts +7 -0
  164. package/dist/schemas/claudeFlags.schema.d.ts.map +1 -0
  165. package/dist/schemas/project.schema.d.ts +18 -0
  166. package/dist/schemas/project.schema.d.ts.map +1 -0
  167. package/dist/schemas/updateConfig.schema.d.ts +19 -0
  168. package/dist/schemas/updateConfig.schema.d.ts.map +1 -0
  169. package/dist/seal.d.ts +14 -0
  170. package/dist/seal.d.ts.map +1 -0
  171. package/dist/server-identity.d.ts +43 -0
  172. package/dist/server-identity.d.ts.map +1 -0
  173. package/dist/server-wiring.d.ts +189 -0
  174. package/dist/server-wiring.d.ts.map +1 -0
  175. package/dist/server.d.ts +404 -0
  176. package/dist/server.d.ts.map +1 -0
  177. package/dist/services/backup/backup.d.ts +103 -0
  178. package/dist/services/backup/backup.d.ts.map +1 -0
  179. package/dist/services/cache/cacheMetadata.d.ts +8 -0
  180. package/dist/services/cache/cacheMetadata.d.ts.map +1 -0
  181. package/dist/services/cache-integrity/alertStore.d.ts +24 -0
  182. package/dist/services/cache-integrity/alertStore.d.ts.map +1 -0
  183. package/dist/services/cache-integrity/backup.d.ts +8 -0
  184. package/dist/services/cache-integrity/backup.d.ts.map +1 -0
  185. package/dist/services/cache-integrity/cacheIntegrityMonitor.d.ts +71 -0
  186. package/dist/services/cache-integrity/cacheIntegrityMonitor.d.ts.map +1 -0
  187. package/dist/services/conversations/conversationWatcher.d.ts +99 -0
  188. package/dist/services/conversations/conversationWatcher.d.ts.map +1 -0
  189. package/dist/services/conversations/findSearchTarget.d.ts +30 -0
  190. package/dist/services/conversations/findSearchTarget.d.ts.map +1 -0
  191. package/dist/services/conversations/isAgentConversation.d.ts +8 -0
  192. package/dist/services/conversations/isAgentConversation.d.ts.map +1 -0
  193. package/dist/services/conversations/pruneAgentConversations.d.ts +8 -0
  194. package/dist/services/conversations/pruneAgentConversations.d.ts.map +1 -0
  195. package/dist/services/conversations/refreshConversationCache.d.ts +27 -0
  196. package/dist/services/conversations/refreshConversationCache.d.ts.map +1 -0
  197. package/dist/services/conversations/shouldRefreshProjectsFromHdd.d.ts +33 -0
  198. package/dist/services/conversations/shouldRefreshProjectsFromHdd.d.ts.map +1 -0
  199. package/dist/services/diagnostics/diagnostics.d.ts +66 -0
  200. package/dist/services/diagnostics/diagnostics.d.ts.map +1 -0
  201. package/dist/services/projectChats/deriveProjectChatTitle.d.ts +15 -0
  202. package/dist/services/projectChats/deriveProjectChatTitle.d.ts.map +1 -0
  203. package/dist/services/projects/ensureProjectsForConversations.d.ts +15 -0
  204. package/dist/services/projects/ensureProjectsForConversations.d.ts.map +1 -0
  205. package/dist/services/providers/capabilities.d.ts +105 -0
  206. package/dist/services/providers/capabilities.d.ts.map +1 -0
  207. package/dist/services/providers/providerHealth.d.ts +72 -0
  208. package/dist/services/providers/providerHealth.d.ts.map +1 -0
  209. package/dist/services/push/apnsClient.d.ts +105 -0
  210. package/dist/services/push/apnsClient.d.ts.map +1 -0
  211. package/dist/services/push/expoPushSender.d.ts +37 -0
  212. package/dist/services/push/expoPushSender.d.ts.map +1 -0
  213. package/dist/services/push/liveActivityContentState.d.ts +60 -0
  214. package/dist/services/push/liveActivityContentState.d.ts.map +1 -0
  215. package/dist/services/push/liveActivityNotifier.d.ts +49 -0
  216. package/dist/services/push/liveActivityNotifier.d.ts.map +1 -0
  217. package/dist/services/push/liveActivityRenewal.d.ts +63 -0
  218. package/dist/services/push/liveActivityRenewal.d.ts.map +1 -0
  219. package/dist/services/push/liveActivitySender.d.ts +88 -0
  220. package/dist/services/push/liveActivitySender.d.ts.map +1 -0
  221. package/dist/services/push/waitingInputNotifier.d.ts +41 -0
  222. package/dist/services/push/waitingInputNotifier.d.ts.map +1 -0
  223. package/dist/services/questions/answersToKeystrokes.d.ts +8 -0
  224. package/dist/services/questions/answersToKeystrokes.d.ts.map +1 -0
  225. package/dist/services/questions/codexGateAnswers.d.ts +14 -0
  226. package/dist/services/questions/codexGateAnswers.d.ts.map +1 -0
  227. package/dist/services/questions/codexScreen.d.ts +74 -0
  228. package/dist/services/questions/codexScreen.d.ts.map +1 -0
  229. package/dist/services/questions/detectAskUserQuestion.d.ts +6 -0
  230. package/dist/services/questions/detectAskUserQuestion.d.ts.map +1 -0
  231. package/dist/services/questions/detectPermissionGate.d.ts +62 -0
  232. package/dist/services/questions/detectPermissionGate.d.ts.map +1 -0
  233. package/dist/services/questions/detectQuestionFromScreen.d.ts +30 -0
  234. package/dist/services/questions/detectQuestionFromScreen.d.ts.map +1 -0
  235. package/dist/services/questions/detectShellPrompt.d.ts +18 -0
  236. package/dist/services/questions/detectShellPrompt.d.ts.map +1 -0
  237. package/dist/services/questions/parseAgentPhase.d.ts +12 -0
  238. package/dist/services/questions/parseAgentPhase.d.ts.map +1 -0
  239. package/dist/services/questions/parseStatusLine.d.ts +19 -0
  240. package/dist/services/questions/parseStatusLine.d.ts.map +1 -0
  241. package/dist/services/questions/questionBroadcast.d.ts +18 -0
  242. package/dist/services/questions/questionBroadcast.d.ts.map +1 -0
  243. package/dist/services/questions/resolveAnswer.d.ts +16 -0
  244. package/dist/services/questions/resolveAnswer.d.ts.map +1 -0
  245. package/dist/services/search/searchQuery.d.ts +78 -0
  246. package/dist/services/search/searchQuery.d.ts.map +1 -0
  247. package/dist/services/security/capabilities.d.ts +50 -0
  248. package/dist/services/security/capabilities.d.ts.map +1 -0
  249. package/dist/services/sessions/autoResumeOnBoot.d.ts +28 -0
  250. package/dist/services/sessions/autoResumeOnBoot.d.ts.map +1 -0
  251. package/dist/services/sessions/codexRolloutOwner.d.ts +55 -0
  252. package/dist/services/sessions/codexRolloutOwner.d.ts.map +1 -0
  253. package/dist/services/sessions/conversationBusy.d.ts +32 -0
  254. package/dist/services/sessions/conversationBusy.d.ts.map +1 -0
  255. package/dist/services/sessions/idempotency.d.ts +67 -0
  256. package/dist/services/sessions/idempotency.d.ts.map +1 -0
  257. package/dist/services/sessions/reconcileSessions.d.ts +63 -0
  258. package/dist/services/sessions/reconcileSessions.d.ts.map +1 -0
  259. package/dist/services/sessions/rehydrateSessions.d.ts +68 -0
  260. package/dist/services/sessions/rehydrateSessions.d.ts.map +1 -0
  261. package/dist/services/sessions/resumeIdentity.d.ts +16 -0
  262. package/dist/services/sessions/resumeIdentity.d.ts.map +1 -0
  263. package/dist/session-registry-boot.d.ts +142 -0
  264. package/dist/session-registry-boot.d.ts.map +1 -0
  265. package/dist/session-store.d.ts +32 -0
  266. package/dist/session-store.d.ts.map +1 -0
  267. package/dist/session-watchers.d.ts +60 -0
  268. package/dist/session-watchers.d.ts.map +1 -0
  269. package/dist/types.d.ts +616 -0
  270. package/dist/types.d.ts.map +1 -0
  271. package/dist/uploads.d.ts +16 -0
  272. package/dist/uploads.d.ts.map +1 -0
  273. package/dist/utils/bootToken.d.ts +3 -0
  274. package/dist/utils/bootToken.d.ts.map +1 -0
  275. package/dist/utils/canonicalizeFilePath.d.ts +75 -0
  276. package/dist/utils/canonicalizeFilePath.d.ts.map +1 -0
  277. package/dist/utils/canonicalizeProjectPath.d.ts +13 -0
  278. package/dist/utils/canonicalizeProjectPath.d.ts.map +1 -0
  279. package/dist/utils/codexConversationLine.d.ts +38 -0
  280. package/dist/utils/codexConversationLine.d.ts.map +1 -0
  281. package/dist/utils/conversationEtag.d.ts +19 -0
  282. package/dist/utils/conversationEtag.d.ts.map +1 -0
  283. package/dist/utils/dates.d.ts +12 -0
  284. package/dist/utils/dates.d.ts.map +1 -0
  285. package/dist/utils/debounce.d.ts +15 -0
  286. package/dist/utils/debounce.d.ts.map +1 -0
  287. package/dist/utils/deriveSessionName.d.ts +10 -0
  288. package/dist/utils/deriveSessionName.d.ts.map +1 -0
  289. package/dist/utils/fileIdentity.d.ts +36 -0
  290. package/dist/utils/fileIdentity.d.ts.map +1 -0
  291. package/dist/utils/isScannedSnapshotStale.d.ts +16 -0
  292. package/dist/utils/isScannedSnapshotStale.d.ts.map +1 -0
  293. package/dist/utils/scanProgressThrottle.d.ts +12 -0
  294. package/dist/utils/scanProgressThrottle.d.ts.map +1 -0
  295. package/dist/version.d.ts +3 -0
  296. package/dist/version.d.ts.map +1 -0
  297. package/dist/ws-hub.d.ts +15 -0
  298. package/dist/ws-hub.d.ts.map +1 -0
  299. package/package.json +3 -4
  300. package/dist/index.d.cts +0 -2571
@@ -0,0 +1,90 @@
1
+ import type { ManagedSession, PTYManagerOptions, SessionRunner, StartForkSessionOptions, StartFreshSessionOptions, StartSessionOptions, UserMessage } from "./types";
2
+ export declare class CodexPtyRunner implements SessionRunner {
3
+ private sessions;
4
+ private onOutput;
5
+ private onStatusChange;
6
+ private onPhaseChange;
7
+ private onReady;
8
+ private onPermissionChange;
9
+ private onUserMessage;
10
+ private log;
11
+ private pendingReady;
12
+ private queuedInputs;
13
+ private openGate;
14
+ private gateActioned;
15
+ private quietCheckers;
16
+ private readyFallbackTimers;
17
+ private submitWatchTimers;
18
+ private lastChunkAt;
19
+ private turnBusy;
20
+ private openBlockingPrompt;
21
+ private openCommandApproval;
22
+ private lastScreenLog;
23
+ private startPromises;
24
+ constructor(options?: PTYManagerOptions);
25
+ start(sessionId: string, options: StartSessionOptions): Promise<ManagedSession>;
26
+ private doStart;
27
+ private launch;
28
+ startFresh(options: StartFreshSessionOptions): Promise<ManagedSession>;
29
+ /**
30
+ * Fork an existing Codex conversation into a new, independently-owned one
31
+ * (`codex fork <session-id>`).
32
+ *
33
+ * This is the recovery path for a rollout Codex will not let us resume: fork
34
+ * starts a *new* rollout seeded from the source's history and never touches
35
+ * the source's writer, so the terminal / VS Code / desktop client that owns
36
+ * it keeps running untouched. Like a fresh start, Codex assigns the new
37
+ * rollout id itself — the returned session is keyed by a local placeholder
38
+ * until watchForCodexRollout binds the real id.
39
+ */
40
+ startFork(options: StartForkSessionOptions): Promise<ManagedSession>;
41
+ private armReadyFallback;
42
+ private tryReadyFallback;
43
+ sendKeys(sessionId: string, keys: string): void;
44
+ private resolveGateAnswer;
45
+ sendInput(sessionId: string, input: string): number;
46
+ private writeSubmit;
47
+ private armSubmitWatch;
48
+ private trySubmitStaleRecovery;
49
+ private flushQueuedInputs;
50
+ cancel(sessionId: string): void;
51
+ killPid(pid: number): void;
52
+ putOnHold(sessionId: string): void;
53
+ private clearSessionDetectors;
54
+ getOutput(sessionId: string): string;
55
+ getOutputLines(sessionId: string, maxLines: number): Promise<string[]>;
56
+ getInputHistory(sessionId: string): UserMessage[];
57
+ getPid(sessionId: string): number | null;
58
+ private recordUserMessage;
59
+ getSession(sessionId: string): ManagedSession | null;
60
+ hasSession(sessionId: string): boolean;
61
+ listSessions(): ManagedSession[];
62
+ dispose(): void;
63
+ private handleOutput;
64
+ private detectScreenState;
65
+ private handleBlockingPrompt;
66
+ private handleCommandApproval;
67
+ private handleGate;
68
+ /**
69
+ * Record the agent's phase and notify only on a real change. The guard is
70
+ * load-bearing, not an optimisation: detectScreenState runs on every chunk,
71
+ * so an unguarded setter would fire the WS frame behind this several times a
72
+ * second for a whole turn while reporting the same value. Same contract as
73
+ * PTYManager.setPhase — the two runners deliberately stay separate classes.
74
+ */
75
+ private setPhase;
76
+ private markReady;
77
+ /**
78
+ * Tear down a session that failed before it ever became usable, and report
79
+ * the reason in machine-readable form.
80
+ *
81
+ * Deliberately NOT markReady + exit: the caller must be able to tell a
82
+ * never-started session from a live one, `onReady` must not fire (no
83
+ * `session_ready` for a failed start), and every piece of per-session state —
84
+ * queue, timers, quiet-checker, gate cards, screen — has to go, since the
85
+ * session is removed from the map and nothing will collect it later.
86
+ */
87
+ private failStartup;
88
+ private handleExit;
89
+ }
90
+ //# sourceMappingURL=codex-pty-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-pty-runner.d.ts","sourceRoot":"","sources":["../src/codex-pty-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type UpdateConfig } from "../schemas/updateConfig.schema";
2
+ declare const DEFAULT_CONFIG_PATH: string;
3
+ export interface LoadUpdateConfigOptions {
4
+ path?: string;
5
+ }
6
+ /**
7
+ * Loads ~/.threadbase/update.yaml. Returns null when the file does not exist
8
+ * (auto-update disabled). Throws on malformed YAML or schema-invalid content
9
+ * so misconfiguration is loud rather than silently disabling updates.
10
+ */
11
+ export declare function loadUpdateConfig(opts?: LoadUpdateConfigOptions): UpdateConfig | null;
12
+ export { DEFAULT_CONFIG_PATH as UPDATE_CONFIG_PATH };
13
+ //# sourceMappingURL=update-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-config.d.ts","sourceRoot":"","sources":["../../src/config/update-config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,gCAAgC,CAAC;AAEvF,QAAA,MAAM,mBAAmB,QAAgD,CAAC;AAE1E,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,uBAA4B,GAAG,YAAY,GAAG,IAAI,CAiBxF;AAED,OAAO,EAAE,mBAAmB,IAAI,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,336 @@
1
+ import { type ConversationMessage, type ConversationMeta, type FileStatEntry } from "@threadbase-sh/scanner";
2
+ import Database from "better-sqlite3";
3
+ import { type Stats } from "fs";
4
+ import { type LineSpan } from "./utils/fileIdentity";
5
+ export interface ConversationCacheOptions {
6
+ filterAgentConversations?: boolean;
7
+ agentEntrypoints?: ReadonlySet<string>;
8
+ onAgentFileDetected?: (filePath: string) => void;
9
+ }
10
+ export interface ConversationListItem {
11
+ id: string;
12
+ filePath: string;
13
+ projectId: string | null;
14
+ projectPath: string | null;
15
+ projectName: string | null;
16
+ title: string | null;
17
+ model: string | null;
18
+ account: string | null;
19
+ branch: string | null;
20
+ messageCount: number;
21
+ lastActivity: string;
22
+ firstMessage: string | null;
23
+ lastMessage: string | null;
24
+ preview: string | null;
25
+ source: string | null;
26
+ provider: "claude-code" | "codex-cli";
27
+ }
28
+ export interface CachedTailMessage {
29
+ role: string;
30
+ timestamp: string;
31
+ text: string;
32
+ content?: unknown[];
33
+ }
34
+ export interface CachedTail {
35
+ conversationId: string;
36
+ messages: CachedTailMessage[];
37
+ tailSize: number;
38
+ }
39
+ /** A row of `conversation_file_state` — per-file offset-index resume state. */
40
+ export interface FileStateRow {
41
+ path: string;
42
+ identity: string;
43
+ size: number;
44
+ mtime_ms: number;
45
+ byte_offset: number;
46
+ last_message_index: number;
47
+ }
48
+ /** A row of `conversation_message_index` — one indexed message's byte span. */
49
+ export interface MessageIndexRow {
50
+ conversation_id: string;
51
+ message_index: number;
52
+ byte_offset: number;
53
+ byte_length: number;
54
+ uuid: string | null;
55
+ role: string | null;
56
+ ts: number | null;
57
+ }
58
+ export interface ScannerMeta {
59
+ id: string;
60
+ sessionId?: string;
61
+ filePath: string;
62
+ projectPath?: string;
63
+ projectName?: string;
64
+ title?: string;
65
+ sessionName?: string;
66
+ model?: string;
67
+ account?: string;
68
+ gitBranch?: string;
69
+ messageCount?: number;
70
+ timestamp?: string;
71
+ firstMessage?: unknown;
72
+ lastMessage?: unknown;
73
+ preview?: string;
74
+ provider?: "claude-code" | "codex-cli";
75
+ }
76
+ export declare class ConversationCache {
77
+ private db;
78
+ private tailSize;
79
+ private fileIndex;
80
+ private fileIndexLoaded;
81
+ private indexParseState;
82
+ private backfillInFlight;
83
+ private tailSeq;
84
+ private nameSeq;
85
+ private stmts;
86
+ private migrationsDir?;
87
+ private filterAgentConversations;
88
+ private agentEntrypoints;
89
+ private onAgentFileDetected?;
90
+ private constructor();
91
+ /**
92
+ * Expose the underlying handle so projects/cache_metadata repositories can
93
+ * share the same connection. Internal API; not part of the public surface.
94
+ */
95
+ getDatabase(): Database.Database;
96
+ getFileState(path: string): FileStateRow | null;
97
+ upsertFileState(row: FileStateRow): void;
98
+ /** Drop a file's index rows + file_state (truncation / identity change). */
99
+ deleteFileIndex(path: string, conversationId: string): void;
100
+ /** Append/replace index rows in one transaction. */
101
+ appendMessageIndexRows(rows: MessageIndexRow[]): void;
102
+ /** Rows for message_index in [fromIndex, toIndex), ordered ascending. */
103
+ getMessageIndexWindow(conversationId: string, fromIndex: number, toIndex: number): MessageIndexRow[];
104
+ getIndexedMessageCount(conversationId: string): number;
105
+ /**
106
+ * Conversation id for a JSONL path — the filename stem (matches the pseudo-id
107
+ * updateFromLine derives and the uuid the detail read path resolves). The
108
+ * offset index keys on this so the window select and the cursor agree.
109
+ */
110
+ static conversationIdForFile(filePath: string): string;
111
+ private isIndexableFile;
112
+ /**
113
+ * Incremental offset-index writer: extend the index for a burst of appended
114
+ * lines (one watcher read) using their byte spans. Each line is classified
115
+ * with the scanner's parseJsonlLine (a running per-file reducer state), so the
116
+ * message ordering can never drift from the scanner's. Message lines get an
117
+ * index row at the next message_index; non-message lines (summary/sidecar)
118
+ * get no row but still advance byte_offset. file_state is updated to the end
119
+ * of the last consumed span.
120
+ *
121
+ * Requires an up-to-date `stat` (identity/size/mtime) for the file so the read
122
+ * path can detect truncation/replacement.
123
+ *
124
+ * `readFrom` is the absolute byte offset the watcher read started at, and
125
+ * `endOffset` is where it ended (readFrom + consumed, i.e. the watcher's new
126
+ * entry.offset). CONTIGUITY GUARD: the read must begin exactly where the index
127
+ * left off (`readFrom === existing.byte_offset`, or 0 with no state). If it
128
+ * doesn't — the watcher attached at EOF after the server was down, or an
129
+ * append raced an in-flight backfill — extending would assign wrong
130
+ * message_index values over a hole. In that case this writes nothing and
131
+ * returns null so the caller drops the index and backfills.
132
+ *
133
+ * On success returns the message_index assigned to each input span (null for a
134
+ * non-message line) so the caller can stamp WS `seq`. Empty array when spans
135
+ * is empty. `endOffset` is stored verbatim as byte_offset so the watcher's
136
+ * offset and file_state.byte_offset are the same number by construction.
137
+ */
138
+ extendMessageIndex(filePath: string, spans: LineSpan[], stat: Stats, readFrom: number, endOffset: number): (number | null)[] | null;
139
+ clearIndexParseState(filePath: string): void;
140
+ /**
141
+ * On-demand full backfill of the offset index for a file with no/stale
142
+ * file_state (cold conversation, or after a truncation/replacement). Rebuilds
143
+ * from byte 0: drops any existing rows, walks the whole file in chunks with a
144
+ * running parse state, yields to the event loop every ~1000 lines so a large
145
+ * file never blocks, and writes index rows + file_state.
146
+ *
147
+ * Single-flighted per path: concurrent callers await the same walk. The
148
+ * triggering detail request is served by the scanner fallback while this runs.
149
+ */
150
+ backfillIndex(filePath: string): Promise<void>;
151
+ private runBackfill;
152
+ /**
153
+ * Windowed detail read straight from the offset index — the hot path.
154
+ * Returns the parsed messages for message_index in [fromIndex, toIndex) plus
155
+ * the total indexed count, or null when the index can't serve this file (no
156
+ * file_state, identity/size mismatch = truncation/replacement, or cold index)
157
+ * so the caller falls back to the scanner and enqueues a backfill.
158
+ *
159
+ * On a match it SQL-selects the window's byte ranges and preads exactly those
160
+ * ranges from the JSONL (never the whole file), parsing only the sliced lines.
161
+ * Returns messages in the same ConversationMessage shape parseJsonlLine
162
+ * produces during a scan, so the payload is identical to the scanner path.
163
+ */
164
+ readMessageWindow(filePath: string, fromIndex: number, toIndex: number): {
165
+ messages: ConversationMessage[];
166
+ total: number;
167
+ fromIndex: number;
168
+ } | null;
169
+ private agentEntrypointsKey;
170
+ private classifyAgentFile;
171
+ isAgentFileCached(filePath: string): boolean;
172
+ static open(dbPath: string, tailSize?: number, migrationsDir?: string, options?: ConversationCacheOptions): ConversationCache;
173
+ close(): void;
174
+ getPopularProjects(limit: number): Array<{
175
+ path: string;
176
+ name: string;
177
+ sessionCount: number;
178
+ }>;
179
+ /** Every project with at least one cached conversation, most recently active
180
+ * first. Paths are the raw `project_path` values, which is what
181
+ * /api/conversations?project= matches on exactly — so a summary row is
182
+ * always joinable against the page it describes. */
183
+ listProjectSummaries(opts: {
184
+ limit: number;
185
+ offset: number;
186
+ }): {
187
+ projects: Array<{
188
+ path: string;
189
+ name: string;
190
+ conversationCount: number;
191
+ lastActivity: string;
192
+ }>;
193
+ total: number;
194
+ };
195
+ private ensureFileIndex;
196
+ updateFromLine(filePath: string, rawLine: string): void;
197
+ /**
198
+ * Batched form of updateFromLine: applies a burst of newly-appended lines
199
+ * (one chokidar read) in a single transaction with one message_count bump,
200
+ * one meta write, and one tail read/write — instead of 2-4 synchronous
201
+ * writes per line. Semantics are identical to replaying each line through
202
+ * updateFromLine in order: the agent filter short-circuits the whole batch,
203
+ * project context is backfilled last-wins, message_count increases by the
204
+ * number of surviving message lines, and last_activity/last_message reflect
205
+ * the newest message line by timestamp (a monotonic guard keeps them from
206
+ * moving backward when an interleaved writer appends an older line — P0.3).
207
+ */
208
+ updateFromLines(filePath: string, rawLines: string[]): void;
209
+ upsertFromScannerMeta(metas: ScannerMeta[]): string[];
210
+ deleteByFilePath(filePath: string): boolean;
211
+ populateTailFromFile(convId: string, filePath: string): boolean;
212
+ listConversations(opts: {
213
+ project?: string;
214
+ provider?: string;
215
+ limit: number;
216
+ offset: number;
217
+ }): {
218
+ conversations: ConversationListItem[];
219
+ total: number;
220
+ };
221
+ /** Returns a map of filePath → { mtimeMs, size } for all rows that have
222
+ * stat data stored. Used by the server to build the statCache passed to
223
+ * ConversationScanner.scan() so unchanged files are skipped. */
224
+ getFileStats(): Map<string, {
225
+ mtimeMs: number;
226
+ size: number;
227
+ }>;
228
+ getScannerStatCache(): Map<string, {
229
+ stat: FileStatEntry;
230
+ meta: ConversationMeta;
231
+ }>;
232
+ /**
233
+ * Conversation id for a JSONL path, or null when no row exists yet. Resolves
234
+ * by file_path (NOT conversationIdForFile) so codex rollout files — named
235
+ * rollout-<ts>-<uuid>.jsonl, whose stem is not the row id — resolve correctly.
236
+ */
237
+ getIdByFilePath(filePath: string): string | null;
238
+ getMetaById(id: string): ConversationListItem | null;
239
+ setConversationProjectId(conversationId: string, projectId: string): void;
240
+ markAsStreamer(id: string): void;
241
+ getLatestConversation(): {
242
+ id: string;
243
+ lastActivity: string | null;
244
+ } | null;
245
+ hasOrphanProjectId(): boolean;
246
+ listConversationsForProjectBackfill(): Array<{
247
+ id: string;
248
+ projectPath: string | null;
249
+ projectId: string | null;
250
+ lastActivity: string | null;
251
+ }>;
252
+ getConversationTail(id: string): CachedTail | null;
253
+ hasConversation(id: string): boolean;
254
+ upsertSessionName(sessionId: string, name: string): void;
255
+ getSessionName(sessionId: string): string | null;
256
+ listSessionNames(): Record<string, string>;
257
+ invalidate(id?: string): void;
258
+ /**
259
+ * Drop the cached row for a file. Two callers with opposite intent:
260
+ * - a directory-watch "change" event (the file was appended to) — pass
261
+ * `skipIfTailed: true`, which NEVER deletes (upsert-or-leave). A change
262
+ * event fires on every external append; deleting here flickers the
263
+ * conversation out of /api/conversations — whether it's a live-tailed row
264
+ * the updateFromLines/warm-up path just wrote (CRITICAL #2; both watchers
265
+ * fire on the same append with no ordering guarantee) OR a refresh-created
266
+ * untailed row (a ?refresh=1 upsert never populates a tail, so the old
267
+ * "delete when untailed" behavior made it vanish on its next append with no
268
+ * client action). The live-tail path owns the row's content and the
269
+ * debounced rescan re-derives metadata, so leaving the row loses nothing.
270
+ * - a genuine unlink (the file is gone) — leave `skipIfTailed` false so the
271
+ * row is always removed, otherwise a deleted session ghosts in the cache.
272
+ */
273
+ invalidateByFilePath(filePath: string, opts?: {
274
+ skipIfTailed?: boolean;
275
+ }): string | null;
276
+ /**
277
+ * Drop rows whose `file_path` no longer exists on disk AND which have no
278
+ * cached tail to fall back to. Rows with a tail are left alone so
279
+ * `handleGetConversation` can still serve the cached tail even when the
280
+ * JSONL has been deleted.
281
+ */
282
+ pruneGhostFiles(exists?: (filePath: string) => boolean): string[];
283
+ /**
284
+ * Reconcile the cache against the authoritative set of conversation file
285
+ * paths a fresh scan surfaced: drop any cached row whose `file_path` is not
286
+ * in `livePaths` (removed from disk, or now filtered out — e.g. became an
287
+ * agent JSONL). This is the "removed conversations" half of a ?refresh=1
288
+ * reconcile; the additions/updates half is upsertFromScannerMeta.
289
+ *
290
+ * Skip semantics depend on whether the file still exists on disk:
291
+ * - File GONE from disk → always removed, tail or not. This matches the old
292
+ * invalidate()+rebuild behavior (a deleted conversation must disappear on
293
+ * refresh) and keeps refresh=1 truthful about removals. NOTE: this is an
294
+ * INTENTIONAL divergence from pruneGhostFiles(), which KEEPS tailed ghosts
295
+ * so their cached history stays viewable on a background prune. refresh=1
296
+ * has the opposite contract (mobile relies on removals being reflected), so
297
+ * do not "unify" the two — they serve different purposes.
298
+ * - File STILL on disk but absent from `livePaths` → the CRITICAL #2 race:
299
+ * the scan snapshot predates a just-created (and now live-tailed) file.
300
+ * A tailed row here is actively maintained from real content, so it is
301
+ * kept — dropping it would flicker the active conversation out of
302
+ * /api/conversations. An untailed on-disk row not in the snapshot is a
303
+ * transient scan/discovery gap; it is left alone (not removed) and the
304
+ * next reconcile picks it up, rather than risk removing a real file the
305
+ * scan simply hasn't surfaced yet.
306
+ * Returns the removed IDs.
307
+ */
308
+ reconcileDeletions(livePaths: Set<string>, opts?: {
309
+ exists?: (filePath: string) => boolean;
310
+ }): string[];
311
+ /**
312
+ * Read-only: list cached rows whose `file_path` no longer exists on disk.
313
+ * Unlike pruneGhostFiles/reconcileDeletions this mutates nothing — it just
314
+ * reports drift for the CacheIntegrityMonitor to classify. `tailed` flags
315
+ * rows that still have cached history (which pruneGhostFiles would keep).
316
+ */
317
+ listMissingFiles(exists?: (filePath: string) => boolean): {
318
+ id: string;
319
+ filePath: string;
320
+ title: string | null;
321
+ tailed: boolean;
322
+ }[];
323
+ /**
324
+ * Drop the given conversation ids outright — main row, tail, and message
325
+ * index — regardless of whether they have a tail. Used by the cache-integrity
326
+ * resolution actions (prune_all / prune_selected). Returns the count dropped.
327
+ */
328
+ dropRowsById(ids: string[]): number;
329
+ /**
330
+ * Wipe all cached conversation state — meta, tails, and message index — and
331
+ * reset the in-memory file index. Only called by the `reset_rescan`
332
+ * resolution action, which repopulates from a fresh disk scan afterward.
333
+ */
334
+ clearAll(): void;
335
+ }
336
+ //# sourceMappingURL=conversation-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-cache.d.ts","sourceRoot":"","sources":["../src/conversation-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface DbConfig {
2
+ connectionString: string;
3
+ max: number;
4
+ ssl?: string;
5
+ statementTimeout?: number;
6
+ instanceId: string;
7
+ }
8
+ export declare function isDbEnabled(): boolean;
9
+ export declare function getInstanceId(): string;
10
+ export declare function getDbConfig(): DbConfig | null;
11
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/db/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,IAAI,OAAO,CAGrC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,WAAW,IAAI,QAAQ,GAAG,IAAI,CAkB7C"}
@@ -0,0 +1,5 @@
1
+ export type { DbConfig } from "./config";
2
+ export { getDbConfig, isDbEnabled } from "./config";
3
+ export { runMigrations } from "./migrations";
4
+ export { createPool, maskConnectionString } from "./pool";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type pg from "pg";
2
+ export declare function runMigrations(pool: pg.Pool, migrationsDir?: string): Promise<void>;
3
+ //# sourceMappingURL=migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAYzB,wBAAsB,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BxF"}
@@ -0,0 +1,5 @@
1
+ import type { Pool as PoolType } from "pg";
2
+ import type { DbConfig } from "./config";
3
+ export declare function maskConnectionString(url: string): string;
4
+ export declare function createPool(config: DbConfig): Promise<PoolType>;
5
+ //# sourceMappingURL=pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../src/db/pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAaxD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoBpE"}
@@ -0,0 +1,52 @@
1
+ import type Database from "better-sqlite3";
2
+ /**
3
+ * Slow-query threshold, in milliseconds.
4
+ *
5
+ * Measured, not guessed. Against the live 22 MB `cache.db` on this machine
6
+ * (583 conversations, 38 717 index rows, warm page cache), 3 600 read samples
7
+ * across the twelve statements the hot paths actually run gave p50 0.03 ms,
8
+ * p99 0.87 ms, p99.9 1.43 ms, max 1.83 ms; 1 200 write samples gave p99
9
+ * 0.09 ms with rare WAL-checkpoint spikes to 4.37 ms. So *every* healthy query
10
+ * on this machine finishes inside ~4.4 ms, and the checkpoint spikes are the
11
+ * only thing anywhere near that.
12
+ *
13
+ * 35 ms sits two anchors above that: it is 8x the slowest healthy operation
14
+ * ever observed, so checkpoint spikes can never page anyone, and it is more
15
+ * than the 34 ms *end-to-end* time of the fastest complete conversation fetch
16
+ * measured on this box. A query crossing it therefore cost more on its own
17
+ * than an entire healthy request — which is the point at which a warn line is
18
+ * worth the bytes it occupies in the log.
19
+ *
20
+ * Override with `THREADBASE_DB_SLOW_QUERY_MS`; <= 0 disables slow logging.
21
+ */
22
+ export declare const DEFAULT_SLOW_QUERY_MS = 35;
23
+ /**
24
+ * Time every `.get()` / `.all()` / `.run()` on every statement this connection
25
+ * prepares.
26
+ *
27
+ * Wrapping `prepare` is what makes this one edit per database instead of one
28
+ * per query: `better-sqlite3` is synchronous, so a call's wall time *is* its
29
+ * cost, and every statement in the process — the 45 in ConversationCache, the
30
+ * 4 in RuntimeStore, and the ~40 more inside the repositories that share these
31
+ * handles — is created here. Measured overhead is +0.09 µs on an 8.9 µs call
32
+ * (~1%), which is why it is always on rather than behind a flag.
33
+ *
34
+ * Only the three terminal methods are replaced, as own properties; `iterate`,
35
+ * `pluck`, `raw`, `columns` and `bind` keep resolving to the prototype
36
+ * untouched. A statement that throws is not recorded — the error surfaces on
37
+ * its own path.
38
+ */
39
+ export declare function instrumentDatabase(db: Database.Database, options?: {
40
+ slowMs?: number;
41
+ }): Database.Database;
42
+ /**
43
+ * Name the statements in a `{ name: Statement }` bag after their keys, so a
44
+ * slow-query line reads `getMessageIndexWindow` rather than
45
+ * `select:conversation_message_index`.
46
+ *
47
+ * Separate from `instrumentDatabase` because `prepare` cannot know the key its
48
+ * result is about to be assigned to. Statements from a connection that was
49
+ * never instrumented are skipped.
50
+ */
51
+ export declare function labelStatements(statements: object): void;
52
+ //# sourceMappingURL=query-timing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-timing.d.ts","sourceRoot":"","sources":["../../src/db/query-timing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAK3C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAC;AA+DxC;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,QAAQ,CAAC,QAAQ,CA0BnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAKxD"}
@@ -0,0 +1,12 @@
1
+ import type Database from "better-sqlite3";
2
+ export type CacheMetadataKey = "last_conversation_id" | "last_conversation_created_at" | "projects_last_indexed_at" | "conversations_last_indexed_at" | "conversations_dirty";
3
+ export declare class CacheMetadataRepository {
4
+ private get;
5
+ private upsert;
6
+ private del;
7
+ constructor(db: Database.Database);
8
+ getCacheMetadata(key: CacheMetadataKey): string | null;
9
+ setCacheMetadata(key: CacheMetadataKey, value: string): void;
10
+ deleteCacheMetadata(key: CacheMetadataKey): void;
11
+ }
12
+ //# sourceMappingURL=cacheMetadata.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cacheMetadata.repository.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/cacheMetadata.repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,MAAM,MAAM,gBAAgB,GACxB,sBAAsB,GACtB,8BAA8B,GAC9B,0BAA0B,GAC1B,+BAA+B,GAC/B,qBAAqB,CAAC;AAE1B,qBAAa,uBAAuB;IAClC,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,GAAG,CAAqB;IAEhC,YAAY,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAUhC;IAED,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAGrD;IAED,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE3D;IAED,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAE/C;CACF"}
@@ -0,0 +1,27 @@
1
+ import type { ConversationCache } from "../../conversation-cache";
2
+ /**
3
+ * Thin repository wrapper around ConversationCache for the project-id flow.
4
+ * The cache is the source of truth for conversation rows; this just exposes
5
+ * a stable, repo-style API for services that don't want to know about the
6
+ * cache class directly.
7
+ */
8
+ export declare class ConversationsRepository {
9
+ private cache;
10
+ constructor(cache: ConversationCache);
11
+ updateConversationProjectId(args: {
12
+ conversationId: string;
13
+ projectId: string;
14
+ }): void;
15
+ listConversationsForProjectBackfill(): {
16
+ id: string;
17
+ projectPath: string | null;
18
+ projectId: string | null;
19
+ lastActivity: string | null;
20
+ }[];
21
+ getLatestConversation(): {
22
+ id: string;
23
+ lastActivity: string | null;
24
+ } | null;
25
+ hasOrphanRows(): boolean;
26
+ }
27
+ //# sourceMappingURL=conversations.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversations.repository.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/conversations.repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE;;;;;GAKG;AACH,qBAAa,uBAAuB;IACtB,OAAO,CAAC,KAAK;IAAzB,YAAoB,KAAK,EAAE,iBAAiB,EAAI;IAEhD,2BAA2B,CAAC,IAAI,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAErF;IAED,mCAAmC;;;;;QAElC;IAED,qBAAqB;;;aAEpB;IAED,aAAa,IAAI,OAAO,CAEvB;CACF"}