/*
 * Copyright 2026, Jaime Terrats.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { existsSync, watch } from 'node:fs';
import { join } from 'node:path';
import { Hono } from 'hono';
import { streamSSE } from 'hono/streaming';
import { resolveRoleActivation } from '../../services/role-activation.js';
import { readWorkspaceConfig } from '../../services/workspace-config.js';
export function eventsRoute(cwd) {
    const app = new Hono();
    app.get('/', (c) => {
        const stateDir = join(cwd, '.setup-agents', 'state');
        return streamSSE(c, async (stream) => {
            if (!existsSync(stateDir)) {
                await stream.writeSSE({
                    data: JSON.stringify({ type: 'error', message: 'State directory not found' }),
                    event: 'error',
                });
                return;
            }
            const watcher = watch(stateDir, { recursive: false }, (_eventType, filename) => {
                const kind = filename?.replace('.jsonl', '') ?? 'unknown';
                stream
                    .writeSSE({
                    data: JSON.stringify({ kind, timestamp: new Date().toISOString() }),
                    event: 'state-change',
                })
                    .catch(() => {
                    /* stream closed */
                });
                if (kind === 'workflow-runs' || kind === 'tasks') {
                    const config = readWorkspaceConfig(cwd);
                    const state = resolveRoleActivation(cwd, config?.profiles ?? []);
                    stream
                        .writeSSE({
                        data: JSON.stringify(state),
                        event: 'phase-interaction',
                    })
                        .catch(() => {
                        /* stream closed */
                    });
                }
            });
            await stream.writeSSE({ data: JSON.stringify({ connected: true }), event: 'connected' });
            stream.onAbort(() => {
                watcher.close();
            });
            // Keep the stream alive until client disconnects
            await new Promise((resolve) => {
                stream.onAbort(resolve);
            });
        });
    });
    return app;
}
//# sourceMappingURL=events.js.map