@grackle-ai/plugin-core 0.96.3

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.
Files changed (122) hide show
  1. package/dist/codespace-handlers.d.ts +6 -0
  2. package/dist/codespace-handlers.d.ts.map +1 -0
  3. package/dist/codespace-handlers.js +66 -0
  4. package/dist/codespace-handlers.js.map +1 -0
  5. package/dist/cron-phase.d.ts +46 -0
  6. package/dist/cron-phase.d.ts.map +1 -0
  7. package/dist/cron-phase.js +88 -0
  8. package/dist/cron-phase.js.map +1 -0
  9. package/dist/dispatch-phase.d.ts +46 -0
  10. package/dist/dispatch-phase.d.ts.map +1 -0
  11. package/dist/dispatch-phase.js +99 -0
  12. package/dist/dispatch-phase.js.map +1 -0
  13. package/dist/environment-handlers.d.ts +16 -0
  14. package/dist/environment-handlers.d.ts.map +1 -0
  15. package/dist/environment-handlers.js +255 -0
  16. package/dist/environment-handlers.js.map +1 -0
  17. package/dist/environment-reconciliation.d.ts +35 -0
  18. package/dist/environment-reconciliation.d.ts.map +1 -0
  19. package/dist/environment-reconciliation.js +74 -0
  20. package/dist/environment-reconciliation.js.map +1 -0
  21. package/dist/escalation-handlers.d.ts +8 -0
  22. package/dist/escalation-handlers.d.ts.map +1 -0
  23. package/dist/escalation-handlers.js +60 -0
  24. package/dist/escalation-handlers.js.map +1 -0
  25. package/dist/finding-handlers.d.ts +8 -0
  26. package/dist/finding-handlers.d.ts.map +1 -0
  27. package/dist/finding-handlers.js +38 -0
  28. package/dist/finding-handlers.js.map +1 -0
  29. package/dist/grpc-proto-converters.d.ts +31 -0
  30. package/dist/grpc-proto-converters.d.ts.map +1 -0
  31. package/dist/grpc-proto-converters.js +222 -0
  32. package/dist/grpc-proto-converters.js.map +1 -0
  33. package/dist/grpc-service.d.ts +21 -0
  34. package/dist/grpc-service.d.ts.map +1 -0
  35. package/dist/grpc-service.js +50 -0
  36. package/dist/grpc-service.js.map +1 -0
  37. package/dist/grpc-shared.d.ts +22 -0
  38. package/dist/grpc-shared.d.ts.map +1 -0
  39. package/dist/grpc-shared.js +68 -0
  40. package/dist/grpc-shared.js.map +1 -0
  41. package/dist/index.d.ts +20 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +20 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/knowledge-handlers.d.ts +12 -0
  46. package/dist/knowledge-handlers.d.ts.map +1 -0
  47. package/dist/knowledge-handlers.js +149 -0
  48. package/dist/knowledge-handlers.js.map +1 -0
  49. package/dist/lifecycle-cleanup.d.ts +13 -0
  50. package/dist/lifecycle-cleanup.d.ts.map +1 -0
  51. package/dist/lifecycle-cleanup.js +35 -0
  52. package/dist/lifecycle-cleanup.js.map +1 -0
  53. package/dist/lifecycle.d.ts +28 -0
  54. package/dist/lifecycle.d.ts.map +1 -0
  55. package/dist/lifecycle.js +132 -0
  56. package/dist/lifecycle.js.map +1 -0
  57. package/dist/orphan-phase.d.ts +27 -0
  58. package/dist/orphan-phase.d.ts.map +1 -0
  59. package/dist/orphan-phase.js +69 -0
  60. package/dist/orphan-phase.js.map +1 -0
  61. package/dist/persona-handlers.d.ts +12 -0
  62. package/dist/persona-handlers.d.ts.map +1 -0
  63. package/dist/persona-handlers.js +156 -0
  64. package/dist/persona-handlers.js.map +1 -0
  65. package/dist/root-task-boot.d.ts +67 -0
  66. package/dist/root-task-boot.d.ts.map +1 -0
  67. package/dist/root-task-boot.js +234 -0
  68. package/dist/root-task-boot.js.map +1 -0
  69. package/dist/schedule-expression.d.ts +43 -0
  70. package/dist/schedule-expression.d.ts.map +1 -0
  71. package/dist/schedule-expression.js +105 -0
  72. package/dist/schedule-expression.js.map +1 -0
  73. package/dist/schedule-handlers.d.ts +12 -0
  74. package/dist/schedule-handlers.d.ts.map +1 -0
  75. package/dist/schedule-handlers.js +122 -0
  76. package/dist/schedule-handlers.js.map +1 -0
  77. package/dist/session-handlers.d.ts +40 -0
  78. package/dist/session-handlers.d.ts.map +1 -0
  79. package/dist/session-handlers.js +610 -0
  80. package/dist/session-handlers.js.map +1 -0
  81. package/dist/settings-handlers.d.ts +10 -0
  82. package/dist/settings-handlers.d.ts.map +1 -0
  83. package/dist/settings-handlers.js +80 -0
  84. package/dist/settings-handlers.js.map +1 -0
  85. package/dist/signals/escalation-auto.d.ts +20 -0
  86. package/dist/signals/escalation-auto.d.ts.map +1 -0
  87. package/dist/signals/escalation-auto.js +126 -0
  88. package/dist/signals/escalation-auto.js.map +1 -0
  89. package/dist/signals/orphan-reparent.d.ts +31 -0
  90. package/dist/signals/orphan-reparent.d.ts.map +1 -0
  91. package/dist/signals/orphan-reparent.js +175 -0
  92. package/dist/signals/orphan-reparent.js.map +1 -0
  93. package/dist/signals/sigchld.d.ts +12 -0
  94. package/dist/signals/sigchld.d.ts.map +1 -0
  95. package/dist/signals/sigchld.js +177 -0
  96. package/dist/signals/sigchld.js.map +1 -0
  97. package/dist/task-handlers.d.ts +22 -0
  98. package/dist/task-handlers.d.ts.map +1 -0
  99. package/dist/task-handlers.js +517 -0
  100. package/dist/task-handlers.js.map +1 -0
  101. package/dist/test-utils/integration-setup.d.ts +11 -0
  102. package/dist/test-utils/integration-setup.d.ts.map +1 -0
  103. package/dist/test-utils/integration-setup.js +26 -0
  104. package/dist/test-utils/integration-setup.js.map +1 -0
  105. package/dist/test-utils/mock-database.d.ts +152 -0
  106. package/dist/test-utils/mock-database.d.ts.map +1 -0
  107. package/dist/test-utils/mock-database.js +169 -0
  108. package/dist/test-utils/mock-database.js.map +1 -0
  109. package/dist/token-handlers.d.ts +12 -0
  110. package/dist/token-handlers.d.ts.map +1 -0
  111. package/dist/token-handlers.js +85 -0
  112. package/dist/token-handlers.js.map +1 -0
  113. package/dist/tsdoc-metadata.json +11 -0
  114. package/dist/utils/format-gh-error.d.ts +6 -0
  115. package/dist/utils/format-gh-error.d.ts.map +1 -0
  116. package/dist/utils/format-gh-error.js +30 -0
  117. package/dist/utils/format-gh-error.js.map +1 -0
  118. package/dist/workspace-handlers.d.ts +16 -0
  119. package/dist/workspace-handlers.d.ts.map +1 -0
  120. package/dist/workspace-handlers.js +146 -0
  121. package/dist/workspace-handlers.js.map +1 -0
  122. package/package.json +60 -0
