Skip to content
Source
Sign inSign up

applicationEvent.ts

115 lines4.5 KB

1import * as Schema from "effect/Schema";
2​
3import {
4 ApprovalRequestId,
5 ClientSurface,
6 CommandId,
7 EventId,
8 IsoDateTime,
9 NonNegativeInt,
10 ProjectId,
11 ProviderItemId,
12 TrimmedNonEmptyString,
13} from "./baseSchemas.ts";
14import { RepositoryIdentity, ThreadEnvMode } from "./environment.ts";
15import { ModelSelection } from "./modelSelection.ts";
16import type { OrchestrationV2StoredEvent } from "./orchestrationV2.ts";
17import { ProjectScript, StoredProjectIcon } from "./project.ts";
18​
19export const OrchestrationClientOrigin = Schema.Struct({
20 surface: Schema.optional(ClientSurface),
21 appVersion: Schema.optional(TrimmedNonEmptyString),
22});
23export type OrchestrationClientOrigin = typeof OrchestrationClientOrigin.Type;
24​
25export const ApplicationEventMetadata = Schema.Struct({
26 deferredTurn: Schema.optional(Schema.Boolean),
27 providerTurnId: Schema.optional(TrimmedNonEmptyString),
28 providerItemId: Schema.optional(ProviderItemId),
29 adapterKey: Schema.optional(TrimmedNonEmptyString),
30 requestId: Schema.optional(ApprovalRequestId),
31 ingestedAt: Schema.optional(IsoDateTime),
32 origin: Schema.optional(OrchestrationClientOrigin),
33});
34export type ApplicationEventMetadata = typeof ApplicationEventMetadata.Type;
35​
36export const ApplicationProjectCreatedPayload = Schema.Struct({
37 projectId: ProjectId,
38 title: TrimmedNonEmptyString,
39 workspaceRoot: TrimmedNonEmptyString,
40 repositoryIdentity: Schema.optional(Schema.NullOr(RepositoryIdentity)),
41 defaultModelSelection: Schema.NullOr(ModelSelection),
42 defaultThreadEnvMode: Schema.optional(Schema.NullOr(ThreadEnvMode)),
43 faviconPath: Schema.optional(Schema.NullOr(TrimmedNonEmptyString)),
44 projectIcon: Schema.optional(Schema.NullOr(StoredProjectIcon)),
45 scripts: Schema.Array(ProjectScript),
46 createdAt: IsoDateTime,
47 updatedAt: IsoDateTime,
48});
49export type ApplicationProjectCreatedPayload = typeof ApplicationProjectCreatedPayload.Type;
50​
51export const ApplicationProjectMetaUpdatedPayload = Schema.Struct({
52 projectId: ProjectId,
53 title: Schema.optional(TrimmedNonEmptyString),
54 workspaceRoot: Schema.optional(TrimmedNonEmptyString),
55 repositoryIdentity: Schema.optional(Schema.NullOr(RepositoryIdentity)),
56 defaultModelSelection: Schema.optional(Schema.NullOr(ModelSelection)),
57 // Absent = leave unchanged; null = clear the override.
58 defaultThreadEnvMode: Schema.optional(Schema.NullOr(ThreadEnvMode)),
59 autoPull: Schema.optional(Schema.Boolean),
60 faviconPath: Schema.optional(Schema.NullOr(TrimmedNonEmptyString)),
61 projectIcon: Schema.optional(Schema.NullOr(StoredProjectIcon)),
62 scripts: Schema.optional(Schema.Array(ProjectScript)),
63 pinnedAt: Schema.optional(Schema.NullOr(IsoDateTime)),
64 archivedAt: Schema.optional(Schema.NullOr(IsoDateTime)),
65 updatedAt: IsoDateTime,
66});
67export type ApplicationProjectMetaUpdatedPayload = typeof ApplicationProjectMetaUpdatedPayload.Type;
68​
69export const ApplicationProjectDeletedPayload = Schema.Struct({
70 projectId: ProjectId,
71 deletedAt: IsoDateTime,
72});
73export type ApplicationProjectDeletedPayload = typeof ApplicationProjectDeletedPayload.Type;
74​
75const ApplicationProjectEventBaseFields = {
76 sequence: NonNegativeInt,
77 eventId: EventId,
78 aggregateKind: Schema.Literal("project"),
79 aggregateId: ProjectId,
80 occurredAt: IsoDateTime,
81 commandId: Schema.NullOr(CommandId),
82 causationEventId: Schema.NullOr(EventId),
83 correlationId: Schema.NullOr(CommandId),
84 metadata: ApplicationEventMetadata,
85} as const;
86​
87export const ApplicationProjectCreatedEvent = Schema.Struct({
88 ...ApplicationProjectEventBaseFields,
89 type: Schema.Literal("project.created"),
90 payload: ApplicationProjectCreatedPayload,
91});
92export type ApplicationProjectCreatedEvent = typeof ApplicationProjectCreatedEvent.Type;
93​
94export const ApplicationProjectMetaUpdatedEvent = Schema.Struct({
95 ...ApplicationProjectEventBaseFields,
96 type: Schema.Literal("project.meta-updated"),
97 payload: ApplicationProjectMetaUpdatedPayload,
98});
99export type ApplicationProjectMetaUpdatedEvent = typeof ApplicationProjectMetaUpdatedEvent.Type;
100​
101export const ApplicationProjectDeletedEvent = Schema.Struct({
102 ...ApplicationProjectEventBaseFields,
103 type: Schema.Literal("project.deleted"),
104 payload: ApplicationProjectDeletedPayload,
105});
106export type ApplicationProjectDeletedEvent = typeof ApplicationProjectDeletedEvent.Type;
107​
108export const ApplicationProjectEvent = Schema.Union([
109 ApplicationProjectCreatedEvent,
110 ApplicationProjectMetaUpdatedEvent,
111 ApplicationProjectDeletedEvent,
112]);
113export type ApplicationProjectEvent = typeof ApplicationProjectEvent.Type;
114​
115export type ApplicationStoredEvent = ApplicationProjectEvent | OrchestrationV2StoredEvent;