@polpo-ai/server 0.2.5 → 0.2.7

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/index.d.ts CHANGED
@@ -21,6 +21,8 @@ export { stateRoutes } from "./routes/state.js";
21
21
  export { healthRoutes } from "./routes/health.js";
22
22
  export { completionRoutes, type CompletionRouteDeps } from "./routes/completions.js";
23
23
  export { agentRoutes } from "./routes/agents.js";
24
+ export { eventRoutes, type EventBridge, type EventClient } from "./routes/events.js";
25
+ export { configRoutes } from "./routes/config.js";
24
26
  export type { TaskRouteDeps, MissionRouteDeps, PlaybookRouteDeps, ApprovalRouteDeps, ChatRouteDeps, VaultRouteDeps, PeerRouteDeps, NotificationRouteDeps, ScheduleRouteDeps, WatcherRouteDeps, StateRouteDeps, ConfigRouteDeps, AuthRouteDeps, FileRouteDeps, SkillRouteDeps, AgentRouteDeps, } from "./deps.js";
25
27
  export { validateParams, instantiatePlaybook } from "./playbook-utils.js";
26
28
  export type { PlaybookParameter, PlaybookDefinition, ValidationResult } from "./playbook-utils.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,aAAa,EACb,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,aAAa,EACb,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -22,6 +22,8 @@ export { stateRoutes } from "./routes/state.js";
22
22
  export { healthRoutes } from "./routes/health.js";
23
23
  export { completionRoutes } from "./routes/completions.js";
24
24
  export { agentRoutes } from "./routes/agents.js";
25
+ export { eventRoutes } from "./routes/events.js";
26
+ export { configRoutes } from "./routes/config.js";
25
27
  // Playbook utilities (pure logic, edge-compatible)
26
28
  export { validateParams, instantiatePlaybook } from "./playbook-utils.js";
