@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.
- package/dist/agent/agent-client.d.ts +14 -0
- package/dist/agent/agent-client.d.ts.map +1 -0
- package/dist/agent/agent-config.d.ts +24 -0
- package/dist/agent/agent-config.d.ts.map +1 -0
- package/dist/agent/conversation-writer.d.ts +13 -0
- package/dist/agent/conversation-writer.d.ts.map +1 -0
- package/dist/agent/dedupe.d.ts +6 -0
- package/dist/agent/dedupe.d.ts.map +1 -0
- package/dist/agent/errors.d.ts +23 -0
- package/dist/agent/errors.d.ts.map +1 -0
- package/dist/agent/handle-send-agent-input.d.ts +21 -0
- package/dist/agent/handle-send-agent-input.d.ts.map +1 -0
- package/dist/agent/handle-start-agent-session.d.ts +21 -0
- package/dist/agent/handle-start-agent-session.d.ts.map +1 -0
- package/dist/agent/history-mapper.d.ts +4 -0
- package/dist/agent/history-mapper.d.ts.map +1 -0
- package/dist/agent/payload-guard.d.ts +29 -0
- package/dist/agent/payload-guard.d.ts.map +1 -0
- package/dist/api/app.d.ts +28 -0
- package/dist/api/app.d.ts.map +1 -0
- package/dist/api/handlers/conversations.handlers.d.ts +69 -0
- package/dist/api/handlers/conversations.handlers.d.ts.map +1 -0
- package/dist/api/handlers/http-helpers.d.ts +50 -0
- package/dist/api/handlers/http-helpers.d.ts.map +1 -0
- package/dist/api/handlers/sessions.handlers.d.ts +236 -0
- package/dist/api/handlers/sessions.handlers.d.ts.map +1 -0
- package/dist/api/middleware/auth.middleware.d.ts +5 -0
- package/dist/api/middleware/auth.middleware.d.ts.map +1 -0
- package/dist/api/middleware/cors.middleware.d.ts +5 -0
- package/dist/api/middleware/cors.middleware.d.ts.map +1 -0
- package/dist/api/middleware/error.middleware.d.ts +4 -0
- package/dist/api/middleware/error.middleware.d.ts.map +1 -0
- package/dist/api/routes/backup.routes.d.ts +5 -0
- package/dist/api/routes/backup.routes.d.ts.map +1 -0
- package/dist/api/routes/browse.routes.d.ts +5 -0
- package/dist/api/routes/browse.routes.d.ts.map +1 -0
- package/dist/api/routes/cacheAlert.routes.d.ts +5 -0
- package/dist/api/routes/cacheAlert.routes.d.ts.map +1 -0
- package/dist/api/routes/config.routes.d.ts +5 -0
- package/dist/api/routes/config.routes.d.ts.map +1 -0
- package/dist/api/routes/conversations.routes.d.ts +5 -0
- package/dist/api/routes/conversations.routes.d.ts.map +1 -0
- package/dist/api/routes/devices.routes.d.ts +17 -0
- package/dist/api/routes/devices.routes.d.ts.map +1 -0
- package/dist/api/routes/diagnostics.routes.d.ts +5 -0
- package/dist/api/routes/diagnostics.routes.d.ts.map +1 -0
- package/dist/api/routes/health.routes.d.ts +5 -0
- package/dist/api/routes/health.routes.d.ts.map +1 -0
- package/dist/api/routes/logs.routes.d.ts +3 -0
- package/dist/api/routes/logs.routes.d.ts.map +1 -0
- package/dist/api/routes/misc.routes.d.ts +77 -0
- package/dist/api/routes/misc.routes.d.ts.map +1 -0
- package/dist/api/routes/pair.routes.d.ts +5 -0
- package/dist/api/routes/pair.routes.d.ts.map +1 -0
- package/dist/api/routes/progress.routes.d.ts +39 -0
- package/dist/api/routes/progress.routes.d.ts.map +1 -0
- package/dist/api/routes/projects.routes.d.ts +5 -0
- package/dist/api/routes/projects.routes.d.ts.map +1 -0
- package/dist/api/routes/providers.routes.d.ts +19 -0
- package/dist/api/routes/providers.routes.d.ts.map +1 -0
- package/dist/api/routes/scanner.routes.d.ts +5 -0
- package/dist/api/routes/scanner.routes.d.ts.map +1 -0
- package/dist/api/routes/sessions.routes.d.ts +6 -0
- package/dist/api/routes/sessions.routes.d.ts.map +1 -0
- package/dist/api/routes/ws.routes.d.ts +7 -0
- package/dist/api/routes/ws.routes.d.ts.map +1 -0
- package/dist/api/types/api-deps.d.ts +114 -0
- package/dist/api/types/api-deps.d.ts.map +1 -0
- package/dist/auth.d.ts +81 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/browse.d.ts +17 -0
- package/dist/browse.d.ts.map +1 -0
- package/dist/claude-flags.d.ts +76 -0
- package/dist/claude-flags.d.ts.map +1 -0
- package/dist/cli.cjs +121 -7
- package/dist/cli.cjs.map +1 -1
- package/dist/codex-pty-runner.d.ts +90 -0
- package/dist/codex-pty-runner.d.ts.map +1 -0
- package/dist/config/update-config.d.ts +13 -0
- package/dist/config/update-config.d.ts.map +1 -0
- package/dist/conversation-cache.d.ts +336 -0
- package/dist/conversation-cache.d.ts.map +1 -0
- package/dist/db/config.d.ts +11 -0
- package/dist/db/config.d.ts.map +1 -0
- package/dist/db/index.d.ts +5 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/migrations.d.ts +3 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/pool.d.ts +5 -0
- package/dist/db/pool.d.ts.map +1 -0
- package/dist/db/query-timing.d.ts +52 -0
- package/dist/db/query-timing.d.ts.map +1 -0
- package/dist/db/repositories/cacheMetadata.repository.d.ts +12 -0
- package/dist/db/repositories/cacheMetadata.repository.d.ts.map +1 -0
- package/dist/db/repositories/conversations.repository.d.ts +27 -0
- package/dist/db/repositories/conversations.repository.d.ts.map +1 -0
- package/dist/db/repositories/devices.repository.d.ts +137 -0
- package/dist/db/repositories/devices.repository.d.ts.map +1 -0
- package/dist/db/repositories/managed-sessions.repository.d.ts +127 -0
- package/dist/db/repositories/managed-sessions.repository.d.ts.map +1 -0
- package/dist/db/repositories/projects.repository.d.ts +28 -0
- package/dist/db/repositories/projects.repository.d.ts.map +1 -0
- package/dist/db/repositories/push.repository.d.ts +186 -0
- package/dist/db/repositories/push.repository.d.ts.map +1 -0
- package/dist/db/repositories/sessions.repository.d.ts +16 -0
- package/dist/db/repositories/sessions.repository.d.ts.map +1 -0
- package/dist/db/runtime-store.d.ts +80 -0
- package/dist/db/runtime-store.d.ts.map +1 -0
- package/dist/db/sqlite-migrate.d.ts +13 -0
- package/dist/db/sqlite-migrate.d.ts.map +1 -0
- package/dist/db/upload-records.d.ts +11 -0
- package/dist/db/upload-records.d.ts.map +1 -0
- package/dist/e2ee/noise.d.ts +261 -0
- package/dist/e2ee/noise.d.ts.map +1 -0
- package/dist/e2ee/pair-payload.d.ts +60 -0
- package/dist/e2ee/pair-payload.d.ts.map +1 -0
- package/dist/e2ee/pair-request.d.ts +24 -0
- package/dist/e2ee/pair-request.d.ts.map +1 -0
- package/dist/external-tails.d.ts +91 -0
- package/dist/external-tails.d.ts.map +1 -0
- package/dist/feature-flags.d.ts +212 -0
- package/dist/feature-flags.d.ts.map +1 -0
- package/dist/handlers/handleListProjects.d.ts +3 -0
- package/dist/handlers/handleListProjects.d.ts.map +1 -0
- package/dist/index.cjs +101 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +18 -2571
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +101 -2
- package/dist/index.js.map +1 -1
- package/dist/lifecycle/constants.d.ts +21 -0
- package/dist/lifecycle/constants.d.ts.map +1 -0
- package/dist/lifecycle/process-liveness.d.ts +7 -0
- package/dist/lifecycle/process-liveness.d.ts.map +1 -0
- package/dist/live-session-manager.d.ts +59 -0
- package/dist/live-session-manager.d.ts.map +1 -0
- package/dist/logger.d.ts +14 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/pair-store.d.ts +60 -0
- package/dist/pair-store.d.ts.map +1 -0
- package/dist/platform.d.ts +25 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/process-discovery.d.ts +35 -0
- package/dist/process-discovery.d.ts.map +1 -0
- package/dist/providers.d.ts +7 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/pty-host/protocol.d.ts +270 -0
- package/dist/pty-host/protocol.d.ts.map +1 -0
- package/dist/pty-host/remote-session-runner.d.ts +133 -0
- package/dist/pty-host/remote-session-runner.d.ts.map +1 -0
- package/dist/pty-host/socket.d.ts +54 -0
- package/dist/pty-host/socket.d.ts.map +1 -0
- package/dist/pty-host/spawn-host.d.ts +30 -0
- package/dist/pty-host/spawn-host.d.ts.map +1 -0
- package/dist/pty-manager.d.ts +65 -0
- package/dist/pty-manager.d.ts.map +1 -0
- package/dist/pty-shared.d.ts +27 -0
- package/dist/pty-shared.d.ts.map +1 -0
- package/dist/scanner-manager.d.ts +126 -0
- package/dist/scanner-manager.d.ts.map +1 -0
- package/dist/schemas/cacheAlert.schema.d.ts +14 -0
- package/dist/schemas/cacheAlert.schema.d.ts.map +1 -0
- package/dist/schemas/claudeFlags.schema.d.ts +7 -0
- package/dist/schemas/claudeFlags.schema.d.ts.map +1 -0
- package/dist/schemas/project.schema.d.ts +18 -0
- package/dist/schemas/project.schema.d.ts.map +1 -0
- package/dist/schemas/updateConfig.schema.d.ts +19 -0
- package/dist/schemas/updateConfig.schema.d.ts.map +1 -0
- package/dist/seal.d.ts +14 -0
- package/dist/seal.d.ts.map +1 -0
- package/dist/server-identity.d.ts +43 -0
- package/dist/server-identity.d.ts.map +1 -0
- package/dist/server-wiring.d.ts +189 -0
- package/dist/server-wiring.d.ts.map +1 -0
- package/dist/server.d.ts +404 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/services/backup/backup.d.ts +103 -0
- package/dist/services/backup/backup.d.ts.map +1 -0
- package/dist/services/cache/cacheMetadata.d.ts +8 -0
- package/dist/services/cache/cacheMetadata.d.ts.map +1 -0
- package/dist/services/cache-integrity/alertStore.d.ts +24 -0
- package/dist/services/cache-integrity/alertStore.d.ts.map +1 -0
- package/dist/services/cache-integrity/backup.d.ts +8 -0
- package/dist/services/cache-integrity/backup.d.ts.map +1 -0
- package/dist/services/cache-integrity/cacheIntegrityMonitor.d.ts +71 -0
- package/dist/services/cache-integrity/cacheIntegrityMonitor.d.ts.map +1 -0
- package/dist/services/conversations/conversationWatcher.d.ts +99 -0
- package/dist/services/conversations/conversationWatcher.d.ts.map +1 -0
- package/dist/services/conversations/findSearchTarget.d.ts +30 -0
- package/dist/services/conversations/findSearchTarget.d.ts.map +1 -0
- package/dist/services/conversations/isAgentConversation.d.ts +8 -0
- package/dist/services/conversations/isAgentConversation.d.ts.map +1 -0
- package/dist/services/conversations/pruneAgentConversations.d.ts +8 -0
- package/dist/services/conversations/pruneAgentConversations.d.ts.map +1 -0
- package/dist/services/conversations/refreshConversationCache.d.ts +27 -0
- package/dist/services/conversations/refreshConversationCache.d.ts.map +1 -0
- package/dist/services/conversations/shouldRefreshProjectsFromHdd.d.ts +33 -0
- package/dist/services/conversations/shouldRefreshProjectsFromHdd.d.ts.map +1 -0
- package/dist/services/diagnostics/diagnostics.d.ts +66 -0
- package/dist/services/diagnostics/diagnostics.d.ts.map +1 -0
- package/dist/services/projectChats/deriveProjectChatTitle.d.ts +15 -0
- package/dist/services/projectChats/deriveProjectChatTitle.d.ts.map +1 -0
- package/dist/services/projects/ensureProjectsForConversations.d.ts +15 -0
- package/dist/services/projects/ensureProjectsForConversations.d.ts.map +1 -0
- package/dist/services/providers/capabilities.d.ts +105 -0
- package/dist/services/providers/capabilities.d.ts.map +1 -0
- package/dist/services/providers/providerHealth.d.ts +72 -0
- package/dist/services/providers/providerHealth.d.ts.map +1 -0
- package/dist/services/push/apnsClient.d.ts +105 -0
- package/dist/services/push/apnsClient.d.ts.map +1 -0
- package/dist/services/push/expoPushSender.d.ts +37 -0
- package/dist/services/push/expoPushSender.d.ts.map +1 -0
- package/dist/services/push/liveActivityContentState.d.ts +60 -0
- package/dist/services/push/liveActivityContentState.d.ts.map +1 -0
- package/dist/services/push/liveActivityNotifier.d.ts +49 -0
- package/dist/services/push/liveActivityNotifier.d.ts.map +1 -0
- package/dist/services/push/liveActivityRenewal.d.ts +63 -0
- package/dist/services/push/liveActivityRenewal.d.ts.map +1 -0
- package/dist/services/push/liveActivitySender.d.ts +88 -0
- package/dist/services/push/liveActivitySender.d.ts.map +1 -0
- package/dist/services/push/waitingInputNotifier.d.ts +41 -0
- package/dist/services/push/waitingInputNotifier.d.ts.map +1 -0
- package/dist/services/questions/answersToKeystrokes.d.ts +8 -0
- package/dist/services/questions/answersToKeystrokes.d.ts.map +1 -0
- package/dist/services/questions/codexGateAnswers.d.ts +14 -0
- package/dist/services/questions/codexGateAnswers.d.ts.map +1 -0
- package/dist/services/questions/codexScreen.d.ts +74 -0
- package/dist/services/questions/codexScreen.d.ts.map +1 -0
- package/dist/services/questions/detectAskUserQuestion.d.ts +6 -0
- package/dist/services/questions/detectAskUserQuestion.d.ts.map +1 -0
- package/dist/services/questions/detectPermissionGate.d.ts +62 -0
- package/dist/services/questions/detectPermissionGate.d.ts.map +1 -0
- package/dist/services/questions/detectQuestionFromScreen.d.ts +30 -0
- package/dist/services/questions/detectQuestionFromScreen.d.ts.map +1 -0
- package/dist/services/questions/detectShellPrompt.d.ts +18 -0
- package/dist/services/questions/detectShellPrompt.d.ts.map +1 -0
- package/dist/services/questions/parseAgentPhase.d.ts +12 -0
- package/dist/services/questions/parseAgentPhase.d.ts.map +1 -0
- package/dist/services/questions/parseStatusLine.d.ts +19 -0
- package/dist/services/questions/parseStatusLine.d.ts.map +1 -0
- package/dist/services/questions/questionBroadcast.d.ts +18 -0
- package/dist/services/questions/questionBroadcast.d.ts.map +1 -0
- package/dist/services/questions/resolveAnswer.d.ts +16 -0
- package/dist/services/questions/resolveAnswer.d.ts.map +1 -0
- package/dist/services/search/searchQuery.d.ts +78 -0
- package/dist/services/search/searchQuery.d.ts.map +1 -0
- package/dist/services/security/capabilities.d.ts +50 -0
- package/dist/services/security/capabilities.d.ts.map +1 -0
- package/dist/services/sessions/autoResumeOnBoot.d.ts +28 -0
- package/dist/services/sessions/autoResumeOnBoot.d.ts.map +1 -0
- package/dist/services/sessions/codexRolloutOwner.d.ts +55 -0
- package/dist/services/sessions/codexRolloutOwner.d.ts.map +1 -0
- package/dist/services/sessions/conversationBusy.d.ts +32 -0
- package/dist/services/sessions/conversationBusy.d.ts.map +1 -0
- package/dist/services/sessions/idempotency.d.ts +67 -0
- package/dist/services/sessions/idempotency.d.ts.map +1 -0
- package/dist/services/sessions/reconcileSessions.d.ts +63 -0
- package/dist/services/sessions/reconcileSessions.d.ts.map +1 -0
- package/dist/services/sessions/rehydrateSessions.d.ts +68 -0
- package/dist/services/sessions/rehydrateSessions.d.ts.map +1 -0
- package/dist/services/sessions/resumeIdentity.d.ts +16 -0
- package/dist/services/sessions/resumeIdentity.d.ts.map +1 -0
- package/dist/session-registry-boot.d.ts +142 -0
- package/dist/session-registry-boot.d.ts.map +1 -0
- package/dist/session-store.d.ts +32 -0
- package/dist/session-store.d.ts.map +1 -0
- package/dist/session-watchers.d.ts +60 -0
- package/dist/session-watchers.d.ts.map +1 -0
- package/dist/types.d.ts +616 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/uploads.d.ts +16 -0
- package/dist/uploads.d.ts.map +1 -0
- package/dist/utils/bootToken.d.ts +3 -0
- package/dist/utils/bootToken.d.ts.map +1 -0
- package/dist/utils/canonicalizeFilePath.d.ts +75 -0
- package/dist/utils/canonicalizeFilePath.d.ts.map +1 -0
- package/dist/utils/canonicalizeProjectPath.d.ts +13 -0
- package/dist/utils/canonicalizeProjectPath.d.ts.map +1 -0
- package/dist/utils/codexConversationLine.d.ts +38 -0
- package/dist/utils/codexConversationLine.d.ts.map +1 -0
- package/dist/utils/conversationEtag.d.ts +19 -0
- package/dist/utils/conversationEtag.d.ts.map +1 -0
- package/dist/utils/dates.d.ts +12 -0
- package/dist/utils/dates.d.ts.map +1 -0
- package/dist/utils/debounce.d.ts +15 -0
- package/dist/utils/debounce.d.ts.map +1 -0
- package/dist/utils/deriveSessionName.d.ts +10 -0
- package/dist/utils/deriveSessionName.d.ts.map +1 -0
- package/dist/utils/fileIdentity.d.ts +36 -0
- package/dist/utils/fileIdentity.d.ts.map +1 -0
- package/dist/utils/isScannedSnapshotStale.d.ts +16 -0
- package/dist/utils/isScannedSnapshotStale.d.ts.map +1 -0
- package/dist/utils/scanProgressThrottle.d.ts +12 -0
- package/dist/utils/scanProgressThrottle.d.ts.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/ws-hub.d.ts +15 -0
- package/dist/ws-hub.d.ts.map +1 -0
- package/package.json +3 -4
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|