@hyperdrive.bot/fleet-server 0.3.164 → 0.3.166
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/server/extensions/daemon-backend.js +25 -0
- package/dist/server/server/agent/agent-storage.d.ts +67 -12
- package/dist/server/server/agent/agent-storage.js +208 -132
- package/dist/server/server/agent/providers/claude/transport/pty-query.js +10 -0
- package/dist/server/server/bootstrap.d.ts +5 -0
- package/dist/server/server/bootstrap.js +26 -3
- package/dist/server/server/chat/chat-service.d.ts +22 -0
- package/dist/server/server/chat/chat-service.js +46 -3
- package/dist/server/server/daemon-worker.js +1 -0
- package/dist/server/server/fleet/decision-service.d.ts +5 -0
- package/dist/server/server/fleet/decision-service.js +30 -0
- package/dist/server/server/loop-service.d.ts +95 -0
- package/dist/server/server/loop-service.js +64 -3
- package/dist/server/server/migrations/backfill-workspace-id.migration.js +3 -2
- package/dist/server/server/push/token-store.d.ts +5 -1
- package/dist/server/server/push/token-store.js +26 -5
- package/dist/server/server/schedule/service.js +4 -1
- package/dist/server/server/schedule/store.d.ts +21 -1
- package/dist/server/server/schedule/store.js +283 -2
- package/dist/server/server/search/indexer.d.ts +10 -0
- package/dist/server/server/search/indexer.js +51 -2
- package/dist/server/server/session.js +12 -13
- package/dist/server/server/state/agent-state.d.ts +39 -0
- package/dist/server/server/state/agent-state.js +94 -0
- package/dist/server/server/state/daemon-state.d.ts +30 -0
- package/dist/server/server/state/daemon-state.js +99 -0
- package/dist/server/server/state/legacy-import.d.ts +124 -0
- package/dist/server/server/state/legacy-import.js +682 -0
- package/dist/server/server/state/legacy-manifest.d.ts +73 -0
- package/dist/server/server/state/legacy-manifest.js +112 -0
- package/dist/server/server/state/legacy-mirror.d.ts +57 -0
- package/dist/server/server/state/legacy-mirror.js +114 -0
- package/dist/server/server/state/legacy-sources.d.ts +9 -0
- package/dist/server/server/state/legacy-sources.js +163 -0
- package/dist/server/server/state/state-db.d.ts +263 -0
- package/dist/server/server/state/state-db.js +772 -0
- package/dist/server/server/state/state-schema.d.ts +39 -0
- package/dist/server/server/state/state-schema.js +125 -0
- package/dist/server/server/state/state-worker.d.ts +48 -0
- package/dist/server/server/state/state-worker.js +165 -0
- package/dist/server/server/websocket-server.js +2 -1
- package/dist/server/server/workspace/session-openable.js +7 -0
- package/dist/server/server/workspace-reconciliation-service.js +14 -3
- package/dist/server/server/workspace-registry.d.ts +45 -2
- package/dist/server/server/workspace-registry.js +75 -4
- package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-bridge-491bc812b0659658291d67bc77c9e697.js → desktop-attachment-bridge-eafa6217277b83ec33d4967049da7697.js} +5 -5
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-eafa6217277b83ec33d4967049da7697.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-eafa6217277b83ec33d4967049da7697.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-eafa6217277b83ec33d4967049da7697.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-eafa6217277b83ec33d4967049da7697.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{desktop-attachment-store-6d63da0fd45a8d1001f62f227484f116.js → desktop-attachment-store-bdcb16b0ac512f03771e9926602de68f.js} +3 -3
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-bdcb16b0ac512f03771e9926602de68f.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-bdcb16b0ac512f03771e9926602de68f.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-bdcb16b0ac512f03771e9926602de68f.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-bdcb16b0ac512f03771e9926602de68f.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{index-2ac1a7249c20c322a1f9a54563cfee62.js → index-1ff4c43fd657ba6473b02d56dae75a25.js} +1530 -1527
- package/dist/server/web-ui/_expo/static/js/web/index-1ff4c43fd657ba6473b02d56dae75a25.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-1ff4c43fd657ba6473b02d56dae75a25.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-1ff4c43fd657ba6473b02d56dae75a25.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{index-2ac1a7249c20c322a1f9a54563cfee62.js.map.gz → index-1ff4c43fd657ba6473b02d56dae75a25.js.map.gz} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{indexeddb-attachment-store-040c97c7cac8a3ed86c75baa2ce39d61.js → indexeddb-attachment-store-c83a6261ece654d4dfc3566e3b929e73.js} +3 -3
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c83a6261ece654d4dfc3566e3b929e73.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c83a6261ece654d4dfc3566e3b929e73.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c83a6261ece654d4dfc3566e3b929e73.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-c83a6261ece654d4dfc3566e3b929e73.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{native-file-attachment-store-ac3bbd454eba677c4fd092227d5b5b89.js → native-file-attachment-store-ff6e2b6baeb643378628c82f177b35c9.js} +5 -5
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-ff6e2b6baeb643378628c82f177b35c9.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-ff6e2b6baeb643378628c82f177b35c9.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-ff6e2b6baeb643378628c82f177b35c9.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-ff6e2b6baeb643378628c82f177b35c9.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{profiler-b509d7fffd6cf457a9c12588b80560cb.js → profiler-a28d140b5874532b9eef737c77fde610.js} +11 -11
- package/dist/server/web-ui/_expo/static/js/web/profiler-a28d140b5874532b9eef737c77fde610.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-a28d140b5874532b9eef737c77fde610.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-a28d140b5874532b9eef737c77fde610.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-a28d140b5874532b9eef737c77fde610.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{startRecording-9c90e555a5ecdc643e277f9a98913aaf.js → startRecording-f05b37fde4fc248dba4cb646dda2fc3d.js} +60 -60
- package/dist/server/web-ui/_expo/static/js/web/startRecording-f05b37fde4fc248dba4cb646dda2fc3d.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-f05b37fde4fc248dba4cb646dda2fc3d.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-f05b37fde4fc248dba4cb646dda2fc3d.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{startRecording-9c90e555a5ecdc643e277f9a98913aaf.js.map.gz → startRecording-f05b37fde4fc248dba4cb646dda2fc3d.js.map.gz} +0 -0
- package/dist/server/web-ui/index.html +1 -1
- package/dist/server/web-ui/index.html.br +0 -0
- package/dist/server/web-ui/index.html.gz +0 -0
- package/package.json +6 -6
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-491bc812b0659658291d67bc77c9e697.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-491bc812b0659658291d67bc77c9e697.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-491bc812b0659658291d67bc77c9e697.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-bridge-491bc812b0659658291d67bc77c9e697.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-6d63da0fd45a8d1001f62f227484f116.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-6d63da0fd45a8d1001f62f227484f116.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-6d63da0fd45a8d1001f62f227484f116.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/desktop-attachment-store-6d63da0fd45a8d1001f62f227484f116.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-2ac1a7249c20c322a1f9a54563cfee62.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-2ac1a7249c20c322a1f9a54563cfee62.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-2ac1a7249c20c322a1f9a54563cfee62.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-040c97c7cac8a3ed86c75baa2ce39d61.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-040c97c7cac8a3ed86c75baa2ce39d61.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-040c97c7cac8a3ed86c75baa2ce39d61.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/indexeddb-attachment-store-040c97c7cac8a3ed86c75baa2ce39d61.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-ac3bbd454eba677c4fd092227d5b5b89.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-ac3bbd454eba677c4fd092227d5b5b89.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-ac3bbd454eba677c4fd092227d5b5b89.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/native-file-attachment-store-ac3bbd454eba677c4fd092227d5b5b89.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-b509d7fffd6cf457a9c12588b80560cb.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-b509d7fffd6cf457a9c12588b80560cb.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-b509d7fffd6cf457a9c12588b80560cb.js.map.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/profiler-b509d7fffd6cf457a9c12588b80560cb.js.map.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-9c90e555a5ecdc643e277f9a98913aaf.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-9c90e555a5ecdc643e277f9a98913aaf.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/startRecording-9c90e555a5ecdc643e277f9a98913aaf.js.map.br +0 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import type { DatabaseSync, StatementSync } from "node:sqlite";
|
|
2
|
+
import type { Logger } from "pino";
|
|
3
|
+
import { LegacyManifest } from "./legacy-manifest.js";
|
|
4
|
+
import { LegacyMirror } from "./legacy-mirror.js";
|
|
5
|
+
import { type WorkerStatement } from "./state-worker.js";
|
|
6
|
+
import { type DocTableName } from "./state-schema.js";
|
|
7
|
+
export declare const STATE_DB_FILENAME = "state.sqlite";
|
|
8
|
+
/** Kill switch: `PASEO_STATE_SQLITE=0` keeps every store on its legacy files. */
|
|
9
|
+
export declare const STATE_SQLITE_ENV = "PASEO_STATE_SQLITE";
|
|
10
|
+
/** Kill switch: `PASEO_STATE_FILE_MIRROR=0` stops writing the legacy files. */
|
|
11
|
+
export declare const STATE_FILE_MIRROR_ENV = "PASEO_STATE_FILE_MIRROR";
|
|
12
|
+
type DatabaseSyncCtor = new (path: string) => DatabaseSync;
|
|
13
|
+
export interface DocRow {
|
|
14
|
+
scope: string;
|
|
15
|
+
id: string;
|
|
16
|
+
body: string;
|
|
17
|
+
rev: number;
|
|
18
|
+
}
|
|
19
|
+
/** A row including tombstones, for reconciliation. */
|
|
20
|
+
export interface StoredRow {
|
|
21
|
+
scope: string;
|
|
22
|
+
id: string;
|
|
23
|
+
rev: number;
|
|
24
|
+
deletedAt: number | null;
|
|
25
|
+
body: string | null;
|
|
26
|
+
}
|
|
27
|
+
export interface ChangedRow {
|
|
28
|
+
scope: string;
|
|
29
|
+
id: string;
|
|
30
|
+
rev: number;
|
|
31
|
+
/** Epoch ms, set on a tombstone. */
|
|
32
|
+
deletedAt: number | null;
|
|
33
|
+
/** Null on a tombstone. */
|
|
34
|
+
body: string | null;
|
|
35
|
+
}
|
|
36
|
+
export interface ImportMarker {
|
|
37
|
+
status: "running" | "done";
|
|
38
|
+
cursor: string | null;
|
|
39
|
+
imported: number;
|
|
40
|
+
skipped: number;
|
|
41
|
+
}
|
|
42
|
+
export interface StateWriteStats {
|
|
43
|
+
transactions: number;
|
|
44
|
+
rows: number;
|
|
45
|
+
/** Most recent transaction durations in ms, newest last, capped. */
|
|
46
|
+
recentTxnMs: number[];
|
|
47
|
+
maxTxnMs: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The one handle on `state.sqlite`.
|
|
51
|
+
*
|
|
52
|
+
* Writes are queued and committed together in one transaction per turn of the
|
|
53
|
+
* event loop (`setImmediate`), so a burst of 50 agent updates is one commit, not
|
|
54
|
+
* 50. Reads on the hot path never come here: every store keeps its in-memory
|
|
55
|
+
* index and treats this file as its durable log. The only reads are at load, in
|
|
56
|
+
* explicit paged queries, and in `listChangedSince`.
|
|
57
|
+
*/
|
|
58
|
+
export declare class StateDb {
|
|
59
|
+
readonly dbPath: string;
|
|
60
|
+
readonly mirror: LegacyMirror;
|
|
61
|
+
readonly manifest: LegacyManifest;
|
|
62
|
+
private readonly db;
|
|
63
|
+
readonly logger: Logger;
|
|
64
|
+
private readonly statements;
|
|
65
|
+
private readonly docs;
|
|
66
|
+
private pending;
|
|
67
|
+
private waiters;
|
|
68
|
+
private flushScheduled;
|
|
69
|
+
private revCounter;
|
|
70
|
+
private closed;
|
|
71
|
+
private worker;
|
|
72
|
+
private consecutiveFailures;
|
|
73
|
+
private retryAttempts;
|
|
74
|
+
private retryStartedAt;
|
|
75
|
+
private retryTimer;
|
|
76
|
+
private readonly stats;
|
|
77
|
+
constructor(options: {
|
|
78
|
+
db: DatabaseSync;
|
|
79
|
+
dbPath: string;
|
|
80
|
+
logger: Logger;
|
|
81
|
+
mirror: LegacyMirror;
|
|
82
|
+
});
|
|
83
|
+
prepare(sql: string): StatementSync;
|
|
84
|
+
doc(name: DocTableName, options?: {
|
|
85
|
+
tombstones?: boolean;
|
|
86
|
+
}): DocTable;
|
|
87
|
+
/** Next value of the daemon-wide change sequence. Persisted with each commit. */
|
|
88
|
+
nextRev(): number;
|
|
89
|
+
get currentRev(): number;
|
|
90
|
+
/**
|
|
91
|
+
* The rev a mirror write reflects: the last rev already committed. Commits
|
|
92
|
+
* are synchronous, so every row the caller's in-memory state was built from
|
|
93
|
+
* has a rev at or below it. Deliberately no flush: flushing here would stamp
|
|
94
|
+
* the file with revs of writes queued after its content was captured, and a
|
|
95
|
+
* crash would then leave a lagging file the boot catch-up cannot see
|
|
96
|
+
* (re-review R1). Capture it where the content is captured.
|
|
97
|
+
*/
|
|
98
|
+
mirrorRev(): number;
|
|
99
|
+
/**
|
|
100
|
+
* Shutdown has begun (SIGTERM, SIGINT, the updater stopping the daemon):
|
|
101
|
+
* commit the queue and start every pending legacy file write now, instead of
|
|
102
|
+
* after the rest of the daemon has wound down.
|
|
103
|
+
*/
|
|
104
|
+
beginShutdown(): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Queue a write for the next batched commit. The promise settles when that
|
|
107
|
+
* commit lands. When a batch fails, its ops are retried one transaction each,
|
|
108
|
+
* so only the op that actually fails rejects.
|
|
109
|
+
*/
|
|
110
|
+
enqueue(op: () => void): Promise<void>;
|
|
111
|
+
/** Commit everything queued, now. Safe to call with nothing queued. */
|
|
112
|
+
flushSync(): void;
|
|
113
|
+
private commitPending;
|
|
114
|
+
/**
|
|
115
|
+
* Put a batch whose transaction failed back at the head of the queue and
|
|
116
|
+
* retry it after a backoff. Once the batch has been failing for
|
|
117
|
+
* `COMMIT_RETRY_BUDGET_MS` it rejects, so a writer that holds the lock for good surfaces as
|
|
118
|
+
* failed writes and `failedCommits`, not as a queue that grows forever.
|
|
119
|
+
*/
|
|
120
|
+
private requeue;
|
|
121
|
+
private clearRetry;
|
|
122
|
+
/** Commits that failed in a row; a health signal once it keeps climbing. */
|
|
123
|
+
get failedCommits(): number;
|
|
124
|
+
private recordFailure;
|
|
125
|
+
/**
|
|
126
|
+
* Move WAL checkpoints and bulk writes to a worker thread (see
|
|
127
|
+
* `StateWorker`). If the worker cannot start, SQLite keeps checkpointing
|
|
128
|
+
* inside commits and bulk writes run here, as usual.
|
|
129
|
+
*/
|
|
130
|
+
startWorker(): void;
|
|
131
|
+
/** See `StateWorker.pause`. */
|
|
132
|
+
pauseCheckpoints(): void;
|
|
133
|
+
resumeCheckpoints(): void;
|
|
134
|
+
/**
|
|
135
|
+
* Commit a bulk batch as one transaction, off the event loop when the worker
|
|
136
|
+
* is up. Only for work nothing else is writing concurrently (the import runs
|
|
137
|
+
* before any store exists); the rev counter is persisted with the batch.
|
|
138
|
+
*/
|
|
139
|
+
commitBatch(statements: WorkerStatement[]): Promise<void>;
|
|
140
|
+
metaStatement(key: string, value: string): WorkerStatement;
|
|
141
|
+
/** Run `fn` in one IMMEDIATE transaction, rolling back on throw. */
|
|
142
|
+
transaction<T>(fn: () => T): T;
|
|
143
|
+
getMeta(key: string): string | null;
|
|
144
|
+
setMeta(key: string, value: string): void;
|
|
145
|
+
/** Every meta entry whose key starts with `prefix`, keyed by the rest of the key. */
|
|
146
|
+
getMetaWithPrefix(prefix: string): Map<string, string>;
|
|
147
|
+
deleteMeta(key: string): void;
|
|
148
|
+
/** `setMeta` for use inside an open transaction. */
|
|
149
|
+
setMetaInTransaction(key: string, value: string): void;
|
|
150
|
+
getImportMarker(store: string): ImportMarker | null;
|
|
151
|
+
/** Write an import marker. Call inside `transaction` to commit it with the rows it covers. */
|
|
152
|
+
putImportMarker(store: string, marker: ImportMarker): void;
|
|
153
|
+
/** `putImportMarker` as a statement for `commitBatch`, to commit with its rows. */
|
|
154
|
+
importMarkerStatement(store: string, marker: ImportMarker): WorkerStatement;
|
|
155
|
+
get writeStats(): StateWriteStats;
|
|
156
|
+
private recordTxn;
|
|
157
|
+
/** Flush queued writes and the legacy mirror, then close the handle. */
|
|
158
|
+
close(): Promise<void>;
|
|
159
|
+
/**
|
|
160
|
+
* Close without flushing the mirror or the queue, and drop pending mirror
|
|
161
|
+
* writes. Tests use it to simulate a kill -9.
|
|
162
|
+
*/
|
|
163
|
+
closeImmediately(): void;
|
|
164
|
+
}
|
|
165
|
+
/** A keyed-document table. See `state-schema.ts`. */
|
|
166
|
+
export declare class DocTable {
|
|
167
|
+
private readonly state;
|
|
168
|
+
readonly name: DocTableName;
|
|
169
|
+
private readonly tombstones;
|
|
170
|
+
constructor(state: StateDb, name: DocTableName, tombstones: boolean);
|
|
171
|
+
/** Serialize now (so later mutation of `value` cannot leak in) and queue the upsert. */
|
|
172
|
+
put(scope: string, id: string, value: unknown, ord?: number): Promise<void>;
|
|
173
|
+
putRaw(scope: string, id: string, body: string, ord?: number): Promise<void>;
|
|
174
|
+
/** `put`, resolving with the rev the row was committed at. */
|
|
175
|
+
putWithRev(scope: string, id: string, value: unknown): Promise<number>;
|
|
176
|
+
/** Upsert inside the caller's transaction. */
|
|
177
|
+
putNow(scope: string, id: string, body: string, ord?: number): void;
|
|
178
|
+
/** The upsert as a statement for `StateDb.commitBatch`; takes its rev now. */
|
|
179
|
+
putStatement(scope: string, id: string, body: string, ord?: number): WorkerStatement;
|
|
180
|
+
remove(scope: string, id: string): Promise<void>;
|
|
181
|
+
removeNow(scope: string, id: string): void;
|
|
182
|
+
/** The removal (a tombstone on a tombstoned table) as a batch statement; takes its rev now. */
|
|
183
|
+
removeStatement(scope: string, id: string): WorkerStatement;
|
|
184
|
+
/**
|
|
185
|
+
* Rows, tombstones included, optionally narrowed to one scope and one id. No
|
|
186
|
+
* flush: for reconciliation, which runs before any store writes.
|
|
187
|
+
*/
|
|
188
|
+
storedRows(filter?: {
|
|
189
|
+
scope?: string;
|
|
190
|
+
id?: string;
|
|
191
|
+
}): StoredRow[];
|
|
192
|
+
/** Drop every row of a scope (a deleted schedule's runs). Never tombstoned. */
|
|
193
|
+
removeScope(scope: string): Promise<void>;
|
|
194
|
+
/** Live rows, ordered by scope, ord, id. Flushes queued writes first. */
|
|
195
|
+
loadAll(scope?: string): DocRow[];
|
|
196
|
+
/** `loadAll` for use inside an open transaction (no flush). */
|
|
197
|
+
loadAllInTransaction(scope?: string): DocRow[];
|
|
198
|
+
get(scope: string, id: string): string | null;
|
|
199
|
+
/** `get` for use inside an open transaction (no flush). */
|
|
200
|
+
getInTransaction(scope: string, id: string): string | null;
|
|
201
|
+
/**
|
|
202
|
+
* Drop tombstones deleted before `before`, except ids in `keep`. Returns how
|
|
203
|
+
* many went.
|
|
204
|
+
*/
|
|
205
|
+
purgeTombstones(before: number, keep?: ReadonlySet<string>): number;
|
|
206
|
+
/** Highest rev in the table, tombstones included (0 when empty). */
|
|
207
|
+
maxRev(): number;
|
|
208
|
+
count(): number;
|
|
209
|
+
/**
|
|
210
|
+
* Rows (live and tombstoned) whose rev is greater than `rev`, oldest change
|
|
211
|
+
* first. Internal for now; the delta protocol exposes it in a later release.
|
|
212
|
+
*/
|
|
213
|
+
listChangedSince(rev: number, limit?: number): ChangedRow[];
|
|
214
|
+
}
|
|
215
|
+
export declare class ScopeSync {
|
|
216
|
+
private readonly table;
|
|
217
|
+
private readonly written;
|
|
218
|
+
constructor(table: DocTable);
|
|
219
|
+
/** Seed from rows already in the table, so the first sync does not rewrite them. */
|
|
220
|
+
seed(rows: DocRow[]): void;
|
|
221
|
+
/** Queue the diff inside the next batch. `prune` removes rows no longer listed. */
|
|
222
|
+
sync(scope: string, items: ReadonlyArray<{
|
|
223
|
+
id: string;
|
|
224
|
+
value: unknown;
|
|
225
|
+
}>, options: {
|
|
226
|
+
prune: boolean;
|
|
227
|
+
}): Promise<void>;
|
|
228
|
+
/**
|
|
229
|
+
* Drop every tracked scope not in `live` (a deleted room's messages, a
|
|
230
|
+
* deleted loop's logs), so children never outlive their parent.
|
|
231
|
+
*/
|
|
232
|
+
dropScopesExcept(live: ReadonlySet<string>): Promise<void>;
|
|
233
|
+
dropScope(scope: string): Promise<void>;
|
|
234
|
+
private scopeMap;
|
|
235
|
+
}
|
|
236
|
+
export interface OpenStateDbOptions {
|
|
237
|
+
paseoHome: string;
|
|
238
|
+
logger: Logger;
|
|
239
|
+
env?: NodeJS.ProcessEnv;
|
|
240
|
+
/** Test seam: simulate a runtime without `node:sqlite`. */
|
|
241
|
+
loadCtor?: () => DatabaseSyncCtor;
|
|
242
|
+
mirrorDebounceMs?: number;
|
|
243
|
+
/** Default true: checkpoints and bulk import writes on a worker thread. */
|
|
244
|
+
worker?: boolean;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Open and probe `state.sqlite`, or return null so every store stays on its
|
|
248
|
+
* legacy files. Never throws: a runtime without `node:sqlite` (Node 20, Node
|
|
249
|
+
* 22 before 22.13 without the flag), a locked or corrupt file, or a schema
|
|
250
|
+
* newer than this build all degrade to the file stores with one warning.
|
|
251
|
+
*/
|
|
252
|
+
export declare function openStateDb(options: OpenStateDbOptions): StateDb | null;
|
|
253
|
+
/**
|
|
254
|
+
* Stores constructed deep inside other services (schedules, fleet decisions,
|
|
255
|
+
* push tokens, extension storage) find the daemon's handle by PASEO_HOME
|
|
256
|
+
* instead of having it threaded through every constructor in between. Nothing
|
|
257
|
+
* attached means file stores, which is also what every unit test gets.
|
|
258
|
+
*/
|
|
259
|
+
export declare function attachStateDb(paseoHome: string, stateDb: StateDb): void;
|
|
260
|
+
export declare function detachStateDb(paseoHome: string): void;
|
|
261
|
+
export declare function stateDbFor(paseoHome: string): StateDb | null;
|
|
262
|
+
export {};
|
|
263
|
+
//# sourceMappingURL=state-db.d.ts.map
|