27
29
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,kBAAkB;AAClB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAA4B,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAsBjD,mDAAmD;AACnD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,kBAAkB;AAClB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAA4B,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAsC,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAsBlD,mDAAmD;AACnD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { OpenAPIHono } from "@hono/zod-openapi";
2
+ /**
3
+ * Config management routes.
4
+ * Uses ConfigStore via deps for persistence — no direct filesystem access.
5
+ */
6
+ export declare function configRoutes(getDeps: () => {
7
+ getConfig: () => any;
8
+ reloadConfig: () => Promise<boolean>;
9
+ /** Save a modified config. Replaces loadPolpoConfig/savePolpoConfig coupling. */
10
+ saveConfig: (config: any) => Promise<void>;
11
+ getNotificationRouter: () => any;
12
+ }): OpenAPIHono;
13
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/routes/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAoJhE;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM;IAC1C,SAAS,EAAE,MAAM,GAAG,CAAC;IACrB,YAAY,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,iFAAiF;IACjF,UAAU,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,qBAAqB,EAAE,MAAM,GAAG,CAAC;CAClC,GAAG,WAAW,CAmId"}
@@ -0,0 +1,260 @@
1
+ import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
2
+ import { redactPolpoConfig } from "../security.js";
3
+ import { UpdateSettingsSchema, NotificationChannelConfigSchema } from "../schemas.js";
4
+ // ── Route definitions ──────────────────────────────────────────────
5
+ const reloadConfigRoute = createRoute({
6
+ method: "post",
7
+ path: "/reload",
8
+ tags: ["Config"],
9
+ summary: "Reload config",
10
+ responses: {
11
+ 200: {
12
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.object({ message: z.string() }) }) } },
13
+ description: "Configuration reloaded successfully",
14
+ },
15
+ 500: {
16
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string() }) } },
17
+ description: "Failed to reload configuration",
18
+ },
19
+ },
20
+ });
21
+ const getConfigRoute = createRoute({
22
+ method: "get",
23
+ path: "/",
24
+ tags: ["Config"],
25
+ summary: "Get config",
26
+ responses: {
27
+ 200: {
28
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.any() }) } },
29
+ description: "Current configuration",
30
+ },
31
+ 404: {
32
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string() }) } },
33
+ description: "No configuration loaded",
34
+ },
35
+ },
36
+ });
37
+ const updateSettingsRoute = createRoute({
38
+ method: "patch",
39
+ path: "/settings",
40
+ tags: ["Config"],
41
+ summary: "Update orchestrator settings",
42
+ request: {
43
+ body: { content: { "application/json": { schema: UpdateSettingsSchema } } },
44
+ },
45
+ responses: {
46
+ 200: {
47
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.any() }) } },
48
+ description: "Settings updated",
49
+ },
50
+ 404: {
51
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string() }) } },
52
+ description: "No configuration loaded",
53
+ },
54
+ 500: {
55
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string() }) } },
56
+ description: "Failed to update settings",
57
+ },
58
+ },
59
+ });
60
+ const upsertChannelRoute = createRoute({
61
+ method: "put",
62
+ path: "/channels/{name}",
63
+ tags: ["Config"],
64
+ summary: "Create or update a notification channel",
65
+ request: {
66
+ params: z.object({ name: z.string().min(1).regex(/^[a-zA-Z0-9_-]+$/, "Channel name must be alphanumeric with dashes/underscores") }),
67
+ body: { content: { "application/json": { schema: NotificationChannelConfigSchema } } },
68
+ },
69
+ responses: {
70
+ 200: {
71
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.any() }) } },
72
+ description: "Channel saved",
73
+ },
74
+ 404: {
75
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string() }) } },
76
+ description: "No configuration loaded",
77
+ },
78
+ 500: {
79
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string() }) } },
80
+ description: "Failed to save",
81
+ },
82
+ },
83
+ });
84
+ const deleteChannelRoute = createRoute({
85
+ method: "delete",
86
+ path: "/channels/{name}",
87
+ tags: ["Config"],
88
+ summary: "Delete a notification channel",
89
+ request: {
90
+ params: z.object({ name: z.string().min(1) }),
91
+ },
92
+ responses: {
93
+ 200: {
94
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.any() }) } },
95
+ description: "Channel deleted",
96
+ },
97
+ 404: {
98
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string() }) } },
99
+ description: "Channel or config not found",
100
+ },
101
+ 500: {
102
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string() }) } },
103
+ description: "Failed to save",
104
+ },
105
+ },
106
+ });
107
+ const testChannelRoute = createRoute({
108
+ method: "post",
109
+ path: "/channels/{name}/test",
110
+ tags: ["Config"],
111
+ summary: "Test a notification channel",
112
+ request: {
113
+ params: z.object({ name: z.string().min(1) }),
114
+ },
115
+ responses: {
116
+ 200: {
117
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.object({ success: z.boolean() }) }) } },
118
+ description: "Test result",
119
+ },
120
+ 404: {
121
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), error: z.string() }) } },
122
+ description: "Channel not found",
123
+ },
124
+ },
125
+ });
126
+ const listChannelsRoute = createRoute({
127
+ method: "get",
128
+ path: "/channels",
129
+ tags: ["Config"],
130
+ summary: "List notification channels",
131
+ responses: {
132
+ 200: {
133
+ content: { "application/json": { schema: z.object({ ok: z.boolean(), data: z.any() }) } },
134
+ description: "Channel list",
135
+ },
136
+ },
137
+ });
138
+ // ── Route handlers ─────────────────────────────────────────────────
139
+ /**
140
+ * Config management routes.
141
+ * Uses ConfigStore via deps for persistence — no direct filesystem access.
142
+ */
143
+ export function configRoutes(getDeps) {
144
+ const app = new OpenAPIHono();
145
+ /** Read config, apply mutation, save, reload, return updated. */
146
+ async function mutateConfig(deps, mutate) {
147
+ const config = deps.getConfig();
148
+ if (!config)
149
+ return { ok: false, error: "No configuration loaded", status: 404 };
150
+ // Deep clone to avoid mutating the live config before save
151
+ const clone = JSON.parse(JSON.stringify(config));
152
+ mutate(clone);
153
+ try {
154
+ await deps.saveConfig(clone);
155
+ }
156
+ catch (err) {
157
+ const msg = err instanceof Error ? err.message : "Unknown error";
158
+ return { ok: false, error: `Failed to save config: ${msg}`, status: 500 };
159
+ }
160
+ await deps.reloadConfig();
161
+ return { ok: true, config: deps.getConfig() };
162
+ }
163
+ app.openapi(reloadConfigRoute, async (c) => {
164
+ const deps = getDeps();
165
+ const success = await deps.reloadConfig();
166
+ if (success) {
167
+ return c.json({ ok: true, data: { message: "Configuration reloaded successfully" } }, 200);
168
+ }
169
+ return c.json({ ok: false, error: "Failed to reload configuration" }, 500);
170
+ });
171
+ app.openapi(getConfigRoute, (c) => {
172
+ const deps = getDeps();
173
+ const config = deps.getConfig();
174
+ if (!config) {
175
+ return c.json({ ok: false, error: "No configuration loaded" }, 404);
176
+ }
177
+ return c.json({ ok: true, data: redactPolpoConfig(config) }, 200);
178
+ });
179
+ app.openapi(updateSettingsRoute, async (c) => {
180
+ const deps = getDeps();
181
+ const body = c.req.valid("json");
182
+ const result = await mutateConfig(deps, (config) => {
183
+ const settings = config.settings ?? {};
184
+ if (body.orchestratorModel !== undefined)
185
+ settings.orchestratorModel = body.orchestratorModel;
186
+ if (body.imageModel !== undefined)
187
+ settings.imageModel = body.imageModel === null ? undefined : body.imageModel;
188
+ if (body.reasoning !== undefined)
189
+ settings.reasoning = body.reasoning;
190
+ config.settings = settings;
191
+ });
192
+ if (!result.ok)
193
+ return c.json({ ok: false, error: result.error }, result.status);
194
+ return c.json({ ok: true, data: redactPolpoConfig(result.config) }, 200);
195
+ });
196
+ // ── Channel CRUD ──
197
+ app.openapi(listChannelsRoute, (c) => {
198
+ const deps = getDeps();
199
+ const config = deps.getConfig();
200
+ const channels = config?.settings?.notifications?.channels ?? {};
201
+ return c.json({ ok: true, data: channels }, 200);
202
+ });
203
+ app.openapi(upsertChannelRoute, async (c) => {
204
+ const deps = getDeps();
205
+ const { name } = c.req.valid("param");
206
+ const channelConfig = c.req.valid("json");
207
+ const result = await mutateConfig(deps, (config) => {
208
+ const settings = config.settings ?? {};
209
+ if (!settings.notifications)
210
+ settings.notifications = { channels: {}, rules: [] };
211
+ if (!settings.notifications.channels)
212
+ settings.notifications.channels = {};
213
+ settings.notifications.channels[name] = channelConfig;
214
+ config.settings = settings;
215
+ });
216
+ if (!result.ok)
217
+ return c.json({ ok: false, error: result.error }, result.status);
218
+ return c.json({ ok: true, data: redactPolpoConfig(result.config) }, 200);
219
+ });
220
+ app.openapi(deleteChannelRoute, async (c) => {
221
+ const deps = getDeps();
222
+ const { name } = c.req.valid("param");
223
+ const currentConfig = deps.getConfig();
224
+ const channels = currentConfig?.settings?.notifications?.channels;
225
+ if (!channels || !(name in channels)) {
226
+ return c.json({ ok: false, error: `Channel "${name}" not found` }, 404);
227
+ }
228
+ const result = await mutateConfig(deps, (config) => {
229
+ const settings = config.settings ?? {};
230
+ if (settings.notifications?.channels) {
231
+ delete settings.notifications.channels[name];
232
+ }
233
+ config.settings = settings;
234
+ });
235
+ if (!result.ok)
236
+ return c.json({ ok: false, error: result.error }, result.status);
237
+ return c.json({ ok: true, data: redactPolpoConfig(result.config) }, 200);
238
+ });
239
+ app.openapi(testChannelRoute, async (c) => {
240
+ const deps = getDeps();
241
+ const { name } = c.req.valid("param");
242
+ const notificationRouter = deps.getNotificationRouter();
243
+ if (!notificationRouter) {
244
+ return c.json({ ok: false, error: "Notification system not initialized" }, 404);
245
+ }
246
+ const channelIds = notificationRouter.getChannelIds();
247
+ if (!channelIds.includes(name)) {
248
+ return c.json({ ok: false, error: `Channel "${name}" not found in runtime. Save and reload first.` }, 404);
249
+ }
250
+ try {
251
+ const results = await notificationRouter.testChannels();
252
+ return c.json({ ok: true, data: { success: results[name] ?? false } }, 200);
253
+ }
254
+ catch {
255
+ return c.json({ ok: true, data: { success: false } }, 200);
256
+ }
257
+ });
258
+ return app;
259
+ }
260
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/routes/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,+BAA+B,EAAE,MAAM,eAAe,CAAC;AAEtF,sEAAsE;AAEtE,MAAM,iBAAiB,GAAG,WAAW,CAAC;IACpC,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,CAAC,QAAQ,CAAC;IAChB,OAAO,EAAE,eAAe;IACxB,SAAS,EAAE;QACT,GAAG,EAAE;YACH,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YACnH,WAAW,EAAE,qCAAqC;SACnD;QACD,GAAG,EAAE;YACH,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;YAC7F,WAAW,EAAE,gCAAgC;SAC9C;KACF;CACF,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,WAAW,CAAC;IACjC,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,CAAC,QAAQ,CAAC;IAChB,OAAO,EAAE,YAAY;IACrB,SAAS,EAAE;QACT,GAAG,EAAE;YACH,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;YACzF,WAAW,EAAE,uBAAuB;SACrC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;YAC7F,WAAW,EAAE,yBAAyB;SACvC;KACF;CACF,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,WAAW,CAAC;IACtC,MAAM,EAAE,OAAO;IACf,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,CAAC,QAAQ,CAAC;IAChB,OAAO,EAAE,8BAA8B;IACvC,OAAO,EAAE;QACP,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,oBAAoB,EAAE,EAAE,EAAE;KAC5E;IACD,SAAS,EAAE;QACT,GAAG,EAAE;YACH,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;YACzF,WAAW,EAAE,kBAAkB;SAChC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;YAC7F,WAAW,EAAE,yBAAyB;SACvC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;YAC7F,WAAW,EAAE,2BAA2B;SACzC;KACF;CACF,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,WAAW,CAAC;IACrC,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,kBAAkB;IACxB,IAAI,EAAE,CAAC,QAAQ,CAAC;IAChB,OAAO,EAAE,yCAAyC;IAClD,OAAO,EAAE;QACP,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,EAAE,2DAA2D,CAAC,EAAE,CAAC;QACpI,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,+BAA+B,EAAE,EAAE,EAAE;KACvF;IACD,SAAS,EAAE;QACT,GAAG,EAAE;YACH,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;YACzF,WAAW,EAAE,eAAe;SAC7B;QACD,GAAG,EAAE;YACH,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;YAC7F,WAAW,EAAE,yBAAyB;SACvC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;YAC7F,WAAW,EAAE,gBAAgB;SAC9B;KACF;CACF,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,WAAW,CAAC;IACrC,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,kBAAkB;IACxB,IAAI,EAAE,CAAC,QAAQ,CAAC;IAChB,OAAO,EAAE,+BAA+B;IACxC,OAAO,EAAE;QACP,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C;IACD,SAAS,EAAE;QACT,GAAG,EAAE;YACH,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;YACzF,WAAW,EAAE,iBAAiB;SAC/B;QACD,GAAG,EAAE;YACH,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;YAC7F,WAAW,EAAE,6BAA6B;SAC3C;QACD,GAAG,EAAE;YACH,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;YAC7F,WAAW,EAAE,gBAAgB;SAC9B;KACF;CACF,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,WAAW,CAAC;IACnC,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,uBAAuB;IAC7B,IAAI,EAAE,CAAC,QAAQ,CAAC;IAChB,OAAO,EAAE,6BAA6B;IACtC,OAAO,EAAE;QACP,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C;IACD,SAAS,EAAE;QACT,GAAG,EAAE;YACH,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YACpH,WAAW,EAAE,aAAa;SAC3B;QACD,GAAG,EAAE;YACH,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;YAC7F,WAAW,EAAE,mBAAmB;SACjC;KACF;CACF,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,WAAW,CAAC;IACpC,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,CAAC,QAAQ,CAAC;IAChB,OAAO,EAAE,4BAA4B;IACrC,SAAS,EAAE;QACT,GAAG,EAAE;YACH,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;YACzF,WAAW,EAAE,cAAc;SAC5B;KACF;CACF,CAAC,CAAC;AAEH,sEAAsE;AAEtE;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAM5B;IACC,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;IAE9B,iEAAiE;IACjE,KAAK,UAAU,YAAY,CACzB,IAAgC,EAChC,MAA6B;QAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAEjF,2DAA2D;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,CAAC;QAEd,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC5E,CAAC;QAED,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAG,EAAE,CAAC;IACjD,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACzC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1C,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,qCAAqC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE;QAChC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,EAAE,GAAG,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,OAAO,CAAC,mBAAmB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEjC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;YACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS;gBAAE,QAAQ,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;YAC9F,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;gBAAE,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;YAChH,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;gBAAE,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YACtE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACjF,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,qBAAqB;IAErB,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,IAAI,EAAE,CAAC;QACjE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;YACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YACvC,IAAI,CAAC,QAAQ,CAAC,aAAa;gBAAE,QAAQ,CAAC,aAAa,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YAClF,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ;gBAAE,QAAQ,CAAC,aAAa,CAAC,QAAQ,GAAG,EAAE,CAAC;YAC3E,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC;YACtD,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACjF,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEtC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,CAAC;QAClE,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,IAAI,aAAa,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;YACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YACvC,IAAI,QAAQ,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC;gBACrC,OAAO,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/C,CAAC;YACD,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACjF,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEtC,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACxD,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qCAAqC,EAAE,EAAE,GAAG,CAAC,CAAC;QAClF,CAAC;QAED,MAAM,UAAU,GAAa,kBAAkB,CAAC,aAAa,EAAE,CAAC;QAChE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,IAAI,gDAAgD,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7G,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,YAAY,EAAE,CAAC;YACxD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QAC9E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { OpenAPIHono } from "@hono/zod-openapi";
2
+ /** SSE client interface — implemented by the consumer's bridge. */
3
+ export interface EventClient {
4
+ id: string;
5
+ send(event: string, data: unknown, eventId: string): void;
6
+ close(): void;
7
+ }
8
+ /** Event bridge interface — the consumer provides the event source. */
9
+ export interface EventBridge {
10
+ addClient(client: EventClient, lastEventId?: string): void;
11
+ removeClient(id: string): void;
12
+ }
13
+ /**
14
+ * SSE streaming event routes.
15
+ * Accepts any EventBridge implementation (self-hosted SSEBridge, cloud EventEmitter adapter, etc.)
16
+ */
17
+ export declare function eventRoutes(bridge: EventBridge): OpenAPIHono;
18
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/routes/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAIhE,mEAAmE;AACnE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1D,KAAK,IAAI,IAAI,CAAC;CACf;AAED,uEAAuE;AACvE,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3D,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAwBD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAiD5D"}
@@ -0,0 +1,86 @@
1
+ import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
2
+ import { streamSSE } from "hono/streaming";
3
+ import { nanoid } from "nanoid";
4
+ // ── Route definitions ─────────────────────────────────────────────────
5
+ const _sseEventStreamRoute = createRoute({
6
+ method: "get",
7
+ path: "/",
8
+ tags: ["Events"],
9
+ summary: "SSE event stream",
10
+ description: "Server-Sent Events stream for real-time events. Supports Last-Event-ID header for replay and ?filter= query parameter for event filtering.",
11
+ request: {
12
+ query: z.object({
13
+ filter: z.string().optional(),
14
+ }),
15
+ },
16
+ responses: {
17
+ 200: {
18
+ description: "SSE event stream (text/event-stream)",
19
+ },
20
+ },
21
+ });
22
+ // ── Route handlers ────────────────────────────────────────────────────
23
+ /**
24
+ * SSE streaming event routes.
25
+ * Accepts any EventBridge implementation (self-hosted SSEBridge, cloud EventEmitter adapter, etc.)
26
+ */
27
+ export function eventRoutes(bridge) {
28
+ const app = new OpenAPIHono();
29
+ app.get("/", (c) => {
30
+ const lastEventId = c.req.header("last-event-id");
31
+ const filterParam = c.req.query("filter");
32
+ const filters = filterParam ? filterParam.split(",").map(f => f.trim()) : null;
33
+ return streamSSE(c, async (stream) => {
34
+ const clientId = nanoid();
35
+ const client = {
36
+ id: clientId,
37
+ send(event, data, eventId) {
38
+ if (filters && !matchesFilter(event, filters))
39
+ return;
40
+ stream.writeSSE({
41
+ event,
42
+ data: JSON.stringify(data),
43
+ id: eventId,
44
+ });
45
+ },
46
+ close() {
47
+ stream.close();
48
+ },
49
+ };
50
+ bridge.addClient(client, lastEventId ?? undefined);
51
+ const heartbeat = setInterval(() => {
52
+ try {
53
+ stream.writeSSE({ event: "heartbeat", data: "" });
54
+ }
55
+ catch {
56
+ clearInterval(heartbeat);
57
+ bridge.removeClient(clientId);
58
+ }
59
+ }, 30_000);
60
+ stream.onAbort(() => {
61
+ clearInterval(heartbeat);
62
+ bridge.removeClient(clientId);
63
+ });
64
+ await new Promise((resolve) => {
65
+ stream.onAbort(() => resolve());
66
+ });
67
+ });
68
+ });
69
+ return app;
70
+ }
71
+ /** Check if an event name matches any of the filter patterns. */
72
+ function matchesFilter(event, filters) {
73
+ for (const filter of filters) {
74
+ if (filter === event)
75
+ return true;
76
+ if (filter.endsWith(":*")) {
77
+ const prefix = filter.slice(0, -1);
78
+ if (event.startsWith(prefix))
79
+ return true;
80
+ }
81
+ if (filter === "*")
82
+ return true;
83
+ }
84
+ return false;
85
+ }
86
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/routes/events.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polpo-ai/server",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "description": "Polpo API route factories — edge-compatible Hono routes for tasks, agents, missions, vault, and more",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",