@yanib/reverb-application 0.1.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.
@@ -0,0 +1,309 @@
1
+ import type { AnalysisId, AnalysisResult, ArtifactBatch, BeginGeneration, BlobResult, BoundedDiagnostic, CommitDescriptor, CommitSha, ConfigRevision, ConsumerGenerationSelection, ContractGenerationObservation, ContentHash, CoverageRecord, DiffManifest, EvidenceEdge, FileArtifact, FindingFingerprint, FindingOccurrence, GenerationFailure, GenerationId, GenerationLease, GenerationLeaseId, GenerationSummary, IndexedContractDefinition, IndexedContractReference, Instant, JobId, OverlayEntry, OverlayId, PullRequestOverlay, RegistryRevision, RegistrySnapshot, RepositoryAction, RepositoryDescriptor, RepositoryGeneration, RepositoryStableId, ReviewEvent, ReviewEventId, SuppressionRule, SuppressionStateEvent, PromotionRecord, CorpusManifest, ImpactCase, EvaluationReport, TreeManifest, WorkspaceId } from '@yanib/reverb-domain';
2
+ export type PortFailureKind = 'domain' | 'infrastructure' | 'authorization_denied' | 'incomplete_provider_data' | 'cancelled' | 'not_found' | 'conflict';
3
+ export interface PortFailure {
4
+ readonly kind: PortFailureKind;
5
+ readonly code: string;
6
+ readonly safeMessage: string;
7
+ readonly retryable: boolean;
8
+ }
9
+ export type PortResult<Value> = {
10
+ readonly ok: true;
11
+ readonly value: Value;
12
+ } | {
13
+ readonly ok: false;
14
+ readonly failure: PortFailure;
15
+ };
16
+ export declare const portSuccess: <Value>(value: Value) => PortResult<Value>;
17
+ export declare const portFailure: (failure: PortFailure) => PortResult<never>;
18
+ export interface RepositoryReader {
19
+ resolveRepository(id: RepositoryStableId): Promise<PortResult<RepositoryDescriptor>>;
20
+ resolveCommit(id: RepositoryStableId, ref: string): Promise<PortResult<CommitDescriptor>>;
21
+ listTree(id: RepositoryStableId, sha: CommitSha): Promise<PortResult<TreeManifest>>;
22
+ readBlob(id: RepositoryStableId, sha: CommitSha, path: FileArtifact['path'], maximumBytes: number): Promise<PortResult<BlobResult>>;
23
+ compare(id: RepositoryStableId, base: CommitSha, head: CommitSha): Promise<PortResult<DiffManifest>>;
24
+ }
25
+ export interface GenerationSelection {
26
+ readonly workspaceId: WorkspaceId;
27
+ readonly repositoryId: RepositoryStableId;
28
+ readonly commitSha?: CommitSha;
29
+ readonly indexerBundleVersion?: string;
30
+ readonly configRevision?: ConfigRevision;
31
+ readonly allowPartial: boolean;
32
+ }
33
+ export type GenerationSelectionResult = {
34
+ readonly state: 'selected';
35
+ readonly generation: RepositoryGeneration;
36
+ } | {
37
+ readonly state: 'not_indexed';
38
+ } | {
39
+ readonly state: 'failed';
40
+ readonly generation: RepositoryGeneration;
41
+ };
42
+ export interface BeginOverlay {
43
+ readonly overlay: PullRequestOverlay;
44
+ readonly leaseId: GenerationLeaseId;
45
+ readonly leaseExpiresAt: Instant;
46
+ }
47
+ export interface OverlaySummary {
48
+ readonly state: 'complete' | 'partial';
49
+ readonly completedAt: Instant;
50
+ readonly resultHash: ContentHash;
51
+ }
52
+ export interface GenerationStore {
53
+ beginGeneration(input: BeginGeneration): Promise<PortResult<GenerationLease>>;
54
+ putArtifacts(lease: GenerationLease, batch: ArtifactBatch): Promise<PortResult<void>>;
55
+ completeGeneration(lease: GenerationLease, summary: GenerationSummary): Promise<PortResult<GenerationId>>;
56
+ failGeneration(lease: GenerationLease, failure: GenerationFailure): Promise<PortResult<void>>;
57
+ expireLease(lease: GenerationLease, at: Instant): Promise<PortResult<void>>;
58
+ getGeneration(id: GenerationId): Promise<PortResult<RepositoryGeneration>>;
59
+ selectGeneration(query: GenerationSelection): Promise<PortResult<GenerationSelectionResult>>;
60
+ listArtifacts(generationId: GenerationId): Promise<PortResult<readonly FileArtifact[]>>;
61
+ getGenerationCoverage(generationId: GenerationId): Promise<PortResult<readonly CoverageRecord[]>>;
62
+ getGenerationDiagnostics(generationId: GenerationId): Promise<PortResult<readonly BoundedDiagnostic[]>>;
63
+ beginOverlay(input: BeginOverlay): Promise<PortResult<GenerationLease>>;
64
+ putOverlayEntries(lease: GenerationLease, overlayId: OverlayId, entries: readonly OverlayEntry[]): Promise<PortResult<void>>;
65
+ completeOverlay(lease: GenerationLease, overlayId: OverlayId, summary: OverlaySummary): Promise<PortResult<OverlayId>>;
66
+ failOverlay(lease: GenerationLease, overlayId: OverlayId, failure: GenerationFailure): Promise<PortResult<void>>;
67
+ getOverlay(id: OverlayId): Promise<PortResult<PullRequestOverlay>>;
68
+ listOverlayEntries(id: OverlayId): Promise<PortResult<readonly OverlayEntry[]>>;
69
+ }
70
+ export interface CanonicalRecord {
71
+ readonly schema: string;
72
+ readonly schemaVersion: string;
73
+ readonly workspaceId: WorkspaceId;
74
+ readonly payloadHash: ContentHash;
75
+ readonly payload: Readonly<Record<string, unknown>>;
76
+ }
77
+ export interface EvidenceStore {
78
+ readRecords(query: {
79
+ workspaceId: WorkspaceId;
80
+ schema: string;
81
+ generationId?: GenerationId;
82
+ }): AsyncIterable<PortResult<CanonicalRecord>>;
83
+ persistAnalysis(result: CanonicalRecord & {
84
+ readonly analysisId: AnalysisId;
85
+ }): Promise<PortResult<void>>;
86
+ appendReview(event: CanonicalRecord & {
87
+ readonly reviewEventId: ReviewEventId;
88
+ }): Promise<PortResult<void>>;
89
+ }
90
+ export interface DefinitionQuery {
91
+ readonly workspaceId: WorkspaceId;
92
+ readonly generationId?: GenerationId;
93
+ readonly repositoryId?: RepositoryStableId;
94
+ readonly contractKind?: IndexedContractDefinition['contractKind'];
95
+ readonly canonicalKeys?: readonly string[];
96
+ }
97
+ export interface ReferenceQuery {
98
+ readonly workspaceId: WorkspaceId;
99
+ readonly generationIds?: readonly GenerationId[];
100
+ readonly repositoryId?: RepositoryStableId;
101
+ readonly contractKind?: IndexedContractReference['contractKind'];
102
+ readonly canonicalKeys?: readonly string[];
103
+ }
104
+ export interface EdgeQuery {
105
+ readonly workspaceId: WorkspaceId;
106
+ readonly producerRepositoryId?: RepositoryStableId;
107
+ readonly consumerRepositoryId?: RepositoryStableId;
108
+ readonly canonicalKeys?: readonly string[];
109
+ readonly currentAt?: Instant;
110
+ readonly freshnessTtlMs?: number;
111
+ }
112
+ export interface EvidenceGraphStore {
113
+ putContractObservation(observation: ContractGenerationObservation): Promise<PortResult<void>>;
114
+ getContractObservation(generationId: GenerationId): Promise<PortResult<ContractGenerationObservation | null>>;
115
+ readDefinitions(query: DefinitionQuery): Promise<PortResult<readonly IndexedContractDefinition[]>>;
116
+ readReferences(query: ReferenceQuery): Promise<PortResult<readonly IndexedContractReference[]>>;
117
+ observeEdges(edges: readonly EvidenceEdge[]): Promise<PortResult<void>>;
118
+ readEdges(query: EdgeQuery): Promise<PortResult<readonly EvidenceEdge[]>>;
119
+ rebuildServiceEdges(workspaceId: WorkspaceId): Promise<PortResult<number>>;
120
+ persistAnalysis(result: AnalysisResult, supersessionKey: ContentHash): Promise<PortResult<void>>;
121
+ getAnalysis(analysisId: AnalysisId): Promise<PortResult<AnalysisResult>>;
122
+ getCurrentAnalysis(supersessionKey: ContentHash): Promise<PortResult<AnalysisResult | null>>;
123
+ findFinding(workspaceId: WorkspaceId, fingerprint: FindingFingerprint): Promise<PortResult<{
124
+ readonly analysis: AnalysisResult;
125
+ readonly finding: FindingOccurrence;
126
+ }>>;
127
+ }
128
+ export interface ReviewEvaluationStore {
129
+ appendReview(input: {
130
+ readonly event: ReviewEvent;
131
+ readonly suppression?: SuppressionRule;
132
+ }): Promise<PortResult<void>>;
133
+ listReviews(workspaceId: WorkspaceId, fingerprint: FindingFingerprint): Promise<PortResult<readonly ReviewEvent[]>>;
134
+ appendSuppressionState(event: SuppressionStateEvent): Promise<PortResult<void>>;
135
+ listSuppressions(workspaceId: WorkspaceId): Promise<PortResult<readonly SuppressionRule[]>>;
136
+ listSuppressionStateEvents(workspaceId: WorkspaceId): Promise<PortResult<readonly SuppressionStateEvent[]>>;
137
+ putCorpus(manifest: CorpusManifest, cases: readonly ImpactCase[]): Promise<PortResult<void>>;
138
+ getCorpus(revision: ContentHash): Promise<PortResult<{
139
+ readonly manifest: CorpusManifest;
140
+ readonly cases: readonly ImpactCase[];
141
+ }>>;
142
+ putEvaluationReport(report: EvaluationReport): Promise<PortResult<void>>;
143
+ getEvaluationReport(outputHash: ContentHash): Promise<PortResult<EvaluationReport>>;
144
+ appendPromotion(record: PromotionRecord): Promise<PortResult<void>>;
145
+ listPromotions(stratumKey: string): Promise<PortResult<readonly PromotionRecord[]>>;
146
+ }
147
+ export interface ConsumerRefreshRequest {
148
+ readonly workspaceId: WorkspaceId;
149
+ readonly repositoryId: RepositoryStableId;
150
+ readonly maximumDurationMs: number;
151
+ }
152
+ export interface ConsumerRefreshPort {
153
+ refresh(request: ConsumerRefreshRequest): Promise<PortResult<ConsumerGenerationSelection | null>>;
154
+ }
155
+ export interface WorkspaceRegistry {
156
+ getRevision(workspace: WorkspaceId, revision: RegistryRevision): Promise<PortResult<RegistrySnapshot>>;
157
+ getCurrentRevision(workspace: WorkspaceId): Promise<PortResult<RegistrySnapshot>>;
158
+ putRevision(snapshot: RegistrySnapshot): Promise<PortResult<RegistryRevision>>;
159
+ }
160
+ export interface Subject {
161
+ readonly kind: 'user' | 'service' | 'workspace';
162
+ readonly id: string;
163
+ }
164
+ export interface AuthorizationDecision {
165
+ readonly allowed: boolean;
166
+ readonly reason: string;
167
+ readonly revision: RegistryRevision;
168
+ }
169
+ export interface DisclosureRequest {
170
+ readonly workspaceId: WorkspaceId;
171
+ readonly destinationRepositoryId: RepositoryStableId;
172
+ readonly audience: 'static' | 'personalized';
173
+ readonly viewer?: Subject;
174
+ readonly requestedFields: readonly ('repository_identity' | 'contract_identity' | 'location' | 'snippet')[];
175
+ }
176
+ export interface DisclosureProjection {
177
+ readonly allowedFields: readonly string[];
178
+ readonly omittedFields: readonly string[];
179
+ readonly decisionHash: ContentHash;
180
+ readonly registryRevision: RegistryRevision;
181
+ }
182
+ export interface AuthorizationPort {
183
+ authorizeRepositoryUse(subject: Subject, action: RepositoryAction, repository: RepositoryStableId): Promise<PortResult<AuthorizationDecision>>;
184
+ projectDisclosure(input: DisclosureRequest): Promise<PortResult<DisclosureProjection>>;
185
+ }
186
+ export type JobKind = 'index_generation' | 'create_overlay' | 'analyze_pull_request' | 'purge_repository' | 'reconcile_provider';
187
+ export interface DurableJob<Payload = Readonly<Record<string, unknown>>> {
188
+ readonly workspaceId: WorkspaceId;
189
+ readonly kind: JobKind;
190
+ readonly idempotencyKey: ContentHash;
191
+ readonly payload: Payload;
192
+ readonly availableAt: Instant;
193
+ readonly maximumAttempts: number;
194
+ }
195
+ export interface WorkerIdentity {
196
+ readonly id: string;
197
+ }
198
+ export interface JobClaim {
199
+ readonly jobId: JobId;
200
+ readonly worker: WorkerIdentity;
201
+ readonly leaseExpiresAt: Instant;
202
+ }
203
+ export interface ClaimedJob {
204
+ readonly claim: JobClaim;
205
+ readonly job: DurableJob;
206
+ readonly attempt: number;
207
+ }
208
+ export interface JobResult {
209
+ readonly resultHash: ContentHash;
210
+ }
211
+ export interface JobFailure {
212
+ readonly code: string;
213
+ readonly safeMessage: string;
214
+ readonly retryable: boolean;
215
+ }
216
+ export interface JobQueue {
217
+ enqueue<Payload>(job: DurableJob<Payload>): Promise<PortResult<JobId>>;
218
+ claim(worker: WorkerIdentity, kinds: readonly JobKind[]): Promise<PortResult<ClaimedJob | null>>;
219
+ heartbeat(claim: JobClaim): Promise<PortResult<void>>;
220
+ complete(claim: JobClaim, result: JobResult): Promise<PortResult<void>>;
221
+ fail(claim: JobClaim, failure: JobFailure): Promise<PortResult<void>>;
222
+ }
223
+ export interface CancellationPort {
224
+ isCurrent(key: ContentHash): Promise<PortResult<boolean>>;
225
+ }
226
+ export interface Clock {
227
+ now(): Instant;
228
+ }
229
+ export interface SandboxedToolRequest {
230
+ readonly toolId: string;
231
+ readonly argv: readonly string[];
232
+ readonly inputRefs: readonly string[];
233
+ readonly timeoutMs: number;
234
+ readonly maximumOutputBytes: number;
235
+ readonly network: false;
236
+ }
237
+ export interface SandboxedToolResult {
238
+ readonly exitCode: number | null;
239
+ readonly stdout: Uint8Array;
240
+ readonly stderrCode: string | null;
241
+ readonly timedOut: boolean;
242
+ readonly outputTruncated: boolean;
243
+ }
244
+ export interface SandboxRunner {
245
+ run(request: SandboxedToolRequest): Promise<PortResult<SandboxedToolResult>>;
246
+ }
247
+ export interface CheckWrite {
248
+ readonly idempotencyKey: ContentHash;
249
+ readonly workspaceId: WorkspaceId;
250
+ readonly repositoryId: RepositoryStableId;
251
+ readonly headSha: CommitSha;
252
+ readonly conclusion: 'success' | 'neutral' | 'skipped';
253
+ readonly projectionHash: ContentHash;
254
+ readonly projection: Readonly<Record<string, unknown>>;
255
+ }
256
+ export interface ExternalDeliveryRef {
257
+ readonly provider: string;
258
+ readonly externalId: string;
259
+ }
260
+ export interface DeliveryWriter {
261
+ upsertPullRequestCheck(write: CheckWrite): Promise<PortResult<ExternalDeliveryRef>>;
262
+ }
263
+ export type RetentionClass = 'ephemeral_source' | 'derived_generation' | 'uploaded_index';
264
+ export interface BlobRef {
265
+ readonly workspaceId: WorkspaceId;
266
+ readonly hash: ContentHash;
267
+ readonly retentionClass: RetentionClass;
268
+ }
269
+ export interface ArtifactBlobStore {
270
+ put(workspaceId: WorkspaceId, hash: ContentHash, bytes: Uint8Array, policy: RetentionClass): Promise<PortResult<BlobRef>>;
271
+ get(ref: BlobRef): Promise<PortResult<Uint8Array>>;
272
+ delete(ref: BlobRef): Promise<PortResult<void>>;
273
+ }
274
+ export interface ArtifactCacheKey {
275
+ readonly workspaceId: WorkspaceId;
276
+ readonly sourceBlobId: string;
277
+ readonly indexerBundleVersion: string;
278
+ readonly parserId: string;
279
+ readonly parserVersion: string;
280
+ readonly configRevision: ConfigRevision;
281
+ }
282
+ export interface CachedArtifact {
283
+ readonly key: ArtifactCacheKey;
284
+ readonly artifact: Omit<FileArtifact, 'generationId' | 'path' | 'reusedFromGenerationId'>;
285
+ }
286
+ export interface ArtifactCachePort {
287
+ get(key: ArtifactCacheKey): Promise<PortResult<CachedArtifact | null>>;
288
+ put(value: CachedArtifact): Promise<PortResult<void>>;
289
+ }
290
+ export type AllowedTelemetryEvent = {
291
+ readonly type: 'generation_completed';
292
+ readonly state: 'complete' | 'partial';
293
+ readonly fileCount: number;
294
+ readonly reusedCount: number;
295
+ readonly durationMs: number;
296
+ } | {
297
+ readonly type: 'generation_failed';
298
+ readonly reason: string;
299
+ readonly durationMs: number;
300
+ } | {
301
+ readonly type: 'overlay_completed';
302
+ readonly state: 'complete' | 'partial';
303
+ readonly changedFileCount: number;
304
+ readonly durationMs: number;
305
+ };
306
+ export interface TelemetryPort {
307
+ emit(event: AllowedTelemetryEvent): void;
308
+ }
309
+ //# sourceMappingURL=ports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../src/ports.ts"],"names":[],"mappings":"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"}
package/dist/ports.js ADDED
@@ -0,0 +1,3 @@
1
+ export const portSuccess = (value) => ({ ok: true, value });
2
+ export const portFailure = (failure) => ({ ok: false, failure });
3
+ //# sourceMappingURL=ports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../src/ports.ts"],"names":[],"mappings":"AAqEA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAQ,KAAY,EAAqB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7F,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAoB,EAAqB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { type ReviewEvent, type SuppressionRule } from '@yanib/reverb-domain';
2
+ import type { EvidenceGraphStore, PortResult, ReviewEvaluationStore } from './ports.js';
3
+ export interface RecordReviewInput {
4
+ readonly review: Omit<ReviewEvent, 'schema' | 'schemaVersion' | 'outputHash'>;
5
+ readonly suppression?: SuppressionRule;
6
+ }
7
+ export declare class RecordReview {
8
+ private readonly evidence;
9
+ private readonly reviews;
10
+ constructor(evidence: EvidenceGraphStore, reviews: ReviewEvaluationStore);
11
+ execute(input: RecordReviewInput): Promise<PortResult<ReviewEvent>>;
12
+ }
13
+ //# sourceMappingURL=review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,eAAe,GAAG,YAAY,CAAC,CAAC;IAC9E,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC;CACxC;AAED,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,qBAAqB;IAGpC,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;CAiEjF"}
package/dist/review.js ADDED
@@ -0,0 +1,68 @@
1
+ import { ReverbError, createReviewEvent, } from '@yanib/reverb-domain';
2
+ import { portFailure, portSuccess } from './ports.js';
3
+ export class RecordReview {
4
+ evidence;
5
+ reviews;
6
+ constructor(evidence, reviews) {
7
+ this.evidence = evidence;
8
+ this.reviews = reviews;
9
+ }
10
+ async execute(input) {
11
+ const found = await this.evidence.findFinding(input.review.workspaceId, input.review.findingFingerprint);
12
+ if (!found.ok)
13
+ return portFailure(found.failure);
14
+ if (found.value.finding.id !== input.review.findingOccurrenceId) {
15
+ return portFailure({
16
+ kind: 'conflict',
17
+ code: 'immutable_occurrence_mismatch',
18
+ safeMessage: 'The review occurrence does not match the persisted structural finding.',
19
+ retryable: false,
20
+ });
21
+ }
22
+ const finding = found.value.finding;
23
+ if (input.review.versions.producerGenerationId !== finding.edge.producerGenerationId ||
24
+ input.review.versions.consumerGenerationId !== finding.edge.consumerGenerationId ||
25
+ input.review.versions.evidenceStratum !== finding.edge.stratumKey) {
26
+ return portFailure({
27
+ kind: 'conflict',
28
+ code: 'review_evidence_version_mismatch',
29
+ safeMessage: 'The review version stamp does not match the immutable finding evidence.',
30
+ retryable: false,
31
+ });
32
+ }
33
+ const history = await this.reviews.listReviews(input.review.workspaceId, input.review.findingFingerprint);
34
+ if (!history.ok)
35
+ return portFailure(history.failure);
36
+ const previous = [...history.value]
37
+ .filter((value) => value.findingOccurrenceId === input.review.findingOccurrenceId)
38
+ .sort((left, right) => left.occurredAt.localeCompare(right.occurredAt))
39
+ .at(-1);
40
+ if (input.suppression !== undefined &&
41
+ (input.review.suppressionRuleId !== input.suppression.id ||
42
+ input.suppression.workspaceId !== input.review.workspaceId)) {
43
+ return portFailure({
44
+ kind: 'conflict',
45
+ code: 'review_suppression_mismatch',
46
+ safeMessage: 'The review and optional suppression must reference each other in one workspace.',
47
+ retryable: false,
48
+ });
49
+ }
50
+ try {
51
+ const event = createReviewEvent(input.review, previous);
52
+ const stored = await this.reviews.appendReview({
53
+ event,
54
+ ...(input.suppression === undefined ? {} : { suppression: input.suppression }),
55
+ });
56
+ return stored.ok ? portSuccess(event) : portFailure(stored.failure);
57
+ }
58
+ catch (error) {
59
+ return portFailure({
60
+ kind: 'domain',
61
+ code: error instanceof ReverbError ? error.code : 'invalid_review',
62
+ safeMessage: error instanceof ReverbError ? error.message : 'Review validation failed.',
63
+ retryable: false,
64
+ });
65
+ }
66
+ }
67
+ }
68
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@yanib/reverb-application",
3
+ "version": "0.1.0",
4
+ "description": "Reverb application use cases and host-neutral ports",
5
+ "type": "module",
6
+ "license": "Apache-2.0",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/YanibHQ/reverb-impact.git",
10
+ "directory": "packages/application"
11
+ },
12
+ "homepage": "https://github.com/YanibHQ/reverb-impact#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/YanibHQ/reverb-impact/issues"
15
+ },
16
+ "engines": {
17
+ "node": ">=24 <26"
18
+ },
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "main": "./dist/index.js",
23
+ "types": "./dist/index.d.ts",
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/index.d.ts",
27
+ "default": "./dist/index.js"
28
+ }
29
+ },
30
+ "dependencies": {
31
+ "@yanib/reverb-domain": "0.1.0"
32
+ },
33
+ "publishConfig": {
34
+ "access": "public",
35
+ "provenance": true
36
+ },
37
+ "scripts": {
38
+ "build": "tsc -b"
39
+ }
40
+ }