@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,58 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { AstGrepError } from "../errors.js";
|
|
3
|
+
import type { SymbolInfo, ImportInfo, Match, SymbolPattern } from "@jamesaphoenix/tx-types";
|
|
4
|
+
/**
|
|
5
|
+
* File extension to ast-grep language mapping.
|
|
6
|
+
* Covers TypeScript, JavaScript, Python, Go, Rust, Java, C#, Ruby, PHP, Kotlin, Swift, C/C++.
|
|
7
|
+
*/
|
|
8
|
+
export declare const EXT_TO_LANGUAGE: Readonly<Record<string, string>>;
|
|
9
|
+
/**
|
|
10
|
+
* Default symbol patterns for each supported language.
|
|
11
|
+
* These patterns are used by ast-grep to extract symbols from source files.
|
|
12
|
+
* Following DD-014 specification.
|
|
13
|
+
*/
|
|
14
|
+
export declare const DEFAULT_SYMBOL_PATTERNS: Readonly<Record<string, readonly SymbolPattern[]>>;
|
|
15
|
+
declare const AstGrepService_base: Context.TagClass<AstGrepService, "AstGrepService", {
|
|
16
|
+
/**
|
|
17
|
+
* Find all symbols (functions, classes, interfaces, etc.) in a file.
|
|
18
|
+
* Returns empty array for unsupported file types.
|
|
19
|
+
*/
|
|
20
|
+
readonly findSymbols: (filePath: string) => Effect.Effect<readonly SymbolInfo[], AstGrepError>;
|
|
21
|
+
/**
|
|
22
|
+
* Extract import statements from a file.
|
|
23
|
+
* Returns empty array for unsupported file types.
|
|
24
|
+
*/
|
|
25
|
+
readonly getImports: (filePath: string) => Effect.Effect<readonly ImportInfo[], AstGrepError>;
|
|
26
|
+
/**
|
|
27
|
+
* Match a custom ast-grep pattern against a file or directory.
|
|
28
|
+
*/
|
|
29
|
+
readonly matchPattern: (pattern: string, path: string) => Effect.Effect<readonly Match[], AstGrepError>;
|
|
30
|
+
}>;
|
|
31
|
+
/**
|
|
32
|
+
* AstGrepService provides code intelligence via ast-grep CLI.
|
|
33
|
+
*
|
|
34
|
+
* This service extracts symbols, imports, and matches patterns from source files
|
|
35
|
+
* using structural code analysis. It gracefully degrades when ast-grep is not
|
|
36
|
+
* installed by providing a Noop fallback.
|
|
37
|
+
*
|
|
38
|
+
* Design: Following DD-014 specification for symbol extraction.
|
|
39
|
+
*/
|
|
40
|
+
export declare class AstGrepService extends AstGrepService_base {
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Live implementation that spawns ast-grep CLI.
|
|
44
|
+
* Requires ast-grep to be installed and available in PATH.
|
|
45
|
+
*/
|
|
46
|
+
export declare const AstGrepServiceLive: Layer.Layer<AstGrepService, never, never>;
|
|
47
|
+
/**
|
|
48
|
+
* Noop implementation that returns empty arrays.
|
|
49
|
+
* Used when ast-grep is not installed or not available.
|
|
50
|
+
*/
|
|
51
|
+
export declare const AstGrepServiceNoop: Layer.Layer<AstGrepService, never, never>;
|
|
52
|
+
/**
|
|
53
|
+
* Auto-detecting layer that uses Live if ast-grep is available, Noop otherwise.
|
|
54
|
+
* This allows graceful degradation when ast-grep is not installed.
|
|
55
|
+
*/
|
|
56
|
+
export declare const AstGrepServiceAuto: Layer.Layer<AstGrepService, never, never>;
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=ast-grep-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-grep-service.d.ts","sourceRoot":"","sources":["../../src/services/ast-grep-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAc,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAEvG;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqC5D,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC,CAsHtF,CAAA;;IAcG;;;OAGG;0BACmB,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,UAAU,EAAE,EAAE,YAAY,CAAC;IAC9F;;;OAGG;yBACkB,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,UAAU,EAAE,EAAE,YAAY,CAAC;IAC7F;;OAEG;2BACoB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,KAAK,EAAE,EAAE,YAAY,CAAC;;AAzB3G;;;;;;;;GAQG;AACH,qBAAa,cAAe,SAAQ,mBAkBjC;CAAG;AA6EN;;;GAGG;AACH,eAAO,MAAM,kBAAkB,2CAkJ7B,CAAA;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,2CAI7B,CAAA;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,2CAoB9B,CAAA"}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { spawn } from "child_process";
|
|
3
|
+
import { AstGrepError } from "../errors.js";
|
|
4
|
+
/**
|
|
5
|
+
* File extension to ast-grep language mapping.
|
|
6
|
+
* Covers TypeScript, JavaScript, Python, Go, Rust, Java, C#, Ruby, PHP, Kotlin, Swift, C/C++.
|
|
7
|
+
*/
|
|
8
|
+
export const EXT_TO_LANGUAGE = {
|
|
9
|
+
// TypeScript
|
|
10
|
+
".ts": "typescript",
|
|
11
|
+
".tsx": "typescript",
|
|
12
|
+
".mts": "typescript",
|
|
13
|
+
// JavaScript
|
|
14
|
+
".js": "javascript",
|
|
15
|
+
".jsx": "javascript",
|
|
16
|
+
".mjs": "javascript",
|
|
17
|
+
// Python
|
|
18
|
+
".py": "python",
|
|
19
|
+
".pyw": "python",
|
|
20
|
+
// Go
|
|
21
|
+
".go": "go",
|
|
22
|
+
// Rust
|
|
23
|
+
".rs": "rust",
|
|
24
|
+
// Java
|
|
25
|
+
".java": "java",
|
|
26
|
+
// C#
|
|
27
|
+
".cs": "csharp",
|
|
28
|
+
// Ruby
|
|
29
|
+
".rb": "ruby",
|
|
30
|
+
// PHP
|
|
31
|
+
".php": "php",
|
|
32
|
+
// Kotlin
|
|
33
|
+
".kt": "kotlin",
|
|
34
|
+
".kts": "kotlin",
|
|
35
|
+
// Swift
|
|
36
|
+
".swift": "swift",
|
|
37
|
+
// C
|
|
38
|
+
".c": "c",
|
|
39
|
+
".h": "c",
|
|
40
|
+
// C++
|
|
41
|
+
".cpp": "cpp",
|
|
42
|
+
".cc": "cpp",
|
|
43
|
+
".cxx": "cpp",
|
|
44
|
+
".hpp": "cpp",
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Default symbol patterns for each supported language.
|
|
48
|
+
* These patterns are used by ast-grep to extract symbols from source files.
|
|
49
|
+
* Following DD-014 specification.
|
|
50
|
+
*/
|
|
51
|
+
export const DEFAULT_SYMBOL_PATTERNS = {
|
|
52
|
+
// TypeScript / JavaScript
|
|
53
|
+
typescript: [
|
|
54
|
+
{ pattern: "export function $NAME($_) { $$$_ }", kind: "function", exported: true },
|
|
55
|
+
{ pattern: "export const $NAME = ($_) => $$$_", kind: "function", exported: true },
|
|
56
|
+
{ pattern: "export class $NAME { $$$_ }", kind: "class", exported: true },
|
|
57
|
+
{ pattern: "export interface $NAME { $$$_ }", kind: "interface", exported: true },
|
|
58
|
+
{ pattern: "export type $NAME = $_", kind: "type", exported: true },
|
|
59
|
+
{ pattern: "export const $NAME = $_", kind: "const", exported: true },
|
|
60
|
+
{ pattern: "function $NAME($_) { $$$_ }", kind: "function" },
|
|
61
|
+
{ pattern: "class $NAME { $$$_ }", kind: "class" },
|
|
62
|
+
],
|
|
63
|
+
javascript: [
|
|
64
|
+
{ pattern: "export function $NAME($_) { $$$_ }", kind: "function", exported: true },
|
|
65
|
+
{ pattern: "export const $NAME = ($_) => $$$_", kind: "function", exported: true },
|
|
66
|
+
{ pattern: "export class $NAME { $$$_ }", kind: "class", exported: true },
|
|
67
|
+
{ pattern: "module.exports.$NAME = $_", kind: "function", exported: true },
|
|
68
|
+
{ pattern: "function $NAME($_) { $$$_ }", kind: "function" },
|
|
69
|
+
{ pattern: "class $NAME { $$$_ }", kind: "class" },
|
|
70
|
+
],
|
|
71
|
+
// Python
|
|
72
|
+
python: [
|
|
73
|
+
{ pattern: "def $NAME($_): $$$_", kind: "function" },
|
|
74
|
+
{ pattern: "async def $NAME($_): $$$_", kind: "function" },
|
|
75
|
+
{ pattern: "class $NAME: $$$_", kind: "class" },
|
|
76
|
+
{ pattern: "class $NAME($_): $$$_", kind: "class" },
|
|
77
|
+
],
|
|
78
|
+
// Go
|
|
79
|
+
go: [
|
|
80
|
+
{ pattern: "func $NAME($_) $_ { $$$_ }", kind: "function" },
|
|
81
|
+
{ pattern: "func ($_ $_) $NAME($_) $_ { $$$_ }", kind: "method" },
|
|
82
|
+
{ pattern: "type $NAME struct { $$$_ }", kind: "struct" },
|
|
83
|
+
{ pattern: "type $NAME interface { $$$_ }", kind: "interface" },
|
|
84
|
+
],
|
|
85
|
+
// Rust
|
|
86
|
+
rust: [
|
|
87
|
+
{ pattern: "pub fn $NAME($_) $$$_ { $$$_ }", kind: "function", exported: true },
|
|
88
|
+
{ pattern: "fn $NAME($_) $$$_ { $$$_ }", kind: "function" },
|
|
89
|
+
{ pattern: "pub struct $NAME { $$$_ }", kind: "struct", exported: true },
|
|
90
|
+
{ pattern: "struct $NAME { $$$_ }", kind: "struct" },
|
|
91
|
+
{ pattern: "pub enum $NAME { $$$_ }", kind: "enum", exported: true },
|
|
92
|
+
{ pattern: "pub trait $NAME { $$$_ }", kind: "trait", exported: true },
|
|
93
|
+
{ pattern: "impl $NAME { $$$_ }", kind: "class" },
|
|
94
|
+
],
|
|
95
|
+
// Java
|
|
96
|
+
java: [
|
|
97
|
+
{ pattern: "public class $NAME { $$$_ }", kind: "class", exported: true },
|
|
98
|
+
{ pattern: "public interface $NAME { $$$_ }", kind: "interface", exported: true },
|
|
99
|
+
{ pattern: "public enum $NAME { $$$_ }", kind: "enum", exported: true },
|
|
100
|
+
{ pattern: "public $_ $NAME($_) { $$$_ }", kind: "method", exported: true },
|
|
101
|
+
{ pattern: "private $_ $NAME($_) { $$$_ }", kind: "method" },
|
|
102
|
+
],
|
|
103
|
+
// C#
|
|
104
|
+
csharp: [
|
|
105
|
+
{ pattern: "public class $NAME { $$$_ }", kind: "class", exported: true },
|
|
106
|
+
{ pattern: "public interface $NAME { $$$_ }", kind: "interface", exported: true },
|
|
107
|
+
{ pattern: "public enum $NAME { $$$_ }", kind: "enum", exported: true },
|
|
108
|
+
{ pattern: "public $_ $NAME($_) { $$$_ }", kind: "method", exported: true },
|
|
109
|
+
{ pattern: "private $_ $NAME($_) { $$$_ }", kind: "method" },
|
|
110
|
+
{ pattern: "public struct $NAME { $$$_ }", kind: "struct", exported: true },
|
|
111
|
+
],
|
|
112
|
+
// Ruby
|
|
113
|
+
ruby: [
|
|
114
|
+
{ pattern: "def $NAME $$$_ end", kind: "method" },
|
|
115
|
+
{ pattern: "def self.$NAME $$$_ end", kind: "function" },
|
|
116
|
+
{ pattern: "class $NAME $$$_ end", kind: "class" },
|
|
117
|
+
{ pattern: "module $NAME $$$_ end", kind: "module" },
|
|
118
|
+
],
|
|
119
|
+
// PHP
|
|
120
|
+
php: [
|
|
121
|
+
{ pattern: "function $NAME($_) { $$$_ }", kind: "function" },
|
|
122
|
+
{ pattern: "public function $NAME($_) { $$$_ }", kind: "method", exported: true },
|
|
123
|
+
{ pattern: "class $NAME { $$$_ }", kind: "class" },
|
|
124
|
+
{ pattern: "interface $NAME { $$$_ }", kind: "interface" },
|
|
125
|
+
{ pattern: "trait $NAME { $$$_ }", kind: "trait" },
|
|
126
|
+
],
|
|
127
|
+
// Kotlin
|
|
128
|
+
kotlin: [
|
|
129
|
+
{ pattern: "fun $NAME($_): $_ { $$$_ }", kind: "function" },
|
|
130
|
+
{ pattern: "class $NAME { $$$_ }", kind: "class" },
|
|
131
|
+
{ pattern: "data class $NAME($_)", kind: "class" },
|
|
132
|
+
{ pattern: "interface $NAME { $$$_ }", kind: "interface" },
|
|
133
|
+
{ pattern: "object $NAME { $$$_ }", kind: "class" },
|
|
134
|
+
],
|
|
135
|
+
// Swift
|
|
136
|
+
swift: [
|
|
137
|
+
{ pattern: "func $NAME($_) $$$_ { $$$_ }", kind: "function" },
|
|
138
|
+
{ pattern: "class $NAME { $$$_ }", kind: "class" },
|
|
139
|
+
{ pattern: "struct $NAME { $$$_ }", kind: "struct" },
|
|
140
|
+
{ pattern: "protocol $NAME { $$$_ }", kind: "interface" },
|
|
141
|
+
{ pattern: "enum $NAME { $$$_ }", kind: "enum" },
|
|
142
|
+
],
|
|
143
|
+
// C
|
|
144
|
+
c: [
|
|
145
|
+
{ pattern: "$_ $NAME($_) { $$$_ }", kind: "function" },
|
|
146
|
+
{ pattern: "struct $NAME { $$$_ }", kind: "struct" },
|
|
147
|
+
{ pattern: "typedef struct { $$$_ } $NAME", kind: "struct" },
|
|
148
|
+
{ pattern: "enum $NAME { $$$_ }", kind: "enum" },
|
|
149
|
+
],
|
|
150
|
+
// C++
|
|
151
|
+
cpp: [
|
|
152
|
+
{ pattern: "$_ $NAME($_) { $$$_ }", kind: "function" },
|
|
153
|
+
{ pattern: "class $NAME { $$$_ }", kind: "class" },
|
|
154
|
+
{ pattern: "struct $NAME { $$$_ }", kind: "struct" },
|
|
155
|
+
{ pattern: "namespace $NAME { $$$_ }", kind: "module" },
|
|
156
|
+
{ pattern: "template<$_> class $NAME { $$$_ }", kind: "class" },
|
|
157
|
+
],
|
|
158
|
+
};
|
|
159
|
+
/**
|
|
160
|
+
* AstGrepService provides code intelligence via ast-grep CLI.
|
|
161
|
+
*
|
|
162
|
+
* This service extracts symbols, imports, and matches patterns from source files
|
|
163
|
+
* using structural code analysis. It gracefully degrades when ast-grep is not
|
|
164
|
+
* installed by providing a Noop fallback.
|
|
165
|
+
*
|
|
166
|
+
* Design: Following DD-014 specification for symbol extraction.
|
|
167
|
+
*/
|
|
168
|
+
export class AstGrepService extends Context.Tag("AstGrepService")() {
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get the language identifier for a file path based on extension.
|
|
172
|
+
*/
|
|
173
|
+
const getLanguage = (filePath) => {
|
|
174
|
+
const lastDot = filePath.lastIndexOf(".");
|
|
175
|
+
if (lastDot === -1)
|
|
176
|
+
return null;
|
|
177
|
+
const ext = filePath.slice(lastDot);
|
|
178
|
+
return EXT_TO_LANGUAGE[ext] ?? null;
|
|
179
|
+
};
|
|
180
|
+
/**
|
|
181
|
+
* Get symbol patterns for a language.
|
|
182
|
+
*/
|
|
183
|
+
const getPatterns = (language) => {
|
|
184
|
+
return DEFAULT_SYMBOL_PATTERNS[language] ?? [];
|
|
185
|
+
};
|
|
186
|
+
/**
|
|
187
|
+
* Run ast-grep CLI with given arguments.
|
|
188
|
+
* Returns the stdout as a string.
|
|
189
|
+
*/
|
|
190
|
+
const runAstGrep = (args) => Effect.async((resume) => {
|
|
191
|
+
const proc = spawn("ast-grep", [...args], { stdio: ["ignore", "pipe", "pipe"] });
|
|
192
|
+
let stdout = "";
|
|
193
|
+
let stderr = "";
|
|
194
|
+
proc.stdout.on("data", (data) => {
|
|
195
|
+
stdout += data.toString();
|
|
196
|
+
});
|
|
197
|
+
proc.stderr.on("data", (data) => {
|
|
198
|
+
stderr += data.toString();
|
|
199
|
+
});
|
|
200
|
+
proc.on("close", (code) => {
|
|
201
|
+
if (code !== 0 && code !== null) {
|
|
202
|
+
resume(Effect.fail(new AstGrepError({
|
|
203
|
+
reason: `ast-grep exited with code ${code}`,
|
|
204
|
+
cause: stderr,
|
|
205
|
+
})));
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
resume(Effect.succeed(stdout));
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
proc.on("error", (err) => {
|
|
212
|
+
resume(Effect.fail(new AstGrepError({
|
|
213
|
+
reason: "Failed to spawn ast-grep",
|
|
214
|
+
cause: err,
|
|
215
|
+
})));
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
/**
|
|
219
|
+
* Live implementation that spawns ast-grep CLI.
|
|
220
|
+
* Requires ast-grep to be installed and available in PATH.
|
|
221
|
+
*/
|
|
222
|
+
export const AstGrepServiceLive = Layer.succeed(AstGrepService, {
|
|
223
|
+
findSymbols: (filePath) => Effect.gen(function* () {
|
|
224
|
+
const language = getLanguage(filePath);
|
|
225
|
+
if (!language) {
|
|
226
|
+
return [];
|
|
227
|
+
}
|
|
228
|
+
const patterns = getPatterns(language);
|
|
229
|
+
const symbols = [];
|
|
230
|
+
for (const { pattern, kind, exported } of patterns) {
|
|
231
|
+
const output = yield* runAstGrep(["--pattern", pattern, "--json", filePath]).pipe(Effect.catchAll(() => Effect.succeed("[]")));
|
|
232
|
+
let matches;
|
|
233
|
+
try {
|
|
234
|
+
matches = JSON.parse(output);
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
matches = [];
|
|
238
|
+
}
|
|
239
|
+
for (const m of matches) {
|
|
240
|
+
const name = m.metaVariables?.NAME?.text;
|
|
241
|
+
if (name) {
|
|
242
|
+
symbols.push({
|
|
243
|
+
name,
|
|
244
|
+
kind: kind,
|
|
245
|
+
line: (m.range?.start?.line ?? 0) + 1, // Convert 0-indexed to 1-indexed
|
|
246
|
+
exported: exported ?? false,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return symbols;
|
|
252
|
+
}),
|
|
253
|
+
getImports: (filePath) => Effect.gen(function* () {
|
|
254
|
+
const language = getLanguage(filePath);
|
|
255
|
+
if (!language) {
|
|
256
|
+
return [];
|
|
257
|
+
}
|
|
258
|
+
// TypeScript/JavaScript import patterns
|
|
259
|
+
const importPatterns = language === "typescript" || language === "javascript"
|
|
260
|
+
? [
|
|
261
|
+
'import { $$$SPECS } from "$SOURCE"',
|
|
262
|
+
'import * as $ALIAS from "$SOURCE"',
|
|
263
|
+
'import $DEFAULT from "$SOURCE"',
|
|
264
|
+
]
|
|
265
|
+
: [];
|
|
266
|
+
const imports = [];
|
|
267
|
+
for (const pattern of importPatterns) {
|
|
268
|
+
const output = yield* runAstGrep(["--pattern", pattern, "--json", filePath]).pipe(Effect.catchAll(() => Effect.succeed("[]")));
|
|
269
|
+
let matches;
|
|
270
|
+
try {
|
|
271
|
+
matches = JSON.parse(output);
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
matches = [];
|
|
275
|
+
}
|
|
276
|
+
for (const m of matches) {
|
|
277
|
+
const source = m.metaVariables?.SOURCE?.text ?? "";
|
|
278
|
+
if (!source)
|
|
279
|
+
continue;
|
|
280
|
+
// Extract specifiers from different patterns
|
|
281
|
+
const specsText = m.metaVariables?.SPECS?.text ?? "";
|
|
282
|
+
const aliasText = m.metaVariables?.ALIAS?.text ?? "";
|
|
283
|
+
const defaultText = m.metaVariables?.DEFAULT?.text ?? "";
|
|
284
|
+
let specifiers;
|
|
285
|
+
if (specsText) {
|
|
286
|
+
specifiers = specsText
|
|
287
|
+
.split(",")
|
|
288
|
+
.map((s) => s.trim())
|
|
289
|
+
.filter(Boolean);
|
|
290
|
+
}
|
|
291
|
+
else if (aliasText) {
|
|
292
|
+
specifiers = [`* as ${aliasText}`];
|
|
293
|
+
}
|
|
294
|
+
else if (defaultText) {
|
|
295
|
+
specifiers = [defaultText];
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
specifiers = [];
|
|
299
|
+
}
|
|
300
|
+
imports.push({
|
|
301
|
+
source,
|
|
302
|
+
specifiers,
|
|
303
|
+
kind: "static",
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return imports;
|
|
308
|
+
}),
|
|
309
|
+
matchPattern: (pattern, path) => Effect.gen(function* () {
|
|
310
|
+
const output = yield* runAstGrep(["--pattern", pattern, "--json", path]);
|
|
311
|
+
let matches;
|
|
312
|
+
try {
|
|
313
|
+
matches = JSON.parse(output);
|
|
314
|
+
}
|
|
315
|
+
catch {
|
|
316
|
+
return [];
|
|
317
|
+
}
|
|
318
|
+
return matches.map((m) => ({
|
|
319
|
+
file: m.file ?? path,
|
|
320
|
+
line: (m.range?.start?.line ?? 0) + 1, // Convert 0-indexed to 1-indexed
|
|
321
|
+
column: (m.range?.start?.column ?? 0) + 1,
|
|
322
|
+
text: m.text ?? "",
|
|
323
|
+
captures: Object.fromEntries(Object.entries(m.metaVariables ?? {}).map(([k, v]) => [k, v?.text ?? ""])),
|
|
324
|
+
}));
|
|
325
|
+
}),
|
|
326
|
+
});
|
|
327
|
+
/**
|
|
328
|
+
* Noop implementation that returns empty arrays.
|
|
329
|
+
* Used when ast-grep is not installed or not available.
|
|
330
|
+
*/
|
|
331
|
+
export const AstGrepServiceNoop = Layer.succeed(AstGrepService, {
|
|
332
|
+
findSymbols: () => Effect.succeed([]),
|
|
333
|
+
getImports: () => Effect.succeed([]),
|
|
334
|
+
matchPattern: () => Effect.succeed([]),
|
|
335
|
+
});
|
|
336
|
+
/**
|
|
337
|
+
* Auto-detecting layer that uses Live if ast-grep is available, Noop otherwise.
|
|
338
|
+
* This allows graceful degradation when ast-grep is not installed.
|
|
339
|
+
*/
|
|
340
|
+
export const AstGrepServiceAuto = Layer.unwrapEffect(Effect.gen(function* () {
|
|
341
|
+
// Check if ast-grep is available by trying to run it
|
|
342
|
+
const available = yield* Effect.async((resume) => {
|
|
343
|
+
const proc = spawn("ast-grep", ["--version"], { stdio: ["ignore", "pipe", "pipe"] });
|
|
344
|
+
proc.on("close", (code) => {
|
|
345
|
+
resume(Effect.succeed(code === 0));
|
|
346
|
+
});
|
|
347
|
+
proc.on("error", () => {
|
|
348
|
+
resume(Effect.succeed(false));
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
if (available) {
|
|
352
|
+
return AstGrepServiceLive;
|
|
353
|
+
}
|
|
354
|
+
return AstGrepServiceNoop;
|
|
355
|
+
}));
|
|
356
|
+
//# sourceMappingURL=ast-grep-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-grep-service.js","sourceRoot":"","sources":["../../src/services/ast-grep-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { AttemptRepository } from "../repo/attempt-repo.js";
|
|
3
|
+
import { TaskRepository } from "../repo/task-repo.js";
|
|
4
|
+
import { AttemptNotFoundError, TaskNotFoundError, ValidationError, DatabaseError } from "../errors.js";
|
|
5
|
+
import type { Attempt, AttemptId, AttemptOutcome } from "@jamesaphoenix/tx-types";
|
|
6
|
+
declare const AttemptService_base: Context.TagClass<AttemptService, "AttemptService", {
|
|
7
|
+
/** Create a new attempt for a task (validates task exists) */
|
|
8
|
+
readonly create: (taskId: string, approach: string, outcome: AttemptOutcome, reason?: string | null) => Effect.Effect<Attempt, TaskNotFoundError | ValidationError | DatabaseError>;
|
|
9
|
+
/** Get an attempt by ID */
|
|
10
|
+
readonly get: (id: AttemptId) => Effect.Effect<Attempt, AttemptNotFoundError | DatabaseError>;
|
|
11
|
+
/** List all attempts for a task */
|
|
12
|
+
readonly listForTask: (taskId: string) => Effect.Effect<readonly Attempt[], DatabaseError>;
|
|
13
|
+
/** Remove an attempt by ID */
|
|
14
|
+
readonly remove: (id: AttemptId) => Effect.Effect<void, AttemptNotFoundError | DatabaseError>;
|
|
15
|
+
/** Get count of failed attempts for a task */
|
|
16
|
+
readonly getFailedCount: (taskId: string) => Effect.Effect<number, DatabaseError>;
|
|
17
|
+
/** Get failed attempt counts for multiple tasks in a single query */
|
|
18
|
+
readonly getFailedCountsForTasks: (taskIds: readonly string[]) => Effect.Effect<Map<string, number>, DatabaseError>;
|
|
19
|
+
}>;
|
|
20
|
+
export declare class AttemptService extends AttemptService_base {
|
|
21
|
+
}
|
|
22
|
+
export declare const AttemptServiceLive: Layer.Layer<AttemptService, never, TaskRepository | AttemptRepository>;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=attempt-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attempt-service.d.ts","sourceRoot":"","sources":["../../src/services/attempt-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEtG,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;;IAK7E,8DAA8D;qBAC7C,CACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,KACnB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,eAAe,GAAG,aAAa,CAAC;IAEhF,2BAA2B;kBACb,CAAC,EAAE,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAAC;IAE7F,mCAAmC;0BACb,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,OAAO,EAAE,EAAE,aAAa,CAAC;IAE1F,8BAA8B;qBACb,CAAC,EAAE,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAoB,GAAG,aAAa,CAAC;IAE7F,8CAA8C;6BACrB,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAEjF,qEAAqE;sCACnC,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,CAAC;;AAxBvH,qBAAa,cAAe,SAAQ,mBA0BjC;CAAG;AAEN,eAAO,MAAM,kBAAkB,wEA8D9B,CAAA"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { AttemptRepository } from "../repo/attempt-repo.js";
|
|
3
|
+
import { TaskRepository } from "../repo/task-repo.js";
|
|
4
|
+
import { AttemptNotFoundError, TaskNotFoundError, ValidationError } from "../errors.js";
|
|
5
|
+
import { isValidOutcome } from "../mappers/attempt.js";
|
|
6
|
+
export class AttemptService extends Context.Tag("AttemptService")() {
|
|
7
|
+
}
|
|
8
|
+
export const AttemptServiceLive = Layer.effect(AttemptService, Effect.gen(function* () {
|
|
9
|
+
const attemptRepo = yield* AttemptRepository;
|
|
10
|
+
const taskRepo = yield* TaskRepository;
|
|
11
|
+
return {
|
|
12
|
+
create: (taskId, approach, outcome, reason) => Effect.gen(function* () {
|
|
13
|
+
// Validate task exists
|
|
14
|
+
const task = yield* taskRepo.findById(taskId);
|
|
15
|
+
if (!task) {
|
|
16
|
+
return yield* Effect.fail(new TaskNotFoundError({ id: taskId }));
|
|
17
|
+
}
|
|
18
|
+
// Validate approach is not empty
|
|
19
|
+
if (!approach || approach.trim().length === 0) {
|
|
20
|
+
return yield* Effect.fail(new ValidationError({ reason: "Approach is required" }));
|
|
21
|
+
}
|
|
22
|
+
// Validate outcome
|
|
23
|
+
if (!isValidOutcome(outcome)) {
|
|
24
|
+
return yield* Effect.fail(new ValidationError({ reason: `Invalid outcome: ${outcome}` }));
|
|
25
|
+
}
|
|
26
|
+
return yield* attemptRepo.insert({
|
|
27
|
+
taskId,
|
|
28
|
+
approach: approach.trim(),
|
|
29
|
+
outcome,
|
|
30
|
+
reason: reason ?? null
|
|
31
|
+
});
|
|
32
|
+
}),
|
|
33
|
+
get: (id) => Effect.gen(function* () {
|
|
34
|
+
const attempt = yield* attemptRepo.findById(id);
|
|
35
|
+
if (!attempt) {
|
|
36
|
+
return yield* Effect.fail(new AttemptNotFoundError({ id }));
|
|
37
|
+
}
|
|
38
|
+
return attempt;
|
|
39
|
+
}),
|
|
40
|
+
listForTask: (taskId) => attemptRepo.findByTaskId(taskId),
|
|
41
|
+
remove: (id) => Effect.gen(function* () {
|
|
42
|
+
const attempt = yield* attemptRepo.findById(id);
|
|
43
|
+
if (!attempt) {
|
|
44
|
+
return yield* Effect.fail(new AttemptNotFoundError({ id }));
|
|
45
|
+
}
|
|
46
|
+
yield* attemptRepo.remove(id);
|
|
47
|
+
}),
|
|
48
|
+
getFailedCount: (taskId) => Effect.gen(function* () {
|
|
49
|
+
const attempts = yield* attemptRepo.findByTaskId(taskId);
|
|
50
|
+
return attempts.filter(a => a.outcome === "failed").length;
|
|
51
|
+
}),
|
|
52
|
+
getFailedCountsForTasks: (taskIds) => attemptRepo.getFailedCountsForTasks(taskIds)
|
|
53
|
+
};
|
|
54
|
+
}));
|
|
55
|
+
//# sourceMappingURL=attempt-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attempt-service.js","sourceRoot":"","sources":["../../src/services/attempt-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AutoSyncService provides hooks for automatic JSONL export on data mutations.
|
|
3
|
+
*
|
|
4
|
+
* When auto-sync is enabled, any create/update/delete operation on tasks,
|
|
5
|
+
* learnings, file-learnings, attempts, or dependencies triggers an export
|
|
6
|
+
* to keep JSONL files in sync with SQLite.
|
|
7
|
+
*
|
|
8
|
+
* Design:
|
|
9
|
+
* - Non-blocking: Exports run in background fiber to avoid latency impact
|
|
10
|
+
* - Error-resilient: Export errors are logged but never propagate to caller
|
|
11
|
+
* - Configurable: Controlled via sync_config "auto_sync" setting
|
|
12
|
+
*/
|
|
13
|
+
import { Context, Effect, Layer } from "effect";
|
|
14
|
+
import { SqliteClient } from "../db.js";
|
|
15
|
+
import { SyncService } from "./sync-service.js";
|
|
16
|
+
/**
|
|
17
|
+
* Entity types that can trigger auto-sync
|
|
18
|
+
*/
|
|
19
|
+
export type AutoSyncEntity = "tasks" | "learnings" | "file-learnings" | "attempts";
|
|
20
|
+
declare const AutoSyncService_base: Context.TagClass<AutoSyncService, "AutoSyncService", {
|
|
21
|
+
/**
|
|
22
|
+
* Trigger auto-sync after a task or dependency mutation.
|
|
23
|
+
* Non-blocking - runs export in background if auto-sync is enabled.
|
|
24
|
+
*/
|
|
25
|
+
readonly afterTaskMutation: () => Effect.Effect<void, never>;
|
|
26
|
+
/**
|
|
27
|
+
* Trigger auto-sync after a learning mutation.
|
|
28
|
+
* Non-blocking - runs export in background if auto-sync is enabled.
|
|
29
|
+
*/
|
|
30
|
+
readonly afterLearningMutation: () => Effect.Effect<void, never>;
|
|
31
|
+
/**
|
|
32
|
+
* Trigger auto-sync after a file-learning mutation.
|
|
33
|
+
* Non-blocking - runs export in background if auto-sync is enabled.
|
|
34
|
+
*/
|
|
35
|
+
readonly afterFileLearningMutation: () => Effect.Effect<void, never>;
|
|
36
|
+
/**
|
|
37
|
+
* Trigger auto-sync after an attempt mutation.
|
|
38
|
+
* Non-blocking - runs export in background if auto-sync is enabled.
|
|
39
|
+
*/
|
|
40
|
+
readonly afterAttemptMutation: () => Effect.Effect<void, never>;
|
|
41
|
+
/**
|
|
42
|
+
* Trigger auto-sync for all entities.
|
|
43
|
+
* Non-blocking - runs exportAll in background if auto-sync is enabled.
|
|
44
|
+
*/
|
|
45
|
+
readonly afterAnyMutation: () => Effect.Effect<void, never>;
|
|
46
|
+
}>;
|
|
47
|
+
export declare class AutoSyncService extends AutoSyncService_base {
|
|
48
|
+
}
|
|
49
|
+
export declare const AutoSyncServiceLive: Layer.Layer<AutoSyncService, never, SqliteClient | SyncService>;
|
|
50
|
+
/**
|
|
51
|
+
* Noop implementation for use when auto-sync is not needed.
|
|
52
|
+
* All hooks do nothing.
|
|
53
|
+
*/
|
|
54
|
+
export declare const AutoSyncServiceNoop: Layer.Layer<AutoSyncService, never, never>;
|
|
55
|
+
export {};
|
|
56
|
+
//# sourceMappingURL=auto-sync-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-sync-service.d.ts","sourceRoot":"","sources":["../../src/services/auto-sync-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG/C;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,WAAW,GAAG,gBAAgB,GAAG,UAAU,CAAA;;IAK9E;;;OAGG;gCACyB,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;IAE5D;;;OAGG;oCAC6B,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;IAEhE;;;OAGG;wCACiC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;IAEpE;;;OAGG;mCAC4B,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;IAE/D;;;OAGG;+BACwB,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;;AA/B/D,qBAAa,eAAgB,SAAQ,oBAiClC;CAAG;AAEN,eAAO,MAAM,mBAAmB,iEAgE/B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,4CAS/B,CAAA"}
|