@opendatalabs/personal-server-ts-server 0.2.0 → 1.1.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/api-auth.d.ts +16 -0
- package/dist/api-auth.d.ts.map +1 -0
- package/dist/api-auth.js +97 -0
- package/dist/api-auth.js.map +1 -0
- package/dist/api.d.ts +4 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +3 -0
- package/dist/api.js.map +1 -1
- package/dist/app.d.ts +46 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +102 -30
- package/dist/app.js.map +1 -1
- package/dist/bootstrap.d.ts +11 -3
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +266 -33
- package/dist/bootstrap.js.map +1 -1
- package/dist/client.d.ts +17 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +368 -0
- package/dist/client.js.map +1 -0
- package/dist/config/defaults.d.ts +12 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +14 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +8 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +74 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/paths.d.ts +9 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +22 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/hono-context.d.ts +14 -0
- package/dist/hono-context.d.ts.map +1 -0
- package/dist/hono-context.js +2 -0
- package/dist/hono-context.js.map +1 -0
- package/dist/index.js +64 -12
- package/dist/index.js.map +1 -1
- package/dist/keys/server-account.d.ts +28 -0
- package/dist/keys/server-account.d.ts.map +1 -0
- package/dist/keys/server-account.js +48 -0
- package/dist/keys/server-account.js.map +1 -0
- package/dist/logger/index.d.ts +5 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +9 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logging/access-log.d.ts +15 -0
- package/dist/logging/access-log.d.ts.map +1 -0
- package/dist/logging/access-log.js +25 -0
- package/dist/logging/access-log.js.map +1 -0
- package/dist/logging/access-reader.d.ts +19 -0
- package/dist/logging/access-reader.d.ts.map +1 -0
- package/dist/logging/access-reader.js +50 -0
- package/dist/logging/access-reader.js.map +1 -0
- package/dist/middleware/access-log.d.ts.map +1 -1
- package/dist/middleware/access-log.js +8 -2
- package/dist/middleware/access-log.js.map +1 -1
- package/dist/middleware/builder-check.d.ts +2 -2
- package/dist/middleware/builder-check.d.ts.map +1 -1
- package/dist/middleware/builder-check.js +7 -2
- package/dist/middleware/builder-check.js.map +1 -1
- package/dist/middleware/owner-check.js +1 -1
- package/dist/middleware/owner-check.js.map +1 -1
- package/dist/middleware/web3-auth.d.ts +12 -0
- package/dist/middleware/web3-auth.d.ts.map +1 -1
- package/dist/middleware/web3-auth.js +27 -31
- package/dist/middleware/web3-auth.js.map +1 -1
- package/dist/migrations/local-state.d.ts +21 -0
- package/dist/migrations/local-state.d.ts.map +1 -0
- package/dist/migrations/local-state.js +106 -0
- package/dist/migrations/local-state.js.map +1 -0
- package/dist/routes/access-logs.d.ts +7 -0
- package/dist/routes/access-logs.d.ts.map +1 -1
- package/dist/routes/access-logs.js +11 -17
- package/dist/routes/access-logs.js.map +1 -1
- package/dist/routes/auth-device.d.ts +49 -0
- package/dist/routes/auth-device.d.ts.map +1 -0
- package/dist/routes/auth-device.js +581 -0
- package/dist/routes/auth-device.js.map +1 -0
- package/dist/routes/data.d.ts +42 -1
- package/dist/routes/data.d.ts.map +1 -1
- package/dist/routes/data.js +36 -201
- package/dist/routes/data.js.map +1 -1
- package/dist/routes/grants.d.ts +9 -2
- package/dist/routes/grants.d.ts.map +1 -1
- package/dist/routes/grants.js +18 -196
- package/dist/routes/grants.js.map +1 -1
- package/dist/routes/health.d.ts +7 -1
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +39 -2
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/mcp.d.ts +93 -6
- package/dist/routes/mcp.d.ts.map +1 -1
- package/dist/routes/mcp.js +526 -53
- package/dist/routes/mcp.js.map +1 -1
- package/dist/routes/oauth-token.d.ts +56 -0
- package/dist/routes/oauth-token.d.ts.map +1 -0
- package/dist/routes/oauth-token.js +49 -0
- package/dist/routes/oauth-token.js.map +1 -0
- package/dist/routes/sync.d.ts +7 -0
- package/dist/routes/sync.d.ts.map +1 -1
- package/dist/routes/sync.js +12 -39
- package/dist/routes/sync.js.map +1 -1
- package/dist/routes/ui-config.d.ts.map +1 -1
- package/dist/routes/ui-config.js +17 -82
- package/dist/routes/ui-config.js.map +1 -1
- package/dist/routes/ui-registration.d.ts +9 -0
- package/dist/routes/ui-registration.d.ts.map +1 -0
- package/dist/routes/ui-registration.js +217 -0
- package/dist/routes/ui-registration.js.map +1 -0
- package/dist/routes/ui.d.ts +1 -0
- package/dist/routes/ui.d.ts.map +1 -1
- package/dist/routes/ui.js +46 -4
- package/dist/routes/ui.js.map +1 -1
- package/dist/storage/hierarchy.d.ts +29 -0
- package/dist/storage/hierarchy.d.ts.map +1 -0
- package/dist/storage/hierarchy.js +241 -0
- package/dist/storage/hierarchy.js.map +1 -0
- package/dist/storage/index-manager.d.ts +53 -0
- package/dist/storage/index-manager.d.ts.map +1 -0
- package/dist/storage/index-manager.js +167 -0
- package/dist/storage/index-manager.js.map +1 -0
- package/dist/storage/index-schema.d.ts +5 -0
- package/dist/storage/index-schema.d.ts.map +1 -0
- package/dist/storage/index-schema.js +62 -0
- package/dist/storage/index-schema.js.map +1 -0
- package/dist/storage/node-data-storage.d.ts +9 -0
- package/dist/storage/node-data-storage.d.ts.map +1 -0
- package/dist/storage/node-data-storage.js +84 -0
- package/dist/storage/node-data-storage.js.map +1 -0
- package/dist/sync-cursor.d.ts +15 -0
- package/dist/sync-cursor.d.ts.map +1 -0
- package/dist/sync-cursor.js +110 -0
- package/dist/sync-cursor.js.map +1 -0
- package/dist/token-store.d.ts +22 -0
- package/dist/token-store.d.ts.map +1 -0
- package/dist/token-store.js +120 -0
- package/dist/token-store.js.map +1 -0
- package/dist/tunnel/auth.d.ts +4 -0
- package/dist/tunnel/auth.d.ts.map +1 -1
- package/dist/tunnel/auth.js +2 -1
- package/dist/tunnel/auth.js.map +1 -1
- package/dist/tunnel/config.d.ts +1 -0
- package/dist/tunnel/config.d.ts.map +1 -1
- package/dist/tunnel/config.js +1 -1
- package/dist/tunnel/config.js.map +1 -1
- package/dist/tunnel/manager.d.ts +21 -1
- package/dist/tunnel/manager.d.ts.map +1 -1
- package/dist/tunnel/manager.js +78 -23
- package/dist/tunnel/manager.js.map +1 -1
- package/dist/tunnel/verify.d.ts +1 -1
- package/dist/tunnel/verify.d.ts.map +1 -1
- package/dist/tunnel/verify.js +8 -2
- package/dist/tunnel/verify.js.map +1 -1
- package/dist/ui/browser_tls_rustls_bg.wasm +0 -0
- package/dist/ui/index.html +2192 -0
- package/dist/ui/ps-lite-debug.d.ts +93 -0
- package/dist/ui/ps-lite-debug.d.ts.map +1 -0
- package/dist/ui/ps-lite-debug.js +129416 -0
- package/dist/ui/ps-lite-debug.js.map +1 -0
- package/package.json +20 -8
- package/dist/middleware/grant-check.d.ts +0 -12
- package/dist/middleware/grant-check.d.ts.map +0 -1
- package/dist/middleware/grant-check.js +0 -90
- package/dist/middleware/grant-check.js.map +0 -1
- package/dist/oauth/provider.d.ts +0 -55
- package/dist/oauth/provider.d.ts.map +0 -1
- package/dist/oauth/provider.js +0 -160
- package/dist/oauth/provider.js.map +0 -1
- package/dist/oauth/routes.d.ts +0 -10
- package/dist/oauth/routes.d.ts.map +0 -1
- package/dist/oauth/routes.js +0 -206
- package/dist/oauth/routes.js.map +0 -1
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
const CREATE_TABLE_SQL = `
|
|
3
|
+
CREATE TABLE IF NOT EXISTS data_files (
|
|
4
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
5
|
+
file_id TEXT,
|
|
6
|
+
schema_id TEXT,
|
|
7
|
+
path TEXT NOT NULL UNIQUE,
|
|
8
|
+
scope TEXT NOT NULL,
|
|
9
|
+
collected_at TEXT NOT NULL,
|
|
10
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
|
|
11
|
+
size_bytes INTEGER NOT NULL DEFAULT 0,
|
|
12
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
13
|
+
data_point_id TEXT
|
|
14
|
+
)`;
|
|
15
|
+
const CREATE_INDEXES_SQL = [
|
|
16
|
+
"CREATE INDEX IF NOT EXISTS idx_data_files_scope ON data_files (scope)",
|
|
17
|
+
"CREATE INDEX IF NOT EXISTS idx_data_files_collected_at ON data_files (collected_at)",
|
|
18
|
+
"CREATE INDEX IF NOT EXISTS idx_data_files_file_id ON data_files (file_id)",
|
|
19
|
+
"CREATE INDEX IF NOT EXISTS idx_data_files_schema_id ON data_files (schema_id)",
|
|
20
|
+
"CREATE INDEX IF NOT EXISTS idx_data_files_data_point_id ON data_files (data_point_id)",
|
|
21
|
+
];
|
|
22
|
+
export const INDEX_SCHEMA_VERSION = 3;
|
|
23
|
+
function hasColumn(db, table, column) {
|
|
24
|
+
const rows = db.pragma(`table_info(${table})`);
|
|
25
|
+
return rows.some((row) => row.name === column);
|
|
26
|
+
}
|
|
27
|
+
function migrateSchema(db, currentVersion) {
|
|
28
|
+
if (currentVersion < 2 && !hasColumn(db, "data_files", "schema_id")) {
|
|
29
|
+
db.exec("ALTER TABLE data_files ADD COLUMN schema_id TEXT");
|
|
30
|
+
}
|
|
31
|
+
if (currentVersion < 3) {
|
|
32
|
+
if (!hasColumn(db, "data_files", "version")) {
|
|
33
|
+
// Pre-DPv2 rows get version 1 — the same default that fresh ingests
|
|
34
|
+
// start at, so subsequent ingests of the same scope keep incrementing
|
|
35
|
+
// from there without colliding with the legacy row.
|
|
36
|
+
db.exec("ALTER TABLE data_files ADD COLUMN version INTEGER NOT NULL DEFAULT 1");
|
|
37
|
+
}
|
|
38
|
+
if (!hasColumn(db, "data_files", "data_point_id")) {
|
|
39
|
+
db.exec("ALTER TABLE data_files ADD COLUMN data_point_id TEXT");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function ensureSchemaVersion(db) {
|
|
44
|
+
const currentVersion = db.pragma("user_version", { simple: true });
|
|
45
|
+
if (currentVersion > INDEX_SCHEMA_VERSION) {
|
|
46
|
+
throw new Error(`Unsupported index.db schema version ${currentVersion}; runtime supports ${INDEX_SCHEMA_VERSION}`);
|
|
47
|
+
}
|
|
48
|
+
migrateSchema(db, currentVersion);
|
|
49
|
+
db.pragma(`user_version = ${INDEX_SCHEMA_VERSION}`);
|
|
50
|
+
}
|
|
51
|
+
/** Open/create SQLite database, run CREATE TABLE IF NOT EXISTS, set WAL mode */
|
|
52
|
+
export function initializeDatabase(dbPath) {
|
|
53
|
+
const db = new Database(dbPath);
|
|
54
|
+
db.pragma("journal_mode = WAL");
|
|
55
|
+
db.exec(CREATE_TABLE_SQL);
|
|
56
|
+
ensureSchemaVersion(db);
|
|
57
|
+
for (const sql of CREATE_INDEXES_SQL) {
|
|
58
|
+
db.exec(sql);
|
|
59
|
+
}
|
|
60
|
+
return db;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=index-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-schema.js","sourceRoot":"","sources":["../../src/storage/index-schema.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;EAYvB,CAAC;AAEH,MAAM,kBAAkB,GAAG;IACzB,uEAAuE;IACvE,qFAAqF;IACrF,2EAA2E;IAC3E,+EAA+E;IAC/E,uFAAuF;CACxF,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAEtC,SAAS,SAAS,CAChB,EAAqB,EACrB,KAAa,EACb,MAAc;IAEd,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,KAAK,GAAG,CAA4B,CAAC;IAC1E,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,aAAa,CAAC,EAAqB,EAAE,cAAsB;IAClE,IAAI,cAAc,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC;QACpE,EAAE,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,CAAC;YAC5C,oEAAoE;YACpE,sEAAsE;YACtE,oDAAoD;YACpD,EAAE,CAAC,IAAI,CACL,sEAAsE,CACvE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,YAAY,EAAE,eAAe,CAAC,EAAE,CAAC;YAClD,EAAE,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAqB;IAChD,MAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAW,CAAC;IAC7E,IAAI,cAAc,GAAG,oBAAoB,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,uCAAuC,cAAc,sBAAsB,oBAAoB,EAAE,CAClG,CAAC;IACJ,CAAC;IACD,aAAa,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IAClC,EAAE,CAAC,MAAM,CAAC,kBAAkB,oBAAoB,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEhC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEhC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC1B,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACxB,KAAK,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACrC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { HierarchyManagerOptions } from "@opendatalabs/personal-server-ts-core/storage/hierarchy";
|
|
2
|
+
import type { IndexManager } from "@opendatalabs/personal-server-ts-core/storage/index";
|
|
3
|
+
import type { DataStoragePort } from "@opendatalabs/personal-server-ts-core/ports";
|
|
4
|
+
export interface NodeDataStorageDeps {
|
|
5
|
+
indexManager: IndexManager;
|
|
6
|
+
hierarchyOptions: HierarchyManagerOptions;
|
|
7
|
+
}
|
|
8
|
+
export declare function createNodeDataStorage(deps: NodeDataStorageDeps): DataStoragePort;
|
|
9
|
+
//# sourceMappingURL=node-data-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-data-storage.d.ts","sourceRoot":"","sources":["../../src/storage/node-data-storage.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC;AACvG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qDAAqD,CAAC;AACxF,OAAO,KAAK,EAGV,eAAe,EAEhB,MAAM,6CAA6C,CAAC;AAGrD,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,uBAAuB,CAAC;CAC3C;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,mBAAmB,GACxB,eAAe,CAoGjB"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { deleteAllForScope, deleteDataFile, readDataFile, readDataFilePreview, hasScopeBlocks, readScopeBlocks, writeBlockManifest, writeDataFile, } from "./hierarchy.js";
|
|
2
|
+
export function createNodeDataStorage(deps) {
|
|
3
|
+
return {
|
|
4
|
+
kind: "node-fs-sqlite",
|
|
5
|
+
listScopes(options) {
|
|
6
|
+
return deps.indexManager.listDistinctScopes(options);
|
|
7
|
+
},
|
|
8
|
+
listVersions(scope, options) {
|
|
9
|
+
return deps.indexManager.findByScope({ scope, ...options });
|
|
10
|
+
},
|
|
11
|
+
countVersions(scope) {
|
|
12
|
+
return deps.indexManager.countByScope(scope);
|
|
13
|
+
},
|
|
14
|
+
findEntry(lookup) {
|
|
15
|
+
if (lookup.fileId) {
|
|
16
|
+
return deps.indexManager.findByFileId(lookup.fileId);
|
|
17
|
+
}
|
|
18
|
+
if (lookup.at) {
|
|
19
|
+
return deps.indexManager.findClosestByScope(lookup.scope, lookup.at);
|
|
20
|
+
}
|
|
21
|
+
return deps.indexManager.findLatestByScope(lookup.scope);
|
|
22
|
+
},
|
|
23
|
+
findByFileId(fileId) {
|
|
24
|
+
return deps.indexManager.findByFileId(fileId);
|
|
25
|
+
},
|
|
26
|
+
findByDataPointId(dataPointId) {
|
|
27
|
+
return deps.indexManager.findByDataPointId(dataPointId);
|
|
28
|
+
},
|
|
29
|
+
findUnsynced(options) {
|
|
30
|
+
return deps.indexManager.findUnsynced(options);
|
|
31
|
+
},
|
|
32
|
+
readEnvelope(scope, collectedAt) {
|
|
33
|
+
return readDataFile(deps.hierarchyOptions, scope, collectedAt);
|
|
34
|
+
},
|
|
35
|
+
readEnvelopePreview(scope, collectedAt, { maxBytes }) {
|
|
36
|
+
return readDataFilePreview(deps.hierarchyOptions, scope, collectedAt, maxBytes);
|
|
37
|
+
},
|
|
38
|
+
readScopeBlocks(scope, collectedAt, options) {
|
|
39
|
+
return readScopeBlocks(deps.hierarchyOptions, scope, collectedAt, options);
|
|
40
|
+
},
|
|
41
|
+
hasScopeBlocks(scope, collectedAt) {
|
|
42
|
+
return hasScopeBlocks(deps.hierarchyOptions, scope, collectedAt);
|
|
43
|
+
},
|
|
44
|
+
writeEnvelope(envelope) {
|
|
45
|
+
return writeDataFile(deps.hierarchyOptions, envelope);
|
|
46
|
+
},
|
|
47
|
+
writeBlockManifest(scope, collectedAt, manifest, blocks) {
|
|
48
|
+
return writeBlockManifest(deps.hierarchyOptions, scope, collectedAt, manifest, blocks);
|
|
49
|
+
},
|
|
50
|
+
insertEntry(entry) {
|
|
51
|
+
return deps.indexManager.insert(entry);
|
|
52
|
+
},
|
|
53
|
+
updateFileId(path, fileId) {
|
|
54
|
+
return deps.indexManager.updateFileId(path, fileId);
|
|
55
|
+
},
|
|
56
|
+
findLatestVersionByScope(scope) {
|
|
57
|
+
return deps.indexManager.findLatestVersionByScope(scope);
|
|
58
|
+
},
|
|
59
|
+
updateDataPointId(path, dataPointId) {
|
|
60
|
+
return deps.indexManager.updateDataPointId(path, dataPointId);
|
|
61
|
+
},
|
|
62
|
+
updateEntryVersion(path, version) {
|
|
63
|
+
return deps.indexManager.updateVersion(path, version);
|
|
64
|
+
},
|
|
65
|
+
async deleteScope(scope) {
|
|
66
|
+
const deletedCount = deps.indexManager.deleteByScope(scope);
|
|
67
|
+
await deleteAllForScope(deps.hierarchyOptions, scope);
|
|
68
|
+
return deletedCount;
|
|
69
|
+
},
|
|
70
|
+
async deleteByFileId(fileId) {
|
|
71
|
+
const entry = deps.indexManager.findByFileId(fileId);
|
|
72
|
+
if (!entry)
|
|
73
|
+
return false;
|
|
74
|
+
// Delete the blob FIRST; only drop the index row once it's gone (deleteDataFile is
|
|
75
|
+
// ENOENT-tolerant). If blob deletion fails for a real reason, the row is preserved so the next
|
|
76
|
+
// sync retry re-attempts — rather than the row vanishing and the cursor advancing past an
|
|
77
|
+
// orphaned local blob.
|
|
78
|
+
await deleteDataFile(deps.hierarchyOptions, entry.scope, entry.collectedAt);
|
|
79
|
+
deps.indexManager.deleteByPath(entry.path);
|
|
80
|
+
return true;
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=node-data-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-data-storage.js","sourceRoot":"","sources":["../../src/storage/node-data-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,aAAa,GACd,MAAM,gBAAgB,CAAC;AAgBxB,MAAM,UAAU,qBAAqB,CACnC,IAAyB;IAEzB,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,UAAU,CAAC,OAAoC;YAC7C,OAAO,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACvD,CAAC;QACD,YAAY,CAAC,KAAa,EAAE,OAA+B;YACzD,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,aAAa,CAAC,KAAa;YACzB,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC;QACD,SAAS,CAAC,MAA8B;YACtC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACvD,CAAC;YACD,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,OAAO,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YACvE,CAAC;YACD,OAAO,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3D,CAAC;QACD,YAAY,CAAC,MAAc;YACzB,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC;QACD,iBAAiB,CAAC,WAAmB;YACnC,OAAO,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC1D,CAAC;QACD,YAAY,CAAC,OAA4B;YACvC,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACjD,CAAC;QACD,YAAY,CAAC,KAAa,EAAE,WAAmB;YAC7C,OAAO,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QACjE,CAAC;QACD,mBAAmB,CAAC,KAAa,EAAE,WAAmB,EAAE,EAAE,QAAQ,EAAE;YAClE,OAAO,mBAAmB,CACxB,IAAI,CAAC,gBAAgB,EACrB,KAAK,EACL,WAAW,EACX,QAAQ,CACT,CAAC;QACJ,CAAC;QACD,eAAe,CAAC,KAAa,EAAE,WAAmB,EAAE,OAAO;YACzD,OAAO,eAAe,CACpB,IAAI,CAAC,gBAAgB,EACrB,KAAK,EACL,WAAW,EACX,OAAO,CACR,CAAC;QACJ,CAAC;QACD,cAAc,CAAC,KAAa,EAAE,WAAmB;YAC/C,OAAO,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QACnE,CAAC;QACD,aAAa,CAAC,QAA0B;YACtC,OAAO,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;QACxD,CAAC;QACD,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM;YACrD,OAAO,kBAAkB,CACvB,IAAI,CAAC,gBAAgB,EACrB,KAAK,EACL,WAAW,EACX,QAAQ,EACR,MAAM,CACP,CAAC;QACJ,CAAC;QACD,WAAW,CAAC,KAAK;YACf,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,YAAY,CAAC,IAAY,EAAE,MAAc;YACvC,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtD,CAAC;QACD,wBAAwB,CAAC,KAAa;YACpC,OAAO,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAC3D,CAAC;QACD,iBAAiB,CAAC,IAAY,EAAE,WAAmB;YACjD,OAAO,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAChE,CAAC;QACD,kBAAkB,CAAC,IAAY,EAAE,OAAe;YAC9C,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,KAAa;YAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC5D,MAAM,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACtD,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,KAAK,CAAC,cAAc,CAAC,MAAc;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACrD,IAAI,CAAC,KAAK;gBAAE,OAAO,KAAK,CAAC;YACzB,mFAAmF;YACnF,+FAA+F;YAC/F,0FAA0F;YAC1F,uBAAuB;YACvB,MAAM,cAAc,CAClB,IAAI,CAAC,gBAAgB,EACrB,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,WAAW,CAClB,CAAC;YACF,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface SyncCursor {
|
|
2
|
+
/** Read the lastProcessedTimestamp from cursor state */
|
|
3
|
+
read(): Promise<string | null>;
|
|
4
|
+
/** Write the lastProcessedTimestamp to cursor state */
|
|
5
|
+
write(timestamp: string): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export interface SyncCursorOptions {
|
|
8
|
+
legacyConfigPath?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Creates a cursor backed by a separate JSON state file.
|
|
12
|
+
* Passing config.json without options preserves the legacy config-backed API.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createSyncCursor(cursorPath: string, options?: SyncCursorOptions): SyncCursor;
|
|
15
|
+
//# sourceMappingURL=sync-cursor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-cursor.d.ts","sourceRoot":"","sources":["../src/sync-cursor.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,wDAAwD;IACxD,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE/B,uDAAuD;IACvD,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AA+FD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,iBAAsB,GAC9B,UAAU,CAwBZ"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, basename } from "node:path";
|
|
3
|
+
import { loadConfig } from "./config/index.js";
|
|
4
|
+
async function readCursorFile(cursorPath) {
|
|
5
|
+
try {
|
|
6
|
+
const raw = await readFile(cursorPath, "utf8");
|
|
7
|
+
const parsed = JSON.parse(raw);
|
|
8
|
+
return typeof parsed.lastProcessedTimestamp === "string"
|
|
9
|
+
? parsed.lastProcessedTimestamp
|
|
10
|
+
: null;
|
|
11
|
+
}
|
|
12
|
+
catch (err) {
|
|
13
|
+
if (err instanceof Error &&
|
|
14
|
+
"code" in err &&
|
|
15
|
+
err.code === "ENOENT") {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
throw err;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async function writeCursorFile(cursorPath, timestamp) {
|
|
22
|
+
await mkdir(dirname(cursorPath), { recursive: true });
|
|
23
|
+
const tmpPath = `${cursorPath}.tmp`;
|
|
24
|
+
const state = {
|
|
25
|
+
version: 1,
|
|
26
|
+
lastProcessedTimestamp: timestamp,
|
|
27
|
+
};
|
|
28
|
+
await writeFile(tmpPath, `${JSON.stringify(state, null, 2)}\n`);
|
|
29
|
+
await rename(tmpPath, cursorPath);
|
|
30
|
+
}
|
|
31
|
+
function createLegacyConfigCursor(configPath) {
|
|
32
|
+
return {
|
|
33
|
+
async read() {
|
|
34
|
+
const config = await loadConfig({ configPath });
|
|
35
|
+
return config.sync.lastProcessedTimestamp;
|
|
36
|
+
},
|
|
37
|
+
// Write only the sync cursor field through a raw read/merge/atomic-rename
|
|
38
|
+
// so we preserve every other field exactly as it lives on disk. The
|
|
39
|
+
// previous implementation round-tripped the whole config through
|
|
40
|
+
// loadConfig + saveConfig, which applies zod schema defaults (notably
|
|
41
|
+
// `storage.backend = "local"`) and silently clobbered runtime overrides
|
|
42
|
+
// like `storage.backend = "vana"` set via
|
|
43
|
+
// startPersonalServer({ configDefaults }). The result was that any
|
|
44
|
+
// consumer relying on configDefaults to set a non-default backend would
|
|
45
|
+
// silently revert to local storage after the first sync tick.
|
|
46
|
+
async write(timestamp) {
|
|
47
|
+
let raw = "{}";
|
|
48
|
+
try {
|
|
49
|
+
raw = await readFile(configPath, "utf8");
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (!(err instanceof Error &&
|
|
53
|
+
"code" in err &&
|
|
54
|
+
err.code === "ENOENT")) {
|
|
55
|
+
throw err;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
let parsed;
|
|
59
|
+
try {
|
|
60
|
+
const candidate = JSON.parse(raw);
|
|
61
|
+
parsed =
|
|
62
|
+
typeof candidate === "object" && candidate !== null
|
|
63
|
+
? candidate
|
|
64
|
+
: {};
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
parsed = {};
|
|
68
|
+
}
|
|
69
|
+
const existingSync = typeof parsed.sync === "object" && parsed.sync !== null
|
|
70
|
+
? parsed.sync
|
|
71
|
+
: {};
|
|
72
|
+
const next = {
|
|
73
|
+
...parsed,
|
|
74
|
+
sync: { ...existingSync, lastProcessedTimestamp: timestamp },
|
|
75
|
+
};
|
|
76
|
+
await mkdir(dirname(configPath), { recursive: true });
|
|
77
|
+
const tmpPath = `${configPath}.tmp`;
|
|
78
|
+
await writeFile(tmpPath, `${JSON.stringify(next, null, 2)}\n`);
|
|
79
|
+
await rename(tmpPath, configPath);
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Creates a cursor backed by a separate JSON state file.
|
|
85
|
+
* Passing config.json without options preserves the legacy config-backed API.
|
|
86
|
+
*/
|
|
87
|
+
export function createSyncCursor(cursorPath, options = {}) {
|
|
88
|
+
if (!options.legacyConfigPath && basename(cursorPath) === "config.json") {
|
|
89
|
+
return createLegacyConfigCursor(cursorPath);
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
async read() {
|
|
93
|
+
const cursor = await readCursorFile(cursorPath);
|
|
94
|
+
if (cursor !== null) {
|
|
95
|
+
return cursor;
|
|
96
|
+
}
|
|
97
|
+
if (options.legacyConfigPath) {
|
|
98
|
+
const config = await loadConfig({
|
|
99
|
+
configPath: options.legacyConfigPath,
|
|
100
|
+
});
|
|
101
|
+
return config.sync.lastProcessedTimestamp;
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
},
|
|
105
|
+
async write(timestamp) {
|
|
106
|
+
await writeCursorFile(cursorPath, timestamp);
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=sync-cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-cursor.js","sourceRoot":"","sources":["../src/sync-cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAmB/C,KAAK,UAAU,cAAc,CAAC,UAAkB;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA6B,CAAC;QAC3D,OAAO,OAAO,MAAM,CAAC,sBAAsB,KAAK,QAAQ;YACtD,CAAC,CAAC,MAAM,CAAC,sBAAsB;YAC/B,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IACE,GAAG,YAAY,KAAK;YACpB,MAAM,IAAI,GAAG;YACZ,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAChD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,UAAkB,EAClB,SAAiB;IAEjB,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,GAAG,UAAU,MAAM,CAAC;IACpC,MAAM,KAAK,GAAoB;QAC7B,OAAO,EAAE,CAAC;QACV,sBAAsB,EAAE,SAAS;KAClC,CAAC;IACF,MAAM,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAChE,MAAM,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,wBAAwB,CAAC,UAAkB;IAClD,OAAO;QACL,KAAK,CAAC,IAAI;YACR,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;YAChD,OAAO,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC;QAC5C,CAAC;QAED,0EAA0E;QAC1E,oEAAoE;QACpE,iEAAiE;QACjE,sEAAsE;QACtE,wEAAwE;QACxE,0CAA0C;QAC1C,mEAAmE;QACnE,wEAAwE;QACxE,8DAA8D;QAC9D,KAAK,CAAC,KAAK,CAAC,SAAS;YACnB,IAAI,GAAG,GAAG,IAAI,CAAC;YACf,IAAI,CAAC;gBACH,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,CACH,GAAG,YAAY,KAAK;oBACpB,MAAM,IAAI,GAAG;oBACZ,GAA6B,CAAC,IAAI,KAAK,QAAQ,CACjD,EAAE,CAAC;oBACF,MAAM,GAAG,CAAC;gBACZ,CAAC;YACH,CAAC;YACD,IAAI,MAA+B,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;gBAC7C,MAAM;oBACJ,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI;wBACjD,CAAC,CAAE,SAAqC;wBACxC,CAAC,CAAC,EAAE,CAAC;YACX,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,EAAE,CAAC;YACd,CAAC;YACD,MAAM,YAAY,GAChB,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;gBACrD,CAAC,CAAE,MAAM,CAAC,IAAgC;gBAC1C,CAAC,CAAC,EAAE,CAAC;YACT,MAAM,IAAI,GAAG;gBACX,GAAG,MAAM;gBACT,IAAI,EAAE,EAAE,GAAG,YAAY,EAAE,sBAAsB,EAAE,SAAS,EAAE;aAC7D,CAAC;YACF,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,GAAG,UAAU,MAAM,CAAC;YACpC,MAAM,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/D,MAAM,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACpC,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,UAAkB,EAClB,UAA6B,EAAE;IAE/B,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,aAAa,EAAE,CAAC;QACxE,OAAO,wBAAwB,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO;QACL,KAAK,CAAC,IAAI;YACR,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;YAChD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;oBAC9B,UAAU,EAAE,OAAO,CAAC,gBAAgB;iBACrC,CAAC,CAAC;gBACH,OAAO,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC;YAC5C,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,SAAS;YACnB,MAAM,eAAe,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC/C,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent token store — manages Personal Server session tokens on disk.
|
|
3
|
+
*
|
|
4
|
+
* Tokens are stored in a JSON file (tokens.json) in the PS data directory
|
|
5
|
+
* so they survive restarts. Supports multiple concurrent tokens.
|
|
6
|
+
*/
|
|
7
|
+
import type { Logger } from "pino";
|
|
8
|
+
export interface AddTokenOptions {
|
|
9
|
+
expiresAt?: string | Date | null;
|
|
10
|
+
}
|
|
11
|
+
export interface TokenStore {
|
|
12
|
+
/** All currently valid tokens. */
|
|
13
|
+
getTokens(): Promise<string[]>;
|
|
14
|
+
/** Check if a token is valid. */
|
|
15
|
+
isValid(token: string): Promise<boolean>;
|
|
16
|
+
/** Add a new token and persist to disk. */
|
|
17
|
+
addToken(token: string, options?: AddTokenOptions): Promise<void>;
|
|
18
|
+
/** Remove a token and persist to disk. */
|
|
19
|
+
removeToken(token: string): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export declare function createTokenStore(filePath: string, logger: Logger): TokenStore;
|
|
22
|
+
//# sourceMappingURL=token-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../src/token-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,kCAAkC;IAClC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/B,iCAAiC;IACjC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,0CAA0C;IAC1C,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C;AAOD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CA6H7E"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent token store — manages Personal Server session tokens on disk.
|
|
3
|
+
*
|
|
4
|
+
* Tokens are stored in a JSON file (tokens.json) in the PS data directory
|
|
5
|
+
* so they survive restarts. Supports multiple concurrent tokens.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
8
|
+
import { dirname } from "node:path";
|
|
9
|
+
export function createTokenStore(filePath, logger) {
|
|
10
|
+
const tokens = new Map();
|
|
11
|
+
let loaded = false;
|
|
12
|
+
function normalizeExpiresAt(value) {
|
|
13
|
+
if (value == null)
|
|
14
|
+
return null;
|
|
15
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
16
|
+
if (Number.isNaN(date.getTime())) {
|
|
17
|
+
throw new Error("Invalid token expiry");
|
|
18
|
+
}
|
|
19
|
+
return date.toISOString();
|
|
20
|
+
}
|
|
21
|
+
function isExpired(expiresAt) {
|
|
22
|
+
if (!expiresAt)
|
|
23
|
+
return false;
|
|
24
|
+
return new Date(expiresAt).getTime() <= Date.now();
|
|
25
|
+
}
|
|
26
|
+
function purgeExpired() {
|
|
27
|
+
let removed = false;
|
|
28
|
+
for (const [token, expiresAt] of tokens.entries()) {
|
|
29
|
+
if (isExpired(expiresAt)) {
|
|
30
|
+
tokens.delete(token);
|
|
31
|
+
removed = true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return removed;
|
|
35
|
+
}
|
|
36
|
+
async function loadFromDisk() {
|
|
37
|
+
if (loaded)
|
|
38
|
+
return;
|
|
39
|
+
try {
|
|
40
|
+
const raw = await readFile(filePath, "utf-8");
|
|
41
|
+
const data = JSON.parse(raw);
|
|
42
|
+
if (Array.isArray(data.tokens)) {
|
|
43
|
+
for (const entry of data.tokens) {
|
|
44
|
+
if (typeof entry === "string" && entry.length > 0) {
|
|
45
|
+
tokens.set(entry, null);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (typeof entry === "object" &&
|
|
49
|
+
entry !== null &&
|
|
50
|
+
typeof entry.token === "string" &&
|
|
51
|
+
entry.token.length > 0) {
|
|
52
|
+
const expiresAt = normalizeExpiresAt(entry.expiresAt);
|
|
53
|
+
if (!isExpired(expiresAt)) {
|
|
54
|
+
tokens.set(entry.token, expiresAt);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
purgeExpired();
|
|
60
|
+
logger.info({ count: tokens.size }, "Loaded Personal Server session tokens from disk");
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
if (err.code !== "ENOENT") {
|
|
64
|
+
logger.warn({ err }, "Failed to read tokens file");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
loaded = true;
|
|
68
|
+
}
|
|
69
|
+
async function saveToDisk() {
|
|
70
|
+
purgeExpired();
|
|
71
|
+
const data = {
|
|
72
|
+
version: 1,
|
|
73
|
+
tokens: Array.from(tokens.entries()).map(([token, expiresAt]) => expiresAt ? { token, expiresAt } : token),
|
|
74
|
+
};
|
|
75
|
+
try {
|
|
76
|
+
await mkdir(dirname(filePath), { recursive: true });
|
|
77
|
+
await writeFile(filePath, JSON.stringify(data, null, 2), {
|
|
78
|
+
mode: 0o600,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
logger.error({ err }, "Failed to persist tokens file");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Load eagerly on first access
|
|
86
|
+
const ready = loadFromDisk();
|
|
87
|
+
return {
|
|
88
|
+
async getTokens() {
|
|
89
|
+
await ready;
|
|
90
|
+
if (purgeExpired()) {
|
|
91
|
+
await saveToDisk();
|
|
92
|
+
}
|
|
93
|
+
return Array.from(tokens.keys());
|
|
94
|
+
},
|
|
95
|
+
async isValid(token) {
|
|
96
|
+
await ready;
|
|
97
|
+
const expiresAt = tokens.get(token);
|
|
98
|
+
if (expiresAt === undefined) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
if (isExpired(expiresAt)) {
|
|
102
|
+
tokens.delete(token);
|
|
103
|
+
await saveToDisk();
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
return true;
|
|
107
|
+
},
|
|
108
|
+
async addToken(token, options) {
|
|
109
|
+
await ready;
|
|
110
|
+
tokens.set(token, normalizeExpiresAt(options?.expiresAt));
|
|
111
|
+
await saveToDisk();
|
|
112
|
+
},
|
|
113
|
+
async removeToken(token) {
|
|
114
|
+
await ready;
|
|
115
|
+
tokens.delete(token);
|
|
116
|
+
await saveToDisk();
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=token-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-store.js","sourceRoot":"","sources":["../src/token-store.ts"],"names":[],"mappings":"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"}
|
package/dist/tunnel/auth.d.ts
CHANGED
|
@@ -11,6 +11,9 @@ export interface SignedClaim {
|
|
|
11
11
|
claim: string;
|
|
12
12
|
sig: string;
|
|
13
13
|
}
|
|
14
|
+
export interface TunnelClaimSigner {
|
|
15
|
+
signMessage(message: string): Promise<`0x${string}`>;
|
|
16
|
+
}
|
|
14
17
|
export interface ClaimPayload {
|
|
15
18
|
aud: string;
|
|
16
19
|
iat: number;
|
|
@@ -25,6 +28,7 @@ export interface ClaimConfig {
|
|
|
25
28
|
walletAddress: string;
|
|
26
29
|
runId: string;
|
|
27
30
|
serverKeypair: ServerAccount;
|
|
31
|
+
signer?: TunnelClaimSigner;
|
|
28
32
|
}
|
|
29
33
|
/** Encode a UTF-8 string to base64url (no padding). */
|
|
30
34
|
export declare function base64urlEncode(input: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/tunnel/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAEhF,kEAAkE;AAClE,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/tunnel/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAEhF,kEAAkE;AAClE,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,aAAa,CAAC;IAC7B,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED,uDAAuD;AACvD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,CAkBtB"}
|
package/dist/tunnel/auth.js
CHANGED
|
@@ -40,7 +40,8 @@ export async function generateSignedClaim(config) {
|
|
|
40
40
|
runId: config.runId,
|
|
41
41
|
};
|
|
42
42
|
const claim = base64urlEncode(JSON.stringify(payload));
|
|
43
|
-
const
|
|
43
|
+
const signer = config.signer ?? config.serverKeypair;
|
|
44
|
+
const sig = await signer.signMessage(claim);
|
|
44
45
|
return { claim, sig };
|
|
45
46
|
}
|
|
46
47
|
//# sourceMappingURL=auth.js.map
|
package/dist/tunnel/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tunnel/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,kEAAkE;AAClE,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tunnel/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,kEAAkE;AAClE,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AA6BrC,uDAAuD;AACvD,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC;SAC/B,QAAQ,CAAC,QAAQ,CAAC;SAClB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACxB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAmB;IAEnB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAE1C,MAAM,OAAO,GAAiB;QAC5B,GAAG,EAAE,yBAAyB;QAC9B,GAAG,EAAE,GAAG;QACR,GAAG,EAAE,GAAG,GAAG,iBAAiB;QAC5B,KAAK,EAAE,MAAM,CAAC,YAAY;QAC1B,MAAM,EAAE,MAAM,CAAC,aAAa;QAC5B,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE;QAC7C,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;IAEF,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,aAAa,CAAC;IACrD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAE5C,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACxB,CAAC"}
|
package/dist/tunnel/config.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/tunnel/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAsBrE"}
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/tunnel/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAsBrE"}
|
package/dist/tunnel/config.js
CHANGED
|
@@ -28,7 +28,7 @@ metadatas.auth_claim = "${options.authClaim}"
|
|
|
28
28
|
metadatas.auth_sig = "${options.authSig}"
|
|
29
29
|
|
|
30
30
|
[[proxies]]
|
|
31
|
-
name = "personal-server"
|
|
31
|
+
name = "${options.proxyName ?? `personal-server-${options.subdomain.toLowerCase()}`}"
|
|
32
32
|
type = "http"
|
|
33
33
|
localIP = "127.0.0.1"
|
|
34
34
|
localPort = ${options.localPort}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/tunnel/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/tunnel/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA0B;IAC3D,OAAO;;;gBAGO,OAAO,CAAC,UAAU;eACnB,OAAO,CAAC,UAAU;;;;sBAIX,OAAO,CAAC,aAAa;qBACtB,OAAO,CAAC,YAAY;sBACnB,OAAO,CAAC,KAAK;0BACT,OAAO,CAAC,SAAS;wBACnB,OAAO,CAAC,OAAO;;;UAG7B,OAAO,CAAC,SAAS,IAAI,mBAAmB,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE;;;cAGrE,OAAO,CAAC,SAAS;eAChB,OAAO,CAAC,SAAS;CAC/B,CAAC;AACF,CAAC"}
|
package/dist/tunnel/manager.d.ts
CHANGED
|
@@ -9,18 +9,22 @@
|
|
|
9
9
|
* - Provide status for health endpoint
|
|
10
10
|
*/
|
|
11
11
|
import type { ServerAccount } from "@opendatalabs/personal-server-ts-core/keys";
|
|
12
|
+
import { type TunnelClaimSigner } from "./auth.js";
|
|
12
13
|
export type TunnelStatus = "stopped" | "starting" | "connected" | "disconnected" | "error";
|
|
13
14
|
export interface TunnelStatusInfo {
|
|
14
15
|
enabled: boolean;
|
|
15
16
|
status: TunnelStatus;
|
|
16
17
|
publicUrl: string | null;
|
|
17
18
|
connectedSince: string | null;
|
|
19
|
+
routable?: boolean;
|
|
20
|
+
warning?: string;
|
|
18
21
|
error?: string;
|
|
19
22
|
}
|
|
20
23
|
export interface TunnelConfig {
|
|
21
24
|
walletAddress: string;
|
|
22
25
|
ownerAddress: string;
|
|
23
26
|
serverKeypair: ServerAccount;
|
|
27
|
+
tunnelSigner?: TunnelClaimSigner;
|
|
24
28
|
runId: string;
|
|
25
29
|
serverAddr: string;
|
|
26
30
|
serverPort: number;
|
|
@@ -33,16 +37,32 @@ export declare class TunnelManager {
|
|
|
33
37
|
private publicUrl;
|
|
34
38
|
private connectedSince;
|
|
35
39
|
private lastError;
|
|
40
|
+
private routable;
|
|
41
|
+
private routeWarning;
|
|
36
42
|
private config;
|
|
37
43
|
private binaryPath;
|
|
38
44
|
private refreshTimer;
|
|
39
45
|
private refreshing;
|
|
40
46
|
constructor(storageRoot: string);
|
|
41
47
|
/**
|
|
42
|
-
*
|
|
48
|
+
* Reserve the tunnel's public URL without starting frpc. The URL is
|
|
49
|
+
* deterministic (wallet-derived subdomain), so callers can register the
|
|
50
|
+
* server with the gateway before any tunnel traffic is attempted. Dialing
|
|
51
|
+
* the relay pre-registration is what poisoned its delegation cache and
|
|
52
|
+
* caused the ~70s "Signer is not a registered server" window (BUI-611).
|
|
53
|
+
*/
|
|
54
|
+
reserve(config: TunnelConfig, binaryPath: string): string;
|
|
55
|
+
/**
|
|
56
|
+
* Start the frpc process for a previously reserved tunnel.
|
|
43
57
|
* Returns the public URL once the tunnel is established.
|
|
44
58
|
* Automatically schedules periodic claim refresh.
|
|
45
59
|
*/
|
|
60
|
+
connect(): Promise<string>;
|
|
61
|
+
/**
|
|
62
|
+
* Reserve and immediately connect. Prefer reserve() + connect() gated on
|
|
63
|
+
* server registration; this remains for callers that are already
|
|
64
|
+
* registered.
|
|
65
|
+
*/
|
|
46
66
|
start(config: TunnelConfig, binaryPath: string): Promise<string>;
|
|
47
67
|
/**
|
|
48
68
|
* Stop the frpc process gracefully.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/tunnel/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/tunnel/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,WAAW,CAAC;AAInB,MAAM,MAAM,YAAY,GACtB,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,OAAO,CAAC;AAElE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAQD,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,UAAU,CAAS;gBAEf,WAAW,EAAE,MAAM;IAI/B;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAYzD;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAsChC;;;;OAIG;IACG,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKtE;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC3B;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAOrD;;OAEG;IACH,SAAS,IAAI,gBAAgB;IAY7B;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAQ7B;;OAEG;YACW,gBAAgB;IA+B9B;;;OAGG;YACW,YAAY;IA0F1B;;OAEG;YACW,WAAW;IAsBzB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,iBAAiB;IAOzB;;;OAGG;YACW,YAAY;CA0B3B"}
|