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
19/**
20 * Which client dispatched the command that produced this event (#7774).
21 * Stamped by the orchestration engine on client-dispatched commands; absent on
22 * provider/server-originated events and on commands from clients too old to
23 * report it.
24 */
25export const OrchestrationClientOrigin = Schema.Struct({
26 surface: Schema.optional(ClientSurface),
27 appVersion: Schema.optional(TrimmedNonEmptyString),
28});
29export type OrchestrationClientOrigin = typeof OrchestrationClientOrigin.Type;
30
31/** Metadata retained by the shared application event source. */
32export const ApplicationEventMetadata = Schema.Struct({
33 deferredTurn: Schema.optional(Schema.Boolean),
34 providerTurnId: Schema.optional(TrimmedNonEmptyString),
35 providerItemId: Schema.optional(ProviderItemId),
36 adapterKey: Schema.optional(TrimmedNonEmptyString),
37 requestId: Schema.optional(ApprovalRequestId),
38 ingestedAt: Schema.optional(IsoDateTime),
39 origin: Schema.optional(OrchestrationClientOrigin),
40});
41export type ApplicationEventMetadata = typeof ApplicationEventMetadata.Type;
42
43export const ApplicationProjectCreatedPayload = Schema.Struct({
44 projectId: ProjectId,
45 title: TrimmedNonEmptyString,
46 workspaceRoot: TrimmedNonEmptyString,
47 repositoryIdentity: Schema.optional(Schema.NullOr(RepositoryIdentity)),
48 defaultModelSelection: Schema.NullOr(ModelSelection),
49 // Per-project override for where new threads start; optional so persisted
50 // events from older servers still decode.
51 defaultThreadEnvMode: Schema.optional(Schema.NullOr(ThreadEnvMode)),
52 // Optional so persisted events from older servers still decode.
53 faviconPath: Schema.optional(Schema.NullOr(TrimmedNonEmptyString)),
54 projectIcon: Schema.optional(Schema.NullOr(StoredProjectIcon)),
55 scripts: Schema.Array(ProjectScript),
56 createdAt: IsoDateTime,
57 updatedAt: IsoDateTime,
58});
59export type ApplicationProjectCreatedPayload = typeof ApplicationProjectCreatedPayload.Type;
60
61export const ApplicationProjectMetaUpdatedPayload = Schema.Struct({
62 projectId: ProjectId,
63 title: Schema.optional(TrimmedNonEmptyString),
64 workspaceRoot: Schema.optional(TrimmedNonEmptyString),
65 repositoryIdentity: Schema.optional(Schema.NullOr(RepositoryIdentity)),
66 defaultModelSelection: Schema.optional(Schema.NullOr(ModelSelection)),
67 // Absent = leave unchanged; null = clear the override.
68 defaultThreadEnvMode: Schema.optional(Schema.NullOr(ThreadEnvMode)),
69 autoPull: Schema.optional(Schema.Boolean),
70 faviconPath: Schema.optional(Schema.NullOr(TrimmedNonEmptyString)),
71 projectIcon: Schema.optional(Schema.NullOr(StoredProjectIcon)),
72 scripts: Schema.optional(Schema.Array(ProjectScript)),
73 updatedAt: IsoDateTime,
74});
75export type ApplicationProjectMetaUpdatedPayload = typeof ApplicationProjectMetaUpdatedPayload.Type;
76
77export const ApplicationProjectDeletedPayload = Schema.Struct({
78 projectId: ProjectId,
79 deletedAt: IsoDateTime,
80});
81export type ApplicationProjectDeletedPayload = typeof ApplicationProjectDeletedPayload.Type;
82
83const ApplicationProjectEventBaseFields = {
84 sequence: NonNegativeInt,
85 eventId: EventId,
86 aggregateKind: Schema.Literal("project"),
87 aggregateId: ProjectId,
88 occurredAt: IsoDateTime,
89 commandId: Schema.NullOr(CommandId),
90 causationEventId: Schema.NullOr(EventId),
91 correlationId: Schema.NullOr(CommandId),
92 metadata: ApplicationEventMetadata,
93} as const;
94
95export const ApplicationProjectCreatedEvent = Schema.Struct({
96 ...ApplicationProjectEventBaseFields,
97 type: Schema.Literal("project.created"),
98 payload: ApplicationProjectCreatedPayload,
99});
100export type ApplicationProjectCreatedEvent = typeof ApplicationProjectCreatedEvent.Type;
101
102export const ApplicationProjectMetaUpdatedEvent = Schema.Struct({
103 ...ApplicationProjectEventBaseFields,
104 type: Schema.Literal("project.meta-updated"),
105 payload: ApplicationProjectMetaUpdatedPayload,
106});
107export type ApplicationProjectMetaUpdatedEvent = typeof ApplicationProjectMetaUpdatedEvent.Type;
108
109export const ApplicationProjectDeletedEvent = Schema.Struct({
110 ...ApplicationProjectEventBaseFields,
111 type: Schema.Literal("project.deleted"),
112 payload: ApplicationProjectDeletedPayload,
113});
114export type ApplicationProjectDeletedEvent = typeof ApplicationProjectDeletedEvent.Type;
115
116export const ApplicationProjectEvent = Schema.Union([
117 ApplicationProjectCreatedEvent,
118 ApplicationProjectMetaUpdatedEvent,
119 ApplicationProjectDeletedEvent,
120]);
121export type ApplicationProjectEvent = typeof ApplicationProjectEvent.Type;
122
123/** Events exposed by the retained application event source. */
124export type ApplicationStoredEvent = ApplicationProjectEvent | OrchestrationV2StoredEvent;