gitx.do 0.0.2 → 0.0.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/dist/cli/commands/blame.d.ts +259 -0
- package/dist/cli/commands/blame.d.ts.map +1 -0
- package/dist/cli/commands/blame.js +609 -0
- package/dist/cli/commands/blame.js.map +1 -0
- package/dist/cli/commands/branch.d.ts +249 -0
- package/dist/cli/commands/branch.d.ts.map +1 -0
- package/dist/cli/commands/branch.js +693 -0
- package/dist/cli/commands/branch.js.map +1 -0
- package/dist/cli/commands/commit.d.ts +182 -0
- package/dist/cli/commands/commit.d.ts.map +1 -0
- package/dist/cli/commands/commit.js +437 -0
- package/dist/cli/commands/commit.js.map +1 -0
- package/dist/cli/commands/diff.d.ts +464 -0
- package/dist/cli/commands/diff.d.ts.map +1 -0
- package/dist/cli/commands/diff.js +958 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/log.d.ts +239 -0
- package/dist/cli/commands/log.d.ts.map +1 -0
- package/dist/cli/commands/log.js +535 -0
- package/dist/cli/commands/log.js.map +1 -0
- package/dist/cli/commands/review.d.ts +457 -0
- package/dist/cli/commands/review.d.ts.map +1 -0
- package/dist/cli/commands/review.js +533 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/commands/status.d.ts +269 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +493 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/web.d.ts +199 -0
- package/dist/cli/commands/web.d.ts.map +1 -0
- package/dist/cli/commands/web.js +696 -0
- package/dist/cli/commands/web.js.map +1 -0
- package/dist/cli/fs-adapter.d.ts +656 -0
- package/dist/cli/fs-adapter.d.ts.map +1 -0
- package/dist/cli/fs-adapter.js +1179 -0
- package/dist/cli/fs-adapter.js.map +1 -0
- package/dist/cli/index.d.ts +387 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +523 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ui/components/DiffView.d.ts +7 -0
- package/dist/cli/ui/components/DiffView.d.ts.map +1 -0
- package/dist/cli/ui/components/DiffView.js +11 -0
- package/dist/cli/ui/components/DiffView.js.map +1 -0
- package/dist/cli/ui/components/ErrorDisplay.d.ts +6 -0
- package/dist/cli/ui/components/ErrorDisplay.d.ts.map +1 -0
- package/dist/cli/ui/components/ErrorDisplay.js +11 -0
- package/dist/cli/ui/components/ErrorDisplay.js.map +1 -0
- package/dist/cli/ui/components/FuzzySearch.d.ts +9 -0
- package/dist/cli/ui/components/FuzzySearch.d.ts.map +1 -0
- package/dist/cli/ui/components/FuzzySearch.js +12 -0
- package/dist/cli/ui/components/FuzzySearch.js.map +1 -0
- package/dist/cli/ui/components/LoadingSpinner.d.ts +6 -0
- package/dist/cli/ui/components/LoadingSpinner.d.ts.map +1 -0
- package/dist/cli/ui/components/LoadingSpinner.js +10 -0
- package/dist/cli/ui/components/LoadingSpinner.js.map +1 -0
- package/dist/cli/ui/components/NavigationList.d.ts +9 -0
- package/dist/cli/ui/components/NavigationList.d.ts.map +1 -0
- package/dist/cli/ui/components/NavigationList.js +11 -0
- package/dist/cli/ui/components/NavigationList.js.map +1 -0
- package/dist/cli/ui/components/ScrollableContent.d.ts +8 -0
- package/dist/cli/ui/components/ScrollableContent.d.ts.map +1 -0
- package/dist/cli/ui/components/ScrollableContent.js +11 -0
- package/dist/cli/ui/components/ScrollableContent.js.map +1 -0
- package/dist/cli/ui/components/index.d.ts +7 -0
- package/dist/cli/ui/components/index.d.ts.map +1 -0
- package/dist/cli/ui/components/index.js +9 -0
- package/dist/cli/ui/components/index.js.map +1 -0
- package/dist/cli/ui/terminal-ui.d.ts +52 -0
- package/dist/cli/ui/terminal-ui.d.ts.map +1 -0
- package/dist/cli/ui/terminal-ui.js +121 -0
- package/dist/cli/ui/terminal-ui.js.map +1 -0
- package/dist/durable-object/object-store.d.ts +401 -23
- package/dist/durable-object/object-store.d.ts.map +1 -1
- package/dist/durable-object/object-store.js +414 -25
- package/dist/durable-object/object-store.js.map +1 -1
- package/dist/durable-object/schema.d.ts +188 -0
- package/dist/durable-object/schema.d.ts.map +1 -1
- package/dist/durable-object/schema.js +160 -0
- package/dist/durable-object/schema.js.map +1 -1
- package/dist/durable-object/wal.d.ts +336 -31
- package/dist/durable-object/wal.d.ts.map +1 -1
- package/dist/durable-object/wal.js +272 -27
- package/dist/durable-object/wal.js.map +1 -1
- package/dist/index.d.ts +379 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +379 -7
- package/dist/index.js.map +1 -1
- package/dist/mcp/adapter.d.ts +579 -38
- package/dist/mcp/adapter.d.ts.map +1 -1
- package/dist/mcp/adapter.js +426 -33
- package/dist/mcp/adapter.js.map +1 -1
- package/dist/mcp/sandbox.d.ts +532 -29
- package/dist/mcp/sandbox.d.ts.map +1 -1
- package/dist/mcp/sandbox.js +389 -22
- package/dist/mcp/sandbox.js.map +1 -1
- package/dist/mcp/sdk-adapter.d.ts +478 -56
- package/dist/mcp/sdk-adapter.d.ts.map +1 -1
- package/dist/mcp/sdk-adapter.js +346 -44
- package/dist/mcp/sdk-adapter.js.map +1 -1
- package/dist/mcp/tools.d.ts +445 -30
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +363 -33
- package/dist/mcp/tools.js.map +1 -1
- package/dist/ops/blame.d.ts +424 -21
- package/dist/ops/blame.d.ts.map +1 -1
- package/dist/ops/blame.js +303 -20
- package/dist/ops/blame.js.map +1 -1
- package/dist/ops/branch.d.ts +583 -32
- package/dist/ops/branch.d.ts.map +1 -1
- package/dist/ops/branch.js +365 -23
- package/dist/ops/branch.js.map +1 -1
- package/dist/ops/commit-traversal.d.ts +164 -24
- package/dist/ops/commit-traversal.d.ts.map +1 -1
- package/dist/ops/commit-traversal.js +68 -2
- package/dist/ops/commit-traversal.js.map +1 -1
- package/dist/ops/commit.d.ts +387 -53
- package/dist/ops/commit.d.ts.map +1 -1
- package/dist/ops/commit.js +249 -29
- package/dist/ops/commit.js.map +1 -1
- package/dist/ops/merge-base.d.ts +195 -21
- package/dist/ops/merge-base.d.ts.map +1 -1
- package/dist/ops/merge-base.js +122 -12
- package/dist/ops/merge-base.js.map +1 -1
- package/dist/ops/merge.d.ts +600 -130
- package/dist/ops/merge.d.ts.map +1 -1
- package/dist/ops/merge.js +408 -60
- package/dist/ops/merge.js.map +1 -1
- package/dist/ops/tag.d.ts +67 -2
- package/dist/ops/tag.d.ts.map +1 -1
- package/dist/ops/tag.js +42 -1
- package/dist/ops/tag.js.map +1 -1
- package/dist/ops/tree-builder.d.ts +102 -6
- package/dist/ops/tree-builder.d.ts.map +1 -1
- package/dist/ops/tree-builder.js +30 -5
- package/dist/ops/tree-builder.js.map +1 -1
- package/dist/ops/tree-diff.d.ts +50 -2
- package/dist/ops/tree-diff.d.ts.map +1 -1
- package/dist/ops/tree-diff.js +50 -2
- package/dist/ops/tree-diff.js.map +1 -1
- package/dist/pack/delta.d.ts +211 -39
- package/dist/pack/delta.d.ts.map +1 -1
- package/dist/pack/delta.js +232 -46
- package/dist/pack/delta.js.map +1 -1
- package/dist/pack/format.d.ts +390 -28
- package/dist/pack/format.d.ts.map +1 -1
- package/dist/pack/format.js +344 -33
- package/dist/pack/format.js.map +1 -1
- package/dist/pack/full-generation.d.ts +313 -28
- package/dist/pack/full-generation.d.ts.map +1 -1
- package/dist/pack/full-generation.js +238 -19
- package/dist/pack/full-generation.js.map +1 -1
- package/dist/pack/generation.d.ts +346 -23
- package/dist/pack/generation.d.ts.map +1 -1
- package/dist/pack/generation.js +269 -21
- package/dist/pack/generation.js.map +1 -1
- package/dist/pack/index.d.ts +407 -86
- package/dist/pack/index.d.ts.map +1 -1
- package/dist/pack/index.js +351 -70
- package/dist/pack/index.js.map +1 -1
- package/dist/refs/branch.d.ts +517 -71
- package/dist/refs/branch.d.ts.map +1 -1
- package/dist/refs/branch.js +410 -26
- package/dist/refs/branch.js.map +1 -1
- package/dist/refs/storage.d.ts +610 -57
- package/dist/refs/storage.d.ts.map +1 -1
- package/dist/refs/storage.js +481 -29
- package/dist/refs/storage.js.map +1 -1
- package/dist/refs/tag.d.ts +677 -67
- package/dist/refs/tag.d.ts.map +1 -1
- package/dist/refs/tag.js +497 -30
- package/dist/refs/tag.js.map +1 -1
- package/dist/storage/lru-cache.d.ts +556 -53
- package/dist/storage/lru-cache.d.ts.map +1 -1
- package/dist/storage/lru-cache.js +439 -36
- package/dist/storage/lru-cache.js.map +1 -1
- package/dist/storage/object-index.d.ts +483 -38
- package/dist/storage/object-index.d.ts.map +1 -1
- package/dist/storage/object-index.js +388 -22
- package/dist/storage/object-index.js.map +1 -1
- package/dist/storage/r2-pack.d.ts +957 -94
- package/dist/storage/r2-pack.d.ts.map +1 -1
- package/dist/storage/r2-pack.js +756 -48
- package/dist/storage/r2-pack.js.map +1 -1
- package/dist/tiered/cdc-pipeline.d.ts +1610 -38
- package/dist/tiered/cdc-pipeline.d.ts.map +1 -1
- package/dist/tiered/cdc-pipeline.js +1131 -22
- package/dist/tiered/cdc-pipeline.js.map +1 -1
- package/dist/tiered/migration.d.ts +903 -41
- package/dist/tiered/migration.d.ts.map +1 -1
- package/dist/tiered/migration.js +646 -24
- package/dist/tiered/migration.js.map +1 -1
- package/dist/tiered/parquet-writer.d.ts +944 -47
- package/dist/tiered/parquet-writer.d.ts.map +1 -1
- package/dist/tiered/parquet-writer.js +667 -39
- package/dist/tiered/parquet-writer.js.map +1 -1
- package/dist/tiered/read-path.d.ts +728 -34
- package/dist/tiered/read-path.d.ts.map +1 -1
- package/dist/tiered/read-path.js +310 -27
- package/dist/tiered/read-path.js.map +1 -1
- package/dist/types/objects.d.ts +457 -0
- package/dist/types/objects.d.ts.map +1 -1
- package/dist/types/objects.js +305 -4
- package/dist/types/objects.js.map +1 -1
- package/dist/types/storage.d.ts +407 -35
- package/dist/types/storage.d.ts.map +1 -1
- package/dist/types/storage.js +27 -3
- package/dist/types/storage.js.map +1 -1
- package/dist/utils/hash.d.ts +133 -12
- package/dist/utils/hash.d.ts.map +1 -1
- package/dist/utils/hash.js +133 -12
- package/dist/utils/hash.js.map +1 -1
- package/dist/utils/sha1.d.ts +102 -9
- package/dist/utils/sha1.d.ts.map +1 -1
- package/dist/utils/sha1.js +114 -11
- package/dist/utils/sha1.js.map +1 -1
- package/dist/wire/capabilities.d.ts +896 -88
- package/dist/wire/capabilities.d.ts.map +1 -1
- package/dist/wire/capabilities.js +566 -62
- package/dist/wire/capabilities.js.map +1 -1
- package/dist/wire/pkt-line.d.ts +293 -15
- package/dist/wire/pkt-line.d.ts.map +1 -1
- package/dist/wire/pkt-line.js +251 -15
- package/dist/wire/pkt-line.js.map +1 -1
- package/dist/wire/receive-pack.d.ts +814 -64
- package/dist/wire/receive-pack.d.ts.map +1 -1
- package/dist/wire/receive-pack.js +542 -41
- package/dist/wire/receive-pack.js.map +1 -1
- package/dist/wire/smart-http.d.ts +575 -97
- package/dist/wire/smart-http.d.ts.map +1 -1
- package/dist/wire/smart-http.js +337 -46
- package/dist/wire/smart-http.js.map +1 -1
- package/dist/wire/upload-pack.d.ts +492 -98
- package/dist/wire/upload-pack.d.ts.map +1 -1
- package/dist/wire/upload-pack.js +347 -59
- package/dist/wire/upload-pack.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,16 +1,63 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Object Location Index
|
|
2
|
+
* @fileoverview Object Location Index Module
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* - Parquet: Columnar format for cold storage analytics
|
|
4
|
+
* This module tracks the storage location of Git objects across multiple storage tiers.
|
|
5
|
+
* It provides a unified index for locating objects regardless of which tier contains
|
|
6
|
+
* the actual data.
|
|
8
7
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* ## Storage Tiers
|
|
9
|
+
*
|
|
10
|
+
* - **Hot**: SQLite (local Durable Object storage for frequently accessed objects)
|
|
11
|
+
* - **R2**: Packed in R2 object storage (for larger objects or archives)
|
|
12
|
+
* - **Parquet**: Columnar format for cold storage analytics
|
|
13
|
+
*
|
|
14
|
+
* ## Features
|
|
15
|
+
*
|
|
16
|
+
* - O(1) object location lookup by SHA
|
|
17
|
+
* - Batch lookup for multiple objects
|
|
18
|
+
* - Tier-based statistics and querying
|
|
19
|
+
* - Object tracking during tier migrations
|
|
20
|
+
*
|
|
21
|
+
* @module storage/object-index
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* // Initialize the index with Durable Object storage
|
|
26
|
+
* const index = new ObjectIndex(storage);
|
|
27
|
+
*
|
|
28
|
+
* // Record an object location
|
|
29
|
+
* await index.recordLocation({
|
|
30
|
+
* sha: 'abc123...def456',
|
|
31
|
+
* tier: 'hot',
|
|
32
|
+
* size: 1024,
|
|
33
|
+
* type: 'blob'
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* // Look up an object
|
|
37
|
+
* const location = await index.lookupLocation('abc123...def456');
|
|
38
|
+
* if (location) {
|
|
39
|
+
* console.log(`Object is in ${location.tier} tier`);
|
|
40
|
+
* }
|
|
41
|
+
* ```
|
|
11
42
|
*/
|
|
12
43
|
/**
|
|
13
|
-
*
|
|
44
|
+
* Validates SHA format (40 alphanumeric characters, allows hyphens).
|
|
45
|
+
*
|
|
46
|
+
* @description
|
|
47
|
+
* Ensures the SHA meets the expected format requirements. Throws an error
|
|
48
|
+
* if the SHA is invalid, which helps catch bugs early.
|
|
49
|
+
*
|
|
50
|
+
* @param sha - The SHA string to validate
|
|
51
|
+
*
|
|
52
|
+
* @throws {Error} If SHA format is invalid
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* validateSha('abc123def456789012345678901234567890abcd'); // OK
|
|
57
|
+
* validateSha('invalid'); // throws Error
|
|
58
|
+
* ```
|
|
59
|
+
*
|
|
60
|
+
* @internal
|
|
14
61
|
*/
|
|
15
62
|
function validateSha(sha) {
|
|
16
63
|
if (!sha || sha.length !== 40) {
|
|
@@ -25,15 +72,104 @@ function validateSha(sha) {
|
|
|
25
72
|
}
|
|
26
73
|
}
|
|
27
74
|
/**
|
|
28
|
-
* Object Index class for managing object locations across storage tiers
|
|
75
|
+
* Object Index class for managing object locations across storage tiers.
|
|
76
|
+
*
|
|
77
|
+
* @description
|
|
78
|
+
* Provides a centralized index for tracking where Git objects are stored
|
|
79
|
+
* in the tiered storage system. Uses SQLite (via Durable Object storage)
|
|
80
|
+
* for persistent, consistent storage of location metadata.
|
|
81
|
+
*
|
|
82
|
+
* ## Key Features
|
|
83
|
+
*
|
|
84
|
+
* - **Fast Lookups**: O(1) lookup by SHA using indexed SQLite queries
|
|
85
|
+
* - **Batch Operations**: Efficient bulk lookup for multiple objects
|
|
86
|
+
* - **Tier Tracking**: Query objects by storage tier
|
|
87
|
+
* - **Statistics**: Aggregate stats for monitoring and capacity planning
|
|
88
|
+
*
|
|
89
|
+
* ## Thread Safety
|
|
90
|
+
*
|
|
91
|
+
* The underlying Durable Object storage provides transactional guarantees,
|
|
92
|
+
* ensuring consistency even with concurrent access.
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```typescript
|
|
96
|
+
* const index = new ObjectIndex(storage);
|
|
97
|
+
*
|
|
98
|
+
* // Record locations
|
|
99
|
+
* await index.recordLocation({
|
|
100
|
+
* sha: 'abc123...',
|
|
101
|
+
* tier: 'hot',
|
|
102
|
+
* size: 1024,
|
|
103
|
+
* type: 'blob'
|
|
104
|
+
* });
|
|
105
|
+
*
|
|
106
|
+
* // Look up a single object
|
|
107
|
+
* const location = await index.lookupLocation('abc123...');
|
|
108
|
+
*
|
|
109
|
+
* // Batch lookup
|
|
110
|
+
* const result = await index.batchLookup(['sha1', 'sha2', 'sha3']);
|
|
111
|
+
*
|
|
112
|
+
* // Get objects by tier
|
|
113
|
+
* const hotObjects = await index.getObjectsByTier('hot');
|
|
114
|
+
*
|
|
115
|
+
* // Get statistics
|
|
116
|
+
* const stats = await index.getStats();
|
|
117
|
+
* ```
|
|
29
118
|
*/
|
|
30
119
|
export class ObjectIndex {
|
|
31
120
|
_storage;
|
|
121
|
+
/**
|
|
122
|
+
* Creates a new ObjectIndex instance.
|
|
123
|
+
*
|
|
124
|
+
* @description
|
|
125
|
+
* Initializes the index with a Durable Object storage instance.
|
|
126
|
+
* The storage should have the object_index table already created
|
|
127
|
+
* by the schema migration.
|
|
128
|
+
*
|
|
129
|
+
* @param storage - Durable Object storage instance with SQL support
|
|
130
|
+
*
|
|
131
|
+
* @example
|
|
132
|
+
* ```typescript
|
|
133
|
+
* // In a Durable Object class
|
|
134
|
+
* constructor(state: DurableObjectState) {
|
|
135
|
+
* this.index = new ObjectIndex(state.storage);
|
|
136
|
+
* }
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
32
139
|
constructor(storage) {
|
|
33
140
|
this._storage = storage;
|
|
34
141
|
}
|
|
35
142
|
/**
|
|
36
|
-
*
|
|
143
|
+
* Records the location of an object in the index.
|
|
144
|
+
*
|
|
145
|
+
* @description
|
|
146
|
+
* Inserts or updates the location record for an object. If the object
|
|
147
|
+
* already exists in the index, its location is updated (upsert behavior).
|
|
148
|
+
*
|
|
149
|
+
* @param options - Location recording options including SHA, tier, size, etc.
|
|
150
|
+
*
|
|
151
|
+
* @throws {Error} If SHA format is invalid
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* ```typescript
|
|
155
|
+
* // Record a new object in hot tier
|
|
156
|
+
* await index.recordLocation({
|
|
157
|
+
* sha: 'abc123def456789012345678901234567890abcd',
|
|
158
|
+
* tier: 'hot',
|
|
159
|
+
* size: 1024,
|
|
160
|
+
* type: 'blob'
|
|
161
|
+
* });
|
|
162
|
+
*
|
|
163
|
+
* // Record an object in R2 pack
|
|
164
|
+
* await index.recordLocation({
|
|
165
|
+
* sha: 'def456789012345678901234567890abcdef12',
|
|
166
|
+
* tier: 'r2',
|
|
167
|
+
* packId: 'pack-abc123',
|
|
168
|
+
* offset: 4096,
|
|
169
|
+
* size: 2048,
|
|
170
|
+
* type: 'tree'
|
|
171
|
+
* });
|
|
172
|
+
* ```
|
|
37
173
|
*/
|
|
38
174
|
async recordLocation(options) {
|
|
39
175
|
validateSha(options.sha);
|
|
@@ -43,7 +179,28 @@ export class ObjectIndex {
|
|
|
43
179
|
this._storage.sql.exec('INSERT OR REPLACE INTO object_index (sha, tier, pack_id, offset, size, type, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?)', options.sha, options.tier, packId, offset, options.size, options.type ?? null, updatedAt);
|
|
44
180
|
}
|
|
45
181
|
/**
|
|
46
|
-
*
|
|
182
|
+
* Looks up the location of an object by SHA.
|
|
183
|
+
*
|
|
184
|
+
* @description
|
|
185
|
+
* Retrieves the storage location for a single object. Returns null if
|
|
186
|
+
* the object is not found in the index.
|
|
187
|
+
*
|
|
188
|
+
* @param sha - The 40-character SHA-1 hash of the object
|
|
189
|
+
*
|
|
190
|
+
* @returns The object location or null if not found
|
|
191
|
+
*
|
|
192
|
+
* @example
|
|
193
|
+
* ```typescript
|
|
194
|
+
* const location = await index.lookupLocation('abc123...');
|
|
195
|
+
* if (location) {
|
|
196
|
+
* console.log(`Object is in ${location.tier} tier`);
|
|
197
|
+
* if (location.packId) {
|
|
198
|
+
* console.log(`Pack: ${location.packId}, Offset: ${location.offset}`);
|
|
199
|
+
* }
|
|
200
|
+
* } else {
|
|
201
|
+
* console.log('Object not found');
|
|
202
|
+
* }
|
|
203
|
+
* ```
|
|
47
204
|
*/
|
|
48
205
|
async lookupLocation(sha) {
|
|
49
206
|
const result = this._storage.sql.exec('SELECT sha, tier, pack_id, offset, size, type, updated_at FROM object_index WHERE sha = ?', sha);
|
|
@@ -54,7 +211,31 @@ export class ObjectIndex {
|
|
|
54
211
|
return rows[0];
|
|
55
212
|
}
|
|
56
213
|
/**
|
|
57
|
-
*
|
|
214
|
+
* Performs batch lookup of multiple objects.
|
|
215
|
+
*
|
|
216
|
+
* @description
|
|
217
|
+
* Efficiently looks up locations for multiple objects in a single query.
|
|
218
|
+
* Returns both found locations and a list of missing SHAs.
|
|
219
|
+
*
|
|
220
|
+
* This is more efficient than multiple single lookups when you need
|
|
221
|
+
* to find several objects.
|
|
222
|
+
*
|
|
223
|
+
* @param shas - Array of SHA-1 hashes to look up
|
|
224
|
+
*
|
|
225
|
+
* @returns Result containing found locations and missing SHAs
|
|
226
|
+
*
|
|
227
|
+
* @example
|
|
228
|
+
* ```typescript
|
|
229
|
+
* const shas = ['sha1...', 'sha2...', 'sha3...'];
|
|
230
|
+
* const result = await index.batchLookup(shas);
|
|
231
|
+
*
|
|
232
|
+
* console.log(`Found ${result.found.size} objects`);
|
|
233
|
+
* console.log(`Missing ${result.missing.length} objects`);
|
|
234
|
+
*
|
|
235
|
+
* for (const [sha, location] of result.found) {
|
|
236
|
+
* console.log(`${sha}: ${location.tier}`);
|
|
237
|
+
* }
|
|
238
|
+
* ```
|
|
58
239
|
*/
|
|
59
240
|
async batchLookup(shas) {
|
|
60
241
|
if (shas.length === 0) {
|
|
@@ -72,13 +253,59 @@ export class ObjectIndex {
|
|
|
72
253
|
return { found, missing };
|
|
73
254
|
}
|
|
74
255
|
/**
|
|
75
|
-
*
|
|
256
|
+
* Updates the location of an object (e.g., when moving between tiers).
|
|
257
|
+
*
|
|
258
|
+
* @description
|
|
259
|
+
* Updates the tier, packId, and offset for an existing object.
|
|
260
|
+
* Use this when migrating objects between storage tiers.
|
|
261
|
+
*
|
|
262
|
+
* Note: This only updates existing records. If the object doesn't exist,
|
|
263
|
+
* no action is taken. Use `recordLocation` for upsert behavior.
|
|
264
|
+
*
|
|
265
|
+
* @param sha - The object's SHA-1 hash
|
|
266
|
+
* @param newTier - The new storage tier
|
|
267
|
+
* @param packId - Pack ID for r2/parquet tiers (optional)
|
|
268
|
+
* @param offset - Byte offset in pack file (optional)
|
|
269
|
+
*
|
|
270
|
+
* @example
|
|
271
|
+
* ```typescript
|
|
272
|
+
* // Migrate object from hot to R2
|
|
273
|
+
* await index.updateLocation(
|
|
274
|
+
* 'abc123...',
|
|
275
|
+
* 'r2',
|
|
276
|
+
* 'pack-new123',
|
|
277
|
+
* 1024
|
|
278
|
+
* );
|
|
279
|
+
*
|
|
280
|
+
* // Migrate object to hot tier
|
|
281
|
+
* await index.updateLocation('abc123...', 'hot');
|
|
282
|
+
* ```
|
|
76
283
|
*/
|
|
77
284
|
async updateLocation(sha, newTier, packId, offset) {
|
|
78
285
|
this._storage.sql.exec('UPDATE object_index SET tier = ?, pack_id = ?, offset = ? WHERE sha = ?', newTier, packId ?? null, offset ?? null, sha);
|
|
79
286
|
}
|
|
80
287
|
/**
|
|
81
|
-
*
|
|
288
|
+
* Gets statistics about object distribution across tiers.
|
|
289
|
+
*
|
|
290
|
+
* @description
|
|
291
|
+
* Returns aggregated statistics including object counts and total sizes
|
|
292
|
+
* for each storage tier. Useful for monitoring storage usage and
|
|
293
|
+
* capacity planning.
|
|
294
|
+
*
|
|
295
|
+
* @returns Statistics about objects in each tier
|
|
296
|
+
*
|
|
297
|
+
* @example
|
|
298
|
+
* ```typescript
|
|
299
|
+
* const stats = await index.getStats();
|
|
300
|
+
*
|
|
301
|
+
* console.log(`Total objects: ${stats.totalObjects}`);
|
|
302
|
+
* console.log('Hot tier:');
|
|
303
|
+
* console.log(` Count: ${stats.hotCount}`);
|
|
304
|
+
* console.log(` Size: ${(stats.hotSize / 1024 / 1024).toFixed(2)} MB`);
|
|
305
|
+
* console.log('R2 tier:');
|
|
306
|
+
* console.log(` Count: ${stats.r2Count}`);
|
|
307
|
+
* console.log(` Size: ${(stats.r2Size / 1024 / 1024).toFixed(2)} MB`);
|
|
308
|
+
* ```
|
|
82
309
|
*/
|
|
83
310
|
async getStats() {
|
|
84
311
|
// Get objects by tier and compute stats in code
|
|
@@ -104,14 +331,48 @@ export class ObjectIndex {
|
|
|
104
331
|
};
|
|
105
332
|
}
|
|
106
333
|
/**
|
|
107
|
-
*
|
|
334
|
+
* Checks if an object exists in the index.
|
|
335
|
+
*
|
|
336
|
+
* @description
|
|
337
|
+
* Returns true if the object is tracked in the index, regardless of
|
|
338
|
+
* which tier it's stored in.
|
|
339
|
+
*
|
|
340
|
+
* @param sha - The object's SHA-1 hash
|
|
341
|
+
*
|
|
342
|
+
* @returns true if the object exists in the index
|
|
343
|
+
*
|
|
344
|
+
* @example
|
|
345
|
+
* ```typescript
|
|
346
|
+
* if (await index.exists('abc123...')) {
|
|
347
|
+
* console.log('Object is tracked');
|
|
348
|
+
* } else {
|
|
349
|
+
* console.log('Object is not in the index');
|
|
350
|
+
* }
|
|
351
|
+
* ```
|
|
108
352
|
*/
|
|
109
353
|
async exists(sha) {
|
|
110
354
|
const location = await this.lookupLocation(sha);
|
|
111
355
|
return location !== null;
|
|
112
356
|
}
|
|
113
357
|
/**
|
|
114
|
-
*
|
|
358
|
+
* Deletes an object from the index.
|
|
359
|
+
*
|
|
360
|
+
* @description
|
|
361
|
+
* Removes the location record for an object. This does NOT delete
|
|
362
|
+
* the actual object data from storage - only the index entry.
|
|
363
|
+
*
|
|
364
|
+
* @param sha - The object's SHA-1 hash
|
|
365
|
+
*
|
|
366
|
+
* @returns true if the object was deleted, false if it didn't exist
|
|
367
|
+
*
|
|
368
|
+
* @example
|
|
369
|
+
* ```typescript
|
|
370
|
+
* if (await index.deleteLocation('abc123...')) {
|
|
371
|
+
* console.log('Location record deleted');
|
|
372
|
+
* } else {
|
|
373
|
+
* console.log('Object was not in the index');
|
|
374
|
+
* }
|
|
375
|
+
* ```
|
|
115
376
|
*/
|
|
116
377
|
async deleteLocation(sha) {
|
|
117
378
|
const result = this._storage.sql.exec('DELETE FROM object_index WHERE sha = ?', sha);
|
|
@@ -119,14 +380,52 @@ export class ObjectIndex {
|
|
|
119
380
|
return rows.length > 0 && rows[0].changes > 0;
|
|
120
381
|
}
|
|
121
382
|
/**
|
|
122
|
-
*
|
|
383
|
+
* Gets all objects in a specific tier.
|
|
384
|
+
*
|
|
385
|
+
* @description
|
|
386
|
+
* Returns all objects currently stored in the specified tier.
|
|
387
|
+
* Useful for migration planning or tier-specific operations.
|
|
388
|
+
*
|
|
389
|
+
* @param tier - The storage tier to query ('hot', 'r2', or 'parquet')
|
|
390
|
+
*
|
|
391
|
+
* @returns Array of object locations in the specified tier
|
|
392
|
+
*
|
|
393
|
+
* @example
|
|
394
|
+
* ```typescript
|
|
395
|
+
* // Get all hot tier objects
|
|
396
|
+
* const hotObjects = await index.getObjectsByTier('hot');
|
|
397
|
+
* console.log(`Hot tier has ${hotObjects.length} objects`);
|
|
398
|
+
*
|
|
399
|
+
* // Calculate total size
|
|
400
|
+
* const totalSize = hotObjects.reduce((sum, obj) => sum + obj.size, 0);
|
|
401
|
+
* console.log(`Total hot tier size: ${totalSize} bytes`);
|
|
402
|
+
* ```
|
|
123
403
|
*/
|
|
124
404
|
async getObjectsByTier(tier) {
|
|
125
405
|
const result = this._storage.sql.exec('SELECT sha, tier, pack_id, offset, size, type, updated_at FROM object_index WHERE tier = ?', tier);
|
|
126
406
|
return result.toArray();
|
|
127
407
|
}
|
|
128
408
|
/**
|
|
129
|
-
*
|
|
409
|
+
* Gets all objects in a specific pack.
|
|
410
|
+
*
|
|
411
|
+
* @description
|
|
412
|
+
* Returns all objects stored in a particular packfile, sorted by offset.
|
|
413
|
+
* Useful for pack operations like repacking or verification.
|
|
414
|
+
*
|
|
415
|
+
* @param packId - The pack file identifier
|
|
416
|
+
*
|
|
417
|
+
* @returns Array of object locations in the pack, sorted by offset
|
|
418
|
+
*
|
|
419
|
+
* @example
|
|
420
|
+
* ```typescript
|
|
421
|
+
* const packObjects = await index.getObjectsByPack('pack-abc123');
|
|
422
|
+
* console.log(`Pack contains ${packObjects.length} objects`);
|
|
423
|
+
*
|
|
424
|
+
* // Objects are sorted by offset for sequential reading
|
|
425
|
+
* for (const obj of packObjects) {
|
|
426
|
+
* console.log(` ${obj.sha}: offset=${obj.offset}, size=${obj.size}`);
|
|
427
|
+
* }
|
|
428
|
+
* ```
|
|
130
429
|
*/
|
|
131
430
|
async getObjectsByPack(packId) {
|
|
132
431
|
const result = this._storage.sql.exec('SELECT sha, tier, pack_id, offset, size, type, updated_at FROM object_index WHERE pack_id = ?', packId);
|
|
@@ -136,28 +435,95 @@ export class ObjectIndex {
|
|
|
136
435
|
}
|
|
137
436
|
}
|
|
138
437
|
/**
|
|
139
|
-
*
|
|
438
|
+
* Records the location of an object (standalone function).
|
|
439
|
+
*
|
|
440
|
+
* @description
|
|
441
|
+
* Standalone function that creates a temporary ObjectIndex instance
|
|
442
|
+
* to record an object's location. Useful when you don't need to
|
|
443
|
+
* maintain an ObjectIndex instance.
|
|
444
|
+
*
|
|
445
|
+
* @param storage - Durable Object storage instance
|
|
446
|
+
* @param options - Location recording options
|
|
447
|
+
*
|
|
448
|
+
* @throws {Error} If SHA format is invalid
|
|
449
|
+
*
|
|
450
|
+
* @example
|
|
451
|
+
* ```typescript
|
|
452
|
+
* await recordLocation(storage, {
|
|
453
|
+
* sha: 'abc123...',
|
|
454
|
+
* tier: 'hot',
|
|
455
|
+
* size: 1024,
|
|
456
|
+
* type: 'blob'
|
|
457
|
+
* });
|
|
458
|
+
* ```
|
|
140
459
|
*/
|
|
141
460
|
export async function recordLocation(storage, options) {
|
|
142
461
|
const index = new ObjectIndex(storage);
|
|
143
462
|
return index.recordLocation(options);
|
|
144
463
|
}
|
|
145
464
|
/**
|
|
146
|
-
*
|
|
465
|
+
* Looks up the location of an object by SHA (standalone function).
|
|
466
|
+
*
|
|
467
|
+
* @description
|
|
468
|
+
* Standalone function for single object lookup. Creates a temporary
|
|
469
|
+
* ObjectIndex instance internally.
|
|
470
|
+
*
|
|
471
|
+
* @param storage - Durable Object storage instance
|
|
472
|
+
* @param sha - The object's SHA-1 hash
|
|
473
|
+
*
|
|
474
|
+
* @returns Object location or null if not found
|
|
475
|
+
*
|
|
476
|
+
* @example
|
|
477
|
+
* ```typescript
|
|
478
|
+
* const location = await lookupLocation(storage, 'abc123...');
|
|
479
|
+
* if (location) {
|
|
480
|
+
* console.log(`Found in ${location.tier}`);
|
|
481
|
+
* }
|
|
482
|
+
* ```
|
|
147
483
|
*/
|
|
148
484
|
export async function lookupLocation(storage, sha) {
|
|
149
485
|
const index = new ObjectIndex(storage);
|
|
150
486
|
return index.lookupLocation(sha);
|
|
151
487
|
}
|
|
152
488
|
/**
|
|
153
|
-
*
|
|
489
|
+
* Performs batch lookup of multiple objects (standalone function).
|
|
490
|
+
*
|
|
491
|
+
* @description
|
|
492
|
+
* Standalone function for batch object lookup. More efficient than
|
|
493
|
+
* multiple single lookups when querying several objects.
|
|
494
|
+
*
|
|
495
|
+
* @param storage - Durable Object storage instance
|
|
496
|
+
* @param shas - Array of SHA-1 hashes to look up
|
|
497
|
+
*
|
|
498
|
+
* @returns Result containing found locations and missing SHAs
|
|
499
|
+
*
|
|
500
|
+
* @example
|
|
501
|
+
* ```typescript
|
|
502
|
+
* const result = await batchLookup(storage, ['sha1...', 'sha2...']);
|
|
503
|
+
* console.log(`Found: ${result.found.size}, Missing: ${result.missing.length}`);
|
|
504
|
+
* ```
|
|
154
505
|
*/
|
|
155
506
|
export async function batchLookup(storage, shas) {
|
|
156
507
|
const index = new ObjectIndex(storage);
|
|
157
508
|
return index.batchLookup(shas);
|
|
158
509
|
}
|
|
159
510
|
/**
|
|
160
|
-
*
|
|
511
|
+
* Gets statistics about object distribution (standalone function).
|
|
512
|
+
*
|
|
513
|
+
* @description
|
|
514
|
+
* Standalone function for retrieving object distribution statistics
|
|
515
|
+
* across storage tiers.
|
|
516
|
+
*
|
|
517
|
+
* @param storage - Durable Object storage instance
|
|
518
|
+
*
|
|
519
|
+
* @returns Statistics about objects in each tier
|
|
520
|
+
*
|
|
521
|
+
* @example
|
|
522
|
+
* ```typescript
|
|
523
|
+
* const stats = await getStats(storage);
|
|
524
|
+
* console.log(`Total: ${stats.totalObjects} objects`);
|
|
525
|
+
* console.log(`Hot: ${stats.hotCount}, R2: ${stats.r2Count}`);
|
|
526
|
+
* ```
|
|
161
527
|
*/
|
|
162
528
|
export async function getStats(storage) {
|
|
163
529
|
const index = new ObjectIndex(storage);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object-index.js","sourceRoot":"","sources":["../../src/storage/object-index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"object-index.js","sourceRoot":"","sources":["../../src/storage/object-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AA8LH;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAA;IAC/C,CAAC;IACD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAA;IAC/C,CAAC;IACD,sDAAsD;IACtD,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,MAAM,OAAO,WAAW;IACd,QAAQ,CAAsB;IAEtC;;;;;;;;;;;;;;;;;OAiBG;IACH,YAAY,OAA6B;QACvC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;IACzB,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,KAAK,CAAC,cAAc,CAAC,OAA8B;QACjD,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAExB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAA;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAA;QAErC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CACpB,uHAAuH,EACvH,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,IAAI,EACZ,MAAM,EACN,MAAM,EACN,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,IAAI,IAAI,IAAI,EACpB,SAAS,CACV,CAAA;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,KAAK,CAAC,cAAc,CAAC,GAAW;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CACnC,2FAA2F,EAC3F,GAAG,CACJ,CAAA;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAsB,CAAA;QACjD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,IAAI,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,KAAK,CAAC,WAAW,CAAC,IAAc;QAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;QAC1C,CAAC;QAED,gCAAgC;QAChC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CACnC,6FAA6F,YAAY,GAAG,EAC5G,GAAG,IAAI,CACR,CAAA;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAsB,CAAA;QAEjD,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAA;QAC/C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QACzB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;QAEnD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;IAC3B,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,KAAK,CAAC,cAAc,CAClB,GAAW,EACX,OAAoB,EACpB,MAAe,EACf,MAAe;QAEf,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CACpB,yEAAyE,EACzE,OAAO,EACP,MAAM,IAAI,IAAI,EACd,MAAM,IAAI,IAAI,EACd,GAAG,CACJ,CAAA;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,KAAK,CAAC,QAAQ;QACZ,gDAAgD;QAChD,kEAAkE;QAClE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;QACrD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACnD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAA;QAE7D,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAA;QAClC,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAA;QAChC,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAA;QAC1C,MAAM,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,YAAY,CAAA;QAEtD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QAC9D,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QAC5D,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QAEtE,OAAO;YACL,YAAY;YACZ,QAAQ;YACR,OAAO;YACP,YAAY;YACZ,OAAO;YACP,MAAM;YACN,WAAW;SACZ,CAAA;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;QAC/C,OAAO,QAAQ,KAAK,IAAI,CAAA;IAC1B,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,KAAK,CAAC,cAAc,CAAC,GAAW;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CACnC,wCAAwC,EACxC,GAAG,CACJ,CAAA;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAA2B,CAAA;QACtD,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAA;IAC/C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,KAAK,CAAC,gBAAgB,CAAC,IAAiB;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CACnC,4FAA4F,EAC5F,IAAI,CACL,CAAA;QACD,OAAO,MAAM,CAAC,OAAO,EAAsB,CAAA;IAC7C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,KAAK,CAAC,gBAAgB,CAAC,MAAc;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CACnC,+FAA+F,EAC/F,MAAM,CACP,CAAA;QACD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,EAAsB,CAAA;QACtD,+CAA+C;QAC/C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAA;IACpE,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA6B,EAC7B,OAA8B;IAE9B,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAA;IACtC,OAAO,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;AACtC,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA6B,EAC7B,GAAW;IAEX,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAA;IACtC,OAAO,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;AAClC,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAA6B,EAC7B,IAAc;IAEd,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAA;IACtC,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;AAChC,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,OAA6B;IAE7B,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAA;IACtC,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAA;AACzB,CAAC"}
|