@jamesaphoenix/tx-core 0.4.1
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/db.d.ts +42 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +46 -0
- package/dist/db.js.map +1 -0
- package/dist/errors.d.ts +231 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +139 -0
- package/dist/errors.js.map +1 -0
- package/dist/id.d.ts +6 -0
- package/dist/id.d.ts.map +1 -0
- package/dist/id.js +21 -0
- package/dist/id.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/layer.d.ts +50 -0
- package/dist/layer.d.ts.map +1 -0
- package/dist/layer.js +155 -0
- package/dist/layer.js.map +1 -0
- package/dist/mappers/anchor.d.ts +14 -0
- package/dist/mappers/anchor.d.ts.map +1 -0
- package/dist/mappers/anchor.js +38 -0
- package/dist/mappers/anchor.js.map +1 -0
- package/dist/mappers/attempt.d.ts +15 -0
- package/dist/mappers/attempt.d.ts.map +1 -0
- package/dist/mappers/attempt.js +23 -0
- package/dist/mappers/attempt.js.map +1 -0
- package/dist/mappers/candidate.d.ts +23 -0
- package/dist/mappers/candidate.d.ts.map +1 -0
- package/dist/mappers/candidate.js +53 -0
- package/dist/mappers/candidate.js.map +1 -0
- package/dist/mappers/claim.d.ts +30 -0
- package/dist/mappers/claim.d.ts.map +1 -0
- package/dist/mappers/claim.js +32 -0
- package/dist/mappers/claim.js.map +1 -0
- package/dist/mappers/deduplication.d.ts +39 -0
- package/dist/mappers/deduplication.d.ts.map +1 -0
- package/dist/mappers/deduplication.js +53 -0
- package/dist/mappers/deduplication.js.map +1 -0
- package/dist/mappers/edge.d.ts +10 -0
- package/dist/mappers/edge.d.ts.map +1 -0
- package/dist/mappers/edge.js +19 -0
- package/dist/mappers/edge.js.map +1 -0
- package/dist/mappers/file-learning.d.ts +14 -0
- package/dist/mappers/file-learning.d.ts.map +1 -0
- package/dist/mappers/file-learning.js +75 -0
- package/dist/mappers/file-learning.js.map +1 -0
- package/dist/mappers/index.d.ts +17 -0
- package/dist/mappers/index.d.ts.map +1 -0
- package/dist/mappers/index.js +30 -0
- package/dist/mappers/index.js.map +1 -0
- package/dist/mappers/learning.d.ts +19 -0
- package/dist/mappers/learning.d.ts.map +1 -0
- package/dist/mappers/learning.js +41 -0
- package/dist/mappers/learning.js.map +1 -0
- package/dist/mappers/orchestrator-state.d.ts +33 -0
- package/dist/mappers/orchestrator-state.d.ts.map +1 -0
- package/dist/mappers/orchestrator-state.js +34 -0
- package/dist/mappers/orchestrator-state.js.map +1 -0
- package/dist/mappers/run.d.ts +32 -0
- package/dist/mappers/run.d.ts.map +1 -0
- package/dist/mappers/run.js +64 -0
- package/dist/mappers/run.js.map +1 -0
- package/dist/mappers/task.d.ts +23 -0
- package/dist/mappers/task.d.ts.map +1 -0
- package/dist/mappers/task.js +54 -0
- package/dist/mappers/task.js.map +1 -0
- package/dist/mappers/tracked-project.d.ts +15 -0
- package/dist/mappers/tracked-project.d.ts.map +1 -0
- package/dist/mappers/tracked-project.js +23 -0
- package/dist/mappers/tracked-project.js.map +1 -0
- package/dist/mappers/worker.d.ts +33 -0
- package/dist/mappers/worker.d.ts.map +1 -0
- package/dist/mappers/worker.js +35 -0
- package/dist/mappers/worker.js.map +1 -0
- package/dist/repo/anchor-repo.d.ts +52 -0
- package/dist/repo/anchor-repo.d.ts.map +1 -0
- package/dist/repo/anchor-repo.js +204 -0
- package/dist/repo/anchor-repo.js.map +1 -0
- package/dist/repo/attempt-repo.d.ts +25 -0
- package/dist/repo/attempt-repo.d.ts.map +1 -0
- package/dist/repo/attempt-repo.js +78 -0
- package/dist/repo/attempt-repo.js.map +1 -0
- package/dist/repo/candidate-repo.d.ts +16 -0
- package/dist/repo/candidate-repo.d.ts.map +1 -0
- package/dist/repo/candidate-repo.js +143 -0
- package/dist/repo/candidate-repo.js.map +1 -0
- package/dist/repo/claim-repo.d.ts +17 -0
- package/dist/repo/claim-repo.d.ts.map +1 -0
- package/dist/repo/claim-repo.js +62 -0
- package/dist/repo/claim-repo.js.map +1 -0
- package/dist/repo/deduplication-repo.d.ts +37 -0
- package/dist/repo/deduplication-repo.d.ts.map +1 -0
- package/dist/repo/deduplication-repo.js +133 -0
- package/dist/repo/deduplication-repo.js.map +1 -0
- package/dist/repo/dep-repo.d.ts +19 -0
- package/dist/repo/dep-repo.d.ts.map +1 -0
- package/dist/repo/dep-repo.js +104 -0
- package/dist/repo/dep-repo.js.map +1 -0
- package/dist/repo/edge-repo.d.ts +26 -0
- package/dist/repo/edge-repo.d.ts.map +1 -0
- package/dist/repo/edge-repo.js +227 -0
- package/dist/repo/edge-repo.js.map +1 -0
- package/dist/repo/file-learning-repo.d.ts +17 -0
- package/dist/repo/file-learning-repo.d.ts.map +1 -0
- package/dist/repo/file-learning-repo.js +60 -0
- package/dist/repo/file-learning-repo.js.map +1 -0
- package/dist/repo/index.d.ts +18 -0
- package/dist/repo/index.d.ts.map +1 -0
- package/dist/repo/index.js +18 -0
- package/dist/repo/index.js.map +1 -0
- package/dist/repo/learning-repo.d.ts +31 -0
- package/dist/repo/learning-repo.d.ts.map +1 -0
- package/dist/repo/learning-repo.js +165 -0
- package/dist/repo/learning-repo.js.map +1 -0
- package/dist/repo/orchestrator-state-repo.d.ts +27 -0
- package/dist/repo/orchestrator-state-repo.d.ts.map +1 -0
- package/dist/repo/orchestrator-state-repo.js +96 -0
- package/dist/repo/orchestrator-state-repo.js.map +1 -0
- package/dist/repo/run-repo.d.ts +31 -0
- package/dist/repo/run-repo.d.ts.map +1 -0
- package/dist/repo/run-repo.js +132 -0
- package/dist/repo/run-repo.js.map +1 -0
- package/dist/repo/task-repo.d.ts +21 -0
- package/dist/repo/task-repo.d.ts.map +1 -0
- package/dist/repo/task-repo.js +169 -0
- package/dist/repo/task-repo.js.map +1 -0
- package/dist/repo/tracked-project-repo.d.ts +16 -0
- package/dist/repo/tracked-project-repo.d.ts.map +1 -0
- package/dist/repo/tracked-project-repo.js +54 -0
- package/dist/repo/tracked-project-repo.js.map +1 -0
- package/dist/repo/worker-repo.d.ts +19 -0
- package/dist/repo/worker-repo.d.ts.map +1 -0
- package/dist/repo/worker-repo.js +72 -0
- package/dist/repo/worker-repo.js.map +1 -0
- package/dist/schemas/index.d.ts +8 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +7 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/sync.d.ts +296 -0
- package/dist/schemas/sync.d.ts.map +1 -0
- package/dist/schemas/sync.js +146 -0
- package/dist/schemas/sync.js.map +1 -0
- package/dist/schemas/worker.d.ts +77 -0
- package/dist/schemas/worker.d.ts.map +1 -0
- package/dist/schemas/worker.js +80 -0
- package/dist/schemas/worker.js.map +1 -0
- package/dist/services/anchor-service.d.ts +147 -0
- package/dist/services/anchor-service.d.ts.map +1 -0
- package/dist/services/anchor-service.js +540 -0
- package/dist/services/anchor-service.js.map +1 -0
- package/dist/services/anchor-verification.d.ts +94 -0
- package/dist/services/anchor-verification.d.ts.map +1 -0
- package/dist/services/anchor-verification.js +617 -0
- package/dist/services/anchor-verification.js.map +1 -0
- package/dist/services/ast-grep-service.d.ts +58 -0
- package/dist/services/ast-grep-service.d.ts.map +1 -0
- package/dist/services/ast-grep-service.js +356 -0
- package/dist/services/ast-grep-service.js.map +1 -0
- package/dist/services/attempt-service.d.ts +24 -0
- package/dist/services/attempt-service.d.ts.map +1 -0
- package/dist/services/attempt-service.js +55 -0
- package/dist/services/attempt-service.js.map +1 -0
- package/dist/services/auto-sync-service.d.ts +56 -0
- package/dist/services/auto-sync-service.d.ts.map +1 -0
- package/dist/services/auto-sync-service.js +66 -0
- package/dist/services/auto-sync-service.js.map +1 -0
- package/dist/services/candidate-extractor-service.d.ts +56 -0
- package/dist/services/candidate-extractor-service.d.ts.map +1 -0
- package/dist/services/candidate-extractor-service.js +365 -0
- package/dist/services/candidate-extractor-service.js.map +1 -0
- package/dist/services/claim-service.d.ts +52 -0
- package/dist/services/claim-service.d.ts.map +1 -0
- package/dist/services/claim-service.js +134 -0
- package/dist/services/claim-service.js.map +1 -0
- package/dist/services/daemon-service.d.ts +214 -0
- package/dist/services/daemon-service.d.ts.map +1 -0
- package/dist/services/daemon-service.js +522 -0
- package/dist/services/daemon-service.js.map +1 -0
- package/dist/services/deduplication-service.d.ts +67 -0
- package/dist/services/deduplication-service.d.ts.map +1 -0
- package/dist/services/deduplication-service.js +145 -0
- package/dist/services/deduplication-service.js.map +1 -0
- package/dist/services/dep-service.d.ts +14 -0
- package/dist/services/dep-service.d.ts.map +1 -0
- package/dist/services/dep-service.js +34 -0
- package/dist/services/dep-service.js.map +1 -0
- package/dist/services/diversifier-service.d.ts +46 -0
- package/dist/services/diversifier-service.d.ts.map +1 -0
- package/dist/services/diversifier-service.js +197 -0
- package/dist/services/diversifier-service.js.map +1 -0
- package/dist/services/edge-service.d.ts +78 -0
- package/dist/services/edge-service.d.ts.map +1 -0
- package/dist/services/edge-service.js +158 -0
- package/dist/services/edge-service.js.map +1 -0
- package/dist/services/embedding-service.d.ts +138 -0
- package/dist/services/embedding-service.d.ts.map +1 -0
- package/dist/services/embedding-service.js +318 -0
- package/dist/services/embedding-service.js.map +1 -0
- package/dist/services/feedback-tracker.d.ts +64 -0
- package/dist/services/feedback-tracker.d.ts.map +1 -0
- package/dist/services/feedback-tracker.js +110 -0
- package/dist/services/feedback-tracker.js.map +1 -0
- package/dist/services/file-learning-service.d.ts +17 -0
- package/dist/services/file-learning-service.d.ts.map +1 -0
- package/dist/services/file-learning-service.js +41 -0
- package/dist/services/file-learning-service.js.map +1 -0
- package/dist/services/file-watcher-service.d.ts +141 -0
- package/dist/services/file-watcher-service.d.ts.map +1 -0
- package/dist/services/file-watcher-service.js +278 -0
- package/dist/services/file-watcher-service.js.map +1 -0
- package/dist/services/graph-expansion.d.ts +155 -0
- package/dist/services/graph-expansion.d.ts.map +1 -0
- package/dist/services/graph-expansion.js +466 -0
- package/dist/services/graph-expansion.js.map +1 -0
- package/dist/services/hierarchy-service.d.ts +16 -0
- package/dist/services/hierarchy-service.d.ts.map +1 -0
- package/dist/services/hierarchy-service.js +66 -0
- package/dist/services/hierarchy-service.js.map +1 -0
- package/dist/services/index.d.ts +36 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +36 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/learning-service.d.ts +39 -0
- package/dist/services/learning-service.d.ts.map +1 -0
- package/dist/services/learning-service.js +151 -0
- package/dist/services/learning-service.js.map +1 -0
- package/dist/services/migration-service.d.ts +67 -0
- package/dist/services/migration-service.d.ts.map +1 -0
- package/dist/services/migration-service.js +144 -0
- package/dist/services/migration-service.js.map +1 -0
- package/dist/services/orchestrator-service.d.ts +52 -0
- package/dist/services/orchestrator-service.d.ts.map +1 -0
- package/dist/services/orchestrator-service.js +203 -0
- package/dist/services/orchestrator-service.js.map +1 -0
- package/dist/services/promotion-service.d.ts +67 -0
- package/dist/services/promotion-service.d.ts.map +1 -0
- package/dist/services/promotion-service.js +151 -0
- package/dist/services/promotion-service.js.map +1 -0
- package/dist/services/query-expansion-service.d.ts +55 -0
- package/dist/services/query-expansion-service.d.ts.map +1 -0
- package/dist/services/query-expansion-service.js +174 -0
- package/dist/services/query-expansion-service.js.map +1 -0
- package/dist/services/ready-service.d.ts +16 -0
- package/dist/services/ready-service.d.ts.map +1 -0
- package/dist/services/ready-service.js +70 -0
- package/dist/services/ready-service.js.map +1 -0
- package/dist/services/reranker-service.d.ts +51 -0
- package/dist/services/reranker-service.d.ts.map +1 -0
- package/dist/services/reranker-service.js +128 -0
- package/dist/services/reranker-service.js.map +1 -0
- package/dist/services/retriever-service.d.ts +49 -0
- package/dist/services/retriever-service.d.ts.map +1 -0
- package/dist/services/retriever-service.js +419 -0
- package/dist/services/retriever-service.js.map +1 -0
- package/dist/services/score-service.d.ts +43 -0
- package/dist/services/score-service.d.ts.map +1 -0
- package/dist/services/score-service.js +82 -0
- package/dist/services/score-service.js.map +1 -0
- package/dist/services/swarm-verification.d.ts +104 -0
- package/dist/services/swarm-verification.d.ts.map +1 -0
- package/dist/services/swarm-verification.js +400 -0
- package/dist/services/swarm-verification.js.map +1 -0
- package/dist/services/sync-service.d.ts +115 -0
- package/dist/services/sync-service.d.ts.map +1 -0
- package/dist/services/sync-service.js +350 -0
- package/dist/services/sync-service.js.map +1 -0
- package/dist/services/task-service.d.ts +22 -0
- package/dist/services/task-service.d.ts.map +1 -0
- package/dist/services/task-service.js +221 -0
- package/dist/services/task-service.js.map +1 -0
- package/dist/services/worker-process.d.ts +41 -0
- package/dist/services/worker-process.d.ts.map +1 -0
- package/dist/services/worker-process.js +280 -0
- package/dist/services/worker-process.js.map +1 -0
- package/dist/services/worker-service.d.ts +74 -0
- package/dist/services/worker-service.d.ts.map +1 -0
- package/dist/services/worker-service.js +148 -0
- package/dist/services/worker-service.js.map +1 -0
- package/dist/utils/glob.d.ts +15 -0
- package/dist/utils/glob.d.ts.map +1 -0
- package/dist/utils/glob.js +27 -0
- package/dist/utils/glob.js.map +1 -0
- package/dist/utils/math.d.ts +6 -0
- package/dist/utils/math.d.ts.map +1 -0
- package/dist/utils/math.js +21 -0
- package/dist/utils/math.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SwarmVerificationService - Bulk invalidation with concurrent verification agents
|
|
3
|
+
*
|
|
4
|
+
* For large batches of anchors, spawns up to 4 concurrent verification agents.
|
|
5
|
+
* Coordinates via job queue pattern using Effect's concurrency primitives.
|
|
6
|
+
* Aggregates results with majority vote for edge cases.
|
|
7
|
+
* Tracks swarm metrics for observability.
|
|
8
|
+
*
|
|
9
|
+
* @see docs/prd/PRD-017-invalidation-maintenance.md - IM-004: Bulk invalidation via agent swarm
|
|
10
|
+
*/
|
|
11
|
+
import { Context, Effect, Layer } from "effect";
|
|
12
|
+
import { AnchorVerificationService, type VerificationResult, type VerifyOptions } from "./anchor-verification.js";
|
|
13
|
+
import { AnchorRepository } from "../repo/anchor-repo.js";
|
|
14
|
+
import { DatabaseError } from "../errors.js";
|
|
15
|
+
import type { AnchorStatus } from "@jamesaphoenix/tx-types";
|
|
16
|
+
/** A batch of anchor IDs to verify */
|
|
17
|
+
export interface VerificationBatch {
|
|
18
|
+
readonly batchId: number;
|
|
19
|
+
readonly anchorIds: readonly number[];
|
|
20
|
+
}
|
|
21
|
+
/** Result of a single agent's verification of a batch */
|
|
22
|
+
export interface BatchResult {
|
|
23
|
+
readonly batchId: number;
|
|
24
|
+
readonly results: readonly VerificationResult[];
|
|
25
|
+
readonly duration: number;
|
|
26
|
+
readonly errors: number;
|
|
27
|
+
}
|
|
28
|
+
/** Swarm verification metrics */
|
|
29
|
+
export interface SwarmMetrics {
|
|
30
|
+
readonly totalAnchors: number;
|
|
31
|
+
readonly totalBatches: number;
|
|
32
|
+
readonly agentsUsed: number;
|
|
33
|
+
readonly duration: number;
|
|
34
|
+
/** Time spent per agent (for load balancing analysis) */
|
|
35
|
+
readonly agentDurations: readonly number[];
|
|
36
|
+
/** Counts by action type */
|
|
37
|
+
readonly unchanged: number;
|
|
38
|
+
readonly selfHealed: number;
|
|
39
|
+
readonly drifted: number;
|
|
40
|
+
readonly invalid: number;
|
|
41
|
+
readonly errors: number;
|
|
42
|
+
/** Edge cases requiring human review (tie votes) */
|
|
43
|
+
readonly needsReview: number;
|
|
44
|
+
}
|
|
45
|
+
/** Complete swarm verification result */
|
|
46
|
+
export interface SwarmVerificationResult {
|
|
47
|
+
readonly metrics: SwarmMetrics;
|
|
48
|
+
readonly results: readonly VerificationResult[];
|
|
49
|
+
/** Anchor IDs that require human review due to tie votes */
|
|
50
|
+
readonly reviewRequired: readonly number[];
|
|
51
|
+
}
|
|
52
|
+
/** Options for swarm verification */
|
|
53
|
+
export interface SwarmVerifyOptions extends VerifyOptions {
|
|
54
|
+
/** Batch size per agent (default: 10) */
|
|
55
|
+
readonly batchSize?: number;
|
|
56
|
+
/** Max concurrent agents (default: 4) */
|
|
57
|
+
readonly maxConcurrent?: number;
|
|
58
|
+
/** Force swarm even for small batches */
|
|
59
|
+
readonly forceSwarm?: boolean;
|
|
60
|
+
}
|
|
61
|
+
/** Majority vote result for an anchor */
|
|
62
|
+
export interface VoteResult {
|
|
63
|
+
readonly anchorId: number;
|
|
64
|
+
readonly votes: Map<AnchorStatus | "error", number>;
|
|
65
|
+
readonly consensus: AnchorStatus | null;
|
|
66
|
+
readonly needsReview: boolean;
|
|
67
|
+
}
|
|
68
|
+
declare const SwarmVerificationService_base: Context.TagClass<SwarmVerificationService, "SwarmVerificationService", {
|
|
69
|
+
/**
|
|
70
|
+
* Verify anchors using concurrent agents.
|
|
71
|
+
* Automatically partitions into batches and spawns agents.
|
|
72
|
+
*/
|
|
73
|
+
readonly verifyAnchors: (anchorIds: readonly number[], options?: SwarmVerifyOptions) => Effect.Effect<SwarmVerificationResult, DatabaseError>;
|
|
74
|
+
/**
|
|
75
|
+
* Verify all valid anchors using swarm.
|
|
76
|
+
*/
|
|
77
|
+
readonly verifyAll: (options?: SwarmVerifyOptions) => Effect.Effect<SwarmVerificationResult, DatabaseError>;
|
|
78
|
+
/**
|
|
79
|
+
* Verify anchors for files matching glob pattern using swarm.
|
|
80
|
+
*/
|
|
81
|
+
readonly verifyGlob: (globPattern: string, options?: SwarmVerifyOptions) => Effect.Effect<SwarmVerificationResult, DatabaseError>;
|
|
82
|
+
/**
|
|
83
|
+
* Verify anchors affected by a list of changed files.
|
|
84
|
+
* Typically called from git hooks after large commits.
|
|
85
|
+
*/
|
|
86
|
+
readonly verifyChangedFiles: (filePaths: readonly string[], options?: SwarmVerifyOptions) => Effect.Effect<SwarmVerificationResult, DatabaseError>;
|
|
87
|
+
}>;
|
|
88
|
+
export declare class SwarmVerificationService extends SwarmVerificationService_base {
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Calculate majority vote for conflicting results on the same anchor.
|
|
92
|
+
* Used when multiple agents verify the same anchor (edge cases).
|
|
93
|
+
*
|
|
94
|
+
* Rules (per PRD-017):
|
|
95
|
+
* - If 3/4 agents say valid, it's valid
|
|
96
|
+
* - Tie = mark for human review
|
|
97
|
+
*
|
|
98
|
+
* Exported for use in LLM-assisted verification scenarios where multiple
|
|
99
|
+
* agents may verify the same anchor for edge cases.
|
|
100
|
+
*/
|
|
101
|
+
export declare const calculateMajorityVote: (results: readonly VerificationResult[]) => VoteResult;
|
|
102
|
+
export declare const SwarmVerificationServiceLive: Layer.Layer<SwarmVerificationService, never, AnchorRepository | AnchorVerificationService>;
|
|
103
|
+
export {};
|
|
104
|
+
//# sourceMappingURL=swarm-verification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swarm-verification.d.ts","sourceRoot":"","sources":["../../src/services/swarm-verification.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SwarmVerificationService - Bulk invalidation with concurrent verification agents
|
|
3
|
+
*
|
|
4
|
+
* For large batches of anchors, spawns up to 4 concurrent verification agents.
|
|
5
|
+
* Coordinates via job queue pattern using Effect's concurrency primitives.
|
|
6
|
+
* Aggregates results with majority vote for edge cases.
|
|
7
|
+
* Tracks swarm metrics for observability.
|
|
8
|
+
*
|
|
9
|
+
* @see docs/prd/PRD-017-invalidation-maintenance.md - IM-004: Bulk invalidation via agent swarm
|
|
10
|
+
*/
|
|
11
|
+
import { Context, Effect, Layer, Queue, Fiber, Ref } from "effect";
|
|
12
|
+
import { AnchorVerificationService } from "./anchor-verification.js";
|
|
13
|
+
import { AnchorRepository } from "../repo/anchor-repo.js";
|
|
14
|
+
import { matchesGlob } from "../utils/glob.js";
|
|
15
|
+
// =============================================================================
|
|
16
|
+
// Configuration Constants
|
|
17
|
+
// =============================================================================
|
|
18
|
+
/** Default batch size per agent (PRD-017: batches of 10) */
|
|
19
|
+
const DEFAULT_BATCH_SIZE = 10;
|
|
20
|
+
/** Maximum concurrent agents (PRD-017: up to 4) */
|
|
21
|
+
const MAX_CONCURRENT_AGENTS = 4;
|
|
22
|
+
/** Minimum batch size to trigger swarm (sequential is fine for small batches) */
|
|
23
|
+
const SWARM_THRESHOLD = 20;
|
|
24
|
+
// =============================================================================
|
|
25
|
+
// Service Definition
|
|
26
|
+
// =============================================================================
|
|
27
|
+
export class SwarmVerificationService extends Context.Tag("SwarmVerificationService")() {
|
|
28
|
+
}
|
|
29
|
+
// =============================================================================
|
|
30
|
+
// Utility Functions
|
|
31
|
+
// =============================================================================
|
|
32
|
+
/**
|
|
33
|
+
* Partition anchor IDs into batches.
|
|
34
|
+
*/
|
|
35
|
+
const partitionIntoBatches = (anchorIds, batchSize) => {
|
|
36
|
+
const batches = [];
|
|
37
|
+
for (let i = 0; i < anchorIds.length; i += batchSize) {
|
|
38
|
+
batches.push({
|
|
39
|
+
batchId: batches.length,
|
|
40
|
+
anchorIds: anchorIds.slice(i, i + batchSize)
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return batches;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Calculate majority vote for conflicting results on the same anchor.
|
|
47
|
+
* Used when multiple agents verify the same anchor (edge cases).
|
|
48
|
+
*
|
|
49
|
+
* Rules (per PRD-017):
|
|
50
|
+
* - If 3/4 agents say valid, it's valid
|
|
51
|
+
* - Tie = mark for human review
|
|
52
|
+
*
|
|
53
|
+
* Exported for use in LLM-assisted verification scenarios where multiple
|
|
54
|
+
* agents may verify the same anchor for edge cases.
|
|
55
|
+
*/
|
|
56
|
+
export const calculateMajorityVote = (results) => {
|
|
57
|
+
const anchorId = results[0].anchorId;
|
|
58
|
+
const votes = new Map();
|
|
59
|
+
for (const result of results) {
|
|
60
|
+
const status = result.newStatus;
|
|
61
|
+
votes.set(status, (votes.get(status) ?? 0) + 1);
|
|
62
|
+
}
|
|
63
|
+
// Find the status with most votes
|
|
64
|
+
let maxVotes = 0;
|
|
65
|
+
let consensus = null;
|
|
66
|
+
let tieCount = 0;
|
|
67
|
+
for (const [status, count] of votes) {
|
|
68
|
+
if (status === "error")
|
|
69
|
+
continue; // Don't count errors in consensus
|
|
70
|
+
if (count > maxVotes) {
|
|
71
|
+
maxVotes = count;
|
|
72
|
+
consensus = status;
|
|
73
|
+
tieCount = 1;
|
|
74
|
+
}
|
|
75
|
+
else if (count === maxVotes) {
|
|
76
|
+
tieCount++;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Tie = needs human review
|
|
80
|
+
const needsReview = tieCount > 1;
|
|
81
|
+
return {
|
|
82
|
+
anchorId,
|
|
83
|
+
votes,
|
|
84
|
+
consensus: needsReview ? null : consensus,
|
|
85
|
+
needsReview
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Aggregate batch results into final metrics.
|
|
90
|
+
*/
|
|
91
|
+
const aggregateResults = (batchResults, startTime, agentCount) => {
|
|
92
|
+
let unchanged = 0;
|
|
93
|
+
let selfHealed = 0;
|
|
94
|
+
let drifted = 0;
|
|
95
|
+
let invalid = 0;
|
|
96
|
+
let errors = 0;
|
|
97
|
+
const allResults = [];
|
|
98
|
+
const agentDurations = [];
|
|
99
|
+
for (const batch of batchResults) {
|
|
100
|
+
agentDurations.push(batch.duration);
|
|
101
|
+
errors += batch.errors;
|
|
102
|
+
for (const result of batch.results) {
|
|
103
|
+
allResults.push(result);
|
|
104
|
+
switch (result.action) {
|
|
105
|
+
case "unchanged":
|
|
106
|
+
unchanged++;
|
|
107
|
+
break;
|
|
108
|
+
case "self_healed":
|
|
109
|
+
selfHealed++;
|
|
110
|
+
break;
|
|
111
|
+
case "drifted":
|
|
112
|
+
drifted++;
|
|
113
|
+
break;
|
|
114
|
+
case "invalidated":
|
|
115
|
+
invalid++;
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
metrics: {
|
|
122
|
+
totalAnchors: allResults.length + errors,
|
|
123
|
+
totalBatches: batchResults.length,
|
|
124
|
+
agentsUsed: agentCount,
|
|
125
|
+
duration: Date.now() - startTime,
|
|
126
|
+
agentDurations,
|
|
127
|
+
unchanged,
|
|
128
|
+
selfHealed,
|
|
129
|
+
drifted,
|
|
130
|
+
invalid,
|
|
131
|
+
errors
|
|
132
|
+
},
|
|
133
|
+
results: allResults
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
// =============================================================================
|
|
137
|
+
// Service Implementation
|
|
138
|
+
// =============================================================================
|
|
139
|
+
export const SwarmVerificationServiceLive = Layer.effect(SwarmVerificationService, Effect.gen(function* () {
|
|
140
|
+
const anchorVerification = yield* AnchorVerificationService;
|
|
141
|
+
const anchorRepo = yield* AnchorRepository;
|
|
142
|
+
/**
|
|
143
|
+
* Process a single batch of anchors using the verification service.
|
|
144
|
+
*/
|
|
145
|
+
const processB = (batch, options) => Effect.gen(function* () {
|
|
146
|
+
const startTime = Date.now();
|
|
147
|
+
const results = [];
|
|
148
|
+
let errors = 0;
|
|
149
|
+
// Process each anchor in the batch
|
|
150
|
+
for (const anchorId of batch.anchorIds) {
|
|
151
|
+
const result = yield* anchorVerification.verify(anchorId, options).pipe(Effect.catchAll(() => {
|
|
152
|
+
errors++;
|
|
153
|
+
return Effect.succeed(null);
|
|
154
|
+
}));
|
|
155
|
+
if (result) {
|
|
156
|
+
results.push(result);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
batchId: batch.batchId,
|
|
161
|
+
results,
|
|
162
|
+
duration: Date.now() - startTime,
|
|
163
|
+
errors
|
|
164
|
+
};
|
|
165
|
+
});
|
|
166
|
+
/**
|
|
167
|
+
* Run swarm verification with concurrent agents.
|
|
168
|
+
*/
|
|
169
|
+
const runSwarm = (anchorIds, options) => Effect.gen(function* () {
|
|
170
|
+
const startTime = Date.now();
|
|
171
|
+
const batchSize = options.batchSize ?? DEFAULT_BATCH_SIZE;
|
|
172
|
+
const maxConcurrent = options.maxConcurrent ?? MAX_CONCURRENT_AGENTS;
|
|
173
|
+
// Partition into batches
|
|
174
|
+
const batches = partitionIntoBatches(anchorIds, batchSize);
|
|
175
|
+
if (batches.length === 0) {
|
|
176
|
+
return {
|
|
177
|
+
metrics: {
|
|
178
|
+
totalAnchors: 0,
|
|
179
|
+
totalBatches: 0,
|
|
180
|
+
agentsUsed: 0,
|
|
181
|
+
duration: 0,
|
|
182
|
+
agentDurations: [],
|
|
183
|
+
unchanged: 0,
|
|
184
|
+
selfHealed: 0,
|
|
185
|
+
drifted: 0,
|
|
186
|
+
invalid: 0,
|
|
187
|
+
errors: 0,
|
|
188
|
+
needsReview: 0
|
|
189
|
+
},
|
|
190
|
+
results: [],
|
|
191
|
+
reviewRequired: []
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
// Determine actual concurrency (don't spawn more agents than batches)
|
|
195
|
+
const agentCount = Math.min(batches.length, maxConcurrent);
|
|
196
|
+
// Create a queue for job distribution
|
|
197
|
+
const queue = yield* Queue.bounded(batches.length);
|
|
198
|
+
// Enqueue all batches
|
|
199
|
+
for (const batch of batches) {
|
|
200
|
+
yield* Queue.offer(queue, batch);
|
|
201
|
+
}
|
|
202
|
+
// Counter to track active work
|
|
203
|
+
const completedBatches = yield* Ref.make([]);
|
|
204
|
+
// Worker function: continuously pull batches from queue
|
|
205
|
+
const worker = (_workerId) => Effect.gen(function* () {
|
|
206
|
+
while (true) {
|
|
207
|
+
// Try to take a batch (non-blocking)
|
|
208
|
+
const maybeBatch = yield* Queue.poll(queue);
|
|
209
|
+
if (maybeBatch._tag === "None") {
|
|
210
|
+
// No more batches, worker done
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
const batch = maybeBatch.value;
|
|
214
|
+
const result = yield* processB(batch, options);
|
|
215
|
+
// Record result
|
|
216
|
+
yield* Ref.update(completedBatches, (results) => [...results, result]);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
// Spawn agents as fibers
|
|
220
|
+
const fibers = [];
|
|
221
|
+
for (let i = 0; i < agentCount; i++) {
|
|
222
|
+
const fiber = yield* Effect.fork(worker(i));
|
|
223
|
+
fibers.push(fiber);
|
|
224
|
+
}
|
|
225
|
+
// Wait for all agents to complete
|
|
226
|
+
for (const fiber of fibers) {
|
|
227
|
+
yield* Fiber.join(fiber);
|
|
228
|
+
}
|
|
229
|
+
// Shutdown queue
|
|
230
|
+
yield* Queue.shutdown(queue);
|
|
231
|
+
// Get all batch results
|
|
232
|
+
const batchResults = yield* Ref.get(completedBatches);
|
|
233
|
+
// Aggregate results
|
|
234
|
+
const { metrics, results } = aggregateResults(batchResults, startTime, agentCount);
|
|
235
|
+
// For now, we don't have multi-agent verification of the same anchor,
|
|
236
|
+
// so no majority voting needed. reviewRequired is empty.
|
|
237
|
+
// This would be used if we added LLM-assisted verification where
|
|
238
|
+
// multiple agents verify the same anchor for edge cases.
|
|
239
|
+
const reviewRequired = [];
|
|
240
|
+
return {
|
|
241
|
+
metrics: {
|
|
242
|
+
...metrics,
|
|
243
|
+
needsReview: reviewRequired.length
|
|
244
|
+
},
|
|
245
|
+
results,
|
|
246
|
+
reviewRequired
|
|
247
|
+
};
|
|
248
|
+
});
|
|
249
|
+
/**
|
|
250
|
+
* Simple sequential verification for small batches.
|
|
251
|
+
*/
|
|
252
|
+
const runSequential = (anchorIds, options) => Effect.gen(function* () {
|
|
253
|
+
// Handle empty input
|
|
254
|
+
if (anchorIds.length === 0) {
|
|
255
|
+
return {
|
|
256
|
+
metrics: {
|
|
257
|
+
totalAnchors: 0,
|
|
258
|
+
totalBatches: 0,
|
|
259
|
+
agentsUsed: 0,
|
|
260
|
+
duration: 0,
|
|
261
|
+
agentDurations: [],
|
|
262
|
+
unchanged: 0,
|
|
263
|
+
selfHealed: 0,
|
|
264
|
+
drifted: 0,
|
|
265
|
+
invalid: 0,
|
|
266
|
+
errors: 0,
|
|
267
|
+
needsReview: 0
|
|
268
|
+
},
|
|
269
|
+
results: [],
|
|
270
|
+
reviewRequired: []
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
const startTime = Date.now();
|
|
274
|
+
const results = [];
|
|
275
|
+
let errors = 0;
|
|
276
|
+
let unchanged = 0;
|
|
277
|
+
let selfHealed = 0;
|
|
278
|
+
let drifted = 0;
|
|
279
|
+
let invalid = 0;
|
|
280
|
+
for (const anchorId of anchorIds) {
|
|
281
|
+
const result = yield* anchorVerification.verify(anchorId, options).pipe(Effect.catchAll(() => {
|
|
282
|
+
errors++;
|
|
283
|
+
return Effect.succeed(null);
|
|
284
|
+
}));
|
|
285
|
+
if (result) {
|
|
286
|
+
results.push(result);
|
|
287
|
+
switch (result.action) {
|
|
288
|
+
case "unchanged":
|
|
289
|
+
unchanged++;
|
|
290
|
+
break;
|
|
291
|
+
case "self_healed":
|
|
292
|
+
selfHealed++;
|
|
293
|
+
break;
|
|
294
|
+
case "drifted":
|
|
295
|
+
drifted++;
|
|
296
|
+
break;
|
|
297
|
+
case "invalidated":
|
|
298
|
+
invalid++;
|
|
299
|
+
break;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return {
|
|
304
|
+
metrics: {
|
|
305
|
+
totalAnchors: results.length + errors,
|
|
306
|
+
totalBatches: 1,
|
|
307
|
+
agentsUsed: 1,
|
|
308
|
+
duration: Date.now() - startTime,
|
|
309
|
+
agentDurations: [Date.now() - startTime],
|
|
310
|
+
unchanged,
|
|
311
|
+
selfHealed,
|
|
312
|
+
drifted,
|
|
313
|
+
invalid,
|
|
314
|
+
errors,
|
|
315
|
+
needsReview: 0
|
|
316
|
+
},
|
|
317
|
+
results,
|
|
318
|
+
reviewRequired: []
|
|
319
|
+
};
|
|
320
|
+
});
|
|
321
|
+
return {
|
|
322
|
+
verifyAnchors: (anchorIds, options = {}) => Effect.gen(function* () {
|
|
323
|
+
// Use swarm for large batches, sequential for small ones
|
|
324
|
+
const useSwarm = options.forceSwarm || anchorIds.length >= SWARM_THRESHOLD;
|
|
325
|
+
if (useSwarm) {
|
|
326
|
+
return yield* runSwarm(anchorIds, options);
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
return yield* runSequential(anchorIds, options);
|
|
330
|
+
}
|
|
331
|
+
}),
|
|
332
|
+
verifyAll: (options = {}) => Effect.gen(function* () {
|
|
333
|
+
const anchors = yield* anchorRepo.findAllValid();
|
|
334
|
+
const anchorIds = anchors
|
|
335
|
+
.filter((a) => !options.skipPinned || !a.pinned)
|
|
336
|
+
.map((a) => a.id);
|
|
337
|
+
const useSwarm = options.forceSwarm || anchorIds.length >= SWARM_THRESHOLD;
|
|
338
|
+
if (useSwarm) {
|
|
339
|
+
return yield* runSwarm(anchorIds, {
|
|
340
|
+
...options,
|
|
341
|
+
detectedBy: options.detectedBy ?? "periodic"
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
return yield* runSequential(anchorIds, {
|
|
346
|
+
...options,
|
|
347
|
+
detectedBy: options.detectedBy ?? "periodic"
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
}),
|
|
351
|
+
verifyGlob: (globPattern, options = {}) => Effect.gen(function* () {
|
|
352
|
+
const allAnchors = yield* anchorRepo.findAll();
|
|
353
|
+
const matchingIds = allAnchors
|
|
354
|
+
.filter((a) => matchesGlob(a.filePath, globPattern))
|
|
355
|
+
.filter((a) => !options.skipPinned || !a.pinned)
|
|
356
|
+
.map((a) => a.id);
|
|
357
|
+
const useSwarm = options.forceSwarm || matchingIds.length >= SWARM_THRESHOLD;
|
|
358
|
+
if (useSwarm) {
|
|
359
|
+
return yield* runSwarm(matchingIds, {
|
|
360
|
+
...options,
|
|
361
|
+
detectedBy: options.detectedBy ?? "manual"
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
return yield* runSequential(matchingIds, {
|
|
366
|
+
...options,
|
|
367
|
+
detectedBy: options.detectedBy ?? "manual"
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
}),
|
|
371
|
+
verifyChangedFiles: (filePaths, options = {}) => Effect.gen(function* () {
|
|
372
|
+
// Find anchors for all changed files
|
|
373
|
+
const anchorIdSet = new Set();
|
|
374
|
+
for (const filePath of filePaths) {
|
|
375
|
+
const anchors = yield* anchorRepo.findByFilePath(filePath);
|
|
376
|
+
for (const anchor of anchors) {
|
|
377
|
+
if (!options.skipPinned || !anchor.pinned) {
|
|
378
|
+
anchorIdSet.add(anchor.id);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
const anchorIds = Array.from(anchorIdSet);
|
|
383
|
+
// Git hook context typically means large changes, use swarm
|
|
384
|
+
const useSwarm = options.forceSwarm || anchorIds.length >= SWARM_THRESHOLD;
|
|
385
|
+
if (useSwarm) {
|
|
386
|
+
return yield* runSwarm(anchorIds, {
|
|
387
|
+
...options,
|
|
388
|
+
detectedBy: options.detectedBy ?? "git_hook"
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
return yield* runSequential(anchorIds, {
|
|
393
|
+
...options,
|
|
394
|
+
detectedBy: options.detectedBy ?? "git_hook"
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
})
|
|
398
|
+
};
|
|
399
|
+
}));
|
|
400
|
+
//# sourceMappingURL=swarm-verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swarm-verification.js","sourceRoot":"","sources":["../../src/services/swarm-verification.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { DatabaseError, ValidationError } from "../errors.js";
|
|
3
|
+
import { SqliteClient } from "../db.js";
|
|
4
|
+
import { TaskService } from "./task-service.js";
|
|
5
|
+
import { TaskRepository } from "../repo/task-repo.js";
|
|
6
|
+
import { DependencyRepository } from "../repo/dep-repo.js";
|
|
7
|
+
/**
|
|
8
|
+
* Result of an export operation.
|
|
9
|
+
*/
|
|
10
|
+
export interface ExportResult {
|
|
11
|
+
readonly opCount: number;
|
|
12
|
+
readonly path: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Result of an import operation.
|
|
16
|
+
*/
|
|
17
|
+
export interface ImportResult {
|
|
18
|
+
readonly imported: number;
|
|
19
|
+
readonly skipped: number;
|
|
20
|
+
readonly conflicts: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Status of the sync system.
|
|
24
|
+
*/
|
|
25
|
+
export interface SyncStatus {
|
|
26
|
+
readonly dbTaskCount: number;
|
|
27
|
+
readonly jsonlOpCount: number;
|
|
28
|
+
readonly lastExport: Date | null;
|
|
29
|
+
readonly lastImport: Date | null;
|
|
30
|
+
readonly isDirty: boolean;
|
|
31
|
+
readonly autoSyncEnabled: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Result of a compact operation.
|
|
35
|
+
*/
|
|
36
|
+
export interface CompactResult {
|
|
37
|
+
readonly before: number;
|
|
38
|
+
readonly after: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Options for export operations.
|
|
42
|
+
*/
|
|
43
|
+
export interface ExportOptions {
|
|
44
|
+
readonly learnings?: boolean;
|
|
45
|
+
readonly fileLearnings?: boolean;
|
|
46
|
+
readonly attempts?: boolean;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Result of an exportAll operation.
|
|
50
|
+
*/
|
|
51
|
+
export interface ExportAllResult {
|
|
52
|
+
readonly tasks: ExportResult;
|
|
53
|
+
readonly learnings?: ExportResult;
|
|
54
|
+
readonly fileLearnings?: ExportResult;
|
|
55
|
+
readonly attempts?: ExportResult;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Result of an importAll operation.
|
|
59
|
+
*/
|
|
60
|
+
export interface ImportAllResult {
|
|
61
|
+
readonly tasks: ImportResult;
|
|
62
|
+
readonly learnings?: ImportResult;
|
|
63
|
+
readonly fileLearnings?: ImportResult;
|
|
64
|
+
readonly attempts?: ImportResult;
|
|
65
|
+
}
|
|
66
|
+
declare const SyncService_base: Context.TagClass<SyncService, "SyncService", {
|
|
67
|
+
/**
|
|
68
|
+
* Export all tasks and dependencies to JSONL file.
|
|
69
|
+
* @param path Optional path (default: .tx/tasks.jsonl)
|
|
70
|
+
*/
|
|
71
|
+
readonly export: (path?: string) => Effect.Effect<ExportResult, DatabaseError>;
|
|
72
|
+
/**
|
|
73
|
+
* Import tasks and dependencies from JSONL file.
|
|
74
|
+
* Uses timestamp-based conflict resolution (later wins).
|
|
75
|
+
* @param path Optional path (default: .tx/tasks.jsonl)
|
|
76
|
+
*/
|
|
77
|
+
readonly import: (path?: string) => Effect.Effect<ImportResult, ValidationError | DatabaseError>;
|
|
78
|
+
/**
|
|
79
|
+
* Get current sync status.
|
|
80
|
+
*/
|
|
81
|
+
readonly status: () => Effect.Effect<SyncStatus, DatabaseError>;
|
|
82
|
+
/**
|
|
83
|
+
* Enable auto-sync mode.
|
|
84
|
+
*/
|
|
85
|
+
readonly enableAutoSync: () => Effect.Effect<void, DatabaseError>;
|
|
86
|
+
/**
|
|
87
|
+
* Disable auto-sync mode.
|
|
88
|
+
*/
|
|
89
|
+
readonly disableAutoSync: () => Effect.Effect<void, DatabaseError>;
|
|
90
|
+
/**
|
|
91
|
+
* Check if auto-sync is enabled.
|
|
92
|
+
*/
|
|
93
|
+
readonly isAutoSyncEnabled: () => Effect.Effect<boolean, DatabaseError>;
|
|
94
|
+
/**
|
|
95
|
+
* Compact the JSONL file by deduplicating operations.
|
|
96
|
+
*/
|
|
97
|
+
readonly compact: (path?: string) => Effect.Effect<CompactResult, DatabaseError | ValidationError>;
|
|
98
|
+
/**
|
|
99
|
+
* Set last export timestamp in config.
|
|
100
|
+
*/
|
|
101
|
+
readonly setLastExport: (timestamp: Date) => Effect.Effect<void, DatabaseError>;
|
|
102
|
+
/**
|
|
103
|
+
* Set last import timestamp in config.
|
|
104
|
+
*/
|
|
105
|
+
readonly setLastImport: (timestamp: Date) => Effect.Effect<void, DatabaseError>;
|
|
106
|
+
}>;
|
|
107
|
+
/**
|
|
108
|
+
* SyncService provides JSONL-based export/import for git-tracked task syncing.
|
|
109
|
+
* See DD-009 for full specification.
|
|
110
|
+
*/
|
|
111
|
+
export declare class SyncService extends SyncService_base {
|
|
112
|
+
}
|
|
113
|
+
export declare const SyncServiceLive: Layer.Layer<SyncService, never, SqliteClient | TaskRepository | DependencyRepository | TaskService>;
|
|
114
|
+
export {};
|
|
115
|
+
//# sourceMappingURL=sync-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-service.d.ts","sourceRoot":"","sources":["../../src/services/sync-service.ts"],"names":[],"mappings":"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"}
|