@git-stunts/git-warp 10.3.2 → 10.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -3
- package/SECURITY.md +89 -1
- package/bin/warp-graph.js +574 -208
- package/index.d.ts +55 -0
- package/index.js +4 -0
- package/package.json +8 -4
- package/src/domain/WarpGraph.js +334 -161
- package/src/domain/crdt/LWW.js +1 -1
- package/src/domain/crdt/ORSet.js +10 -6
- package/src/domain/crdt/VersionVector.js +5 -1
- package/src/domain/errors/EmptyMessageError.js +2 -4
- package/src/domain/errors/ForkError.js +4 -0
- package/src/domain/errors/IndexError.js +4 -0
- package/src/domain/errors/OperationAbortedError.js +4 -0
- package/src/domain/errors/QueryError.js +4 -0
- package/src/domain/errors/SchemaUnsupportedError.js +4 -0
- package/src/domain/errors/ShardCorruptionError.js +2 -6
- package/src/domain/errors/ShardLoadError.js +2 -6
- package/src/domain/errors/ShardValidationError.js +2 -7
- package/src/domain/errors/StorageError.js +2 -6
- package/src/domain/errors/SyncError.js +4 -0
- package/src/domain/errors/TraversalError.js +4 -0
- package/src/domain/errors/WarpError.js +2 -4
- package/src/domain/errors/WormholeError.js +4 -0
- package/src/domain/services/AnchorMessageCodec.js +1 -4
- package/src/domain/services/BitmapIndexBuilder.js +10 -6
- package/src/domain/services/BitmapIndexReader.js +27 -21
- package/src/domain/services/BoundaryTransitionRecord.js +22 -15
- package/src/domain/services/CheckpointMessageCodec.js +1 -7
- package/src/domain/services/CheckpointSerializerV5.js +20 -19
- package/src/domain/services/CheckpointService.js +18 -18
- package/src/domain/services/CommitDagTraversalService.js +13 -1
- package/src/domain/services/DagPathFinding.js +40 -18
- package/src/domain/services/DagTopology.js +7 -6
- package/src/domain/services/DagTraversal.js +5 -3
- package/src/domain/services/Frontier.js +7 -6
- package/src/domain/services/HealthCheckService.js +15 -14
- package/src/domain/services/HookInstaller.js +64 -13
- package/src/domain/services/HttpSyncServer.js +88 -19
- package/src/domain/services/IndexRebuildService.js +12 -12
- package/src/domain/services/IndexStalenessChecker.js +13 -6
- package/src/domain/services/JoinReducer.js +28 -27
- package/src/domain/services/LogicalTraversal.js +7 -6
- package/src/domain/services/MessageCodecInternal.js +2 -0
- package/src/domain/services/ObserverView.js +6 -6
- package/src/domain/services/PatchBuilderV2.js +9 -9
- package/src/domain/services/PatchMessageCodec.js +1 -7
- package/src/domain/services/ProvenanceIndex.js +6 -8
- package/src/domain/services/ProvenancePayload.js +1 -2
- package/src/domain/services/QueryBuilder.js +29 -23
- package/src/domain/services/StateDiff.js +7 -7
- package/src/domain/services/StateSerializerV5.js +8 -6
- package/src/domain/services/StreamingBitmapIndexBuilder.js +29 -23
- package/src/domain/services/SyncAuthService.js +396 -0
- package/src/domain/services/SyncProtocol.js +23 -26
- package/src/domain/services/TemporalQuery.js +4 -3
- package/src/domain/services/TranslationCost.js +4 -4
- package/src/domain/services/WormholeService.js +19 -15
- package/src/domain/types/TickReceipt.js +10 -6
- package/src/domain/types/WarpTypesV2.js +2 -3
- package/src/domain/utils/CachedValue.js +1 -1
- package/src/domain/utils/LRUCache.js +3 -3
- package/src/domain/utils/MinHeap.js +2 -2
- package/src/domain/utils/RefLayout.js +19 -0
- package/src/domain/utils/WriterId.js +2 -2
- package/src/domain/utils/defaultCodec.js +9 -2
- package/src/domain/utils/defaultCrypto.js +36 -0
- package/src/domain/utils/roaring.js +5 -5
- package/src/domain/utils/seekCacheKey.js +32 -0
- package/src/domain/warp/PatchSession.js +3 -3
- package/src/domain/warp/Writer.js +2 -2
- package/src/infrastructure/adapters/BunHttpAdapter.js +21 -8
- package/src/infrastructure/adapters/CasSeekCacheAdapter.js +311 -0
- package/src/infrastructure/adapters/ClockAdapter.js +2 -2
- package/src/infrastructure/adapters/DenoHttpAdapter.js +22 -9
- package/src/infrastructure/adapters/GitGraphAdapter.js +25 -83
- package/src/infrastructure/adapters/InMemoryGraphAdapter.js +488 -0
- package/src/infrastructure/adapters/NodeCryptoAdapter.js +16 -3
- package/src/infrastructure/adapters/NodeHttpAdapter.js +33 -11
- package/src/infrastructure/adapters/WebCryptoAdapter.js +21 -11
- package/src/infrastructure/adapters/adapterValidation.js +90 -0
- package/src/infrastructure/codecs/CborCodec.js +16 -8
- package/src/ports/BlobPort.js +2 -2
- package/src/ports/CodecPort.js +2 -2
- package/src/ports/CommitPort.js +8 -21
- package/src/ports/ConfigPort.js +3 -3
- package/src/ports/CryptoPort.js +7 -7
- package/src/ports/GraphPersistencePort.js +12 -14
- package/src/ports/HttpServerPort.js +1 -5
- package/src/ports/IndexStoragePort.js +1 -0
- package/src/ports/LoggerPort.js +9 -9
- package/src/ports/RefPort.js +5 -5
- package/src/ports/SeekCachePort.js +73 -0
- package/src/ports/TreePort.js +3 -3
- package/src/visualization/layouts/converters.js +14 -7
- package/src/visualization/layouts/elkAdapter.js +17 -4
- package/src/visualization/layouts/elkLayout.js +23 -7
- package/src/visualization/layouts/index.js +3 -3
- package/src/visualization/renderers/ascii/check.js +30 -17
- package/src/visualization/renderers/ascii/graph.js +92 -1
- package/src/visualization/renderers/ascii/history.js +28 -26
- package/src/visualization/renderers/ascii/info.js +9 -7
- package/src/visualization/renderers/ascii/materialize.js +20 -16
- package/src/visualization/renderers/ascii/opSummary.js +15 -7
- package/src/visualization/renderers/ascii/path.js +1 -1
- package/src/visualization/renderers/ascii/seek.js +187 -23
- package/src/visualization/renderers/ascii/table.js +1 -1
- package/src/visualization/renderers/svg/index.js +5 -1
package/index.d.ts
CHANGED
|
@@ -475,6 +475,30 @@ export class GlobalClockAdapter extends ClockPort {
|
|
|
475
475
|
timestamp(): string;
|
|
476
476
|
}
|
|
477
477
|
|
|
478
|
+
/**
|
|
479
|
+
* Port interface for seek materialization cache operations.
|
|
480
|
+
*
|
|
481
|
+
* Implementations store serialized WarpStateV5 snapshots keyed by
|
|
482
|
+
* (ceiling, frontier) tuples for near-instant restoration of
|
|
483
|
+
* previously-visited ticks during seek exploration.
|
|
484
|
+
*
|
|
485
|
+
* @abstract
|
|
486
|
+
*/
|
|
487
|
+
export abstract class SeekCachePort {
|
|
488
|
+
/** Retrieves a cached state buffer by key, or null on miss. */
|
|
489
|
+
abstract get(key: string): Promise<Buffer | null>;
|
|
490
|
+
/** Stores a state buffer under the given key. */
|
|
491
|
+
abstract set(key: string, buffer: Buffer): Promise<void>;
|
|
492
|
+
/** Checks whether a key exists in the cache index. */
|
|
493
|
+
abstract has(key: string): Promise<boolean>;
|
|
494
|
+
/** Lists all keys currently in the cache index. */
|
|
495
|
+
abstract keys(): Promise<string[]>;
|
|
496
|
+
/** Removes a single entry from the cache. */
|
|
497
|
+
abstract delete(key: string): Promise<boolean>;
|
|
498
|
+
/** Removes all entries from the cache. */
|
|
499
|
+
abstract clear(): Promise<void>;
|
|
500
|
+
}
|
|
501
|
+
|
|
478
502
|
/**
|
|
479
503
|
* Port interface for structured logging operations.
|
|
480
504
|
* @abstract
|
|
@@ -1389,6 +1413,22 @@ export interface ApplySyncResult {
|
|
|
1389
1413
|
applied: number;
|
|
1390
1414
|
}
|
|
1391
1415
|
|
|
1416
|
+
/**
|
|
1417
|
+
* Server-side auth configuration for serve().
|
|
1418
|
+
*/
|
|
1419
|
+
export interface SyncAuthServerOptions {
|
|
1420
|
+
keys: Record<string, string>;
|
|
1421
|
+
mode?: 'enforce' | 'log-only';
|
|
1422
|
+
}
|
|
1423
|
+
|
|
1424
|
+
/**
|
|
1425
|
+
* Client-side auth credentials for syncWith().
|
|
1426
|
+
*/
|
|
1427
|
+
export interface SyncAuthClientOptions {
|
|
1428
|
+
secret: string;
|
|
1429
|
+
keyId?: string;
|
|
1430
|
+
}
|
|
1431
|
+
|
|
1392
1432
|
// ============================================================================
|
|
1393
1433
|
// Status snapshot
|
|
1394
1434
|
// ============================================================================
|
|
@@ -1450,6 +1490,7 @@ export default class WarpGraph {
|
|
|
1450
1490
|
clock?: ClockPort;
|
|
1451
1491
|
crypto?: CryptoPort;
|
|
1452
1492
|
codec?: unknown;
|
|
1493
|
+
seekCache?: SeekCachePort;
|
|
1453
1494
|
}): Promise<WarpGraph>;
|
|
1454
1495
|
|
|
1455
1496
|
/**
|
|
@@ -1462,6 +1503,12 @@ export default class WarpGraph {
|
|
|
1462
1503
|
*/
|
|
1463
1504
|
readonly writerId: string;
|
|
1464
1505
|
|
|
1506
|
+
/** Returns the attached seek cache, or null if none is set. */
|
|
1507
|
+
readonly seekCache: SeekCachePort | null;
|
|
1508
|
+
|
|
1509
|
+
/** Attaches (or detaches, with null) a persistent seek cache. */
|
|
1510
|
+
setSeekCache(cache: SeekCachePort | null): void;
|
|
1511
|
+
|
|
1465
1512
|
/**
|
|
1466
1513
|
* Creates a new patch for adding operations.
|
|
1467
1514
|
*/
|
|
@@ -1495,6 +1542,12 @@ export default class WarpGraph {
|
|
|
1495
1542
|
*/
|
|
1496
1543
|
getPropertyCount(): Promise<number>;
|
|
1497
1544
|
|
|
1545
|
+
/**
|
|
1546
|
+
* Returns a defensive copy of the current materialized state,
|
|
1547
|
+
* or null if no state has been materialized yet.
|
|
1548
|
+
*/
|
|
1549
|
+
getStateSnapshot(): Promise<WarpStateV5 | null>;
|
|
1550
|
+
|
|
1498
1551
|
/**
|
|
1499
1552
|
* Gets all properties for an edge from the materialized state.
|
|
1500
1553
|
* Returns null if the edge does not exist or is tombstoned.
|
|
@@ -1584,6 +1637,7 @@ export default class WarpGraph {
|
|
|
1584
1637
|
path?: string;
|
|
1585
1638
|
maxRequestBytes?: number;
|
|
1586
1639
|
httpPort: HttpServerPort;
|
|
1640
|
+
auth?: SyncAuthServerOptions;
|
|
1587
1641
|
}): Promise<{ close(): Promise<void>; url: string }>;
|
|
1588
1642
|
|
|
1589
1643
|
/**
|
|
@@ -1603,6 +1657,7 @@ export default class WarpGraph {
|
|
|
1603
1657
|
status?: number;
|
|
1604
1658
|
error?: Error;
|
|
1605
1659
|
}) => void;
|
|
1660
|
+
auth?: SyncAuthClientOptions;
|
|
1606
1661
|
}): Promise<{ applied: number; attempts: number }>;
|
|
1607
1662
|
|
|
1608
1663
|
/**
|
package/index.js
CHANGED
|
@@ -32,6 +32,7 @@ import GraphPersistencePort from './src/ports/GraphPersistencePort.js';
|
|
|
32
32
|
import IndexStoragePort from './src/ports/IndexStoragePort.js';
|
|
33
33
|
import LoggerPort from './src/ports/LoggerPort.js';
|
|
34
34
|
import ClockPort from './src/ports/ClockPort.js';
|
|
35
|
+
import SeekCachePort from './src/ports/SeekCachePort.js';
|
|
35
36
|
import NoOpLogger from './src/infrastructure/adapters/NoOpLogger.js';
|
|
36
37
|
import ConsoleLogger, { LogLevel } from './src/infrastructure/adapters/ConsoleLogger.js';
|
|
37
38
|
import ClockAdapter from './src/infrastructure/adapters/ClockAdapter.js';
|
|
@@ -125,6 +126,9 @@ export {
|
|
|
125
126
|
|
|
126
127
|
// Clock infrastructure
|
|
127
128
|
ClockPort,
|
|
129
|
+
|
|
130
|
+
// Seek cache (RECALL)
|
|
131
|
+
SeekCachePort,
|
|
128
132
|
ClockAdapter,
|
|
129
133
|
PerformanceClockAdapter,
|
|
130
134
|
GlobalClockAdapter,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@git-stunts/git-warp",
|
|
3
|
-
"version": "10.
|
|
3
|
+
"version": "10.7.0",
|
|
4
4
|
"description": "Deterministic WARP graph over Git: graph-native storage, traversal, and tooling.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"url": "https://github.com/git-stunts/git-warp/issues"
|
|
15
15
|
},
|
|
16
16
|
"engines": {
|
|
17
|
-
"node": ">=
|
|
17
|
+
"node": ">=22.0.0"
|
|
18
18
|
},
|
|
19
19
|
"sideEffects": false,
|
|
20
20
|
"main": "./index.js",
|
|
@@ -74,7 +74,6 @@
|
|
|
74
74
|
"demo:bench-streaming": "cd examples && docker compose up -d && docker compose exec demo node /app/examples/streaming-benchmark.js",
|
|
75
75
|
"demo:bench-traversal": "cd examples && docker compose up -d && docker compose exec demo node /app/examples/traversal-benchmark.js",
|
|
76
76
|
"demo:down": "cd examples && docker compose down -v",
|
|
77
|
-
"roadmap": "node scripts/roadmap.js",
|
|
78
77
|
"setup:hooks": "node scripts/setup-hooks.js",
|
|
79
78
|
"prepare": "patch-package && node scripts/setup-hooks.js",
|
|
80
79
|
"prepack": "npm run lint && npm run test:local",
|
|
@@ -84,10 +83,15 @@
|
|
|
84
83
|
"test:node22": "docker compose -f docker-compose.test.yml --profile node22 run --build --rm test-node22",
|
|
85
84
|
"test:bun": "docker compose -f docker-compose.test.yml --profile bun run --build --rm test-bun",
|
|
86
85
|
"test:deno": "docker compose -f docker-compose.test.yml --profile deno run --build --rm test-deno",
|
|
87
|
-
"test:matrix": "docker compose -f docker-compose.test.yml --profile full up --build --abort-on-container-exit"
|
|
86
|
+
"test:matrix": "docker compose -f docker-compose.test.yml --profile full up --build --abort-on-container-exit",
|
|
87
|
+
"typecheck": "tsc --noEmit",
|
|
88
|
+
"typecheck:src": "tsc --noEmit -p tsconfig.src.json",
|
|
89
|
+
"typecheck:test": "tsc --noEmit -p tsconfig.test.json",
|
|
90
|
+
"typecheck:policy": "node scripts/ts-policy-check.js"
|
|
88
91
|
},
|
|
89
92
|
"dependencies": {
|
|
90
93
|
"@git-stunts/alfred": "^0.4.0",
|
|
94
|
+
"@git-stunts/git-cas": "^3.0.0",
|
|
91
95
|
"@git-stunts/plumbing": "^2.8.0",
|
|
92
96
|
"@git-stunts/trailer-codec": "^2.1.1",
|
|
93
97
|
"boxen": "^7.1.1",
|