@@ -0,0 +1,255 @@
1
+ import { ConnectError, Code } from "@connectrpc/connect";
2
+ import { create } from "@bufbuild/protobuf";
3
+ import { grackle } from "@grackle-ai/common";
4
+ import { envRegistry, workspaceStore, workspaceEnvironmentLinkStore, sessionStore, sqlite } from "@grackle-ai/database";
5
+ import { reconnectOrProvision } from "@grackle-ai/adapter-sdk";
6
+ import { adapterManager } from "@grackle-ai/core";
7
+ import { tokenPush } from "@grackle-ai/core";
8
+ import { parseAdapterConfig } from "@grackle-ai/core";
9
+ import { emit } from "@grackle-ai/core";
10
+ import { recoverSuspendedSessions } from "@grackle-ai/core";
11
+ import { clearReconnectState } from "@grackle-ai/core";
12
+ import { logger } from "@grackle-ai/core";
13
+ import { envRowToProto } from "./grpc-proto-converters.js";
14
+ import { killSessionAndCleanup } from "./grpc-shared.js";
15
+ import { resolveBootstrapRuntime } from "@grackle-ai/core";
16
+ /** List all registered environments. */
17
+ export async function listEnvironments() {
18
+ const rows = envRegistry.listEnvironments();
19
+ return create(grackle.EnvironmentListSchema, {
20
+ environments: rows.map(envRowToProto),
21
+ });
22
+ }
23
+ /** Register a new environment. */
24
+ export async function addEnvironment(req) {
25
+ if (!req.displayName || !req.adapterType) {
26
+ throw new ConnectError("displayName and adapterType required", Code.InvalidArgument);
27
+ }
28
+ const id = req.displayName.toLowerCase().replace(/[^a-z0-9-]/g, "-");
29
+ envRegistry.addEnvironment(id, req.displayName, req.adapterType, req.adapterConfig);
30
+ emit("environment.changed", {});
31
+ logger.info({ environmentId: id, adapterType: req.adapterType }, "Environment added");
32
+ const row = envRegistry.getEnvironment(id);
33
+ return envRowToProto(row);
34
+ }
35
+ /** Update an existing environment's display name and/or adapter config. */
36
+ export async function updateEnvironment(req) {
37
+ if (!req.id) {
38
+ throw new ConnectError("id is required", Code.InvalidArgument);
39
+ }
40
+ const existing = envRegistry.getEnvironment(req.id);
41
+ if (!existing) {
42
+ throw new ConnectError(`Environment not found: ${req.id}`, Code.NotFound);
43
+ }
44
+ const displayName = req.displayName !== undefined ? req.displayName : undefined;
45
+ if (displayName?.trim() === "") {
46
+ throw new ConnectError("Environment name cannot be empty", Code.InvalidArgument);
47
+ }
48
+ let adapterConfig;
49
+ if (req.adapterConfig !== undefined) {
50
+ const raw = req.adapterConfig.trim() || "{}";
51
+ let parsed;
52
+ try {
53
+ parsed = JSON.parse(raw);
54
+ }
55
+ catch {
56
+ throw new ConnectError("adapterConfig is not valid JSON", Code.InvalidArgument);
57
+ }
58
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
59
+ throw new ConnectError("adapterConfig must be a JSON object", Code.InvalidArgument);
60
+ }
61
+ adapterConfig = raw;
62
+ }
63
+ const trimmedName = displayName !== undefined ? displayName.trim() : undefined;
64
+ if (trimmedName === undefined && adapterConfig === undefined) {
65
+ throw new ConnectError("No updatable fields provided", Code.InvalidArgument);
66
+ }
67
+ envRegistry.updateEnvironment(req.id, {
68
+ displayName: trimmedName,
69
+ adapterConfig,
70
+ });
71
+ logger.info({ environmentId: req.id, displayName: trimmedName }, "Environment updated");
72
+ emit("environment.changed", {});
73
+ const updated = envRegistry.getEnvironment(req.id);
74
+ return envRowToProto(updated);
75
+ }
76
+ /** Remove an environment after disconnecting it and cleaning up references. */
77
+ export async function removeEnvironment(req) {
78
+ // Block deletion if workspaces still reference this environment as primary
79
+ const wsCount = workspaceStore.countWorkspacesByEnvironment(req.id);
80
+ if (wsCount > 0) {
81
+ throw new ConnectError(`Cannot remove environment: ${wsCount} active workspace(s) still reference it. Archive or reparent them first.`, Code.FailedPrecondition);
82
+ }
83
+ // Stop auto-reconnect attempts for this environment
84
+ clearReconnectState(req.id);
85
+ // Disconnect the adapter if currently connected
86
+ const env = envRegistry.getEnvironment(req.id);
87
+ if (env) {
88
+ const adapter = adapterManager.getAdapter(env.adapterType);
89
+ if (adapter) {
90
+ try {
91
+ await adapter.disconnect(req.id);
92
+ }
93
+ catch {
94
+ /* best-effort */
95
+ }
96
+ }
97
+ }
98
+ adapterManager.removeConnection(req.id);
99
+ // Delete links, sessions, and environment atomically to prevent partial cleanup
100
+ // if a concurrent LinkEnvironment RPC races between steps.
101
+ const conn = sqlite;
102
+ if (conn) {
103
+ conn.transaction(() => {
104
+ workspaceEnvironmentLinkStore.deleteLinksForEnvironment(req.id);
105
+ sessionStore.deleteByEnvironment(req.id);
106
+ envRegistry.removeEnvironment(req.id);
107
+ })();
108
+ }
109
+ else {
110
+ workspaceEnvironmentLinkStore.deleteLinksForEnvironment(req.id);
111
+ sessionStore.deleteByEnvironment(req.id);
112
+ envRegistry.removeEnvironment(req.id);
113
+ }
114
+ emit("environment.changed", {});
115
+ emit("environment.removed", { environmentId: req.id });
116
+ logger.info({ environmentId: req.id }, "Environment removed");
117
+ return create(grackle.EmptySchema, {});
118
+ }
119
+ /** Provision (bootstrap + connect) an environment, streaming progress events. */
120
+ export async function* provisionEnvironment(req) {
121
+ // Manual provision overrides auto-reconnect
122
+ clearReconnectState(req.id);
123
+ const env = envRegistry.getEnvironment(req.id);
124
+ if (!env) {
125
+ yield create(grackle.ProvisionEventSchema, {
126
+ stage: "error",
127
+ message: `Environment not found: ${req.id}`,
128
+ progress: 0,
129
+ });
130
+ return;
131
+ }
132
+ const adapter = adapterManager.getAdapter(env.adapterType);
133
+ if (!adapter) {
134
+ yield create(grackle.ProvisionEventSchema, {
135
+ stage: "error",
136
+ message: `No adapter for type: ${env.adapterType}`,
137
+ progress: 0,
138
+ });
139
+ return;
140
+ }
141
+ // Force teardown: kill active session, disconnect adapter, clear connection
142
+ if (req.force) {
143
+ const activeSession = sessionStore.getActiveForEnv(req.id);
144
+ if (activeSession) {
145
+ killSessionAndCleanup(activeSession);
146
+ }
147
+ try {
148
+ await adapter.disconnect(req.id);
149
+ }
150
+ catch {
151
+ // best-effort teardown
152
+ }
153
+ adapterManager.removeConnection(req.id);
154
+ }
155
+ envRegistry.updateEnvironmentStatus(req.id, "connecting");
156
+ emit("environment.changed", {});
157
+ const config = parseAdapterConfig(env.adapterConfig);
158
+ config.defaultRuntime = resolveBootstrapRuntime(env);
159
+ const powerlineToken = env.powerlineToken;
160
+ try {
161
+ for await (const event of reconnectOrProvision(req.id, adapter, config, powerlineToken, !!env.bootstrapped, req.force)) {
162
+ yield create(grackle.ProvisionEventSchema, {
163
+ stage: event.stage,
164
+ message: event.message,
165
+ progress: event.progress,
166
+ });
167
+ }
168
+ }
169
+ catch (err) {
170
+ logger.error({ environmentId: req.id, err }, "Provision/bootstrap failed");
171
+ const currentEnv = envRegistry.getEnvironment(req.id);
172
+ if (currentEnv?.status !== "connected") {
173
+ envRegistry.updateEnvironmentStatus(req.id, "error");
174
+ emit("environment.changed", {});
175
+ }
176
+ yield create(grackle.ProvisionEventSchema, {
177
+ stage: "error",
178
+ message: `Provision failed: ${err instanceof Error ? err.message : String(err)}`,
179
+ progress: 0,
180
+ });
181
+ return;
182
+ }
183
+ try {
184
+ const conn = await adapter.connect(req.id, config, powerlineToken);
185
+ adapterManager.setConnection(req.id, conn);
186
+ // Push stored tokens to newly connected environment
187
+ await tokenPush.pushToEnv(req.id);
188
+ envRegistry.updateEnvironmentStatus(req.id, "connected");
189
+ envRegistry.markBootstrapped(req.id);
190
+ emit("environment.changed", {});
191
+ // Auto-recover suspended sessions (fire-and-forget)
192
+ recoverSuspendedSessions(req.id, conn).catch((err) => {
193
+ logger.error({ environmentId: req.id, err }, "Session recovery failed");
194
+ });
195
+ }
196
+ catch (err) {
197
+ // adapter.connect() actually failed
198
+ envRegistry.updateEnvironmentStatus(req.id, "error");
199
+ emit("environment.changed", {});
200
+ yield create(grackle.ProvisionEventSchema, {
201
+ stage: "error",
202
+ message: `Connection failed: ${err instanceof Error ? err.message : String(err)}`,
203
+ progress: 0,
204
+ });
205
+ return;
206
+ }
207
+ logger.info({ environmentId: req.id }, "Environment provisioned");
208
+ // Best-effort: notify client that provision completed.
209
+ // If the client already disconnected (e.g. fire-and-forget fetch in
210
+ // test helpers), the yield throws — but the environment IS connected,
211
+ // so we must NOT revert the status to "error".
212
+ try {
213
+ yield create(grackle.ProvisionEventSchema, {
214
+ stage: "ready",
215
+ message: "Environment connected",
216
+ progress: 1,
217
+ });
218
+ }
219
+ catch {
220
+ // Client disconnected after successful provision — ignore
221
+ }
222
+ }
223
+ /** Stop (disconnect) an environment. */
224
+ export async function stopEnvironment(req) {
225
+ const env = envRegistry.getEnvironment(req.id);
226
+ if (!env) {
227
+ throw new ConnectError(`Environment not found: ${req.id}`, Code.NotFound);
228
+ }
229
+ const adapter = adapterManager.getAdapter(env.adapterType);
230
+ if (adapter) {
231
+ await adapter.stop(req.id, parseAdapterConfig(env.adapterConfig));
232
+ }
233
+ adapterManager.removeConnection(req.id);
234
+ envRegistry.updateEnvironmentStatus(req.id, "disconnected");
235
+ emit("environment.changed", {});
236
+ logger.info({ environmentId: req.id }, "Environment stopped");
237
+ return create(grackle.EmptySchema, {});
238
+ }
239
+ /** Destroy an environment and its underlying resources. */
240
+ export async function destroyEnvironment(req) {
241
+ const env = envRegistry.getEnvironment(req.id);
242
+ if (!env) {
243
+ throw new ConnectError(`Environment not found: ${req.id}`, Code.NotFound);
244
+ }
245
+ const adapter = adapterManager.getAdapter(env.adapterType);
246
+ if (adapter) {
247
+ await adapter.destroy(req.id, parseAdapterConfig(env.adapterConfig));
248
+ }
249
+ adapterManager.removeConnection(req.id);
250
+ envRegistry.updateEnvironmentStatus(req.id, "disconnected");
251
+ emit("environment.changed", {});
252
+ logger.info({ environmentId: req.id }, "Environment destroyed");
253
+ return create(grackle.EmptySchema, {});
254
+ }
255
+ //# sourceMappingURL=environment-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-handlers.js","sourceRoot":"","sources":["../src/environment-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Environment status reconciliation phase — periodic safety net for
3
+ * in-memory connection state vs database environment status drift.
4
+ *
5
+ * At several call sites, `removeConnection()` succeeds but the subsequent
6
+ * `updateEnvironmentStatus()` can fail (e.g., DB lock). This leaves the
7
+ * database showing "connected" while no in-memory connection exists. The
8
+ * heartbeat only probes entries in the connections Map, so the drift
9
+ * persists indefinitely. This phase detects and fixes such mismatches.
10
+ */
11
+ import type { EnvironmentStatus } from "@grackle-ai/common";
12
+ import type { EnvironmentRow } from "@grackle-ai/database";
13
+ import type { GrackleEventType } from "@grackle-ai/core";
14
+ import type { ReconciliationPhase } from "@grackle-ai/core";
15
+ /** Dependencies injected into the environment reconciliation phase for testability. */
16
+ export interface EnvironmentReconciliationDeps {
17
+ /** List all registered environments from the database. */
18
+ listEnvironments: () => EnvironmentRow[];
19
+ /** Get the set of environment IDs that currently have in-memory connections. */
20
+ listConnectionIds: () => Set<string>;
21
+ /** Update an environment's status in the database. */
22
+ updateEnvironmentStatus: (id: string, status: EnvironmentStatus) => void;
23
+ /** Remove an in-memory connection entry. */
24
+ removeConnection: (environmentId: string) => void;
25
+ /** Emit a domain event. */
26
+ emit: (type: GrackleEventType, payload: Record<string, unknown>) => void;
27
+ }
28
+ /**
29
+ * Create the environment status reconciliation phase.
30
+ *
31
+ * @param deps - Injected dependencies for testability.
32
+ * @returns A ReconciliationPhase that can be registered with the ReconciliationManager.
33
+ */
34
+ export declare function createEnvironmentReconciliationPhase(deps: EnvironmentReconciliationDeps): ReconciliationPhase;
35
+ //# sourceMappingURL=environment-reconciliation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-reconciliation.d.ts","sourceRoot":"","sources":["../src/environment-reconciliation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAoB5D,uFAAuF;AACvF,MAAM,WAAW,6BAA6B;IAC5C,0DAA0D;IAC1D,gBAAgB,EAAE,MAAM,cAAc,EAAE,CAAC;IACzC,gFAAgF;IAChF,iBAAiB,EAAE,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,sDAAsD;IACtD,uBAAuB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACzE,4CAA4C;IAC5C,gBAAgB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,2BAA2B;IAC3B,IAAI,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAC1E;AAED;;;;;GAKG;AACH,wBAAgB,oCAAoC,CAClD,IAAI,EAAE,6BAA6B,GAClC,mBAAmB,CAkDrB"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Environment status reconciliation phase — periodic safety net for
3
+ * in-memory connection state vs database environment status drift.
4
+ *
5
+ * At several call sites, `removeConnection()` succeeds but the subsequent
6
+ * `updateEnvironmentStatus()` can fail (e.g., DB lock). This leaves the
7
+ * database showing "connected" while no in-memory connection exists. The
8
+ * heartbeat only probes entries in the connections Map, so the drift
9
+ * persists indefinitely. This phase detects and fixes such mismatches.
10
+ */
11
+ import { logger } from "@grackle-ai/core";
12
+ /**
13
+ * Statuses that indicate the environment should have an active connection.
14
+ *
15
+ * "connecting" is intentionally excluded — it represents an in-progress
16
+ * provision/connect where no in-memory connection exists yet. Reconciling
17
+ * it would incorrectly flip environments back to "disconnected" during
18
+ * normal provisioning flows.
19
+ */
20
+ const ACTIVE_STATUSES = new Set([
21
+ "connected",
22
+ ]);
23
+ /** Statuses that indicate the environment should NOT have an in-memory connection. */
24
+ const INACTIVE_STATUSES = new Set([
25
+ "disconnected",
26
+ "sleeping",
27
+ ]);
28
+ /**
29
+ * Create the environment status reconciliation phase.
30
+ *
31
+ * @param deps - Injected dependencies for testability.
32
+ * @returns A ReconciliationPhase that can be registered with the ReconciliationManager.
33
+ */
34
+ export function createEnvironmentReconciliationPhase(deps) {
35
+ return {
36
+ name: "environment-status",
37
+ execute: async () => {
38
+ const environments = deps.listEnvironments();
39
+ const connectionIds = deps.listConnectionIds();
40
+ let fixedCount = 0;
41
+ // ── Forward drift: DB says active, but no in-memory connection ──
42
+ for (const env of environments) {
43
+ if (ACTIVE_STATUSES.has(env.status) && !connectionIds.has(env.id)) {
44
+ try {
45
+ deps.updateEnvironmentStatus(env.id, "disconnected");
46
+ deps.emit("environment.changed", {});
47
+ fixedCount++;
48
+ }
49
+ catch (err) {
50
+ logger.error({ err, environmentId: env.id }, "Environment reconciliation: failed to fix forward drift");
51
+ }
52
+ }
53
+ }
54
+ // ── Reverse drift: in-memory connection exists, but DB says inactive ──
55
+ const envById = new Map(environments.map((e) => [e.id, e]));
56
+ for (const connectionId of connectionIds) {
57
+ const env = envById.get(connectionId);
58
+ if (env && INACTIVE_STATUSES.has(env.status)) {
59
+ try {
60
+ deps.removeConnection(connectionId);
61
+ fixedCount++;
62
+ }
63
+ catch (err) {
64
+ logger.error({ err, environmentId: connectionId }, "Environment reconciliation: failed to fix reverse drift");
65
+ }
66
+ }
67
+ }
68
+ if (fixedCount > 0) {
69
+ logger.warn({ fixedCount }, "Environment reconciliation: fixed %d drift(s) — these should have been caught by the primary disconnect flow", fixedCount);
70
+ }
71
+ },
72
+ };
73
+ }
74
+ //# sourceMappingURL=environment-reconciliation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-reconciliation.js","sourceRoot":"","sources":["../src/environment-reconciliation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI1C;;;;;;;GAOG;AACH,MAAM,eAAe,GAAmC,IAAI,GAAG,CAAC;IAC9D,WAAW;CACZ,CAAC,CAAC;AAEH,sFAAsF;AACtF,MAAM,iBAAiB,GAAmC,IAAI,GAAG,CAAC;IAChE,cAAc;IACd,UAAU;CACX,CAAC,CAAC;AAgBH;;;;;GAKG;AACH,MAAM,UAAU,oCAAoC,CAClD,IAAmC;IAEnC,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,KAAK,IAAmB,EAAE;YACjC,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC/C,IAAI,UAAU,GAAG,CAAC,CAAC;YAEnB,mEAAmE;YACnE,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;gBAC/B,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,MAA2B,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBACvF,IAAI,CAAC;wBACH,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;wBACrD,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;wBACrC,UAAU,EAAE,CAAC;oBACf,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,MAAM,CAAC,KAAK,CACV,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,EAAE,EAC9B,yDAAyD,CAC1D,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAED,yEAAyE;YACzE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAyB,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACpF,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;gBACzC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBACtC,IAAI,GAAG,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,MAA2B,CAAC,EAAE,CAAC;oBAClE,IAAI,CAAC;wBACH,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;wBACpC,UAAU,EAAE,CAAC;oBACf,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,MAAM,CAAC,KAAK,CACV,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,EACpC,yDAAyD,CAC1D,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;gBACnB,MAAM,CAAC,IAAI,CACT,EAAE,UAAU,EAAE,EACd,8GAA8G,EAC9G,UAAU,CACX,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { grackle } from "@grackle-ai/common";
2
+ /** Create a new escalation and route it to notification channels. */
3
+ export declare function createEscalation(req: grackle.CreateEscalationRequest): Promise<grackle.Escalation>;
4
+ /** List escalations with optional workspace and status filters. */
5
+ export declare function listEscalations(req: grackle.ListEscalationsRequest): Promise<grackle.EscalationList>;
6
+ /** Acknowledge an escalation (mark as seen by the human). */
7
+ export declare function acknowledgeEscalation(req: grackle.AcknowledgeEscalationRequest): Promise<grackle.Escalation>;
8
+ //# sourceMappingURL=escalation-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escalation-handlers.d.ts","sourceRoot":"","sources":["../src/escalation-handlers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAS7C,qEAAqE;AACrE,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAuCxG;AAED,mEAAmE;AACnE,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAS1G;AAED,6DAA6D;AAC7D,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,4BAA4B,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAWlH"}
@@ -0,0 +1,60 @@
1
+ import { ConnectError, Code } from "@connectrpc/connect";
2
+ import { create } from "@bufbuild/protobuf";
3
+ import { grackle } from "@grackle-ai/common";
4
+ import { escalationStore } from "@grackle-ai/database";
5
+ import { ulid } from "ulid";
6
+ import { routeEscalation } from "@grackle-ai/core";
7
+ import { escalationRowToProto } from "./grpc-proto-converters.js";
8
+ /** Valid urgency values for escalations. */
9
+ const VALID_URGENCY = new Set(["low", "normal", "high"]);
10
+ /** Create a new escalation and route it to notification channels. */
11
+ export async function createEscalation(req) {
12
+ if (!req.message) {
13
+ throw new ConnectError("message is required", Code.InvalidArgument);
14
+ }
15
+ const urgency = VALID_URGENCY.has(req.urgency) ? req.urgency : "normal";
16
+ const id = ulid();
17
+ const taskUrl = req.taskId ? `/tasks/${req.taskId}` : "";
18
+ escalationStore.createEscalation(id, req.workspaceId, req.taskId, req.title || "Escalation", req.message, "explicit", urgency, taskUrl);
19
+ const row = escalationStore.getEscalation(id);
20
+ if (row) {
21
+ await routeEscalation(row);
22
+ }
23
+ // Re-read after routing to get updated status
24
+ const updated = escalationStore.getEscalation(id);
25
+ return escalationRowToProto(updated ?? row ?? {
26
+ id,
27
+ workspaceId: req.workspaceId,
28
+ taskId: req.taskId,
29
+ title: req.title || "Escalation",
30
+ message: req.message,
31
+ source: "explicit",
32
+ urgency: req.urgency || "normal",
33
+ status: "pending",
34
+ createdAt: new Date().toISOString(),
35
+ deliveredAt: null,
36
+ acknowledgedAt: null,
37
+ taskUrl,
38
+ });
39
+ }
40
+ /** List escalations with optional workspace and status filters. */
41
+ export async function listEscalations(req) {
42
+ const rows = escalationStore.listEscalations(req.workspaceId || undefined, req.status || undefined, req.limit > 0 ? req.limit : undefined);
43
+ return create(grackle.EscalationListSchema, {
44
+ escalations: rows.map(escalationRowToProto),
45
+ });
46
+ }
47
+ /** Acknowledge an escalation (mark as seen by the human). */
48
+ export async function acknowledgeEscalation(req) {
49
+ if (!req.id) {
50
+ throw new ConnectError("id is required", Code.InvalidArgument);
51
+ }
52
+ const row = escalationStore.getEscalation(req.id);
53
+ if (!row) {
54
+ throw new ConnectError(`escalation not found: ${req.id}`, Code.NotFound);
55
+ }
56
+ escalationStore.updateEscalationStatus(req.id, "acknowledged");
57
+ const updated = escalationStore.getEscalation(req.id);
58
+ return escalationRowToProto(updated ?? row);
59
+ }
60
+ //# sourceMappingURL=escalation-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escalation-handlers.js","sourceRoot":"","sources":["../src/escalation-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { grackle } from "@grackle-ai/common";
2
+ /** Post a new finding. */
3
+ export declare function postFinding(req: grackle.PostFindingRequest): Promise<grackle.Finding>;
4
+ /** Query findings with optional filters. */
5
+ export declare function queryFindings(req: grackle.QueryFindingsRequest): Promise<grackle.FindingList>;
6
+ /** Get a single finding by ID. */
7
+ export declare function getFinding(req: grackle.GetFindingRequest): Promise<grackle.Finding>;
8
+ //# sourceMappingURL=finding-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-handlers.d.ts","sourceRoot":"","sources":["../src/finding-handlers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAM7C,0BAA0B;AAC1B,wBAAsB,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAmB3F;AAED,4CAA4C;AAC5C,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAUnG;AAED,kCAAkC;AAClC,wBAAsB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CASzF"}
@@ -0,0 +1,38 @@
1
+ import { ConnectError, Code } from "@connectrpc/connect";
2
+ import { create } from "@bufbuild/protobuf";
3
+ import { grackle } from "@grackle-ai/common";
4
+ import { findingStore } from "@grackle-ai/database";
5
+ import { v4 as uuid } from "uuid";
6
+ import { emit } from "@grackle-ai/core";
7
+ import { findingRowToProto } from "./grpc-proto-converters.js";
8
+ /** Post a new finding. */
9
+ export async function postFinding(req) {
10
+ if (!req.title) {
11
+ throw new ConnectError("title is required", Code.InvalidArgument);
12
+ }
13
+ const id = uuid().slice(0, 8);
14
+ findingStore.postFinding(id, req.workspaceId, req.taskId, req.sessionId, req.category, req.title, req.content, [...req.tags]);
15
+ emit("finding.posted", { workspaceId: req.workspaceId, findingId: id });
16
+ const rows = findingStore.queryFindings(req.workspaceId);
17
+ const row = rows.find((r) => r.id === id);
18
+ return findingRowToProto(row);
19
+ }
20
+ /** Query findings with optional filters. */
21
+ export async function queryFindings(req) {
22
+ const rows = findingStore.queryFindings(req.workspaceId, req.categories.length > 0 ? [...req.categories] : undefined, req.tags.length > 0 ? [...req.tags] : undefined, req.limit || undefined);
23
+ return create(grackle.FindingListSchema, {
24
+ findings: rows.map(findingRowToProto),
25
+ });
26
+ }
27
+ /** Get a single finding by ID. */
28
+ export async function getFinding(req) {
29
+ if (!req.id) {
30
+ throw new ConnectError("id is required", Code.InvalidArgument);
31
+ }
32
+ const row = findingStore.getFinding(req.id);
33
+ if (!row) {
34
+ throw new ConnectError(`finding not found: ${req.id}`, Code.NotFound);
35
+ }
36
+ return findingRowToProto(row);
37
+ }
38
+ //# sourceMappingURL=finding-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-handlers.js","sourceRoot":"","sources":["../src/finding-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE/D,0BAA0B;AAC1B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAA+B;IAC/D,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,YAAY,CAAC,mBAAmB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,YAAY,CAAC,WAAW,CACtB,EAAE,EACF,GAAG,CAAC,WAAW,EACf,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,SAAS,EACb,GAAG,CAAC,QAAQ,EACZ,GAAG,CAAC,KAAK,EACT,GAAG,CAAC,OAAO,EACX,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CACd,CAAC;IACF,IAAI,CAAC,gBAAgB,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1C,OAAO,iBAAiB,CAAC,GAAI,CAAC,CAAC;AACjC,CAAC;AAED,4CAA4C;AAC5C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAiC;IACnE,MAAM,IAAI,GAAG,YAAY,CAAC,aAAa,CACrC,GAAG,CAAC,WAAW,EACf,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,EAC3D,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAC/C,GAAG,CAAC,KAAK,IAAI,SAAS,CACvB,CAAC;IACF,OAAO,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE;QACvC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC;KACtC,CAAC,CAAC;AACL,CAAC;AAED,kCAAkC;AAClC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAA8B;IAC7D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,YAAY,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,YAAY,CAAC,sBAAsB,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { grackle } from "@grackle-ai/common";
2
+ import type { EnvironmentRow, SessionRow } from "@grackle-ai/database";
3
+ import { workspaceStore, taskStore, personaStore, findingStore, escalationStore, scheduleStore } from "@grackle-ai/database";
4
+ import type { KnowledgeNode, KnowledgeEdge } from "@grackle-ai/knowledge";
5
+ /** Convert an environment database row to its proto representation. */
6
+ export declare function envRowToProto(row: EnvironmentRow): grackle.Environment;
7
+ /** Convert a session database row to its proto representation. */
8
+ export declare function sessionRowToProto(row: SessionRow): grackle.Session;
9
+ /**
10
+ * Convert a workspace database row to its proto representation.
11
+ * When converting many workspaces (e.g. listWorkspaces), pass a pre-fetched
12
+ * linkedEnvMap to avoid N+1 queries. When omitted, falls back to a per-row query.
13
+ */
14
+ export declare function workspaceRowToProto(row: workspaceStore.WorkspaceRow, linkedEnvMap?: Map<string, string[]>): grackle.Workspace;
15
+ /** Convert a task database row to its proto representation. */
16
+ export declare function taskRowToProto(row: taskStore.TaskRow, childIds?: string[], computedStatus?: string, latestSessionId?: string): grackle.Task;
17
+ /** Convert a schedule database row to its proto representation. */
18
+ export declare function scheduleRowToProto(row: scheduleStore.ScheduleRow): grackle.Schedule;
19
+ /** Convert a finding database row to its proto representation. */
20
+ export declare function findingRowToProto(row: findingStore.FindingRow): grackle.Finding;
21
+ /** Convert an escalation database row to its proto representation. */
22
+ export declare function escalationRowToProto(row: escalationStore.EscalationRow): grackle.Escalation;
23
+ /** Safely parse a JSON string, returning the fallback value on failure. */
24
+ export declare function safeParseJson<T>(value: string | undefined, fallback: T): T;
25
+ /** Convert a persona database row to a Persona proto message. */
26
+ export declare function personaRowToProto(row: personaStore.PersonaRow): grackle.Persona;
27
+ /** Convert a KnowledgeNode to its proto representation. */
28
+ export declare function knowledgeNodeToProto(node: KnowledgeNode): grackle.KnowledgeNodeProto;
29
+ /** Convert a KnowledgeEdge to its proto representation. */
30
+ export declare function knowledgeEdgeToProto(edge: KnowledgeEdge): grackle.KnowledgeEdgeProto;
31
+ //# sourceMappingURL=grpc-proto-converters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grpc-proto-converters.d.ts","sourceRoot":"","sources":["../src/grpc-proto-converters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAK7C,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAqD,MAAM,sBAAsB,CAAC;AAChL,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE1E,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAYtE;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAsBlE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,cAAc,CAAC,YAAY,EAChC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACnC,OAAO,CAAC,SAAS,CAoBnB;AAED,+DAA+D;AAC/D,wBAAgB,cAAc,CAC5B,GAAG,EAAE,SAAS,CAAC,OAAO,EACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,EACnB,cAAc,CAAC,EAAE,MAAM,EACvB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAyBd;AAED,mEAAmE;AACnE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa,CAAC,WAAW,GAAG,OAAO,CAAC,QAAQ,CAiBnF;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,CAAC,UAAU,GAAG,OAAO,CAAC,OAAO,CAK/E;AAED,sEAAsE;AACtE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,CAAC,aAAa,GAAG,OAAO,CAAC,UAAU,CAe3F;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAS1E;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,CAAC,UAAU,GAAG,OAAO,CAAC,OAAO,CAgE/E;AAED,2DAA2D;AAC3D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,CAepF;AAED,2DAA2D;AAC3D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,CAQpF"}