xtctx 0.3.2
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/CHANGELOG.md +122 -0
- package/LICENSE +21 -0
- package/README.md +149 -0
- package/dist/src/api/routes/config.d.ts +4 -0
- package/dist/src/api/routes/config.d.ts.map +1 -0
- package/dist/src/api/routes/config.js +61 -0
- package/dist/src/api/routes/config.js.map +1 -0
- package/dist/src/api/routes/knowledge.d.ts +4 -0
- package/dist/src/api/routes/knowledge.d.ts.map +1 -0
- package/dist/src/api/routes/knowledge.js +40 -0
- package/dist/src/api/routes/knowledge.js.map +1 -0
- package/dist/src/api/routes/search.d.ts +7 -0
- package/dist/src/api/routes/search.d.ts.map +1 -0
- package/dist/src/api/routes/search.js +108 -0
- package/dist/src/api/routes/search.js.map +1 -0
- package/dist/src/api/routes/sources.d.ts +12 -0
- package/dist/src/api/routes/sources.d.ts.map +1 -0
- package/dist/src/api/routes/sources.js +70 -0
- package/dist/src/api/routes/sources.js.map +1 -0
- package/dist/src/api/server.d.ts +26 -0
- package/dist/src/api/server.d.ts.map +1 -0
- package/dist/src/api/server.js +312 -0
- package/dist/src/api/server.js.map +1 -0
- package/dist/src/cli/index.d.ts +3 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +58 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/ingest.d.ts +6 -0
- package/dist/src/cli/ingest.d.ts.map +1 -0
- package/dist/src/cli/ingest.js +11 -0
- package/dist/src/cli/ingest.js.map +1 -0
- package/dist/src/cli/init.d.ts +6 -0
- package/dist/src/cli/init.d.ts.map +1 -0
- package/dist/src/cli/init.js +105 -0
- package/dist/src/cli/init.js.map +1 -0
- package/dist/src/cli/serve.d.ts +7 -0
- package/dist/src/cli/serve.d.ts.map +1 -0
- package/dist/src/cli/serve.js +100 -0
- package/dist/src/cli/serve.js.map +1 -0
- package/dist/src/cli/sync.d.ts +5 -0
- package/dist/src/cli/sync.d.ts.map +1 -0
- package/dist/src/cli/sync.js +13 -0
- package/dist/src/cli/sync.js.map +1 -0
- package/dist/src/compaction/pipeline.d.ts +19 -0
- package/dist/src/compaction/pipeline.d.ts.map +1 -0
- package/dist/src/compaction/pipeline.js +37 -0
- package/dist/src/compaction/pipeline.js.map +1 -0
- package/dist/src/compaction/providers/cli.d.ts +13 -0
- package/dist/src/compaction/providers/cli.d.ts.map +1 -0
- package/dist/src/compaction/providers/cli.js +60 -0
- package/dist/src/compaction/providers/cli.js.map +1 -0
- package/dist/src/compaction/rule-based.d.ts +8 -0
- package/dist/src/compaction/rule-based.d.ts.map +1 -0
- package/dist/src/compaction/rule-based.js +120 -0
- package/dist/src/compaction/rule-based.js.map +1 -0
- package/dist/src/config/loader.d.ts +12 -0
- package/dist/src/config/loader.d.ts.map +1 -0
- package/dist/src/config/loader.js +76 -0
- package/dist/src/config/loader.js.map +1 -0
- package/dist/src/config/mappings/claude-code.d.ts +3 -0
- package/dist/src/config/mappings/claude-code.d.ts.map +1 -0
- package/dist/src/config/mappings/claude-code.js +31 -0
- package/dist/src/config/mappings/claude-code.js.map +1 -0
- package/dist/src/config/mappings/codex.d.ts +3 -0
- package/dist/src/config/mappings/codex.d.ts.map +1 -0
- package/dist/src/config/mappings/codex.js +31 -0
- package/dist/src/config/mappings/codex.js.map +1 -0
- package/dist/src/config/mappings/copilot.d.ts +3 -0
- package/dist/src/config/mappings/copilot.d.ts.map +1 -0
- package/dist/src/config/mappings/copilot.js +33 -0
- package/dist/src/config/mappings/copilot.js.map +1 -0
- package/dist/src/config/mappings/cursor.d.ts +3 -0
- package/dist/src/config/mappings/cursor.d.ts.map +1 -0
- package/dist/src/config/mappings/cursor.js +29 -0
- package/dist/src/config/mappings/cursor.js.map +1 -0
- package/dist/src/config/sync.d.ts +13 -0
- package/dist/src/config/sync.d.ts.map +1 -0
- package/dist/src/config/sync.js +96 -0
- package/dist/src/config/sync.js.map +1 -0
- package/dist/src/ingestion/coordinator.d.ts +37 -0
- package/dist/src/ingestion/coordinator.d.ts.map +1 -0
- package/dist/src/ingestion/coordinator.js +127 -0
- package/dist/src/ingestion/coordinator.js.map +1 -0
- package/dist/src/ingestion/daemon.d.ts +17 -0
- package/dist/src/ingestion/daemon.d.ts.map +1 -0
- package/dist/src/ingestion/daemon.js +35 -0
- package/dist/src/ingestion/daemon.js.map +1 -0
- package/dist/src/ingestion/watcher.d.ts +19 -0
- package/dist/src/ingestion/watcher.d.ts.map +1 -0
- package/dist/src/ingestion/watcher.js +70 -0
- package/dist/src/ingestion/watcher.js.map +1 -0
- package/dist/src/knowledge/autotag.d.ts +3 -0
- package/dist/src/knowledge/autotag.d.ts.map +1 -0
- package/dist/src/knowledge/autotag.js +24 -0
- package/dist/src/knowledge/autotag.js.map +1 -0
- package/dist/src/knowledge/dedup.d.ts +7 -0
- package/dist/src/knowledge/dedup.d.ts.map +1 -0
- package/dist/src/knowledge/dedup.js +15 -0
- package/dist/src/knowledge/dedup.js.map +1 -0
- package/dist/src/knowledge/repository.d.ts +12 -0
- package/dist/src/knowledge/repository.d.ts.map +1 -0
- package/dist/src/knowledge/repository.js +74 -0
- package/dist/src/knowledge/repository.js.map +1 -0
- package/dist/src/mcp/server.d.ts +31 -0
- package/dist/src/mcp/server.d.ts.map +1 -0
- package/dist/src/mcp/server.js +323 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/tools/config.d.ts +36 -0
- package/dist/src/mcp/tools/config.d.ts.map +1 -0
- package/dist/src/mcp/tools/config.js +54 -0
- package/dist/src/mcp/tools/config.js.map +1 -0
- package/dist/src/mcp/tools/knowledge.d.ts +17 -0
- package/dist/src/mcp/tools/knowledge.d.ts.map +1 -0
- package/dist/src/mcp/tools/knowledge.js +46 -0
- package/dist/src/mcp/tools/knowledge.js.map +1 -0
- package/dist/src/mcp/tools/search.d.ts +22 -0
- package/dist/src/mcp/tools/search.d.ts.map +1 -0
- package/dist/src/mcp/tools/search.js +30 -0
- package/dist/src/mcp/tools/search.js.map +1 -0
- package/dist/src/mcp/tools/sessions.d.ts +38 -0
- package/dist/src/mcp/tools/sessions.d.ts.map +1 -0
- package/dist/src/mcp/tools/sessions.js +55 -0
- package/dist/src/mcp/tools/sessions.js.map +1 -0
- package/dist/src/mcp/tools/write.d.ts +38 -0
- package/dist/src/mcp/tools/write.d.ts.map +1 -0
- package/dist/src/mcp/tools/write.js +97 -0
- package/dist/src/mcp/tools/write.js.map +1 -0
- package/dist/src/runtime/ingestion.d.ts +17 -0
- package/dist/src/runtime/ingestion.d.ts.map +1 -0
- package/dist/src/runtime/ingestion.js +106 -0
- package/dist/src/runtime/ingestion.js.map +1 -0
- package/dist/src/runtime/services.d.ts +46 -0
- package/dist/src/runtime/services.d.ts.map +1 -0
- package/dist/src/runtime/services.js +227 -0
- package/dist/src/runtime/services.js.map +1 -0
- package/dist/src/scrapers/base.d.ts +10 -0
- package/dist/src/scrapers/base.d.ts.map +1 -0
- package/dist/src/scrapers/base.js +34 -0
- package/dist/src/scrapers/base.js.map +1 -0
- package/dist/src/scrapers/claude-code.d.ts +16 -0
- package/dist/src/scrapers/claude-code.d.ts.map +1 -0
- package/dist/src/scrapers/claude-code.js +120 -0
- package/dist/src/scrapers/claude-code.js.map +1 -0
- package/dist/src/scrapers/codex.d.ts +17 -0
- package/dist/src/scrapers/codex.d.ts.map +1 -0
- package/dist/src/scrapers/codex.js +179 -0
- package/dist/src/scrapers/codex.js.map +1 -0
- package/dist/src/scrapers/copilot.d.ts +17 -0
- package/dist/src/scrapers/copilot.d.ts.map +1 -0
- package/dist/src/scrapers/copilot.js +198 -0
- package/dist/src/scrapers/copilot.js.map +1 -0
- package/dist/src/scrapers/cursor.d.ts +18 -0
- package/dist/src/scrapers/cursor.d.ts.map +1 -0
- package/dist/src/scrapers/cursor.js +218 -0
- package/dist/src/scrapers/cursor.js.map +1 -0
- package/dist/src/scrapers/gemini.d.ts +17 -0
- package/dist/src/scrapers/gemini.d.ts.map +1 -0
- package/dist/src/scrapers/gemini.js +245 -0
- package/dist/src/scrapers/gemini.js.map +1 -0
- package/dist/src/scrapers/registry.d.ts +9 -0
- package/dist/src/scrapers/registry.d.ts.map +1 -0
- package/dist/src/scrapers/registry.js +22 -0
- package/dist/src/scrapers/registry.js.map +1 -0
- package/dist/src/store/embeddings.d.ts +9 -0
- package/dist/src/store/embeddings.d.ts.map +1 -0
- package/dist/src/store/embeddings.js +28 -0
- package/dist/src/store/embeddings.js.map +1 -0
- package/dist/src/store/lance.d.ts +25 -0
- package/dist/src/store/lance.d.ts.map +1 -0
- package/dist/src/store/lance.js +74 -0
- package/dist/src/store/lance.js.map +1 -0
- package/dist/src/store/search.d.ts +18 -0
- package/dist/src/store/search.d.ts.map +1 -0
- package/dist/src/store/search.js +55 -0
- package/dist/src/store/search.js.map +1 -0
- package/dist/src/types/compaction.d.ts +29 -0
- package/dist/src/types/compaction.d.ts.map +1 -0
- package/dist/src/types/compaction.js +2 -0
- package/dist/src/types/compaction.js.map +1 -0
- package/dist/src/types/config.d.ts +45 -0
- package/dist/src/types/config.d.ts.map +1 -0
- package/dist/src/types/config.js +2 -0
- package/dist/src/types/config.js.map +1 -0
- package/dist/src/types/context.d.ts +33 -0
- package/dist/src/types/context.d.ts.map +1 -0
- package/dist/src/types/context.js +18 -0
- package/dist/src/types/context.js.map +1 -0
- package/dist/src/types/index.d.ts +5 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +5 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/scraper.d.ts +70 -0
- package/dist/src/types/scraper.d.ts.map +1 -0
- package/dist/src/types/scraper.js +2 -0
- package/dist/src/types/scraper.js.map +1 -0
- package/dist/src/utils/retry.d.ts +11 -0
- package/dist/src/utils/retry.d.ts.map +1 -0
- package/dist/src/utils/retry.js +46 -0
- package/dist/src/utils/retry.js.map +1 -0
- package/dist/src/utils/shutdown.d.ts +25 -0
- package/dist/src/utils/shutdown.d.ts.map +1 -0
- package/dist/src/utils/shutdown.js +56 -0
- package/dist/src/utils/shutdown.js.map +1 -0
- package/dist/web/apple-touch-icon.png +0 -0
- package/dist/web/assets/index-Nuadr5ox.css +1 -0
- package/dist/web/assets/index-aA0u8eXA.js +3504 -0
- package/dist/web/assets/primeicons-C6QP2o4f.woff2 +0 -0
- package/dist/web/assets/primeicons-DMOk5skT.eot +0 -0
- package/dist/web/assets/primeicons-Dr5RGzOO.svg +345 -0
- package/dist/web/assets/primeicons-MpK4pl85.ttf +0 -0
- package/dist/web/assets/primeicons-WjwUDZjB.woff +0 -0
- package/dist/web/favicon.ico +0 -0
- package/dist/web/favicon.svg +21 -0
- package/dist/web/index.html +21 -0
- package/dist/web/site.webmanifest +19 -0
- package/dist/web/vite.svg +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export declare const CONTEXT_TYPES: readonly ["decision", "error_solution", "insight", "convention", "gotcha", "faq"];
|
|
2
|
+
export type ContextType = (typeof CONTEXT_TYPES)[number];
|
|
3
|
+
export interface ContextRecord {
|
|
4
|
+
id: string;
|
|
5
|
+
type: ContextType;
|
|
6
|
+
created_at: string;
|
|
7
|
+
supersedes?: string;
|
|
8
|
+
superseded_by?: string;
|
|
9
|
+
source_tool: string;
|
|
10
|
+
source_session?: string;
|
|
11
|
+
referenced_files: string[];
|
|
12
|
+
domain_tags: string[];
|
|
13
|
+
environment: {
|
|
14
|
+
runtime_versions?: Record<string, string>;
|
|
15
|
+
dependency_versions?: Record<string, string>;
|
|
16
|
+
os?: string;
|
|
17
|
+
tool_version?: string;
|
|
18
|
+
};
|
|
19
|
+
title: string;
|
|
20
|
+
body: string;
|
|
21
|
+
metadata?: Record<string, unknown>;
|
|
22
|
+
}
|
|
23
|
+
export type WriteAction = "created" | "superseded" | "duplicate_rejected";
|
|
24
|
+
export interface WriteResult {
|
|
25
|
+
action: WriteAction;
|
|
26
|
+
id: string;
|
|
27
|
+
existing?: ContextRecord;
|
|
28
|
+
replaced?: string;
|
|
29
|
+
message?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare function createContextRecordId(title: string, body: string, sourceTool: string): string;
|
|
32
|
+
export declare function isValidContextType(type: string): type is ContextType;
|
|
33
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/types/context.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,mFAOhB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE;QACX,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1C,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7C,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,YAAY,GAAG,oBAAoB,CAAC;AAE1E,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB,MAAM,CAIR;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,WAAW,CAEpE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
export const CONTEXT_TYPES = [
|
|
3
|
+
"decision",
|
|
4
|
+
"error_solution",
|
|
5
|
+
"insight",
|
|
6
|
+
"convention",
|
|
7
|
+
"gotcha",
|
|
8
|
+
"faq",
|
|
9
|
+
];
|
|
10
|
+
export function createContextRecordId(title, body, sourceTool) {
|
|
11
|
+
const hash = createHash("sha256");
|
|
12
|
+
hash.update(`${title}|${body}|${sourceTool}`);
|
|
13
|
+
return hash.digest("hex").slice(0, 16);
|
|
14
|
+
}
|
|
15
|
+
export function isValidContextType(type) {
|
|
16
|
+
return CONTEXT_TYPES.includes(type);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/types/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,UAAU;IACV,gBAAgB;IAChB,SAAS;IACT,YAAY;IACZ,QAAQ;IACR,KAAK;CACG,CAAC;AAmCX,MAAM,UAAU,qBAAqB,CACnC,KAAa,EACb,IAAY,EACZ,UAAkB;IAElB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI,IAAI,IAAI,UAAU,EAAE,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,aAAa,CAAC,QAAQ,CAAC,IAAmB,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export interface ChunkMetadata {
|
|
2
|
+
messageIndex: number;
|
|
3
|
+
tokenEstimate?: number;
|
|
4
|
+
referencedFiles?: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface ConversationChunk {
|
|
7
|
+
tool: string;
|
|
8
|
+
sessionId: string;
|
|
9
|
+
timestamp: Date;
|
|
10
|
+
role: "user" | "assistant" | "system" | "tool";
|
|
11
|
+
content: string;
|
|
12
|
+
metadata: ChunkMetadata;
|
|
13
|
+
}
|
|
14
|
+
export interface ScraperState {
|
|
15
|
+
lastTimestamp: Date;
|
|
16
|
+
lastOffset?: number;
|
|
17
|
+
lastRowId?: number;
|
|
18
|
+
checksum?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ConversationScraper<T extends ConversationChunk = ConversationChunk> {
|
|
21
|
+
readonly tool: string;
|
|
22
|
+
detect(): Promise<boolean>;
|
|
23
|
+
getStorePaths(): string[];
|
|
24
|
+
scrape(since?: Date): AsyncIterable<T>;
|
|
25
|
+
fullSync(): AsyncIterable<T>;
|
|
26
|
+
parseRaw(raw: unknown): T;
|
|
27
|
+
getLastScrapedPosition(): Promise<ScraperState>;
|
|
28
|
+
saveScrapedPosition(state: ScraperState): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
export interface ClaudeCodeChunk extends ConversationChunk {
|
|
31
|
+
tool: "claude-code";
|
|
32
|
+
metadata: ChunkMetadata & {
|
|
33
|
+
toolCalls?: string[];
|
|
34
|
+
costUsd?: number;
|
|
35
|
+
sessionType: "interactive" | "headless";
|
|
36
|
+
permissionMode?: string;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export interface CursorChunk extends ConversationChunk {
|
|
40
|
+
tool: "cursor";
|
|
41
|
+
metadata: ChunkMetadata & {
|
|
42
|
+
composerMode: "normal" | "agent";
|
|
43
|
+
model: string;
|
|
44
|
+
tabContext?: string[];
|
|
45
|
+
codebaseSearchResults?: number;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export interface CodexChunk extends ConversationChunk {
|
|
49
|
+
tool: "codex";
|
|
50
|
+
metadata: ChunkMetadata & {
|
|
51
|
+
approvalMode: "suggest" | "auto-edit" | "full-auto";
|
|
52
|
+
sandboxed: boolean;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export interface CopilotChunk extends ConversationChunk {
|
|
56
|
+
tool: "copilot";
|
|
57
|
+
metadata: ChunkMetadata & {
|
|
58
|
+
model?: string;
|
|
59
|
+
completionType?: string;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export interface GeminiChunk extends ConversationChunk {
|
|
63
|
+
tool: "gemini";
|
|
64
|
+
metadata: ChunkMetadata & {
|
|
65
|
+
model?: string;
|
|
66
|
+
promptTokens?: number;
|
|
67
|
+
responseTokens?: number;
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=scraper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scraper.d.ts","sourceRoot":"","sources":["../../../src/types/scraper.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB,CAClC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB;IAE/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,aAAa,IAAI,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IACvC,QAAQ,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,CAAC,CAAC;IAC1B,sBAAsB,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IAChD,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACxD,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,aAAa,GAAG;QACxB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,aAAa,GAAG,UAAU,CAAC;QACxC,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED,MAAM,WAAW,WAAY,SAAQ,iBAAiB;IACpD,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,aAAa,GAAG;QACxB,YAAY,EAAE,QAAQ,GAAG,OAAO,CAAC;QACjC,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;KAChC,CAAC;CACH;AAED,MAAM,WAAW,UAAW,SAAQ,iBAAiB;IACnD,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,aAAa,GAAG;QACxB,YAAY,EAAE,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;QACpD,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACrD,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,aAAa,GAAG;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED,MAAM,WAAW,WAAY,SAAQ,iBAAiB;IACpD,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,aAAa,GAAG;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scraper.js","sourceRoot":"","sources":["../../../src/types/scraper.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface RetryOptions {
|
|
2
|
+
attempts?: number;
|
|
3
|
+
minDelayMs?: number;
|
|
4
|
+
maxDelayMs?: number;
|
|
5
|
+
factor?: number;
|
|
6
|
+
jitterMs?: number;
|
|
7
|
+
shouldRetry?: (error: unknown, attempt: number) => boolean;
|
|
8
|
+
onRetry?: (error: unknown, attempt: number, delayMs: number) => void;
|
|
9
|
+
}
|
|
10
|
+
export declare function withRetry<T>(operation: () => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
11
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../src/utils/retry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtE;AAYD,wBAAsB,SAAS,CAAC,CAAC,EAC/B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,CAiCZ"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
const DEFAULT_OPTIONS = {
|
|
2
|
+
attempts: 3,
|
|
3
|
+
minDelayMs: 250,
|
|
4
|
+
maxDelayMs: 2_000,
|
|
5
|
+
factor: 2,
|
|
6
|
+
jitterMs: 50,
|
|
7
|
+
};
|
|
8
|
+
export async function withRetry(operation, options = {}) {
|
|
9
|
+
const attempts = Math.max(1, options.attempts ?? DEFAULT_OPTIONS.attempts);
|
|
10
|
+
const minDelayMs = Math.max(0, options.minDelayMs ?? DEFAULT_OPTIONS.minDelayMs);
|
|
11
|
+
const maxDelayMs = Math.max(minDelayMs, options.maxDelayMs ?? DEFAULT_OPTIONS.maxDelayMs);
|
|
12
|
+
const factor = Math.max(1, options.factor ?? DEFAULT_OPTIONS.factor);
|
|
13
|
+
const jitterMs = Math.max(0, options.jitterMs ?? DEFAULT_OPTIONS.jitterMs);
|
|
14
|
+
let currentDelay = minDelayMs;
|
|
15
|
+
let lastError;
|
|
16
|
+
for (let attempt = 1; attempt <= attempts; attempt += 1) {
|
|
17
|
+
try {
|
|
18
|
+
return await operation();
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
lastError = error;
|
|
22
|
+
const shouldRetry = options.shouldRetry ? options.shouldRetry(error, attempt) : true;
|
|
23
|
+
const isLastAttempt = attempt >= attempts;
|
|
24
|
+
if (!shouldRetry || isLastAttempt) {
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
const delayMs = Math.min(maxDelayMs, currentDelay + randomJitter(jitterMs));
|
|
28
|
+
options.onRetry?.(error, attempt, delayMs);
|
|
29
|
+
await sleep(delayMs);
|
|
30
|
+
currentDelay = Math.min(maxDelayMs, Math.floor(currentDelay * factor) || minDelayMs);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
throw lastError;
|
|
34
|
+
}
|
|
35
|
+
function sleep(ms) {
|
|
36
|
+
return new Promise((resolve) => {
|
|
37
|
+
setTimeout(resolve, ms);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function randomJitter(max) {
|
|
41
|
+
if (max <= 0) {
|
|
42
|
+
return 0;
|
|
43
|
+
}
|
|
44
|
+
return Math.floor(Math.random() * (max + 1));
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/utils/retry.ts"],"names":[],"mappings":"AAUA,MAAM,eAAe,GAEjB;IACF,QAAQ,EAAE,CAAC;IACX,UAAU,EAAE,GAAG;IACf,UAAU,EAAE,KAAK;IACjB,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,SAA2B,EAC3B,UAAwB,EAAE;IAE1B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;IACjF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;IAC1F,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;IAE3E,IAAI,YAAY,GAAG,UAAU,CAAC;IAC9B,IAAI,SAAkB,CAAC;IAEvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,QAAQ,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,CAAC;YAClB,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACrF,MAAM,aAAa,GAAG,OAAO,IAAI,QAAQ,CAAC;YAE1C,IAAI,CAAC,WAAW,IAAI,aAAa,EAAE,CAAC;gBAClC,MAAM,KAAK,CAAC;YACd,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CACtB,UAAU,EACV,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,CACtC,CAAC;YACF,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC3C,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YACrB,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,UAAU,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACb,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type ShutdownHook = () => Promise<void> | void;
|
|
2
|
+
type SignalName = "SIGINT" | "SIGTERM";
|
|
3
|
+
export interface ShutdownError {
|
|
4
|
+
name: string;
|
|
5
|
+
error: unknown;
|
|
6
|
+
}
|
|
7
|
+
export interface ShutdownResult {
|
|
8
|
+
reason: string;
|
|
9
|
+
errors: ShutdownError[];
|
|
10
|
+
}
|
|
11
|
+
export declare class ShutdownCoordinator {
|
|
12
|
+
private readonly hooks;
|
|
13
|
+
private shutdownPromise;
|
|
14
|
+
private signalHandlers;
|
|
15
|
+
register(name: string, hook: ShutdownHook): void;
|
|
16
|
+
installSignalHandlers(onSignal: (signal: SignalName) => void): void;
|
|
17
|
+
removeSignalHandlers(): void;
|
|
18
|
+
run(reason?: string): Promise<ShutdownResult>;
|
|
19
|
+
private execute;
|
|
20
|
+
}
|
|
21
|
+
export declare function closeHttpServer(server: {
|
|
22
|
+
close: (cb: (error?: Error | null) => void) => void;
|
|
23
|
+
}): Promise<void>;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=shutdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../../../src/utils/shutdown.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACtD,KAAK,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEvC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmD;IACzE,OAAO,CAAC,eAAe,CAAwC;IAC/D,OAAO,CAAC,cAAc,CAA+C;IAErE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI;IAIhD,qBAAqB,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;IAWnE,oBAAoB,IAAI,IAAI;IAYtB,GAAG,CAAC,MAAM,SAAa,GAAG,OAAO,CAAC,cAAc,CAAC;YAQzC,OAAO;CAatB;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC5C,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC;CACrD,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export class ShutdownCoordinator {
|
|
2
|
+
hooks = [];
|
|
3
|
+
shutdownPromise = null;
|
|
4
|
+
signalHandlers = {};
|
|
5
|
+
register(name, hook) {
|
|
6
|
+
this.hooks.push({ name, hook });
|
|
7
|
+
}
|
|
8
|
+
installSignalHandlers(onSignal) {
|
|
9
|
+
this.removeSignalHandlers();
|
|
10
|
+
const sigint = () => onSignal("SIGINT");
|
|
11
|
+
const sigterm = () => onSignal("SIGTERM");
|
|
12
|
+
this.signalHandlers.SIGINT = sigint;
|
|
13
|
+
this.signalHandlers.SIGTERM = sigterm;
|
|
14
|
+
process.once("SIGINT", sigint);
|
|
15
|
+
process.once("SIGTERM", sigterm);
|
|
16
|
+
}
|
|
17
|
+
removeSignalHandlers() {
|
|
18
|
+
if (this.signalHandlers.SIGINT) {
|
|
19
|
+
process.off("SIGINT", this.signalHandlers.SIGINT);
|
|
20
|
+
}
|
|
21
|
+
if (this.signalHandlers.SIGTERM) {
|
|
22
|
+
process.off("SIGTERM", this.signalHandlers.SIGTERM);
|
|
23
|
+
}
|
|
24
|
+
this.signalHandlers = {};
|
|
25
|
+
}
|
|
26
|
+
async run(reason = "shutdown") {
|
|
27
|
+
if (!this.shutdownPromise) {
|
|
28
|
+
this.shutdownPromise = this.execute(reason);
|
|
29
|
+
}
|
|
30
|
+
return this.shutdownPromise;
|
|
31
|
+
}
|
|
32
|
+
async execute(reason) {
|
|
33
|
+
const errors = [];
|
|
34
|
+
for (const { name, hook } of [...this.hooks].reverse()) {
|
|
35
|
+
try {
|
|
36
|
+
await hook();
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
errors.push({ name, error });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return { reason, errors };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export async function closeHttpServer(server) {
|
|
46
|
+
await new Promise((resolve, reject) => {
|
|
47
|
+
server.close((error) => {
|
|
48
|
+
if (error) {
|
|
49
|
+
reject(error);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
resolve();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=shutdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../../../src/utils/shutdown.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,mBAAmB;IACb,KAAK,GAAgD,EAAE,CAAC;IACjE,eAAe,GAAmC,IAAI,CAAC;IACvD,cAAc,GAA4C,EAAE,CAAC;IAErE,QAAQ,CAAC,IAAY,EAAE,IAAkB;QACvC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,qBAAqB,CAAC,QAAsC;QAC1D,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5B,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC;QACpC,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,OAAO,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,oBAAoB;QAClB,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,UAAU;QAC3B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,MAAc;QAClC,MAAM,MAAM,GAAoB,EAAE,CAAC;QAEnC,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,IAAI,EAAE,CAAC;YACf,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAErC;IACC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,KAAK,CAAC,CAAC,KAAoB,EAAE,EAAE;YACpC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&family=Manrope:wght@400;500;600;700;800&family=Sora:wght@500;600;700&display=swap";@font-face{font-family:primeicons;font-display:block;src:url(/assets/primeicons-DMOk5skT.eot);src:url(/assets/primeicons-DMOk5skT.eot?#iefix) format("embedded-opentype"),url(/assets/primeicons-C6QP2o4f.woff2) format("woff2"),url(/assets/primeicons-WjwUDZjB.woff) format("woff"),url(/assets/primeicons-MpK4pl85.ttf) format("truetype"),url(/assets/primeicons-Dr5RGzOO.svg?#primeicons) format("svg");font-weight:400;font-style:normal}.pi{font-family:primeicons;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.pi:before{--webkit-backface-visibility:hidden;backface-visibility:hidden}.pi-fw{width:1.28571429em;text-align:center}.pi-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@media(prefers-reduced-motion:reduce){.pi-spin{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-transition-delay:0s;transition-delay:0s;-webkit-transition-duration:0s;transition-duration:0s}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.pi-folder-plus:before{content:""}.pi-receipt:before{content:""}.pi-asterisk:before{content:""}.pi-face-smile:before{content:""}.pi-pinterest:before{content:""}.pi-expand:before{content:""}.pi-pen-to-square:before{content:""}.pi-wave-pulse:before{content:""}.pi-turkish-lira:before{content:""}.pi-spinner-dotted:before{content:""}.pi-crown:before{content:""}.pi-pause-circle:before{content:""}.pi-warehouse:before{content:""}.pi-objects-column:before{content:""}.pi-clipboard:before{content:""}.pi-play-circle:before{content:""}.pi-venus:before{content:""}.pi-cart-minus:before{content:""}.pi-file-plus:before{content:""}.pi-microchip:before{content:""}.pi-twitch:before{content:""}.pi-building-columns:before{content:""}.pi-file-check:before{content:""}.pi-microchip-ai:before{content:""}.pi-trophy:before{content:""}.pi-barcode:before{content:""}.pi-file-arrow-up:before{content:""}.pi-mars:before{content:""}.pi-tiktok:before{content:""}.pi-arrow-up-right-and-arrow-down-left-from-center:before{content:""}.pi-ethereum:before{content:""}.pi-list-check:before{content:""}.pi-thumbtack:before{content:""}.pi-arrow-down-left-and-arrow-up-right-to-center:before{content:""}.pi-equals:before{content:""}.pi-lightbulb:before{content:""}.pi-star-half:before{content:""}.pi-address-book:before{content:""}.pi-chart-scatter:before{content:""}.pi-indian-rupee:before{content:""}.pi-star-half-fill:before{content:""}.pi-cart-arrow-down:before{content:""}.pi-calendar-clock:before{content:""}.pi-sort-up-fill:before{content:""}.pi-sparkles:before{content:""}.pi-bullseye:before{content:""}.pi-sort-down-fill:before{content:""}.pi-graduation-cap:before{content:""}.pi-hammer:before{content:""}.pi-bell-slash:before{content:""}.pi-gauge:before{content:""}.pi-shop:before{content:""}.pi-headphones:before{content:""}.pi-eraser:before{content:""}.pi-stopwatch:before{content:""}.pi-verified:before{content:""}.pi-delete-left:before{content:""}.pi-hourglass:before{content:""}.pi-truck:before{content:""}.pi-wrench:before{content:""}.pi-microphone:before{content:""}.pi-megaphone:before{content:""}.pi-arrow-right-arrow-left:before{content:""}.pi-bitcoin:before{content:""}.pi-file-edit:before{content:""}.pi-language:before{content:""}.pi-file-export:before{content:""}.pi-file-import:before{content:""}.pi-file-word:before{content:""}.pi-gift:before{content:""}.pi-cart-plus:before{content:""}.pi-thumbs-down-fill:before{content:""}.pi-thumbs-up-fill:before{content:""}.pi-arrows-alt:before{content:""}.pi-calculator:before{content:""}.pi-sort-alt-slash:before{content:""}.pi-arrows-h:before{content:""}.pi-arrows-v:before{content:""}.pi-pound:before{content:""}.pi-prime:before{content:""}.pi-chart-pie:before{content:""}.pi-reddit:before{content:""}.pi-code:before{content:""}.pi-sync:before{content:""}.pi-shopping-bag:before{content:""}.pi-server:before{content:""}.pi-database:before{content:""}.pi-hashtag:before{content:""}.pi-bookmark-fill:before{content:""}.pi-filter-fill:before{content:""}.pi-heart-fill:before{content:""}.pi-flag-fill:before{content:""}.pi-circle:before{content:""}.pi-circle-fill:before{content:""}.pi-bolt:before{content:""}.pi-history:before{content:""}.pi-box:before{content:""}.pi-at:before{content:""}.pi-arrow-up-right:before{content:""}.pi-arrow-up-left:before{content:""}.pi-arrow-down-left:before{content:""}.pi-arrow-down-right:before{content:""}.pi-telegram:before{content:""}.pi-stop-circle:before{content:""}.pi-stop:before{content:""}.pi-whatsapp:before{content:""}.pi-building:before{content:""}.pi-qrcode:before{content:""}.pi-car:before{content:""}.pi-instagram:before{content:""}.pi-linkedin:before{content:""}.pi-send:before{content:""}.pi-slack:before{content:""}.pi-sun:before{content:""}.pi-moon:before{content:""}.pi-vimeo:before{content:""}.pi-youtube:before{content:""}.pi-flag:before{content:""}.pi-wallet:before{content:""}.pi-map:before{content:""}.pi-link:before{content:""}.pi-credit-card:before{content:""}.pi-discord:before{content:""}.pi-percentage:before{content:""}.pi-euro:before{content:""}.pi-book:before{content:""}.pi-shield:before{content:""}.pi-paypal:before{content:""}.pi-amazon:before{content:""}.pi-phone:before{content:""}.pi-filter-slash:before{content:""}.pi-facebook:before{content:""}.pi-github:before{content:""}.pi-twitter:before{content:""}.pi-step-backward-alt:before{content:""}.pi-step-forward-alt:before{content:""}.pi-forward:before{content:""}.pi-backward:before{content:""}.pi-fast-backward:before{content:""}.pi-fast-forward:before{content:""}.pi-pause:before{content:""}.pi-play:before{content:""}.pi-compass:before{content:""}.pi-id-card:before{content:""}.pi-ticket:before{content:""}.pi-file-o:before{content:""}.pi-reply:before{content:""}.pi-directions-alt:before{content:""}.pi-directions:before{content:""}.pi-thumbs-up:before{content:""}.pi-thumbs-down:before{content:""}.pi-sort-numeric-down-alt:before{content:""}.pi-sort-numeric-up-alt:before{content:""}.pi-sort-alpha-down-alt:before{content:""}.pi-sort-alpha-up-alt:before{content:""}.pi-sort-numeric-down:before{content:""}.pi-sort-numeric-up:before{content:""}.pi-sort-alpha-down:before{content:""}.pi-sort-alpha-up:before{content:""}.pi-sort-alt:before{content:""}.pi-sort-amount-up:before{content:""}.pi-sort-amount-down:before{content:""}.pi-sort-amount-down-alt:before{content:""}.pi-sort-amount-up-alt:before{content:""}.pi-palette:before{content:""}.pi-undo:before{content:""}.pi-desktop:before{content:""}.pi-sliders-v:before{content:""}.pi-sliders-h:before{content:""}.pi-search-plus:before{content:""}.pi-search-minus:before{content:""}.pi-file-excel:before{content:""}.pi-file-pdf:before{content:""}.pi-check-square:before{content:""}.pi-chart-line:before{content:""}.pi-user-edit:before{content:""}.pi-exclamation-circle:before{content:""}.pi-android:before{content:""}.pi-google:before{content:""}.pi-apple:before{content:""}.pi-microsoft:before{content:""}.pi-heart:before{content:""}.pi-mobile:before{content:""}.pi-tablet:before{content:""}.pi-key:before{content:""}.pi-shopping-cart:before{content:""}.pi-comments:before{content:""}.pi-comment:before{content:""}.pi-briefcase:before{content:""}.pi-bell:before{content:""}.pi-paperclip:before{content:""}.pi-share-alt:before{content:""}.pi-envelope:before{content:""}.pi-volume-down:before{content:""}.pi-volume-up:before{content:""}.pi-volume-off:before{content:""}.pi-eject:before{content:""}.pi-money-bill:before{content:""}.pi-images:before{content:""}.pi-image:before{content:""}.pi-sign-in:before{content:""}.pi-sign-out:before{content:""}.pi-wifi:before{content:""}.pi-sitemap:before{content:""}.pi-chart-bar:before{content:""}.pi-camera:before{content:""}.pi-dollar:before{content:""}.pi-lock-open:before{content:""}.pi-table:before{content:""}.pi-map-marker:before{content:""}.pi-list:before{content:""}.pi-eye-slash:before{content:""}.pi-eye:before{content:""}.pi-folder-open:before{content:""}.pi-folder:before{content:""}.pi-video:before{content:""}.pi-inbox:before{content:""}.pi-lock:before{content:""}.pi-unlock:before{content:""}.pi-tags:before{content:""}.pi-tag:before{content:""}.pi-power-off:before{content:""}.pi-save:before{content:""}.pi-question-circle:before{content:""}.pi-question:before{content:""}.pi-copy:before{content:""}.pi-file:before{content:""}.pi-clone:before{content:""}.pi-calendar-times:before{content:""}.pi-calendar-minus:before{content:""}.pi-calendar-plus:before{content:""}.pi-ellipsis-v:before{content:""}.pi-ellipsis-h:before{content:""}.pi-bookmark:before{content:""}.pi-globe:before{content:""}.pi-replay:before{content:""}.pi-filter:before{content:""}.pi-print:before{content:""}.pi-align-right:before{content:""}.pi-align-left:before{content:""}.pi-align-center:before{content:""}.pi-align-justify:before{content:""}.pi-cog:before{content:""}.pi-cloud-download:before{content:""}.pi-cloud-upload:before{content:""}.pi-cloud:before{content:""}.pi-pencil:before{content:""}.pi-users:before{content:""}.pi-clock:before{content:""}.pi-user-minus:before{content:""}.pi-user-plus:before{content:""}.pi-trash:before{content:""}.pi-external-link:before{content:""}.pi-window-maximize:before{content:""}.pi-window-minimize:before{content:""}.pi-refresh:before{content:""}.pi-user:before{content:""}.pi-exclamation-triangle:before{content:""}.pi-calendar:before{content:""}.pi-chevron-circle-left:before{content:""}.pi-chevron-circle-down:before{content:""}.pi-chevron-circle-right:before{content:""}.pi-chevron-circle-up:before{content:""}.pi-angle-double-down:before{content:""}.pi-angle-double-left:before{content:""}.pi-angle-double-right:before{content:""}.pi-angle-double-up:before{content:""}.pi-angle-down:before{content:""}.pi-angle-left:before{content:""}.pi-angle-right:before{content:""}.pi-angle-up:before{content:""}.pi-upload:before{content:""}.pi-download:before{content:""}.pi-ban:before{content:""}.pi-star-fill:before{content:""}.pi-star:before{content:""}.pi-chevron-left:before{content:""}.pi-chevron-right:before{content:""}.pi-chevron-down:before{content:""}.pi-chevron-up:before{content:""}.pi-caret-left:before{content:""}.pi-caret-right:before{content:""}.pi-caret-down:before{content:""}.pi-caret-up:before{content:""}.pi-search:before{content:""}.pi-check:before{content:""}.pi-check-circle:before{content:""}.pi-times:before{content:""}.pi-times-circle:before{content:""}.pi-plus:before{content:""}.pi-plus-circle:before{content:""}.pi-minus:before{content:""}.pi-minus-circle:before{content:""}.pi-circle-on:before{content:""}.pi-circle-off:before{content:""}.pi-sort-down:before{content:""}.pi-sort-up:before{content:""}.pi-sort:before{content:""}.pi-step-backward:before{content:""}.pi-step-forward:before{content:""}.pi-th-large:before{content:""}.pi-arrow-down:before{content:""}.pi-arrow-left:before{content:""}.pi-arrow-right:before{content:""}.pi-arrow-up:before{content:""}.pi-bars:before{content:""}.pi-arrow-circle-down:before{content:""}.pi-arrow-circle-left:before{content:""}.pi-arrow-circle-right:before{content:""}.pi-arrow-circle-up:before{content:""}.pi-info:before{content:""}.pi-info-circle:before{content:""}.pi-home:before{content:""}.pi-spinner:before{content:""}:root{--xt-font-heading: "Outfit", "Segoe UI", sans-serif;--xt-font-body: "Public Sans", "Segoe UI", sans-serif;--xt-font-mono: "IBM Plex Mono", "Consolas", monospace;--xt-radius-xs: 10px;--xt-radius-sm: 14px;--xt-radius-md: 18px;--xt-radius-lg: 24px;--xt-space-1: .25rem;--xt-space-2: .5rem;--xt-space-3: .75rem;--xt-space-4: 1rem;--xt-space-5: 1.5rem;--xt-space-6: 2rem;--xt-space-7: 2.75rem;--xt-shadow-sm: 0 8px 20px rgba(2, 9, 20, .28);--xt-shadow-md: 0 18px 40px rgba(2, 9, 20, .38);--xt-shadow-lg: 0 28px 60px rgba(2, 9, 20, .48);--xt-bg: #040a16;--xt-bg-soft: #091325;--xt-panel: rgba(11, 22, 39, .84);--xt-panel-strong: rgba(13, 26, 46, .95);--xt-card: rgba(15, 30, 52, .86);--xt-card-strong: rgba(18, 36, 62, .96);--xt-line: rgba(72, 107, 170, .4);--xt-line-soft: rgba(72, 107, 170, .25);--xt-text: #e8f1ff;--xt-text-muted: #91a8cf;--xt-text-soft: #b8c7df;--xt-accent: #31d4ab;--xt-accent-strong: #2ca58e;--xt-accent-alt: #4da9ff;--xt-warning: #f0b06f;--xt-danger: #f78091;--xt-focus: rgba(49, 212, 171, .5)}:root.light-mode{--xt-bg: #f3f7ff;--xt-bg-soft: #e6efff;--xt-panel: rgba(255, 255, 255, .87);--xt-panel-strong: rgba(255, 255, 255, .98);--xt-card: rgba(246, 250, 255, .92);--xt-card-strong: rgba(255, 255, 255, .99);--xt-line: rgba(68, 95, 141, .26);--xt-line-soft: rgba(68, 95, 141, .18);--xt-text: #142640;--xt-text-muted: #4e6386;--xt-text-soft: #3b5278;--xt-accent: #148a70;--xt-accent-strong: #106754;--xt-accent-alt: #1f78d9;--xt-warning: #a9642d;--xt-danger: #af4054;--xt-focus: rgba(20, 138, 112, .38);--xt-shadow-sm: 0 8px 20px rgba(16, 27, 51, .12);--xt-shadow-md: 0 16px 36px rgba(16, 27, 51, .16);--xt-shadow-lg: 0 24px 52px rgba(16, 27, 51, .2)}:root{color-scheme:dark;--ui-bg: #0b1220;--ui-bg-accent: #0f1a2d;--ui-surface: #101a2f;--ui-surface-2: #0f172a;--ui-surface-3: #0c1324;--ui-border: #27344d;--ui-border-2: #2f405d;--ui-text: #d8e2f0;--ui-text-muted: #9baac2;--ui-text-dim: #8291aa;--ui-accent: #2dd4bf;--ui-accent-2: #38bdf8;--ui-danger: #f87171;--ui-warning: #f59e0b;--ui-radius: 12px;--ui-radius-sm: 10px;--ui-shadow: 0 10px 24px rgba(3, 10, 20, .26)}:root.light-mode{color-scheme:light;--ui-bg: #f5f8fd;--ui-bg-accent: #edf3fb;--ui-surface: #ffffff;--ui-surface-2: #f8fbff;--ui-surface-3: #eef3fb;--ui-border: #d6e0ef;--ui-border-2: #c7d6ea;--ui-text: #15233a;--ui-text-muted: #4f6486;--ui-text-dim: #6b7d98;--ui-accent: #0f8f7b;--ui-accent-2: #0f6fd4;--ui-danger: #c93d4d;--ui-warning: #b56a16;--ui-shadow: 0 10px 26px rgba(32, 51, 84, .1)}*{box-sizing:border-box}html,body,#app{min-height:100%}body{margin:0;color:var(--ui-text);font-family:"Manrope",var(--xt-font-body);line-height:1.5;background:linear-gradient(180deg,rgba(56,189,248,.08),transparent 28%),linear-gradient(180deg,var(--ui-bg),var(--ui-bg-accent))}body:before{content:"";position:fixed;inset:0;pointer-events:none;background:linear-gradient(rgba(149,166,193,.06) 1px,transparent 1px),linear-gradient(90deg,rgba(149,166,193,.06) 1px,transparent 1px);background-size:34px 34px;opacity:.22}a{color:inherit;text-decoration:none}code,pre{font-family:"JetBrains Mono",var(--xt-font-mono)}.app-shell{position:relative;z-index:1;width:min(1280px,calc(100% - 3rem));margin:1.5rem auto 2.75rem;display:grid;gap:1rem}.shell-panel{border:1px solid var(--ui-border);border-radius:var(--ui-radius);background:var(--ui-surface);box-shadow:var(--ui-shadow)}.shell-topbar{padding:1.25rem 1.5rem;display:grid;gap:.95rem}.topbar-row{display:flex;align-items:center;justify-content:space-between;gap:1rem}.brand-block{display:grid;gap:.35rem}.eyebrow,.page-eyebrow,.context-label{margin:0;color:var(--ui-text-dim);font-family:"JetBrains Mono",var(--xt-font-mono);font-size:.68rem;letter-spacing:.12em;text-transform:uppercase}.brand-block h1{margin:0;font-family:"Sora",var(--xt-font-heading);font-size:clamp(1.6rem,2.2vw,2.15rem);line-height:1.12;letter-spacing:-.02em}.brand-subcopy{margin:0;color:var(--ui-text-muted);font-size:.98rem}.topbar-actions{display:flex;align-items:center;gap:.6rem}.topbar-status{display:flex;flex-wrap:wrap;gap:.5rem}.context-grid{display:grid;gap:.65rem;grid-template-columns:1.4fr 1fr}.context-item{border:1px solid var(--ui-border);border-radius:var(--ui-radius-sm);background:var(--ui-surface-2);padding:.8rem .95rem;display:grid;gap:.35rem}.context-item code{margin:0;font-size:.87rem;line-height:1.35;overflow-wrap:anywhere}.context-actions{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.context-links{display:flex;flex-wrap:wrap;gap:1rem}.context-links a{color:var(--ui-text-muted);font-size:.85rem;text-decoration:underline;text-underline-offset:.16rem}.start-button.p-button{min-width:10.5rem}.workspace-nav{padding:.7rem;display:flex;flex-wrap:wrap;gap:.6rem}.workspace-nav-item{min-height:2.6rem;padding-inline:1rem;border-radius:8px;border:1px solid var(--ui-border);background:var(--ui-surface-2);color:var(--ui-text-muted);display:inline-flex;align-items:center;justify-content:center;gap:.45rem;font-size:.92rem;font-weight:700;transition:background .12s ease}.workspace-nav-item:hover{color:var(--ui-text);background:var(--ui-surface-3)}.workspace-nav-item.active{color:#07151f;border-color:color-mix(in srgb,var(--ui-accent),#ffffff 24%);background:linear-gradient(115deg,color-mix(in srgb,var(--ui-accent),#ffffff 12%),color-mix(in srgb,var(--ui-accent-2),#ffffff 4%))}:root.light-mode .workspace-nav-item.active{color:#fff}.workspace-main{border:1px solid var(--ui-border);border-radius:var(--ui-radius);background:var(--ui-surface);box-shadow:var(--ui-shadow);padding:1.45rem;min-height:calc(100vh - 15rem)}.page-shell{display:grid;gap:1rem}.dashboard-shell{max-width:none}.page-head{display:grid;gap:.4rem}.page-head h2{margin:0;font-family:"Sora",var(--xt-font-heading);font-size:clamp(1.4rem,2.2vw,1.9rem);line-height:1.18;letter-spacing:-.02em}.page-head p{margin:0;color:var(--ui-text-muted);max-width:76ch}.surface-card{border-radius:var(--ui-radius-sm);border:1px solid var(--ui-border);background:var(--ui-surface-2);box-shadow:none}.kpi-grid{display:grid;gap:.85rem;grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}.kpi-card{min-height:0}.kpi-card .p-card-content{display:grid;gap:.4rem}.kpi-value{margin:0;font-family:"Sora",var(--xt-font-heading);font-size:1.95rem;line-height:1;letter-spacing:-.02em;color:var(--ui-accent)}.kpi-label{margin:0;color:var(--ui-text-muted);font-size:.92rem}.split-grid{display:grid;gap:.85rem;grid-template-columns:repeat(auto-fit,minmax(340px,1fr))}.search-controls{display:flex;flex-wrap:wrap;align-items:center;gap:.7rem}.helper-copy{margin:0;color:var(--ui-text-muted);line-height:1.5}.flow-list{margin:0;padding-left:1.2rem;display:grid;gap:.55rem;line-height:1.55}.detail-list{margin:0;display:grid;gap:.8rem}.detail-list dt{margin:0;color:var(--ui-text-dim);font-size:.68rem;letter-spacing:.1em;text-transform:uppercase}.detail-list dd{margin:.15rem 0 0}.detail-list code{overflow-wrap:anywhere;font-size:.88rem}.query-input{min-width:min(420px,100%);flex:1}.type-select{width:12rem}.chip-row{display:flex;flex-wrap:wrap;gap:.55rem}.chip-row-top{margin-top:.7rem}.result-grid{display:grid;gap:.85rem}.result-title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:.65rem}.result-meta{margin:0;color:var(--ui-text-dim);font-size:.85rem;line-height:1.45}.result-body{margin:0;line-height:1.55}.result-footer{margin-top:.7rem;display:flex;flex-wrap:wrap;gap:.45rem}.empty-card{border-style:dashed}.empty-title{margin:0;font-size:1rem;font-weight:700}.table-note{margin:0;color:var(--ui-text-muted);font-size:.86rem;line-height:1.45}.table-note-top{margin-top:.75rem}.code-block{margin:.8rem 0 0;padding:.95rem;border-radius:8px;border:1px solid var(--ui-border);background:#0a1426;color:#c9d8ef;overflow:auto;font-size:.8rem;line-height:1.45}:root.light-mode .code-block{background:#eff4fc;color:#223552}.mb-2{margin-bottom:.75rem}.p-card{background:transparent;box-shadow:none}.p-card .p-card-body{padding:1rem}.p-card .p-card-title{font-family:"Sora",var(--xt-font-heading);font-size:1.04rem;line-height:1.25;letter-spacing:-.01em}.p-card .p-card-subtitle{color:var(--ui-text-dim);font-size:.84rem}.p-card .p-card-content{padding-top:0}.p-button{border-radius:8px;font-weight:700;min-height:2.55rem;padding-inline:.95rem}.p-button:not(.p-button-outlined):not(.p-button-text):not(.p-button-secondary){border:1px solid transparent;color:#07161d;background:linear-gradient(115deg,var(--ui-accent),var(--ui-accent-2));box-shadow:none}:root.light-mode .p-button:not(.p-button-outlined):not(.p-button-text):not(.p-button-secondary){color:#fff}.p-button.p-button-outlined,.p-button.p-button-text{border-color:var(--ui-border-2);color:var(--ui-text-muted)}.p-button.p-button-outlined:hover,.p-button.p-button-text:hover{color:var(--ui-text);background:var(--ui-surface-3)}.p-inputtext,.p-select,.p-selectbutton .p-togglebutton,.p-datatable-wrapper,.p-dropdown{border-radius:8px;min-height:2.55rem}.p-inputtext,.p-select,.p-dropdown{border-color:var(--ui-border-2);background:var(--ui-surface-3);color:var(--ui-text)}.p-selectbutton .p-togglebutton{min-width:5.8rem;border-color:var(--ui-border-2);background:var(--ui-surface-3);color:var(--ui-text-muted)}.p-selectbutton .p-togglebutton.p-togglebutton-checked{background:color-mix(in srgb,var(--ui-accent),#000000 22%);border-color:color-mix(in srgb,var(--ui-accent),#ffffff 6%);color:#e9fffb}.p-datatable{border:1px solid var(--ui-border);border-radius:10px;overflow:hidden;background:var(--ui-surface-3)}.p-datatable .p-datatable-thead>tr>th{background:color-mix(in srgb,var(--ui-surface-2),#000000 12%);color:var(--ui-text-dim);font-size:.78rem;letter-spacing:.07em;text-transform:uppercase}.p-datatable .p-datatable-thead>tr>th,.p-datatable .p-datatable-tbody>tr>td{padding:.72rem .82rem;border-color:var(--ui-border)}.p-message{border-radius:8px}.p-tag{border-radius:7px;font-size:.74rem;font-weight:700}.p-button:focus-visible,a:focus-visible,input:focus-visible,.workspace-nav-item:focus-visible{outline:2px solid var(--xt-focus);outline-offset:2px}@media(max-width:960px){.app-shell{width:calc(100% - 2rem)}.topbar-row{align-items:flex-start;flex-direction:column}.topbar-actions{justify-content:flex-start}.context-grid{grid-template-columns:1fr}.context-actions{align-items:stretch;flex-direction:column}.start-button.p-button{width:100%}.workspace-main{padding:1rem}.split-grid{grid-template-columns:1fr}}@media(max-width:700px){.app-shell{width:calc(100% - 1.25rem);margin-top:.8rem}.shell-topbar{padding:1rem}.workspace-nav{gap:.45rem}.workspace-nav-item{flex:1 1 calc(50% - .3rem)}.p-card .p-card-body{padding:.88rem}.query-input,.type-select{width:100%;min-width:100%}}@media(max-width:460px){.workspace-nav-item{flex:1 1 100%}.brand-block h1{font-size:1.42rem}}@media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
|