@jamesaphoenix/tx-core 0.4.2 → 0.4.3
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/README.md +480 -0
- package/dist/db.d.ts +28 -14
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +102 -14
- package/dist/db.js.map +1 -1
- package/dist/errors.d.ts +178 -34
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +119 -26
- package/dist/errors.js.map +1 -1
- package/dist/id.d.ts +10 -0
- package/dist/id.d.ts.map +1 -1
- package/dist/id.js +17 -1
- package/dist/id.js.map +1 -1
- package/dist/index.d.ts +15 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +62 -8
- package/dist/index.js.map +1 -1
- package/dist/layer.d.ts +23 -14
- package/dist/layer.d.ts.map +1 -1
- package/dist/layer.js +75 -76
- package/dist/layer.js.map +1 -1
- package/dist/mappers/anchor.d.ts +15 -1
- package/dist/mappers/anchor.d.ts.map +1 -1
- package/dist/mappers/anchor.js +95 -28
- package/dist/mappers/anchor.js.map +1 -1
- package/dist/mappers/attempt.d.ts +3 -1
- package/dist/mappers/attempt.d.ts.map +1 -1
- package/dist/mappers/attempt.js +23 -9
- package/dist/mappers/attempt.js.map +1 -1
- package/dist/mappers/candidate.d.ts +3 -1
- package/dist/mappers/candidate.d.ts.map +1 -1
- package/dist/mappers/candidate.js +46 -16
- package/dist/mappers/candidate.js.map +1 -1
- package/dist/mappers/claim.d.ts +1 -1
- package/dist/mappers/claim.d.ts.map +1 -1
- package/dist/mappers/claim.js +11 -4
- package/dist/mappers/claim.js.map +1 -1
- package/dist/mappers/deduplication.d.ts +13 -1
- package/dist/mappers/deduplication.d.ts.map +1 -1
- package/dist/mappers/deduplication.js +22 -3
- package/dist/mappers/deduplication.js.map +1 -1
- package/dist/mappers/doc.d.ts +24 -0
- package/dist/mappers/doc.d.ts.map +1 -0
- package/dist/mappers/doc.js +161 -0
- package/dist/mappers/doc.js.map +1 -0
- package/dist/mappers/edge.d.ts +10 -1
- package/dist/mappers/edge.d.ts.map +1 -1
- package/dist/mappers/edge.js +74 -12
- package/dist/mappers/edge.js.map +1 -1
- package/dist/mappers/file-learning.d.ts.map +1 -1
- package/dist/mappers/file-learning.js +2 -1
- package/dist/mappers/file-learning.js.map +1 -1
- package/dist/mappers/index.d.ts +6 -7
- package/dist/mappers/index.d.ts.map +1 -1
- package/dist/mappers/index.js +10 -12
- package/dist/mappers/index.js.map +1 -1
- package/dist/mappers/learning.d.ts +9 -1
- package/dist/mappers/learning.d.ts.map +1 -1
- package/dist/mappers/learning.js +94 -14
- package/dist/mappers/learning.js.map +1 -1
- package/dist/mappers/orchestrator-state.d.ts +1 -1
- package/dist/mappers/orchestrator-state.d.ts.map +1 -1
- package/dist/mappers/orchestrator-state.js +31 -5
- package/dist/mappers/orchestrator-state.js.map +1 -1
- package/dist/mappers/parse-date.d.ts +11 -0
- package/dist/mappers/parse-date.d.ts.map +1 -0
- package/dist/mappers/parse-date.js +18 -0
- package/dist/mappers/parse-date.js.map +1 -0
- package/dist/mappers/run.d.ts +14 -4
- package/dist/mappers/run.d.ts.map +1 -1
- package/dist/mappers/run.js +49 -18
- package/dist/mappers/run.js.map +1 -1
- package/dist/mappers/task.d.ts +5 -1
- package/dist/mappers/task.d.ts.map +1 -1
- package/dist/mappers/task.js +66 -16
- package/dist/mappers/task.js.map +1 -1
- package/dist/mappers/tracked-project.d.ts +3 -1
- package/dist/mappers/tracked-project.d.ts.map +1 -1
- package/dist/mappers/tracked-project.js +23 -9
- package/dist/mappers/tracked-project.js.map +1 -1
- package/dist/mappers/worker.d.ts +1 -1
- package/dist/mappers/worker.d.ts.map +1 -1
- package/dist/mappers/worker.js +44 -6
- package/dist/mappers/worker.js.map +1 -1
- package/dist/repo/anchor-repo.d.ts +2 -2
- package/dist/repo/anchor-repo.d.ts.map +1 -1
- package/dist/repo/anchor-repo.js +46 -5
- package/dist/repo/anchor-repo.js.map +1 -1
- package/dist/repo/attempt-repo.d.ts +2 -2
- package/dist/repo/attempt-repo.d.ts.map +1 -1
- package/dist/repo/attempt-repo.js +16 -6
- package/dist/repo/attempt-repo.js.map +1 -1
- package/dist/repo/candidate-repo.d.ts.map +1 -1
- package/dist/repo/candidate-repo.js +22 -1
- package/dist/repo/candidate-repo.js.map +1 -1
- package/dist/repo/claim-repo.d.ts +46 -2
- package/dist/repo/claim-repo.d.ts.map +1 -1
- package/dist/repo/claim-repo.js +113 -6
- package/dist/repo/claim-repo.js.map +1 -1
- package/dist/repo/compaction-repo.d.ts +41 -0
- package/dist/repo/compaction-repo.d.ts.map +1 -0
- package/dist/repo/compaction-repo.js +84 -0
- package/dist/repo/compaction-repo.js.map +1 -0
- package/dist/repo/deduplication-repo.d.ts +9 -1
- package/dist/repo/deduplication-repo.d.ts.map +1 -1
- package/dist/repo/deduplication-repo.js +46 -9
- package/dist/repo/deduplication-repo.js.map +1 -1
- package/dist/repo/dep-repo.d.ts +27 -3
- package/dist/repo/dep-repo.d.ts.map +1 -1
- package/dist/repo/dep-repo.js +166 -39
- package/dist/repo/dep-repo.js.map +1 -1
- package/dist/repo/doc-repo.d.ts +59 -0
- package/dist/repo/doc-repo.d.ts.map +1 -0
- package/dist/repo/doc-repo.js +276 -0
- package/dist/repo/doc-repo.js.map +1 -0
- package/dist/repo/edge-repo.d.ts +1 -1
- package/dist/repo/edge-repo.d.ts.map +1 -1
- package/dist/repo/edge-repo.js +65 -34
- package/dist/repo/edge-repo.js.map +1 -1
- package/dist/repo/file-learning-repo.d.ts +3 -3
- package/dist/repo/file-learning-repo.d.ts.map +1 -1
- package/dist/repo/file-learning-repo.js +19 -8
- package/dist/repo/file-learning-repo.js.map +1 -1
- package/dist/repo/index.d.ts +4 -6
- package/dist/repo/index.d.ts.map +1 -1
- package/dist/repo/index.js +3 -5
- package/dist/repo/index.js.map +1 -1
- package/dist/repo/learning-repo.d.ts +10 -3
- package/dist/repo/learning-repo.d.ts.map +1 -1
- package/dist/repo/learning-repo.js +68 -11
- package/dist/repo/learning-repo.js.map +1 -1
- package/dist/repo/orchestrator-state-repo.d.ts.map +1 -1
- package/dist/repo/orchestrator-state-repo.js +8 -1
- package/dist/repo/orchestrator-state-repo.js.map +1 -1
- package/dist/repo/run-repo.d.ts +3 -3
- package/dist/repo/run-repo.d.ts.map +1 -1
- package/dist/repo/run-repo.js +40 -19
- package/dist/repo/run-repo.js.map +1 -1
- package/dist/repo/task-repo.d.ts +14 -3
- package/dist/repo/task-repo.d.ts.map +1 -1
- package/dist/repo/task-repo.js +194 -20
- package/dist/repo/task-repo.js.map +1 -1
- package/dist/repo/tracked-project-repo.d.ts.map +1 -1
- package/dist/repo/tracked-project-repo.js +15 -1
- package/dist/repo/tracked-project-repo.js.map +1 -1
- package/dist/repo/worker-repo.d.ts +3 -2
- package/dist/repo/worker-repo.d.ts.map +1 -1
- package/dist/repo/worker-repo.js +54 -8
- package/dist/repo/worker-repo.js.map +1 -1
- package/dist/schemas/sync.js +2 -2
- package/dist/schemas/sync.js.map +1 -1
- package/dist/schemas/worker.d.ts +1 -0
- package/dist/schemas/worker.d.ts.map +1 -1
- package/dist/schemas/worker.js +1 -0
- package/dist/schemas/worker.js.map +1 -1
- package/dist/services/agent-service.d.ts +57 -0
- package/dist/services/agent-service.d.ts.map +1 -0
- package/dist/services/agent-service.js +81 -0
- package/dist/services/agent-service.js.map +1 -0
- package/dist/services/anchor-service.js +1 -1
- package/dist/services/anchor-service.js.map +1 -1
- package/dist/services/anchor-verification.d.ts +8 -0
- package/dist/services/anchor-verification.d.ts.map +1 -1
- package/dist/services/anchor-verification.js +237 -37
- package/dist/services/anchor-verification.js.map +1 -1
- package/dist/services/ast-grep-service.d.ts.map +1 -1
- package/dist/services/ast-grep-service.js +93 -22
- package/dist/services/ast-grep-service.js.map +1 -1
- package/dist/services/attempt-service.d.ts.map +1 -1
- package/dist/services/attempt-service.js +1 -4
- package/dist/services/attempt-service.js.map +1 -1
- package/dist/services/auto-sync-service.d.ts +1 -1
- package/dist/services/auto-sync-service.d.ts.map +1 -1
- package/dist/services/auto-sync-service.js +18 -10
- package/dist/services/auto-sync-service.js.map +1 -1
- package/dist/services/claim-service.d.ts +8 -2
- package/dist/services/claim-service.d.ts.map +1 -1
- package/dist/services/claim-service.js +37 -23
- package/dist/services/claim-service.js.map +1 -1
- package/dist/services/compaction-service.d.ts +105 -0
- package/dist/services/compaction-service.d.ts.map +1 -0
- package/dist/services/compaction-service.js +369 -0
- package/dist/services/compaction-service.js.map +1 -0
- package/dist/services/cycle-scan-service.d.ts +32 -0
- package/dist/services/cycle-scan-service.d.ts.map +1 -0
- package/dist/services/cycle-scan-service.js +542 -0
- package/dist/services/cycle-scan-service.js.map +1 -0
- package/dist/services/daemon-service.d.ts +40 -2
- package/dist/services/daemon-service.d.ts.map +1 -1
- package/dist/services/daemon-service.js +199 -52
- package/dist/services/daemon-service.js.map +1 -1
- package/dist/services/deduplication-service.d.ts +8 -4
- package/dist/services/deduplication-service.d.ts.map +1 -1
- package/dist/services/deduplication-service.js +79 -25
- package/dist/services/deduplication-service.js.map +1 -1
- package/dist/services/dep-service.d.ts +2 -2
- package/dist/services/dep-service.d.ts.map +1 -1
- package/dist/services/dep-service.js +9 -5
- package/dist/services/dep-service.js.map +1 -1
- package/dist/services/diversifier-service.d.ts +2 -1
- package/dist/services/diversifier-service.d.ts.map +1 -1
- package/dist/services/diversifier-service.js +37 -43
- package/dist/services/diversifier-service.js.map +1 -1
- package/dist/services/doc-service.d.ts +49 -0
- package/dist/services/doc-service.d.ts.map +1 -0
- package/dist/services/doc-service.js +605 -0
- package/dist/services/doc-service.js.map +1 -0
- package/dist/services/edge-service.js +2 -2
- package/dist/services/edge-service.js.map +1 -1
- package/dist/services/embedding-service.d.ts +66 -2
- package/dist/services/embedding-service.d.ts.map +1 -1
- package/dist/services/embedding-service.js +138 -24
- package/dist/services/embedding-service.js.map +1 -1
- package/dist/services/file-learning-service.d.ts.map +1 -1
- package/dist/services/file-learning-service.js +8 -7
- package/dist/services/file-learning-service.js.map +1 -1
- package/dist/services/file-watcher-service.d.ts.map +1 -1
- package/dist/services/file-watcher-service.js +58 -11
- package/dist/services/file-watcher-service.js.map +1 -1
- package/dist/services/graph-expansion.d.ts +3 -0
- package/dist/services/graph-expansion.d.ts.map +1 -1
- package/dist/services/graph-expansion.js +28 -7
- package/dist/services/graph-expansion.js.map +1 -1
- package/dist/services/hierarchy-service.d.ts +1 -1
- package/dist/services/hierarchy-service.d.ts.map +1 -1
- package/dist/services/hierarchy-service.js +50 -32
- package/dist/services/hierarchy-service.js.map +1 -1
- package/dist/services/index.d.ts +13 -15
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +13 -15
- package/dist/services/index.js.map +1 -1
- package/dist/services/learning-service.d.ts +4 -4
- package/dist/services/learning-service.d.ts.map +1 -1
- package/dist/services/learning-service.js +75 -42
- package/dist/services/learning-service.js.map +1 -1
- package/dist/services/llm-service.d.ts +62 -0
- package/dist/services/llm-service.d.ts.map +1 -0
- package/dist/services/llm-service.js +172 -0
- package/dist/services/llm-service.js.map +1 -0
- package/dist/services/migration-service.d.ts +1 -1
- package/dist/services/migration-service.d.ts.map +1 -1
- package/dist/services/migration-service.js +18 -7
- package/dist/services/migration-service.js.map +1 -1
- package/dist/services/orchestrator-service.d.ts +4 -3
- package/dist/services/orchestrator-service.d.ts.map +1 -1
- package/dist/services/orchestrator-service.js +67 -29
- package/dist/services/orchestrator-service.js.map +1 -1
- package/dist/services/promotion-service.d.ts +1 -1
- package/dist/services/promotion-service.js +1 -1
- package/dist/services/promotion-service.js.map +1 -1
- package/dist/services/query-expansion-service.d.ts +30 -9
- package/dist/services/query-expansion-service.d.ts.map +1 -1
- package/dist/services/query-expansion-service.js +54 -63
- package/dist/services/query-expansion-service.js.map +1 -1
- package/dist/services/ready-service.d.ts +21 -1
- package/dist/services/ready-service.d.ts.map +1 -1
- package/dist/services/ready-service.js +44 -21
- package/dist/services/ready-service.js.map +1 -1
- package/dist/services/retriever-service.d.ts +10 -10
- package/dist/services/retriever-service.d.ts.map +1 -1
- package/dist/services/retriever-service.js +53 -161
- package/dist/services/retriever-service.js.map +1 -1
- package/dist/services/swarm-verification.d.ts +2 -2
- package/dist/services/swarm-verification.d.ts.map +1 -1
- package/dist/services/swarm-verification.js +12 -6
- package/dist/services/swarm-verification.js.map +1 -1
- package/dist/services/sync-service.d.ts +17 -4
- package/dist/services/sync-service.d.ts.map +1 -1
- package/dist/services/sync-service.js +378 -114
- package/dist/services/sync-service.js.map +1 -1
- package/dist/services/task-service.d.ts +6 -4
- package/dist/services/task-service.d.ts.map +1 -1
- package/dist/services/task-service.js +162 -33
- package/dist/services/task-service.js.map +1 -1
- package/dist/services/tracing-service.d.ts +55 -0
- package/dist/services/tracing-service.d.ts.map +1 -0
- package/dist/services/tracing-service.js +99 -0
- package/dist/services/tracing-service.js.map +1 -0
- package/dist/services/transcript-adapter.d.ts +99 -0
- package/dist/services/transcript-adapter.d.ts.map +1 -0
- package/dist/services/transcript-adapter.js +283 -0
- package/dist/services/transcript-adapter.js.map +1 -0
- package/dist/services/validation-service.d.ts +85 -0
- package/dist/services/validation-service.d.ts.map +1 -0
- package/dist/services/validation-service.js +289 -0
- package/dist/services/validation-service.js.map +1 -0
- package/dist/services/worker-process.d.ts +23 -4
- package/dist/services/worker-process.d.ts.map +1 -1
- package/dist/services/worker-process.js +159 -70
- package/dist/services/worker-process.js.map +1 -1
- package/dist/services/worker-service.d.ts.map +1 -1
- package/dist/services/worker-service.js +7 -12
- package/dist/services/worker-service.js.map +1 -1
- package/dist/sync/claude-task-writer.d.ts +49 -0
- package/dist/sync/claude-task-writer.d.ts.map +1 -0
- package/dist/sync/claude-task-writer.js +135 -0
- package/dist/sync/claude-task-writer.js.map +1 -0
- package/dist/utils/doc-hash.d.ts +10 -0
- package/dist/utils/doc-hash.d.ts.map +1 -0
- package/dist/utils/doc-hash.js +14 -0
- package/dist/utils/doc-hash.js.map +1 -0
- package/dist/utils/doc-renderer.d.ts +44 -0
- package/dist/utils/doc-renderer.d.ts.map +1 -0
- package/dist/utils/doc-renderer.js +202 -0
- package/dist/utils/doc-renderer.js.map +1 -0
- package/dist/utils/math.d.ts +5 -1
- package/dist/utils/math.d.ts.map +1 -1
- package/dist/utils/math.js +12 -4
- package/dist/utils/math.js.map +1 -1
- package/dist/utils/sql.d.ts +9 -0
- package/dist/utils/sql.d.ts.map +1 -0
- package/dist/utils/sql.js +9 -0
- package/dist/utils/sql.js.map +1 -0
- package/dist/utils/toml-config.d.ts +22 -0
- package/dist/utils/toml-config.d.ts.map +1 -0
- package/dist/utils/toml-config.js +75 -0
- package/dist/utils/toml-config.js.map +1 -0
- package/dist/worker/hooks.d.ts +102 -0
- package/dist/worker/hooks.d.ts.map +1 -0
- package/dist/worker/hooks.js +11 -0
- package/dist/worker/hooks.js.map +1 -0
- package/dist/worker/index.d.ts +9 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +8 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/run-worker.d.ts +33 -0
- package/dist/worker/run-worker.d.ts.map +1 -0
- package/dist/worker/run-worker.js +265 -0
- package/dist/worker/run-worker.js.map +1 -0
- package/package.json +14 -12
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TranscriptAdapter - Abstracts parsing of LLM transcript formats.
|
|
3
|
+
*
|
|
4
|
+
* Different LLM tools produce different transcript formats:
|
|
5
|
+
* - Claude Code: JSONL with stream-json format
|
|
6
|
+
* - Future: Codex, Cursor, custom agents
|
|
7
|
+
*
|
|
8
|
+
* Adapters provide a unified interface for extracting tool calls
|
|
9
|
+
* and messages regardless of the source format.
|
|
10
|
+
*
|
|
11
|
+
* → DD-019: Primitive 3 (Transcript Adapters)
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Represents a parsed tool call from a transcript.
|
|
15
|
+
*/
|
|
16
|
+
export interface ToolCall {
|
|
17
|
+
/** ISO timestamp of when the tool call occurred */
|
|
18
|
+
readonly timestamp: string;
|
|
19
|
+
/** Name of the tool (e.g., "Read", "Bash", "Edit") */
|
|
20
|
+
readonly name: string;
|
|
21
|
+
/** Input parameters passed to the tool */
|
|
22
|
+
readonly input: Record<string, unknown>;
|
|
23
|
+
/** Tool call ID for correlation with results */
|
|
24
|
+
readonly id?: string;
|
|
25
|
+
/** Result of the tool call, if available */
|
|
26
|
+
readonly result?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Represents a parsed message from a transcript.
|
|
30
|
+
*/
|
|
31
|
+
export interface Message {
|
|
32
|
+
/** ISO timestamp of when the message occurred */
|
|
33
|
+
readonly timestamp: string;
|
|
34
|
+
/** Role of the message sender */
|
|
35
|
+
readonly role: "user" | "assistant";
|
|
36
|
+
/** Text content of the message */
|
|
37
|
+
readonly content: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Interface for adapters that parse different transcript formats.
|
|
41
|
+
* Implement this to support new LLM tools.
|
|
42
|
+
*/
|
|
43
|
+
export interface TranscriptAdapter {
|
|
44
|
+
/**
|
|
45
|
+
* Parse tool calls from transcript lines.
|
|
46
|
+
* @param lines - Raw JSONL lines from the transcript file
|
|
47
|
+
* @returns Array of parsed tool calls
|
|
48
|
+
*/
|
|
49
|
+
readonly parseToolCalls: (lines: readonly string[]) => readonly ToolCall[];
|
|
50
|
+
/**
|
|
51
|
+
* Parse messages from transcript lines.
|
|
52
|
+
* @param lines - Raw JSONL lines from the transcript file
|
|
53
|
+
* @returns Array of parsed messages
|
|
54
|
+
*/
|
|
55
|
+
readonly parseMessages: (lines: readonly string[]) => readonly Message[];
|
|
56
|
+
/**
|
|
57
|
+
* Check if this adapter can handle the given agent type.
|
|
58
|
+
* Used for adapter registry selection.
|
|
59
|
+
* @param agentType - The agent type from runs.agent column
|
|
60
|
+
* @returns true if this adapter can parse transcripts from this agent
|
|
61
|
+
*/
|
|
62
|
+
readonly canHandle: (agentType: string) => boolean;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* ClaudeCodeAdapter - Parses Claude Code's --output-format stream-json.
|
|
66
|
+
*
|
|
67
|
+
* Format details:
|
|
68
|
+
* - Each line is a JSON object with a top-level `type` field
|
|
69
|
+
* - Tool calls: type="assistant" with message.content[].type="tool_use"
|
|
70
|
+
* - Messages: type="user" or type="assistant"
|
|
71
|
+
* - Timestamps are at the top level
|
|
72
|
+
*/
|
|
73
|
+
export declare const ClaudeCodeAdapter: TranscriptAdapter;
|
|
74
|
+
/**
|
|
75
|
+
* GenericJSONLAdapter - Fallback adapter for unknown JSONL formats.
|
|
76
|
+
*
|
|
77
|
+
* Attempts to parse common patterns:
|
|
78
|
+
* - Tool calls: entries with `tool`, `name`, or `function` fields
|
|
79
|
+
* - Messages: entries with `role` or `type` indicating user/assistant
|
|
80
|
+
*
|
|
81
|
+
* Less strict parsing to handle various custom formats.
|
|
82
|
+
*/
|
|
83
|
+
export declare const GenericJSONLAdapter: TranscriptAdapter;
|
|
84
|
+
/**
|
|
85
|
+
* Get the appropriate adapter for the given agent type.
|
|
86
|
+
* Returns GenericJSONLAdapter if no specific adapter matches.
|
|
87
|
+
*
|
|
88
|
+
* @param agentType - The agent type from runs.agent column
|
|
89
|
+
* @returns The adapter to use for parsing transcripts
|
|
90
|
+
*/
|
|
91
|
+
export declare function getAdapter(agentType: string): TranscriptAdapter;
|
|
92
|
+
/**
|
|
93
|
+
* Register a custom adapter at the beginning of the registry.
|
|
94
|
+
* Custom adapters take precedence over built-in ones.
|
|
95
|
+
*
|
|
96
|
+
* @param adapter - The adapter to register
|
|
97
|
+
*/
|
|
98
|
+
export declare function registerAdapter(adapter: TranscriptAdapter): void;
|
|
99
|
+
//# sourceMappingURL=transcript-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-adapter.d.ts","sourceRoot":"","sources":["../../src/services/transcript-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,mDAAmD;IACnD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,sDAAsD;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvC,gDAAgD;IAChD,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;IACpB,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,iDAAiD;IACjD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;IACnC,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,SAAS,QAAQ,EAAE,CAAA;IAE1E;;;;OAIG;IACH,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,SAAS,OAAO,EAAE,CAAA;IAExE;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAA;CACnD;AAkDD;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,EAAE,iBA6I/B,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,EAAE,iBAoEjC,CAAA;AAaD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,CAE/D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAGhE"}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TranscriptAdapter - Abstracts parsing of LLM transcript formats.
|
|
3
|
+
*
|
|
4
|
+
* Different LLM tools produce different transcript formats:
|
|
5
|
+
* - Claude Code: JSONL with stream-json format
|
|
6
|
+
* - Future: Codex, Cursor, custom agents
|
|
7
|
+
*
|
|
8
|
+
* Adapters provide a unified interface for extracting tool calls
|
|
9
|
+
* and messages regardless of the source format.
|
|
10
|
+
*
|
|
11
|
+
* → DD-019: Primitive 3 (Transcript Adapters)
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Helper to safely parse a JSON line, returning null for empty or non-JSON lines.
|
|
15
|
+
* Only catches SyntaxError from JSON.parse; unexpected errors are re-thrown.
|
|
16
|
+
*/
|
|
17
|
+
const safeParseJson = (line) => {
|
|
18
|
+
const trimmed = line.trim();
|
|
19
|
+
if (!trimmed)
|
|
20
|
+
return null;
|
|
21
|
+
try {
|
|
22
|
+
return JSON.parse(trimmed);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (error instanceof SyntaxError) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
// eslint-disable-next-line tx/no-throw-in-services -- Re-throw unexpected non-SyntaxError; this is a non-Effect utility helper
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Extract text content from Claude Code message content array.
|
|
34
|
+
* Content can be a string or an array of content blocks.
|
|
35
|
+
*/
|
|
36
|
+
const extractTextContent = (content) => {
|
|
37
|
+
if (typeof content === "string") {
|
|
38
|
+
return content;
|
|
39
|
+
}
|
|
40
|
+
if (Array.isArray(content)) {
|
|
41
|
+
return content
|
|
42
|
+
.filter((block) => typeof block === "object" && block !== null)
|
|
43
|
+
.map((block) => {
|
|
44
|
+
if (block.type === "text" && typeof block.text === "string") {
|
|
45
|
+
return block.text;
|
|
46
|
+
}
|
|
47
|
+
if (block.type === "thinking" && typeof block.thinking === "string") {
|
|
48
|
+
return block.thinking;
|
|
49
|
+
}
|
|
50
|
+
return "";
|
|
51
|
+
})
|
|
52
|
+
.filter(Boolean)
|
|
53
|
+
.join("\n");
|
|
54
|
+
}
|
|
55
|
+
return "";
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* ClaudeCodeAdapter - Parses Claude Code's --output-format stream-json.
|
|
59
|
+
*
|
|
60
|
+
* Format details:
|
|
61
|
+
* - Each line is a JSON object with a top-level `type` field
|
|
62
|
+
* - Tool calls: type="assistant" with message.content[].type="tool_use"
|
|
63
|
+
* - Messages: type="user" or type="assistant"
|
|
64
|
+
* - Timestamps are at the top level
|
|
65
|
+
*/
|
|
66
|
+
export const ClaudeCodeAdapter = {
|
|
67
|
+
canHandle: (agentType) => agentType.includes("claude") ||
|
|
68
|
+
agentType.includes("tx-") ||
|
|
69
|
+
agentType === "claude-code",
|
|
70
|
+
parseToolCalls: (lines) => {
|
|
71
|
+
const toolCalls = [];
|
|
72
|
+
const toolResults = new Map();
|
|
73
|
+
// First pass: collect tool results
|
|
74
|
+
for (const line of lines) {
|
|
75
|
+
const entry = safeParseJson(line);
|
|
76
|
+
if (!entry)
|
|
77
|
+
continue;
|
|
78
|
+
// Tool results come as type="user" with content[].type="tool_result"
|
|
79
|
+
if (entry.type === "user") {
|
|
80
|
+
const message = entry.message;
|
|
81
|
+
const content = message?.content;
|
|
82
|
+
if (Array.isArray(content)) {
|
|
83
|
+
for (const block of content) {
|
|
84
|
+
if (typeof block === "object" &&
|
|
85
|
+
block !== null &&
|
|
86
|
+
block.type === "tool_result") {
|
|
87
|
+
const toolResult = block;
|
|
88
|
+
const toolUseId = toolResult.tool_use_id;
|
|
89
|
+
const resultContent = toolResult.content;
|
|
90
|
+
if (toolUseId && typeof resultContent === "string") {
|
|
91
|
+
toolResults.set(toolUseId, resultContent);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Second pass: collect tool calls
|
|
99
|
+
for (const line of lines) {
|
|
100
|
+
const entry = safeParseJson(line);
|
|
101
|
+
if (!entry)
|
|
102
|
+
continue;
|
|
103
|
+
// Tool calls come as type="assistant" with content[].type="tool_use"
|
|
104
|
+
if (entry.type === "assistant") {
|
|
105
|
+
const timestamp = entry.timestamp ?? new Date().toISOString();
|
|
106
|
+
const message = entry.message;
|
|
107
|
+
const content = message?.content;
|
|
108
|
+
if (Array.isArray(content)) {
|
|
109
|
+
for (const block of content) {
|
|
110
|
+
if (typeof block === "object" &&
|
|
111
|
+
block !== null &&
|
|
112
|
+
block.type === "tool_use") {
|
|
113
|
+
const toolUse = block;
|
|
114
|
+
const id = toolUse.id;
|
|
115
|
+
const name = toolUse.name;
|
|
116
|
+
const input = toolUse.input ?? {};
|
|
117
|
+
if (name) {
|
|
118
|
+
toolCalls.push({
|
|
119
|
+
timestamp,
|
|
120
|
+
name,
|
|
121
|
+
input,
|
|
122
|
+
id,
|
|
123
|
+
result: id ? toolResults.get(id) : undefined
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return toolCalls;
|
|
132
|
+
},
|
|
133
|
+
parseMessages: (lines) => {
|
|
134
|
+
const messages = [];
|
|
135
|
+
for (const line of lines) {
|
|
136
|
+
const entry = safeParseJson(line);
|
|
137
|
+
if (!entry)
|
|
138
|
+
continue;
|
|
139
|
+
const timestamp = entry.timestamp ?? new Date().toISOString();
|
|
140
|
+
if (entry.type === "user") {
|
|
141
|
+
const message = entry.message;
|
|
142
|
+
if (!message)
|
|
143
|
+
continue;
|
|
144
|
+
// Skip tool results - those are handled in parseToolCalls
|
|
145
|
+
const content = message.content;
|
|
146
|
+
if (Array.isArray(content)) {
|
|
147
|
+
const hasOnlyToolResults = content.every((block) => typeof block === "object" &&
|
|
148
|
+
block !== null &&
|
|
149
|
+
block.type === "tool_result");
|
|
150
|
+
if (hasOnlyToolResults)
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
const text = extractTextContent(message.content);
|
|
154
|
+
if (text) {
|
|
155
|
+
messages.push({
|
|
156
|
+
timestamp,
|
|
157
|
+
role: "user",
|
|
158
|
+
content: text
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
else if (entry.type === "assistant") {
|
|
163
|
+
const message = entry.message;
|
|
164
|
+
if (!message)
|
|
165
|
+
continue;
|
|
166
|
+
// Skip entries that only contain tool_use blocks
|
|
167
|
+
const content = message.content;
|
|
168
|
+
if (Array.isArray(content)) {
|
|
169
|
+
const hasOnlyToolUse = content.every((block) => typeof block === "object" &&
|
|
170
|
+
block !== null &&
|
|
171
|
+
block.type === "tool_use");
|
|
172
|
+
if (hasOnlyToolUse)
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
const text = extractTextContent(message.content);
|
|
176
|
+
if (text) {
|
|
177
|
+
messages.push({
|
|
178
|
+
timestamp,
|
|
179
|
+
role: "assistant",
|
|
180
|
+
content: text
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return messages;
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
/**
|
|
189
|
+
* GenericJSONLAdapter - Fallback adapter for unknown JSONL formats.
|
|
190
|
+
*
|
|
191
|
+
* Attempts to parse common patterns:
|
|
192
|
+
* - Tool calls: entries with `tool`, `name`, or `function` fields
|
|
193
|
+
* - Messages: entries with `role` or `type` indicating user/assistant
|
|
194
|
+
*
|
|
195
|
+
* Less strict parsing to handle various custom formats.
|
|
196
|
+
*/
|
|
197
|
+
export const GenericJSONLAdapter = {
|
|
198
|
+
canHandle: () => true, // Always matches as fallback
|
|
199
|
+
parseToolCalls: (lines) => {
|
|
200
|
+
const toolCalls = [];
|
|
201
|
+
for (const line of lines) {
|
|
202
|
+
const entry = safeParseJson(line);
|
|
203
|
+
if (!entry)
|
|
204
|
+
continue;
|
|
205
|
+
// Look for common tool call patterns
|
|
206
|
+
const name = entry.tool ??
|
|
207
|
+
entry.name ??
|
|
208
|
+
entry.function ??
|
|
209
|
+
entry.tool_call?.name;
|
|
210
|
+
if (name) {
|
|
211
|
+
toolCalls.push({
|
|
212
|
+
timestamp: entry.timestamp ?? new Date().toISOString(),
|
|
213
|
+
name,
|
|
214
|
+
input: entry.input ??
|
|
215
|
+
entry.args ??
|
|
216
|
+
entry.arguments ??
|
|
217
|
+
entry.tool_call
|
|
218
|
+
?.arguments ??
|
|
219
|
+
{},
|
|
220
|
+
id: entry.id,
|
|
221
|
+
result: entry.result
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return toolCalls;
|
|
226
|
+
},
|
|
227
|
+
parseMessages: (lines) => {
|
|
228
|
+
const messages = [];
|
|
229
|
+
for (const line of lines) {
|
|
230
|
+
const entry = safeParseJson(line);
|
|
231
|
+
if (!entry)
|
|
232
|
+
continue;
|
|
233
|
+
// Determine role from common patterns
|
|
234
|
+
const role = entry.role ??
|
|
235
|
+
entry.type ??
|
|
236
|
+
entry.sender;
|
|
237
|
+
if (role === "user" || role === "assistant") {
|
|
238
|
+
const content = entry.content ??
|
|
239
|
+
entry.text ??
|
|
240
|
+
entry.message;
|
|
241
|
+
if (content) {
|
|
242
|
+
messages.push({
|
|
243
|
+
timestamp: entry.timestamp ?? new Date().toISOString(),
|
|
244
|
+
role,
|
|
245
|
+
content
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return messages;
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
/**
|
|
254
|
+
* Registry of available transcript adapters.
|
|
255
|
+
* Order matters - first matching adapter is used.
|
|
256
|
+
* Mutable array to allow runtime registration of custom adapters.
|
|
257
|
+
*/
|
|
258
|
+
const adapters = [
|
|
259
|
+
ClaudeCodeAdapter,
|
|
260
|
+
// Future: CodexAdapter, CursorAdapter, etc.
|
|
261
|
+
GenericJSONLAdapter // Fallback - always matches
|
|
262
|
+
];
|
|
263
|
+
/**
|
|
264
|
+
* Get the appropriate adapter for the given agent type.
|
|
265
|
+
* Returns GenericJSONLAdapter if no specific adapter matches.
|
|
266
|
+
*
|
|
267
|
+
* @param agentType - The agent type from runs.agent column
|
|
268
|
+
* @returns The adapter to use for parsing transcripts
|
|
269
|
+
*/
|
|
270
|
+
export function getAdapter(agentType) {
|
|
271
|
+
return adapters.find((a) => a.canHandle(agentType)) ?? GenericJSONLAdapter;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Register a custom adapter at the beginning of the registry.
|
|
275
|
+
* Custom adapters take precedence over built-in ones.
|
|
276
|
+
*
|
|
277
|
+
* @param adapter - The adapter to register
|
|
278
|
+
*/
|
|
279
|
+
export function registerAdapter(adapter) {
|
|
280
|
+
// Insert at the beginning, before GenericJSONLAdapter fallback
|
|
281
|
+
adapters.unshift(adapter);
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=transcript-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-adapter.js","sourceRoot":"","sources":["../../src/services/transcript-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { SqliteClient } from "../db.js";
|
|
3
|
+
import { DatabaseError } from "../errors.js";
|
|
4
|
+
/**
|
|
5
|
+
* Severity level for validation issues.
|
|
6
|
+
*/
|
|
7
|
+
export type ValidationSeverity = "error" | "warning" | "info";
|
|
8
|
+
/**
|
|
9
|
+
* A single validation issue found during validation.
|
|
10
|
+
*/
|
|
11
|
+
export interface ValidationIssue {
|
|
12
|
+
readonly check: string;
|
|
13
|
+
readonly severity: ValidationSeverity;
|
|
14
|
+
readonly message: string;
|
|
15
|
+
readonly details?: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Result of a single validation check.
|
|
19
|
+
*/
|
|
20
|
+
export interface CheckResult {
|
|
21
|
+
readonly name: string;
|
|
22
|
+
readonly passed: boolean;
|
|
23
|
+
readonly issues: readonly ValidationIssue[];
|
|
24
|
+
readonly fixable: boolean;
|
|
25
|
+
readonly fixed?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Overall validation result.
|
|
29
|
+
*/
|
|
30
|
+
export interface ValidationResult {
|
|
31
|
+
readonly valid: boolean;
|
|
32
|
+
readonly checks: readonly CheckResult[];
|
|
33
|
+
readonly issueCount: {
|
|
34
|
+
readonly error: number;
|
|
35
|
+
readonly warning: number;
|
|
36
|
+
readonly info: number;
|
|
37
|
+
};
|
|
38
|
+
readonly fixedCount: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Options for running validation.
|
|
42
|
+
*/
|
|
43
|
+
export interface ValidateOptions {
|
|
44
|
+
readonly fix?: boolean;
|
|
45
|
+
}
|
|
46
|
+
declare const ValidationService_base: Context.TagClass<ValidationService, "ValidationService", {
|
|
47
|
+
/**
|
|
48
|
+
* Run all validation checks.
|
|
49
|
+
* Returns a summary of issues found.
|
|
50
|
+
*/
|
|
51
|
+
readonly validate: (options?: ValidateOptions) => Effect.Effect<ValidationResult, DatabaseError>;
|
|
52
|
+
/**
|
|
53
|
+
* Run SQLite integrity check.
|
|
54
|
+
*/
|
|
55
|
+
readonly checkIntegrity: () => Effect.Effect<CheckResult, DatabaseError>;
|
|
56
|
+
/**
|
|
57
|
+
* Verify schema version matches latest migration.
|
|
58
|
+
*/
|
|
59
|
+
readonly checkSchemaVersion: () => Effect.Effect<CheckResult, DatabaseError>;
|
|
60
|
+
/**
|
|
61
|
+
* Check foreign key constraints.
|
|
62
|
+
*/
|
|
63
|
+
readonly checkForeignKeys: () => Effect.Effect<CheckResult, DatabaseError>;
|
|
64
|
+
/**
|
|
65
|
+
* Detect orphaned dependencies (referencing non-existent tasks).
|
|
66
|
+
*/
|
|
67
|
+
readonly checkOrphanedDependencies: (fix?: boolean) => Effect.Effect<CheckResult, DatabaseError>;
|
|
68
|
+
/**
|
|
69
|
+
* Scan for invalid status values.
|
|
70
|
+
*/
|
|
71
|
+
readonly checkInvalidStatuses: (fix?: boolean) => Effect.Effect<CheckResult, DatabaseError>;
|
|
72
|
+
/**
|
|
73
|
+
* Check for missing task references in parent_id.
|
|
74
|
+
*/
|
|
75
|
+
readonly checkMissingParentRefs: (fix?: boolean) => Effect.Effect<CheckResult, DatabaseError>;
|
|
76
|
+
}>;
|
|
77
|
+
/**
|
|
78
|
+
* ValidationService performs pre-flight database checks.
|
|
79
|
+
* Follows Effect-TS patterns per DD-002.
|
|
80
|
+
*/
|
|
81
|
+
export declare class ValidationService extends ValidationService_base {
|
|
82
|
+
}
|
|
83
|
+
export declare const ValidationServiceLive: Layer.Layer<ValidationService, never, SqliteClient>;
|
|
84
|
+
export {};
|
|
85
|
+
//# sourceMappingURL=validation-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-service.d.ts","sourceRoot":"","sources":["../../src/services/validation-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAI5C;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;AAE7D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAA;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAA;IAC3C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAA;IACvC,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KACtB,CAAA;IACD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CACvB;;IASG;;;OAGG;uBACgB,CAAC,OAAO,CAAC,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC;IAEhG;;OAEG;6BACsB,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC;IAExE;;OAEG;iCAC0B,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC;IAE5E;;OAEG;+BACwB,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC;IAE1E;;OAEG;wCACiC,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC;IAEhG;;OAEG;mCAC4B,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC;IAE3F;;OAEG;qCAC8B,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC;;AAzCjG;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,sBAuCpC;CAAG;AAEN,eAAO,MAAM,qBAAqB,qDAyUjC,CAAA"}
|