@nex-ai/nex 0.1.21 → 0.1.23
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/README.md +11 -2
- package/dist/agent/adoption.d.ts +23 -0
- package/dist/agent/adoption.js +87 -0
- package/dist/agent/adoption.js.map +1 -0
- package/dist/agent/gossip.d.ts +17 -0
- package/dist/agent/gossip.js +48 -0
- package/dist/agent/gossip.js.map +1 -0
- package/dist/agent/loop.d.ts +59 -0
- package/dist/agent/loop.js +389 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/queues.d.ts +16 -0
- package/dist/agent/queues.js +44 -0
- package/dist/agent/queues.js.map +1 -0
- package/dist/agent/session-store.d.ts +21 -0
- package/dist/agent/session-store.js +96 -0
- package/dist/agent/session-store.js.map +1 -0
- package/dist/agent/templates.d.ts +5 -0
- package/dist/agent/templates.js +48 -0
- package/dist/agent/templates.js.map +1 -0
- package/dist/agent/tools.d.ts +25 -0
- package/dist/agent/tools.js +238 -0
- package/dist/agent/tools.js.map +1 -0
- package/dist/agent/types.d.ts +59 -0
- package/dist/agent/types.js +5 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/calendar/scheduler.d.ts +32 -0
- package/dist/calendar/scheduler.js +178 -0
- package/dist/calendar/scheduler.js.map +1 -0
- package/dist/calendar/store.d.ts +15 -0
- package/dist/calendar/store.js +50 -0
- package/dist/calendar/store.js.map +1 -0
- package/dist/calendar/types.d.ts +17 -0
- package/dist/calendar/types.js +5 -0
- package/dist/calendar/types.js.map +1 -0
- package/dist/chat/channel.d.ts +20 -0
- package/dist/chat/channel.js +84 -0
- package/dist/chat/channel.js.map +1 -0
- package/dist/chat/message-store.d.ts +18 -0
- package/dist/chat/message-store.js +82 -0
- package/dist/chat/message-store.js.map +1 -0
- package/dist/chat/router.d.ts +17 -0
- package/dist/chat/router.js +65 -0
- package/dist/chat/router.js.map +1 -0
- package/dist/chat/suggested-responses.d.ts +6 -0
- package/dist/chat/suggested-responses.js +99 -0
- package/dist/chat/suggested-responses.js.map +1 -0
- package/dist/chat/types.d.ts +28 -0
- package/dist/chat/types.js +5 -0
- package/dist/chat/types.js.map +1 -0
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/dispatch.d.ts +39 -0
- package/dist/commands/dispatch.js +1293 -0
- package/dist/commands/dispatch.js.map +1 -0
- package/dist/commands/init.d.ts +49 -0
- package/dist/commands/init.js +315 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/parse-input.d.ts +5 -0
- package/dist/commands/parse-input.js +37 -0
- package/dist/commands/parse-input.js.map +1 -0
- package/dist/index.d.ts +6 -23
- package/dist/index.js +118 -50
- package/dist/index.js.map +1 -1
- package/dist/lib/client.js +1 -1
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/errors.js +1 -1
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/graph-html.d.ts +1 -0
- package/dist/lib/graph-html.js +16 -3
- package/dist/lib/graph-html.js.map +1 -1
- package/dist/lib/integrations.d.ts +23 -0
- package/dist/lib/integrations.js +25 -0
- package/dist/lib/integrations.js.map +1 -0
- package/dist/lib/nex-mcp-config.d.ts +14 -0
- package/dist/lib/nex-mcp-config.js +26 -0
- package/dist/lib/nex-mcp-config.js.map +1 -0
- package/dist/orchestration/budget.d.ts +32 -0
- package/dist/orchestration/budget.js +72 -0
- package/dist/orchestration/budget.js.map +1 -0
- package/dist/orchestration/executor.d.ts +59 -0
- package/dist/orchestration/executor.js +197 -0
- package/dist/orchestration/executor.js.map +1 -0
- package/dist/orchestration/router.d.ts +30 -0
- package/dist/orchestration/router.js +98 -0
- package/dist/orchestration/router.js.map +1 -0
- package/dist/orchestration/templates.d.ts +11 -0
- package/dist/orchestration/templates.js +99 -0
- package/dist/orchestration/templates.js.map +1 -0
- package/dist/orchestration/types.d.ts +58 -0
- package/dist/orchestration/types.js +7 -0
- package/dist/orchestration/types.js.map +1 -0
- package/dist/plugin/shared.js +1 -1
- package/dist/plugin/shared.js.map +1 -1
- package/dist/tui/agent-colors.d.ts +19 -0
- package/dist/tui/agent-colors.js +34 -0
- package/dist/tui/agent-colors.js.map +1 -0
- package/dist/tui/app.d.ts +14 -0
- package/dist/tui/app.js +267 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/channel-colors.d.ts +16 -0
- package/dist/tui/channel-colors.js +43 -0
- package/dist/tui/channel-colors.js.map +1 -0
- package/dist/tui/components/agent-card.d.ts +11 -0
- package/dist/tui/components/agent-card.js +40 -0
- package/dist/tui/components/agent-card.js.map +1 -0
- package/dist/tui/components/banner.d.ts +44 -0
- package/dist/tui/components/banner.js +130 -0
- package/dist/tui/components/banner.js.map +1 -0
- package/dist/tui/components/channel-colors.d.ts +21 -0
- package/dist/tui/components/channel-colors.js +53 -0
- package/dist/tui/components/channel-colors.js.map +1 -0
- package/dist/tui/components/channel-message.d.ts +53 -0
- package/dist/tui/components/channel-message.js +66 -0
- package/dist/tui/components/channel-message.js.map +1 -0
- package/dist/tui/components/chat-input.d.ts +11 -0
- package/dist/tui/components/chat-input.js +19 -0
- package/dist/tui/components/chat-input.js.map +1 -0
- package/dist/tui/components/data-table.d.ts +11 -0
- package/dist/tui/components/data-table.js +47 -0
- package/dist/tui/components/data-table.js.map +1 -0
- package/dist/tui/components/error-box.d.ts +11 -0
- package/dist/tui/components/error-box.js +59 -0
- package/dist/tui/components/error-box.js.map +1 -0
- package/dist/tui/components/help-screen.d.ts +3 -0
- package/dist/tui/components/help-screen.js +63 -0
- package/dist/tui/components/help-screen.js.map +1 -0
- package/dist/tui/components/index.d.ts +17 -0
- package/dist/tui/components/index.js +10 -0
- package/dist/tui/components/index.js.map +1 -0
- package/dist/tui/components/inline-confirm.d.ts +14 -0
- package/dist/tui/components/inline-confirm.js +13 -0
- package/dist/tui/components/inline-confirm.js.map +1 -0
- package/dist/tui/components/inline-select.d.ts +21 -0
- package/dist/tui/components/inline-select.js +20 -0
- package/dist/tui/components/inline-select.js.map +1 -0
- package/dist/tui/components/markdown.d.ts +6 -0
- package/dist/tui/components/markdown.js +179 -0
- package/dist/tui/components/markdown.js.map +1 -0
- package/dist/tui/components/mention-autocomplete.d.ts +77 -0
- package/dist/tui/components/mention-autocomplete.js +235 -0
- package/dist/tui/components/mention-autocomplete.js.map +1 -0
- package/dist/tui/components/message-list.d.ts +18 -0
- package/dist/tui/components/message-list.js +29 -0
- package/dist/tui/components/message-list.js.map +1 -0
- package/dist/tui/components/picker.d.ts +16 -0
- package/dist/tui/components/picker.js +32 -0
- package/dist/tui/components/picker.js.map +1 -0
- package/dist/tui/components/progress-steps.d.ts +13 -0
- package/dist/tui/components/progress-steps.js +21 -0
- package/dist/tui/components/progress-steps.js.map +1 -0
- package/dist/tui/components/slack/compose.d.ts +27 -0
- package/dist/tui/components/slack/compose.js +123 -0
- package/dist/tui/components/slack/compose.js.map +1 -0
- package/dist/tui/components/slack/layout.d.ts +36 -0
- package/dist/tui/components/slack/layout.js +96 -0
- package/dist/tui/components/slack/layout.js.map +1 -0
- package/dist/tui/components/slack/messages.d.ts +72 -0
- package/dist/tui/components/slack/messages.js +177 -0
- package/dist/tui/components/slack/messages.js.map +1 -0
- package/dist/tui/components/slack/quick-switcher.d.ts +33 -0
- package/dist/tui/components/slack/quick-switcher.js +98 -0
- package/dist/tui/components/slack/quick-switcher.js.map +1 -0
- package/dist/tui/components/slack/sidebar-types.d.ts +65 -0
- package/dist/tui/components/slack/sidebar-types.js +7 -0
- package/dist/tui/components/slack/sidebar-types.js.map +1 -0
- package/dist/tui/components/slack/sidebar.d.ts +46 -0
- package/dist/tui/components/slack/sidebar.js +52 -0
- package/dist/tui/components/slack/sidebar.js.map +1 -0
- package/dist/tui/components/slack/thread-panel.d.ts +45 -0
- package/dist/tui/components/slack/thread-panel.js +47 -0
- package/dist/tui/components/slack/thread-panel.js.map +1 -0
- package/dist/tui/components/slash-autocomplete.d.ts +81 -0
- package/dist/tui/components/slash-autocomplete.js +218 -0
- package/dist/tui/components/slash-autocomplete.js.map +1 -0
- package/dist/tui/components/spinner.d.ts +17 -0
- package/dist/tui/components/spinner.js +30 -0
- package/dist/tui/components/spinner.js.map +1 -0
- package/dist/tui/components/status-bar.d.ts +23 -0
- package/dist/tui/components/status-bar.js +55 -0
- package/dist/tui/components/status-bar.js.map +1 -0
- package/dist/tui/components/success-box.d.ts +7 -0
- package/dist/tui/components/success-box.js +10 -0
- package/dist/tui/components/success-box.js.map +1 -0
- package/dist/tui/components/tool-indicator.d.ts +12 -0
- package/dist/tui/components/tool-indicator.js +18 -0
- package/dist/tui/components/tool-indicator.js.map +1 -0
- package/dist/tui/components/viewport.d.ts +9 -0
- package/dist/tui/components/viewport.js +24 -0
- package/dist/tui/components/viewport.js.map +1 -0
- package/dist/tui/generative/bindings.d.ts +27 -0
- package/dist/tui/generative/bindings.js +152 -0
- package/dist/tui/generative/bindings.js.map +1 -0
- package/dist/tui/generative/registry.d.ts +19 -0
- package/dist/tui/generative/registry.js +31 -0
- package/dist/tui/generative/registry.js.map +1 -0
- package/dist/tui/generative/renderer.d.ts +24 -0
- package/dist/tui/generative/renderer.js +160 -0
- package/dist/tui/generative/renderer.js.map +1 -0
- package/dist/tui/generative/types.d.ts +68 -0
- package/dist/tui/generative/types.js +7 -0
- package/dist/tui/generative/types.js.map +1 -0
- package/dist/tui/hooks/use-cancellable.d.ts +28 -0
- package/dist/tui/hooks/use-cancellable.js +51 -0
- package/dist/tui/hooks/use-cancellable.js.map +1 -0
- package/dist/tui/hooks/use-streaming.d.ts +44 -0
- package/dist/tui/hooks/use-streaming.js +105 -0
- package/dist/tui/hooks/use-streaming.js.map +1 -0
- package/dist/tui/index.d.ts +4 -0
- package/dist/tui/index.js +7 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/keybindings.d.ts +25 -0
- package/dist/tui/keybindings.js +277 -0
- package/dist/tui/keybindings.js.map +1 -0
- package/dist/tui/register-views.d.ts +8 -0
- package/dist/tui/register-views.js +116 -0
- package/dist/tui/register-views.js.map +1 -0
- package/dist/tui/router.d.ts +29 -0
- package/dist/tui/router.js +87 -0
- package/dist/tui/router.js.map +1 -0
- package/dist/tui/services/agent-service.d.ts +58 -0
- package/dist/tui/services/agent-service.js +197 -0
- package/dist/tui/services/agent-service.js.map +1 -0
- package/dist/tui/services/calendar-service.d.ts +31 -0
- package/dist/tui/services/calendar-service.js +133 -0
- package/dist/tui/services/calendar-service.js.map +1 -0
- package/dist/tui/services/chat-service.d.ts +28 -0
- package/dist/tui/services/chat-service.js +91 -0
- package/dist/tui/services/chat-service.js.map +1 -0
- package/dist/tui/services/orchestration-service.d.ts +42 -0
- package/dist/tui/services/orchestration-service.js +153 -0
- package/dist/tui/services/orchestration-service.js.map +1 -0
- package/dist/tui/slash-commands.d.ts +106 -0
- package/dist/tui/slash-commands.js +1421 -0
- package/dist/tui/slash-commands.js.map +1 -0
- package/dist/tui/store.d.ts +96 -0
- package/dist/tui/store.js +120 -0
- package/dist/tui/store.js.map +1 -0
- package/dist/tui/theme.d.ts +40 -0
- package/dist/tui/theme.js +39 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/tui-context.d.ts +22 -0
- package/dist/tui/tui-context.js +17 -0
- package/dist/tui/tui-context.js.map +1 -0
- package/dist/tui/views/agent-list.d.ts +8 -0
- package/dist/tui/views/agent-list.js +11 -0
- package/dist/tui/views/agent-list.js.map +1 -0
- package/dist/tui/views/ask-chat.d.ts +9 -0
- package/dist/tui/views/ask-chat.js +40 -0
- package/dist/tui/views/ask-chat.js.map +1 -0
- package/dist/tui/views/calendar.d.ts +15 -0
- package/dist/tui/views/calendar.js +29 -0
- package/dist/tui/views/calendar.js.map +1 -0
- package/dist/tui/views/chat.d.ts +18 -0
- package/dist/tui/views/chat.js +28 -0
- package/dist/tui/views/chat.js.map +1 -0
- package/dist/tui/views/generative.d.ts +14 -0
- package/dist/tui/views/generative.js +37 -0
- package/dist/tui/views/generative.js.map +1 -0
- package/dist/tui/views/help.d.ts +6 -0
- package/dist/tui/views/help.js +9 -0
- package/dist/tui/views/help.js.map +1 -0
- package/dist/tui/views/home-screen.d.ts +67 -0
- package/dist/tui/views/home-screen.js +192 -0
- package/dist/tui/views/home-screen.js.map +1 -0
- package/dist/tui/views/home.d.ts +33 -0
- package/dist/tui/views/home.js +60 -0
- package/dist/tui/views/home.js.map +1 -0
- package/dist/tui/views/index.d.ts +20 -0
- package/dist/tui/views/index.js +11 -0
- package/dist/tui/views/index.js.map +1 -0
- package/dist/tui/views/insights.d.ts +19 -0
- package/dist/tui/views/insights.js +46 -0
- package/dist/tui/views/insights.js.map +1 -0
- package/dist/tui/views/orchestration.d.ts +18 -0
- package/dist/tui/views/orchestration.js +73 -0
- package/dist/tui/views/orchestration.js.map +1 -0
- package/dist/tui/views/record-detail.d.ts +10 -0
- package/dist/tui/views/record-detail.js +22 -0
- package/dist/tui/views/record-detail.js.map +1 -0
- package/dist/tui/views/record-list.d.ts +15 -0
- package/dist/tui/views/record-list.js +22 -0
- package/dist/tui/views/record-list.js.map +1 -0
- package/dist/tui/views/slack-channel-header.d.ts +15 -0
- package/dist/tui/views/slack-channel-header.js +16 -0
- package/dist/tui/views/slack-channel-header.js.map +1 -0
- package/dist/tui/views/slack-home.d.ts +21 -0
- package/dist/tui/views/slack-home.js +572 -0
- package/dist/tui/views/slack-home.js.map +1 -0
- package/dist/tui/views/task-board.d.ts +21 -0
- package/dist/tui/views/task-board.js +33 -0
- package/dist/tui/views/task-board.js.map +1 -0
- package/dist/tui/views/timeline.d.ts +17 -0
- package/dist/tui/views/timeline.js +24 -0
- package/dist/tui/views/timeline.js.map +1 -0
- package/package.json +8 -3
|
@@ -0,0 +1,572 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* SlackHome — the main Slack-style home view.
|
|
4
|
+
*
|
|
5
|
+
* Connects all Slack components to services:
|
|
6
|
+
* - Sidebar with DMs (agents) and channels from ChatService
|
|
7
|
+
* - Message list with grouping from ChatService
|
|
8
|
+
* - Thread panel for in-thread replies
|
|
9
|
+
* - Quick switcher overlay (Ctrl+K)
|
|
10
|
+
* - Compose area with slash commands and @mentions
|
|
11
|
+
* - Agent routing: DM → steer(), channel → broadcast
|
|
12
|
+
*/
|
|
13
|
+
import { useState, useEffect, useMemo, useCallback } from "react";
|
|
14
|
+
import { useStdout } from "ink";
|
|
15
|
+
import { SlackLayout, computeLayout } from "../components/slack/layout.js";
|
|
16
|
+
import { SlackSidebar } from "../components/slack/sidebar.js";
|
|
17
|
+
import { SlackMessageList } from "../components/slack/messages.js";
|
|
18
|
+
import { ComposeArea } from "../components/slack/compose.js";
|
|
19
|
+
import { ThreadPanel } from "../components/slack/thread-panel.js";
|
|
20
|
+
import { QuickSwitcher } from "../components/slack/quick-switcher.js";
|
|
21
|
+
import { ChannelHeader } from "./slack-channel-header.js";
|
|
22
|
+
import { getChatService } from "../services/chat-service.js";
|
|
23
|
+
import { getAgentService } from "../services/agent-service.js";
|
|
24
|
+
import { parseSlashInput, getSlashCommand, listSlashCommands, getInitState, handleInitInput, getAgentWizardState, handleAgentWizardInput, openAgentsManager, } from "../slash-commands.js";
|
|
25
|
+
import { dispatch } from "../../commands/dispatch.js";
|
|
26
|
+
import { resolveApiKey } from "../../lib/config.js";
|
|
27
|
+
import { InlineSelect } from "../components/inline-select.js";
|
|
28
|
+
import { InlineConfirm } from "../components/inline-confirm.js";
|
|
29
|
+
import { Spinner } from "../components/spinner.js";
|
|
30
|
+
// ── Helpers ───────────────────────────────────────────────────────
|
|
31
|
+
let _msgCounter = 0;
|
|
32
|
+
function msgId() {
|
|
33
|
+
return `msg-${Date.now()}-${++_msgCounter}`;
|
|
34
|
+
}
|
|
35
|
+
function getInitials(name) {
|
|
36
|
+
return name
|
|
37
|
+
.split(/[\s-]+/)
|
|
38
|
+
.slice(0, 2)
|
|
39
|
+
.map((w) => w[0]?.toUpperCase() ?? "")
|
|
40
|
+
.join("");
|
|
41
|
+
}
|
|
42
|
+
export function SlackHome({ push }) {
|
|
43
|
+
const { stdout } = useStdout();
|
|
44
|
+
const cols = stdout?.columns ?? 120;
|
|
45
|
+
const rows = stdout?.rows ?? 40;
|
|
46
|
+
// ── Services ──
|
|
47
|
+
const chatService = getChatService();
|
|
48
|
+
const agentService = getAgentService();
|
|
49
|
+
// ── Revision counters (trigger re-render on service updates) ──
|
|
50
|
+
const [chatRevision, setChatRevision] = useState(0);
|
|
51
|
+
const [agentRevision, setAgentRevision] = useState(0);
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
const unsubChat = chatService.subscribe(() => setChatRevision((r) => r + 1));
|
|
54
|
+
const unsubAgent = agentService.subscribe(() => setAgentRevision((r) => r + 1));
|
|
55
|
+
return () => { unsubChat(); unsubAgent(); };
|
|
56
|
+
}, []);
|
|
57
|
+
// ── Focus state ──
|
|
58
|
+
const [focusSection, setFocusSection] = useState("compose");
|
|
59
|
+
// ── Sidebar state ──
|
|
60
|
+
const [activeChannelId, setActiveChannelId] = useState("");
|
|
61
|
+
const [sidebarCursor, setSidebarCursor] = useState(0);
|
|
62
|
+
const [collapsedSections, setCollapsedSections] = useState([]);
|
|
63
|
+
// ── Thread state ──
|
|
64
|
+
const [threadOpen, setThreadOpen] = useState(false);
|
|
65
|
+
const [threadParentId, setThreadParentId] = useState(null);
|
|
66
|
+
const [threadSourceChannel, setThreadSourceChannel] = useState("");
|
|
67
|
+
// ── Quick switcher ──
|
|
68
|
+
const [quickSwitcherOpen, setQuickSwitcherOpen] = useState(false);
|
|
69
|
+
// ── Loading / inline widgets ──
|
|
70
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
71
|
+
const [loadingHint, setLoadingHint] = useState("");
|
|
72
|
+
const [picker, setPicker] = useState(null);
|
|
73
|
+
const [confirm, setConfirm] = useState(null);
|
|
74
|
+
// ── Local messages (system/slash command output) ──
|
|
75
|
+
const [localMessages, setLocalMessages] = useState([
|
|
76
|
+
{
|
|
77
|
+
id: "welcome",
|
|
78
|
+
role: "system",
|
|
79
|
+
content: "Welcome to Nex. Type a message or use /help for commands.",
|
|
80
|
+
timestamp: Date.now(),
|
|
81
|
+
},
|
|
82
|
+
]);
|
|
83
|
+
// ── Derive channels and DMs from services ──
|
|
84
|
+
void chatRevision;
|
|
85
|
+
void agentRevision;
|
|
86
|
+
const channels = chatService.getChannels();
|
|
87
|
+
const agents = agentService.list();
|
|
88
|
+
// Build sidebar sections: DMs first, then channels
|
|
89
|
+
const sidebarSections = useMemo(() => {
|
|
90
|
+
// DM items: one per agent
|
|
91
|
+
const dmItems = agents.map((managed) => {
|
|
92
|
+
// Find or infer a DM channel for this agent
|
|
93
|
+
const dmChannel = channels.find((ch) => ch.name === managed.config.slug || ch.name === `dm-${managed.config.slug}`);
|
|
94
|
+
const channelId = dmChannel?.id ?? `dm-${managed.config.slug}`;
|
|
95
|
+
const isOnline = managed.state.phase !== "done" && managed.state.phase !== "error";
|
|
96
|
+
return {
|
|
97
|
+
id: channelId,
|
|
98
|
+
name: managed.config.name,
|
|
99
|
+
type: "dm",
|
|
100
|
+
online: isOnline,
|
|
101
|
+
unread: dmChannel ? chatService.getMessages(dmChannel.id, 100)
|
|
102
|
+
.filter((m) => m.senderType === "agent").length > 0 ? 0 : 0 : 0,
|
|
103
|
+
hasMention: false,
|
|
104
|
+
muted: false,
|
|
105
|
+
lastActivity: Date.now(),
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
// Channel items
|
|
109
|
+
const channelItems = channels
|
|
110
|
+
.filter((ch) => !ch.name.startsWith("dm-"))
|
|
111
|
+
.map((ch) => ({
|
|
112
|
+
id: ch.id,
|
|
113
|
+
name: ch.name,
|
|
114
|
+
type: "channel",
|
|
115
|
+
visibility: "public",
|
|
116
|
+
unread: ch.unread,
|
|
117
|
+
hasMention: false,
|
|
118
|
+
muted: false,
|
|
119
|
+
lastActivity: Date.now(),
|
|
120
|
+
}));
|
|
121
|
+
return [
|
|
122
|
+
{ title: "Direct messages", items: dmItems },
|
|
123
|
+
{ title: "Channels", items: channelItems },
|
|
124
|
+
];
|
|
125
|
+
}, [chatRevision, agentRevision]);
|
|
126
|
+
// Set initial active channel: first DM (founding agent) or first channel
|
|
127
|
+
useEffect(() => {
|
|
128
|
+
if (activeChannelId)
|
|
129
|
+
return;
|
|
130
|
+
const firstDm = sidebarSections[0]?.items[0];
|
|
131
|
+
const firstChannel = sidebarSections[1]?.items[0];
|
|
132
|
+
const initial = firstDm ?? firstChannel;
|
|
133
|
+
if (initial) {
|
|
134
|
+
setActiveChannelId(initial.id);
|
|
135
|
+
}
|
|
136
|
+
}, [sidebarSections, activeChannelId]);
|
|
137
|
+
// Auto-detect missing API key
|
|
138
|
+
useEffect(() => {
|
|
139
|
+
const apiKey = resolveApiKey();
|
|
140
|
+
if (!apiKey) {
|
|
141
|
+
setLocalMessages((prev) => [
|
|
142
|
+
...prev,
|
|
143
|
+
{
|
|
144
|
+
id: "no-auth",
|
|
145
|
+
role: "system",
|
|
146
|
+
content: "No API key found. Run /init to set up Nex.",
|
|
147
|
+
timestamp: Date.now(),
|
|
148
|
+
},
|
|
149
|
+
]);
|
|
150
|
+
}
|
|
151
|
+
}, []);
|
|
152
|
+
// ── Derive active channel info ──
|
|
153
|
+
const activeItem = useMemo(() => {
|
|
154
|
+
for (const section of sidebarSections) {
|
|
155
|
+
const found = section.items.find((item) => item.id === activeChannelId);
|
|
156
|
+
if (found)
|
|
157
|
+
return found;
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}, [sidebarSections, activeChannelId]);
|
|
161
|
+
const activeChannelType = activeItem?.type ?? "channel";
|
|
162
|
+
const activeChannelName = activeItem?.name ?? "general";
|
|
163
|
+
// ── Derive messages for active channel ──
|
|
164
|
+
const serviceMessages = useMemo(() => {
|
|
165
|
+
if (!activeChannelId)
|
|
166
|
+
return [];
|
|
167
|
+
return chatService.getMessages(activeChannelId).map((m) => ({
|
|
168
|
+
id: m.id,
|
|
169
|
+
sender: m.sender,
|
|
170
|
+
senderType: m.senderType,
|
|
171
|
+
content: m.content,
|
|
172
|
+
timestamp: m.timestamp,
|
|
173
|
+
}));
|
|
174
|
+
}, [activeChannelId, chatRevision]);
|
|
175
|
+
// Convert local messages to ChatMessageInput format
|
|
176
|
+
const localChatMessages = useMemo(() => {
|
|
177
|
+
return localMessages.map((m) => ({
|
|
178
|
+
id: m.id,
|
|
179
|
+
sender: m.role === "user" ? "you" : m.role === "system" ? "system" : "nex",
|
|
180
|
+
senderType: (m.role === "user" ? "human" : "system"),
|
|
181
|
+
content: m.content,
|
|
182
|
+
timestamp: m.timestamp,
|
|
183
|
+
isError: m.isError,
|
|
184
|
+
}));
|
|
185
|
+
}, [localMessages]);
|
|
186
|
+
// Merge and sort
|
|
187
|
+
const allMessages = useMemo(() => {
|
|
188
|
+
return [...serviceMessages, ...localChatMessages].sort((a, b) => a.timestamp - b.timestamp);
|
|
189
|
+
}, [serviceMessages, localChatMessages]);
|
|
190
|
+
// ── Thread replies ──
|
|
191
|
+
const threadReplies = useMemo(() => {
|
|
192
|
+
if (!threadParentId || !threadSourceChannel)
|
|
193
|
+
return [];
|
|
194
|
+
// Get replies to the parent message from the service
|
|
195
|
+
const msgs = chatService.getMessages(threadSourceChannel);
|
|
196
|
+
return msgs
|
|
197
|
+
.filter((m) => m.replyTo === threadParentId)
|
|
198
|
+
.map((m) => ({
|
|
199
|
+
id: m.id,
|
|
200
|
+
sender: m.sender,
|
|
201
|
+
senderType: m.senderType,
|
|
202
|
+
initials: getInitials(m.sender),
|
|
203
|
+
content: m.content,
|
|
204
|
+
timestamp: m.timestamp,
|
|
205
|
+
isFirstInGroup: true, // simplification for now
|
|
206
|
+
}));
|
|
207
|
+
}, [threadParentId, threadSourceChannel, chatRevision]);
|
|
208
|
+
const threadParentMessage = useMemo(() => {
|
|
209
|
+
if (!threadParentId)
|
|
210
|
+
return null;
|
|
211
|
+
const msg = allMessages.find((m) => m.id === threadParentId);
|
|
212
|
+
if (!msg)
|
|
213
|
+
return null;
|
|
214
|
+
return {
|
|
215
|
+
id: msg.id,
|
|
216
|
+
sender: msg.sender,
|
|
217
|
+
senderType: msg.senderType,
|
|
218
|
+
initials: getInitials(msg.sender),
|
|
219
|
+
content: msg.content,
|
|
220
|
+
timestamp: msg.timestamp,
|
|
221
|
+
isFirstInGroup: true,
|
|
222
|
+
};
|
|
223
|
+
}, [threadParentId, allMessages]);
|
|
224
|
+
// ── Quick switcher items ──
|
|
225
|
+
const switcherItems = useMemo(() => {
|
|
226
|
+
const items = [];
|
|
227
|
+
for (const section of sidebarSections) {
|
|
228
|
+
for (const item of section.items) {
|
|
229
|
+
items.push({
|
|
230
|
+
id: item.id,
|
|
231
|
+
name: item.name,
|
|
232
|
+
type: item.type,
|
|
233
|
+
online: item.online,
|
|
234
|
+
unread: item.unread,
|
|
235
|
+
score: item.id === activeChannelId ? 200 : item.unread > 0 ? 100 : 50,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return items;
|
|
240
|
+
}, [sidebarSections, activeChannelId]);
|
|
241
|
+
// ── Slash command entries for autocomplete ──
|
|
242
|
+
const slashCommandEntries = useMemo(() => listSlashCommands().map((cmd) => ({
|
|
243
|
+
name: cmd.name,
|
|
244
|
+
description: cmd.description,
|
|
245
|
+
usage: cmd.usage,
|
|
246
|
+
})), []);
|
|
247
|
+
// Agent entries for @mention autocomplete
|
|
248
|
+
const agentEntries = useMemo(() => agents.map((a) => ({
|
|
249
|
+
slug: a.config.slug,
|
|
250
|
+
name: a.config.name,
|
|
251
|
+
})), [agentRevision]);
|
|
252
|
+
// ── Slash command context (for init flow and slash commands) ──
|
|
253
|
+
const slashContext = useMemo(() => ({
|
|
254
|
+
push,
|
|
255
|
+
dispatch,
|
|
256
|
+
addMessage: (msg) => setLocalMessages((prev) => [...prev, msg]),
|
|
257
|
+
setLoading: (loading, hint) => {
|
|
258
|
+
setIsLoading(loading);
|
|
259
|
+
setLoadingHint(hint ?? "");
|
|
260
|
+
},
|
|
261
|
+
showPicker: (title, options, onSelect) => {
|
|
262
|
+
setPicker({
|
|
263
|
+
title,
|
|
264
|
+
options,
|
|
265
|
+
onSelect: (value) => {
|
|
266
|
+
setPicker(null);
|
|
267
|
+
onSelect(value);
|
|
268
|
+
},
|
|
269
|
+
});
|
|
270
|
+
},
|
|
271
|
+
clearPicker: () => setPicker(null),
|
|
272
|
+
showConfirm: (question, onConfirm) => {
|
|
273
|
+
setConfirm({
|
|
274
|
+
question,
|
|
275
|
+
onConfirm: (confirmed) => {
|
|
276
|
+
setConfirm(null);
|
|
277
|
+
onConfirm(confirmed);
|
|
278
|
+
},
|
|
279
|
+
});
|
|
280
|
+
},
|
|
281
|
+
clearConfirm: () => setConfirm(null),
|
|
282
|
+
}), [push]);
|
|
283
|
+
// ── Message send handler ──
|
|
284
|
+
const handleSend = useCallback(async (input) => {
|
|
285
|
+
if (!input.trim())
|
|
286
|
+
return;
|
|
287
|
+
const isSlash = input.trimStart().startsWith("/");
|
|
288
|
+
const isInitInput = getInitState().phase !== "idle";
|
|
289
|
+
// Handle init flow
|
|
290
|
+
if (isInitInput) {
|
|
291
|
+
try {
|
|
292
|
+
await handleInitInput(input, slashContext);
|
|
293
|
+
}
|
|
294
|
+
catch (err) {
|
|
295
|
+
setLocalMessages((prev) => [
|
|
296
|
+
...prev,
|
|
297
|
+
{
|
|
298
|
+
id: msgId(),
|
|
299
|
+
role: "assistant",
|
|
300
|
+
content: `Init error: ${err instanceof Error ? err.message : String(err)}`,
|
|
301
|
+
timestamp: Date.now(),
|
|
302
|
+
isError: true,
|
|
303
|
+
},
|
|
304
|
+
]);
|
|
305
|
+
}
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
// Handle agent wizard text input phases
|
|
309
|
+
if (getAgentWizardState().phase !== "idle") {
|
|
310
|
+
try {
|
|
311
|
+
await handleAgentWizardInput(input, slashContext);
|
|
312
|
+
}
|
|
313
|
+
catch (err) {
|
|
314
|
+
setLocalMessages((prev) => [
|
|
315
|
+
...prev,
|
|
316
|
+
{
|
|
317
|
+
id: msgId(),
|
|
318
|
+
role: "assistant",
|
|
319
|
+
content: `Error: ${err instanceof Error ? err.message : String(err)}`,
|
|
320
|
+
timestamp: Date.now(),
|
|
321
|
+
isError: true,
|
|
322
|
+
},
|
|
323
|
+
]);
|
|
324
|
+
}
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
// Handle slash commands
|
|
328
|
+
if (isSlash) {
|
|
329
|
+
const parsed = parseSlashInput(input);
|
|
330
|
+
if (!parsed.command) {
|
|
331
|
+
setLocalMessages((prev) => [
|
|
332
|
+
...prev,
|
|
333
|
+
{
|
|
334
|
+
id: msgId(),
|
|
335
|
+
role: "assistant",
|
|
336
|
+
content: "Type /help to see available commands.",
|
|
337
|
+
timestamp: Date.now(),
|
|
338
|
+
isError: true,
|
|
339
|
+
},
|
|
340
|
+
]);
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
if (parsed.command === "clear") {
|
|
344
|
+
setLocalMessages([
|
|
345
|
+
{ id: msgId(), role: "system", content: "Conversation cleared.", timestamp: Date.now() },
|
|
346
|
+
]);
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
const cmd = getSlashCommand(parsed.command);
|
|
350
|
+
if (cmd) {
|
|
351
|
+
setIsLoading(true);
|
|
352
|
+
setLoadingHint(`Running /${parsed.command}...`);
|
|
353
|
+
try {
|
|
354
|
+
const result = await cmd.execute(parsed.args ?? "", slashContext);
|
|
355
|
+
if (result.output && !result.silent) {
|
|
356
|
+
setLocalMessages((prev) => [
|
|
357
|
+
...prev,
|
|
358
|
+
{ id: msgId(), role: "assistant", content: result.output, timestamp: Date.now() },
|
|
359
|
+
]);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
catch (err) {
|
|
363
|
+
setLocalMessages((prev) => [
|
|
364
|
+
...prev,
|
|
365
|
+
{
|
|
366
|
+
id: msgId(),
|
|
367
|
+
role: "assistant",
|
|
368
|
+
content: `Error: ${err instanceof Error ? err.message : String(err)}`,
|
|
369
|
+
timestamp: Date.now(),
|
|
370
|
+
isError: true,
|
|
371
|
+
},
|
|
372
|
+
]);
|
|
373
|
+
}
|
|
374
|
+
finally {
|
|
375
|
+
setIsLoading(false);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
setLocalMessages((prev) => [
|
|
380
|
+
...prev,
|
|
381
|
+
{
|
|
382
|
+
id: msgId(),
|
|
383
|
+
role: "assistant",
|
|
384
|
+
content: `Unknown command: /${parsed.command}. Type /help for available commands.`,
|
|
385
|
+
timestamp: Date.now(),
|
|
386
|
+
isError: true,
|
|
387
|
+
},
|
|
388
|
+
]);
|
|
389
|
+
}
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
// Natural language message
|
|
393
|
+
if (activeChannelId) {
|
|
394
|
+
chatService.send(activeChannelId, input, "human");
|
|
395
|
+
// Route to agent if this is a DM
|
|
396
|
+
if (activeChannelType === "dm") {
|
|
397
|
+
// Find the agent for this DM
|
|
398
|
+
const agent = agents.find((a) => {
|
|
399
|
+
const dmId = `dm-${a.config.slug}`;
|
|
400
|
+
return activeChannelId === dmId || activeChannelId.includes(a.config.slug);
|
|
401
|
+
});
|
|
402
|
+
if (agent) {
|
|
403
|
+
try {
|
|
404
|
+
agentService.steer(agent.config.slug, input);
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
// Agent may not be started — that's OK
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
// No channel — use ask dispatch as fallback
|
|
414
|
+
setIsLoading(true);
|
|
415
|
+
setLoadingHint("thinking...");
|
|
416
|
+
try {
|
|
417
|
+
const result = await dispatch(`ask ${input}`);
|
|
418
|
+
const isAuthError = result.exitCode === 2 || result.error?.includes("API key");
|
|
419
|
+
setLocalMessages((prev) => [
|
|
420
|
+
...prev,
|
|
421
|
+
{
|
|
422
|
+
id: msgId(),
|
|
423
|
+
role: "assistant",
|
|
424
|
+
content: isAuthError
|
|
425
|
+
? "Your API key is missing or expired.\n\nTo fix:\n 1. Get a key at https://app.nex.ai\n 2. Run: nex config set api_key <key>\n 3. Then try again."
|
|
426
|
+
: result.error
|
|
427
|
+
? `Error: ${result.error}`
|
|
428
|
+
: result.output || "(no response)",
|
|
429
|
+
timestamp: Date.now(),
|
|
430
|
+
isError: !!result.error,
|
|
431
|
+
},
|
|
432
|
+
]);
|
|
433
|
+
}
|
|
434
|
+
finally {
|
|
435
|
+
setIsLoading(false);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}, [activeChannelId, activeChannelType, agents, slashContext]);
|
|
439
|
+
// ── Thread handlers ──
|
|
440
|
+
const handleOpenThread = useCallback((messageId) => {
|
|
441
|
+
setThreadOpen(true);
|
|
442
|
+
setThreadParentId(messageId);
|
|
443
|
+
setThreadSourceChannel(activeChannelId);
|
|
444
|
+
setFocusSection("thread");
|
|
445
|
+
}, [activeChannelId]);
|
|
446
|
+
const handleCloseThread = useCallback(() => {
|
|
447
|
+
setThreadOpen(false);
|
|
448
|
+
setThreadParentId(null);
|
|
449
|
+
setThreadSourceChannel("");
|
|
450
|
+
setFocusSection("compose");
|
|
451
|
+
}, []);
|
|
452
|
+
const handleThreadReply = useCallback((content) => {
|
|
453
|
+
if (!threadParentId || !threadSourceChannel)
|
|
454
|
+
return;
|
|
455
|
+
chatService.send(threadSourceChannel, content, "human");
|
|
456
|
+
}, [threadParentId, threadSourceChannel]);
|
|
457
|
+
// ── Sidebar handlers ──
|
|
458
|
+
const handleSidebarSelect = useCallback((id) => {
|
|
459
|
+
setActiveChannelId(id);
|
|
460
|
+
setFocusSection("compose");
|
|
461
|
+
}, []);
|
|
462
|
+
const handleToggleSection = useCallback((title) => {
|
|
463
|
+
setCollapsedSections((prev) => prev.includes(title)
|
|
464
|
+
? prev.filter((t) => t !== title)
|
|
465
|
+
: [...prev, title]);
|
|
466
|
+
}, []);
|
|
467
|
+
// ── Quick switcher handlers ──
|
|
468
|
+
const handleQuickSwitcherSelect = useCallback((id) => {
|
|
469
|
+
setActiveChannelId(id);
|
|
470
|
+
setQuickSwitcherOpen(false);
|
|
471
|
+
setFocusSection("compose");
|
|
472
|
+
}, []);
|
|
473
|
+
// ── Expose globalThis callbacks for app.tsx key interception ──
|
|
474
|
+
useEffect(() => {
|
|
475
|
+
globalThis.__nexQuickSwitcherOpen = () => {
|
|
476
|
+
setQuickSwitcherOpen(true);
|
|
477
|
+
};
|
|
478
|
+
globalThis.__nexQuickSwitcherClose = () => {
|
|
479
|
+
setQuickSwitcherOpen(false);
|
|
480
|
+
};
|
|
481
|
+
globalThis.__nexSlackFocusCycle = (direction) => {
|
|
482
|
+
setFocusSection((prev) => {
|
|
483
|
+
const sections = threadOpen
|
|
484
|
+
? ["sidebar", "messages", "compose", "thread"]
|
|
485
|
+
: ["sidebar", "messages", "compose"];
|
|
486
|
+
const idx = sections.indexOf(prev);
|
|
487
|
+
const next = (idx + direction + sections.length) % sections.length;
|
|
488
|
+
return sections[next];
|
|
489
|
+
});
|
|
490
|
+
};
|
|
491
|
+
globalThis.__nexSidebarNav = (direction) => {
|
|
492
|
+
// Count total visible items for upper-bound clamping
|
|
493
|
+
let totalItems = 0;
|
|
494
|
+
for (const section of sidebarSections) {
|
|
495
|
+
if (!collapsedSections.includes(section.title)) {
|
|
496
|
+
totalItems += section.items.length;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
setSidebarCursor((prev) => Math.max(0, Math.min(totalItems - 1, prev + direction)));
|
|
500
|
+
};
|
|
501
|
+
globalThis.__nexSidebarSelect = () => {
|
|
502
|
+
// Flatten sidebar to find item at cursor
|
|
503
|
+
let idx = 0;
|
|
504
|
+
for (const section of sidebarSections) {
|
|
505
|
+
if (collapsedSections.includes(section.title))
|
|
506
|
+
continue;
|
|
507
|
+
for (const item of section.items) {
|
|
508
|
+
if (idx === sidebarCursor) {
|
|
509
|
+
handleSidebarSelect(item.id);
|
|
510
|
+
return;
|
|
511
|
+
}
|
|
512
|
+
idx++;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
};
|
|
516
|
+
globalThis.__nexSidebarToggle = () => {
|
|
517
|
+
// Toggle section at cursor position
|
|
518
|
+
let idx = 0;
|
|
519
|
+
for (const section of sidebarSections) {
|
|
520
|
+
if (idx === sidebarCursor) {
|
|
521
|
+
handleToggleSection(section.title);
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
idx++;
|
|
525
|
+
if (!collapsedSections.includes(section.title)) {
|
|
526
|
+
idx += section.items.length;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
};
|
|
530
|
+
globalThis.__nexThreadClose = () => {
|
|
531
|
+
handleCloseThread();
|
|
532
|
+
};
|
|
533
|
+
globalThis.__nexAddChannel = () => {
|
|
534
|
+
// Push to a simple /channel-create prompt view or run /channel slash command
|
|
535
|
+
setLocalMessages((prev) => [...prev, {
|
|
536
|
+
id: msgId(), role: "system",
|
|
537
|
+
content: 'Type `/channel create <name>` to create a channel, or Ctrl+K to search.',
|
|
538
|
+
timestamp: Date.now(),
|
|
539
|
+
}]);
|
|
540
|
+
setFocusSection("compose");
|
|
541
|
+
};
|
|
542
|
+
globalThis.__nexAddAgent = () => {
|
|
543
|
+
void openAgentsManager(slashContext);
|
|
544
|
+
setFocusSection("compose");
|
|
545
|
+
};
|
|
546
|
+
globalThis.__nexFocusSection = focusSection;
|
|
547
|
+
globalThis.__nexQuickSwitcherIsOpen = quickSwitcherOpen;
|
|
548
|
+
return () => {
|
|
549
|
+
delete globalThis.__nexQuickSwitcherOpen;
|
|
550
|
+
delete globalThis.__nexQuickSwitcherClose;
|
|
551
|
+
delete globalThis.__nexSlackFocusCycle;
|
|
552
|
+
delete globalThis.__nexSidebarNav;
|
|
553
|
+
delete globalThis.__nexSidebarSelect;
|
|
554
|
+
delete globalThis.__nexSidebarToggle;
|
|
555
|
+
delete globalThis.__nexThreadClose;
|
|
556
|
+
delete globalThis.__nexAddChannel;
|
|
557
|
+
delete globalThis.__nexAddAgent;
|
|
558
|
+
delete globalThis.__nexFocusSection;
|
|
559
|
+
delete globalThis.__nexQuickSwitcherIsOpen;
|
|
560
|
+
};
|
|
561
|
+
}, [
|
|
562
|
+
focusSection, threadOpen, quickSwitcherOpen, sidebarSections,
|
|
563
|
+
collapsedSections, sidebarCursor, handleSidebarSelect,
|
|
564
|
+
handleToggleSection, handleCloseThread,
|
|
565
|
+
]);
|
|
566
|
+
// ── Layout metrics ──
|
|
567
|
+
const layout = computeLayout(cols, threadOpen);
|
|
568
|
+
// ── Render ──
|
|
569
|
+
return (_jsx(SlackLayout, { cols: cols, rows: rows, threadOpen: threadOpen, focusSection: focusSection, sidebar: _jsx(SlackSidebar, { width: layout.sidebarWidth, focused: focusSection === "sidebar", workspaceName: "Nex Workspace", sections: sidebarSections, collapsedSections: collapsedSections, activeChannelId: activeChannelId, cursor: sidebarCursor, onToggleSection: handleToggleSection, onSelectItem: handleSidebarSelect }), main: _jsxs(_Fragment, { children: [_jsx(ChannelHeader, { name: activeChannelName, type: activeChannelType, online: activeItem?.online, focused: focusSection === "messages" }), _jsx(SlackMessageList, { messages: allMessages, onThreadOpen: handleOpenThread, width: layout.mainWidth }), isLoading && _jsx(Spinner, { label: loadingHint || "thinking..." }), picker != null ? (_jsx(InlineSelect, { title: picker.title, options: picker.options, onSelect: picker.onSelect })) : confirm != null ? (_jsx(InlineConfirm, { question: confirm.question, onConfirm: confirm.onConfirm })) : (_jsx(ComposeArea, { channelName: activeChannelName, channelType: activeChannelType, recipientName: activeChannelType === "dm" ? activeChannelName : undefined, focused: focusSection === "compose", onSubmit: handleSend, slashCommands: slashCommandEntries, agents: agentEntries }))] }), thread: threadOpen && threadParentMessage ? (_jsx(ThreadPanel, { width: layout.threadWidth, focused: focusSection === "thread", parentMessage: threadParentMessage, replies: threadReplies, sourceChannelName: activeChannelName, sourceChannelType: activeChannelType, alsoSendToChannel: false, onSendReply: handleThreadReply, onToggleAlsoSend: () => { }, onClose: handleCloseThread, slashCommands: slashCommandEntries, agents: agentEntries })) : undefined, overlay: quickSwitcherOpen ? (_jsx(QuickSwitcher, { open: quickSwitcherOpen, items: switcherItems, onSelect: handleQuickSwitcherSelect, onClose: () => setQuickSwitcherOpen(false) })) : undefined }));
|
|
570
|
+
}
|
|
571
|
+
export default SlackHome;
|
|
572
|
+
//# sourceMappingURL=slack-home.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-home.js","sourceRoot":"","sources":["../../../src/tui/views/slack-home.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;AAEH,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAEtE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAiBnD,qEAAqE;AAErE,IAAI,WAAW,GAAG,CAAC,CAAC;AACpB,SAAS,KAAK;IACZ,OAAO,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,IAAI;SACR,KAAK,CAAC,QAAQ,CAAC;SACf,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;SACrC,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AASD,MAAM,UAAU,SAAS,CAAC,EAAE,IAAI,EAAkB;IAChD,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,MAAM,EAAE,OAAO,IAAI,GAAG,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;IAEhC,iBAAiB;IACjB,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IAEvC,iEAAiE;IACjE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEtD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChF,OAAO,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,oBAAoB;IACpB,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAe,SAAS,CAAC,CAAC;IAE1E,sBAAsB;IACtB,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IACnE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IAEzE,qBAAqB;IACrB,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC1E,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAE3E,uBAAuB;IACvB,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElE,iCAAiC;IACjC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAqB,IAAI,CAAC,CAAC;IAC/D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAsB,IAAI,CAAC,CAAC;IAElE,qDAAqD;IACrD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAwB;QACxE;YACE,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,2DAA2D;YACpE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB;KACF,CAAC,CAAC;IAEH,8CAA8C;IAC9C,KAAK,YAAY,CAAC;IAClB,KAAK,aAAa,CAAC;IAEnB,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC;IAEnC,mDAAmD;IACnD,MAAM,eAAe,GAAyB,OAAO,CAAC,GAAG,EAAE;QACzD,0BAA0B;QAC1B,MAAM,OAAO,GAAsB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACxD,4CAA4C;YAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAC7B,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,KAAK,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CACnF,CAAC;YACF,MAAM,SAAS,GAAG,SAAS,EAAE,EAAE,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC;YAEnF,OAAO;gBACL,EAAE,EAAE,SAAS;gBACb,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI;gBACzB,IAAI,EAAE,IAAa;gBACnB,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC;qBAC3D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjE,UAAU,EAAE,KAAK;gBACjB,KAAK,EAAE,KAAK;gBACZ,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;aACzB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,gBAAgB;QAChB,MAAM,YAAY,GAAsB,QAAQ;aAC7C,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;aAC1C,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACZ,EAAE,EAAE,EAAE,CAAC,EAAE;YACT,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,IAAI,EAAE,SAAkB;YACxB,UAAU,EAAE,QAAiB;YAC7B,MAAM,EAAE,EAAE,CAAC,MAAM;YACjB,UAAU,EAAE,KAAK;YACjB,KAAK,EAAE,KAAK;YACZ,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;SACzB,CAAC,CAAC,CAAC;QAEN,OAAO;YACL,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE;YAC5C,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE;SAC3C,CAAC;IACJ,CAAC,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;IAElC,yEAAyE;IACzE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,eAAe;YAAE,OAAO;QAC5B,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,OAAO,IAAI,YAAY,CAAC;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,EAAE,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC;IAEvC,8BAA8B;IAC9B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBACzB,GAAG,IAAI;gBACP;oBACE,EAAE,EAAE,SAAS;oBACb,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,4CAA4C;oBACrD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,mCAAmC;IACnC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9B,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,eAAe,CAAC,CAAC;YACxE,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC;IAEvC,MAAM,iBAAiB,GAAG,UAAU,EAAE,IAAI,IAAI,SAAS,CAAC;IACxD,MAAM,iBAAiB,GAAG,UAAU,EAAE,IAAI,IAAI,SAAS,CAAC;IAExD,2CAA2C;IAC3C,MAAM,eAAe,GAAuB,OAAO,CAAC,GAAG,EAAE;QACvD,IAAI,CAAC,eAAe;YAAE,OAAO,EAAE,CAAC;QAChC,OAAO,WAAW,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1D,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,UAAU,EAAE,CAAC,CAAC,UAA+B;YAC7C,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,SAAS,EAAE,CAAC,CAAC,SAAS;SACvB,CAAC,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC,CAAC;IAEpC,oDAAoD;IACpD,MAAM,iBAAiB,GAAuB,OAAO,CAAC,GAAG,EAAE;QACzD,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,MAAM,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK;YAC1E,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAiC;YACpF,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,iBAAiB;IACjB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE;QAC/B,OAAO,CAAC,GAAG,eAAe,EAAE,GAAG,iBAAiB,CAAC,CAAC,IAAI,CACpD,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CACpC,CAAC;IACJ,CAAC,EAAE,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAEzC,uBAAuB;IACvB,MAAM,aAAa,GAAoB,OAAO,CAAC,GAAG,EAAE;QAClD,IAAI,CAAC,cAAc,IAAI,CAAC,mBAAmB;YAAE,OAAO,EAAE,CAAC;QACvD,qDAAqD;QACrD,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;QAC1D,OAAO,IAAI;aACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,cAAc,CAAC;aAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,UAAU,EAAE,CAAC,CAAC,UAA0C;YACxD,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;YAC/B,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,cAAc,EAAE,IAAI,EAAE,yBAAyB;SAChD,CAAC,CAAC,CAAC;IACR,CAAC,EAAE,CAAC,cAAc,EAAE,mBAAmB,EAAE,YAAY,CAAC,CAAC,CAAC;IAExD,MAAM,mBAAmB,GAAyB,OAAO,CAAC,GAAG,EAAE;QAC7D,IAAI,CAAC,cAAc;YAAE,OAAO,IAAI,CAAC;QACjC,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,CAAC;QAC7D,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,UAAU,EAAE,GAAG,CAAC,UAA0C;YAC1D,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;YACjC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,cAAc,EAAE,IAAI;SACrB,CAAC;IACJ,CAAC,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC;IAElC,6BAA6B;IAC7B,MAAM,aAAa,GAAwB,OAAO,CAAC,GAAG,EAAE;QACtD,MAAM,KAAK,GAAwB,EAAE,CAAC;QACtC,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;YACtC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,KAAK,EAAE,IAAI,CAAC,EAAE,KAAK,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;iBACtE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,EAAE,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC;IAEvC,+CAA+C;IAC/C,MAAM,mBAAmB,GAAG,OAAO,CACjC,GAAG,EAAE,CACH,iBAAiB,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAChC,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,KAAK,EAAE,GAAG,CAAC,KAAK;KACjB,CAAC,CAAC,EACL,EAAE,CACH,CAAC;IAEF,0CAA0C;IAC1C,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CACH,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;QACnB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;KACpB,CAAC,CAAC,EACL,CAAC,aAAa,CAAC,CAChB,CAAC;IAEF,iEAAiE;IACjE,MAAM,YAAY,GAAwB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACvD,IAAI;QACJ,QAAQ;QACR,UAAU,EAAE,CAAC,GAAwB,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;QACpF,UAAU,EAAE,CAAC,OAAgB,EAAE,IAAa,EAAE,EAAE;YAC9C,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,cAAc,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC7B,CAAC;QACD,UAAU,EAAE,CAAC,KAAa,EAAE,OAAuB,EAAE,QAAiC,EAAE,EAAE;YACxF,SAAS,CAAC;gBACR,KAAK;gBACL,OAAO;gBACP,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;oBAC1B,SAAS,CAAC,IAAI,CAAC,CAAC;oBAChB,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAClB,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QACD,WAAW,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC;QAClC,WAAW,EAAE,CAAC,QAAgB,EAAE,SAAuC,EAAE,EAAE;YACzE,UAAU,CAAC;gBACT,QAAQ;gBACR,SAAS,EAAE,CAAC,SAAkB,EAAE,EAAE;oBAChC,UAAU,CAAC,IAAI,CAAC,CAAC;oBACjB,SAAS,CAAC,SAAS,CAAC,CAAC;gBACvB,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QACD,YAAY,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;KACrC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEZ,6BAA6B;IAC7B,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QACrD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YAAE,OAAO;QAE1B,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,YAAY,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC;QAEpD,mBAAmB;QACnB,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,eAAe,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YAC7C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;oBACzB,GAAG,IAAI;oBACP;wBACE,EAAE,EAAE,KAAK,EAAE;wBACX,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,eAAe,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;wBAC1E,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,OAAO,EAAE,IAAI;qBACd;iBACF,CAAC,CAAC;YACL,CAAC;YACD,OAAO;QACT,CAAC;QAED,wCAAwC;QACxC,IAAI,mBAAmB,EAAE,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACH,MAAM,sBAAsB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;oBACzB,GAAG,IAAI;oBACP;wBACE,EAAE,EAAE,KAAK,EAAE;wBACX,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;wBACrE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,OAAO,EAAE,IAAI;qBACd;iBACF,CAAC,CAAC;YACL,CAAC;YACD,OAAO;QACT,CAAC;QAED,wBAAwB;QACxB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;oBACzB,GAAG,IAAI;oBACP;wBACE,EAAE,EAAE,KAAK,EAAE;wBACX,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,uCAAuC;wBAChD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,OAAO,EAAE,IAAI;qBACd;iBACF,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAC/B,gBAAgB,CAAC;oBACf,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,uBAAuB,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;iBACzF,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC5C,IAAI,GAAG,EAAE,CAAC;gBACR,YAAY,CAAC,IAAI,CAAC,CAAC;gBACnB,cAAc,CAAC,YAAY,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC;gBAChD,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;oBAClE,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;wBACpC,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;4BACzB,GAAG,IAAI;4BACP,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,MAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;yBACnF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;wBACzB,GAAG,IAAI;wBACP;4BACE,EAAE,EAAE,KAAK,EAAE;4BACX,IAAI,EAAE,WAAW;4BACjB,OAAO,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;4BACrE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;4BACrB,OAAO,EAAE,IAAI;yBACd;qBACF,CAAC,CAAC;gBACL,CAAC;wBAAS,CAAC;oBACT,YAAY,CAAC,KAAK,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;oBACzB,GAAG,IAAI;oBACP;wBACE,EAAE,EAAE,KAAK,EAAE;wBACX,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,qBAAqB,MAAM,CAAC,OAAO,sCAAsC;wBAClF,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,OAAO,EAAE,IAAI;qBACd;iBACF,CAAC,CAAC;YACL,CAAC;YACD,OAAO;QACT,CAAC;QAED,2BAA2B;QAC3B,IAAI,eAAe,EAAE,CAAC;YACpB,WAAW,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAElD,iCAAiC;YACjC,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;gBAC/B,6BAA6B;gBAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;oBAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;oBACnC,OAAO,eAAe,KAAK,IAAI,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC7E,CAAC,CAAC,CAAC;gBACH,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,CAAC;wBACH,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBAC/C,CAAC;oBAAC,MAAM,CAAC;wBACP,uCAAuC;oBACzC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,4CAA4C;YAC5C,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,cAAc,CAAC,aAAa,CAAC,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;gBAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAC/E,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;oBACzB,GAAG,IAAI;oBACP;wBACE,EAAE,EAAE,KAAK,EAAE;wBACX,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,WAAW;4BAClB,CAAC,CAAC,oJAAoJ;4BACtJ,CAAC,CAAC,MAAM,CAAC,KAAK;gCACZ,CAAC,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE;gCAC1B,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,eAAe;wBACtC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK;qBACxB;iBACF,CAAC,CAAC;YACL,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,eAAe,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IAE/D,wBAAwB;IACxB,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,SAAiB,EAAE,EAAE;QACzD,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC7B,sBAAsB,CAAC,eAAe,CAAC,CAAC;QACxC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;QACzC,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACxB,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAC3B,eAAe,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,iBAAiB,GAAG,WAAW,CAAC,CAAC,OAAe,EAAE,EAAE;QACxD,IAAI,CAAC,cAAc,IAAI,CAAC,mBAAmB;YAAE,OAAO;QACpD,WAAW,CAAC,IAAI,CAAC,mBAAmB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC,EAAE,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAE1C,yBAAyB;IACzB,MAAM,mBAAmB,GAAG,WAAW,CAAC,CAAC,EAAU,EAAE,EAAE;QACrD,kBAAkB,CAAC,EAAE,CAAC,CAAC;QACvB,eAAe,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,mBAAmB,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE;QACxD,oBAAoB,CAAC,CAAC,IAAI,EAAE,EAAE,CAC5B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAClB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC;YACjC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CACrB,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,gCAAgC;IAChC,MAAM,yBAAyB,GAAG,WAAW,CAAC,CAAC,EAAU,EAAE,EAAE;QAC3D,kBAAkB,CAAC,EAAE,CAAC,CAAC;QACvB,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC5B,eAAe,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,iEAAiE;IACjE,SAAS,CAAC,GAAG,EAAE;QACZ,UAAsC,CAAC,sBAAsB,GAAG,GAAG,EAAE;YACpE,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC;QACD,UAAsC,CAAC,uBAAuB,GAAG,GAAG,EAAE;YACrE,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC;QACD,UAAsC,CAAC,oBAAoB,GAAG,CAAC,SAAiB,EAAE,EAAE;YACnF,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE;gBACvB,MAAM,QAAQ,GAAmB,UAAU;oBACzC,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC;oBAC9C,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;gBACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACnC,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;gBACnE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QACD,UAAsC,CAAC,eAAe,GAAG,CAAC,SAAiB,EAAE,EAAE;YAC9E,qDAAqD;YACrD,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;gBACtC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC/C,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;gBACrC,CAAC;YACH,CAAC;YACD,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACtF,CAAC,CAAC;QACD,UAAsC,CAAC,kBAAkB,GAAG,GAAG,EAAE;YAChE,yCAAyC;YACzC,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;gBACtC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;oBAAE,SAAS;gBACxD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBACjC,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;wBAC1B,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBAC7B,OAAO;oBACT,CAAC;oBACD,GAAG,EAAE,CAAC;gBACR,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QACD,UAAsC,CAAC,kBAAkB,GAAG,GAAG,EAAE;YAChE,oCAAoC;YACpC,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;gBACtC,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;oBAC1B,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBACnC,OAAO;gBACT,CAAC;gBACD,GAAG,EAAE,CAAC;gBACN,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC/C,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QACD,UAAsC,CAAC,gBAAgB,GAAG,GAAG,EAAE;YAC9D,iBAAiB,EAAE,CAAC;QACtB,CAAC,CAAC;QACD,UAAsC,CAAC,eAAe,GAAG,GAAG,EAAE;YAC7D,6EAA6E;YAC7E,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;oBACnC,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ;oBAC3B,OAAO,EAAE,yEAAyE;oBAClF,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB,CAAC,CAAC,CAAC;YACJ,eAAe,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC,CAAC;QACD,UAAsC,CAAC,aAAa,GAAG,GAAG,EAAE;YAC3D,KAAK,iBAAiB,CAAC,YAAY,CAAC,CAAC;YACrC,eAAe,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC,CAAC;QACD,UAAsC,CAAC,iBAAiB,GAAG,YAAY,CAAC;QACxE,UAAsC,CAAC,wBAAwB,GAAG,iBAAiB,CAAC;QAErF,OAAO,GAAG,EAAE;YACV,OAAQ,UAAsC,CAAC,sBAAsB,CAAC;YACtE,OAAQ,UAAsC,CAAC,uBAAuB,CAAC;YACvE,OAAQ,UAAsC,CAAC,oBAAoB,CAAC;YACpE,OAAQ,UAAsC,CAAC,eAAe,CAAC;YAC/D,OAAQ,UAAsC,CAAC,kBAAkB,CAAC;YAClE,OAAQ,UAAsC,CAAC,kBAAkB,CAAC;YAClE,OAAQ,UAAsC,CAAC,gBAAgB,CAAC;YAChE,OAAQ,UAAsC,CAAC,eAAe,CAAC;YAC/D,OAAQ,UAAsC,CAAC,aAAa,CAAC;YAC7D,OAAQ,UAAsC,CAAC,iBAAiB,CAAC;YACjE,OAAQ,UAAsC,CAAC,wBAAwB,CAAC;QAC1E,CAAC,CAAC;IACJ,CAAC,EAAE;QACD,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,eAAe;QAC5D,iBAAiB,EAAE,aAAa,EAAE,mBAAmB;QACrD,mBAAmB,EAAE,iBAAiB;KACvC,CAAC,CAAC;IAEH,uBAAuB;IACvB,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAE/C,eAAe;IACf,OAAO,CACL,KAAC,WAAW,IACV,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,OAAO,EACL,KAAC,YAAY,IACX,KAAK,EAAE,MAAM,CAAC,YAAY,EAC1B,OAAO,EAAE,YAAY,KAAK,SAAS,EACnC,aAAa,EAAC,eAAe,EAC7B,QAAQ,EAAE,eAAe,EACzB,iBAAiB,EAAE,iBAAiB,EACpC,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,aAAa,EACrB,eAAe,EAAE,mBAAmB,EACpC,YAAY,EAAE,mBAAmB,GACjC,EAEJ,IAAI,EACF,8BAEE,KAAC,aAAa,IACZ,IAAI,EAAE,iBAAiB,EACvB,IAAI,EAAE,iBAAiB,EACvB,MAAM,EAAE,UAAU,EAAE,MAAM,EAC1B,OAAO,EAAE,YAAY,KAAK,UAAU,GACpC,EAGF,KAAC,gBAAgB,IACf,QAAQ,EAAE,WAAW,EACrB,YAAY,EAAE,gBAAgB,EAC9B,KAAK,EAAE,MAAM,CAAC,SAAS,GACvB,EAGD,SAAS,IAAI,KAAC,OAAO,IAAC,KAAK,EAAE,WAAW,IAAI,aAAa,GAAI,EAG7D,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAChB,KAAC,YAAY,IACX,KAAK,EAAE,MAAM,CAAC,KAAK,EACnB,OAAO,EAAE,MAAM,CAAC,OAAO,EACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ,GACzB,CACH,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CACpB,KAAC,aAAa,IACZ,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAC1B,SAAS,EAAE,OAAO,CAAC,SAAS,GAC5B,CACH,CAAC,CAAC,CAAC,CACF,KAAC,WAAW,IACV,WAAW,EAAE,iBAAiB,EAC9B,WAAW,EAAE,iBAAiB,EAC9B,aAAa,EAAE,iBAAiB,KAAK,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,EACzE,OAAO,EAAE,YAAY,KAAK,SAAS,EACnC,QAAQ,EAAE,UAAU,EACpB,aAAa,EAAE,mBAAmB,EAClC,MAAM,EAAE,YAAY,GACpB,CACH,IACA,EAEL,MAAM,EACJ,UAAU,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAClC,KAAC,WAAW,IACV,KAAK,EAAE,MAAM,CAAC,WAAW,EACzB,OAAO,EAAE,YAAY,KAAK,QAAQ,EAClC,aAAa,EAAE,mBAAmB,EAClC,OAAO,EAAE,aAAa,EACtB,iBAAiB,EAAE,iBAAiB,EACpC,iBAAiB,EAAE,iBAAiB,EACpC,iBAAiB,EAAE,KAAK,EACxB,WAAW,EAAE,iBAAiB,EAC9B,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC,EAC1B,OAAO,EAAE,iBAAiB,EAC1B,aAAa,EAAE,mBAAmB,EAClC,MAAM,EAAE,YAAY,GACpB,CACH,CAAC,CAAC,CAAC,SAAS,EAEf,OAAO,EACL,iBAAiB,CAAC,CAAC,CAAC,CAClB,KAAC,aAAa,IACZ,IAAI,EAAE,iBAAiB,EACvB,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,yBAAyB,EACnC,OAAO,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,GAC1C,CACH,CAAC,CAAC,CAAC,SAAS,GAEf,CACH,CAAC;AACJ,CAAC;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task board — 3-column kanban view.
|
|
3
|
+
* Columns: To Do (muted), In Progress (blue), Done (green).
|
|
4
|
+
*/
|
|
5
|
+
import React from "react";
|
|
6
|
+
export type TaskPriority = "urgent" | "high" | "medium" | "low";
|
|
7
|
+
export type TaskStatus = "todo" | "in_progress" | "done";
|
|
8
|
+
export interface TaskCard {
|
|
9
|
+
id: string;
|
|
10
|
+
title: string;
|
|
11
|
+
priority: TaskPriority;
|
|
12
|
+
status: TaskStatus;
|
|
13
|
+
record?: string;
|
|
14
|
+
due?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface TaskBoardViewProps {
|
|
17
|
+
tasks: TaskCard[];
|
|
18
|
+
onBack?: () => void;
|
|
19
|
+
}
|
|
20
|
+
export declare function TaskBoardView({ tasks, onBack: _onBack, }: TaskBoardViewProps): React.JSX.Element;
|
|
21
|
+
export default TaskBoardView;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
// ── Priority badge ──────────────────────────────────────────────────
|
|
4
|
+
const PRIORITY_CONFIG = {
|
|
5
|
+
urgent: { badge: "!!!", color: "red" },
|
|
6
|
+
high: { badge: "!!", color: "red" },
|
|
7
|
+
medium: { badge: "!", color: "yellow" },
|
|
8
|
+
low: { badge: "\u00B7", color: "gray" },
|
|
9
|
+
};
|
|
10
|
+
function PriorityBadge({ priority }) {
|
|
11
|
+
const cfg = PRIORITY_CONFIG[priority];
|
|
12
|
+
return _jsx(Text, { color: cfg.color, children: cfg.badge });
|
|
13
|
+
}
|
|
14
|
+
const COLUMNS = [
|
|
15
|
+
{ status: "todo", title: "To Do", icon: "\u25CB", color: "gray" },
|
|
16
|
+
{ status: "in_progress", title: "In Progress", icon: "\u25D4", color: "blue" },
|
|
17
|
+
{ status: "done", title: "Done", icon: "\u25CF", color: "green" },
|
|
18
|
+
];
|
|
19
|
+
// ── Card component ──────────────────────────────────────────────────
|
|
20
|
+
function Card({ task }) {
|
|
21
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", paddingX: 1, marginBottom: 1, children: [_jsxs(Box, { gap: 1, children: [_jsx(PriorityBadge, { priority: task.priority }), _jsx(Text, { children: task.title })] }), task.record && (_jsx(Text, { dimColor: true, children: task.record })), task.due && (_jsx(Text, { color: "yellow", children: task.due }))] }));
|
|
22
|
+
}
|
|
23
|
+
// ── Column component ────────────────────────────────────────────────
|
|
24
|
+
function Column({ def, tasks }) {
|
|
25
|
+
return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1, children: [_jsxs(Box, { gap: 1, marginBottom: 1, children: [_jsx(Text, { color: def.color, children: def.icon }), _jsx(Text, { color: def.color, bold: true, children: def.title }), _jsx(Text, { dimColor: true, children: `(${tasks.length})` })] }), tasks.length === 0 ? (_jsx(Text, { dimColor: true, children: "No tasks" })) : (tasks.map((task) => _jsx(Card, { task: task }, task.id)))] }));
|
|
26
|
+
}
|
|
27
|
+
// ── Main view ───────────────────────────────────────────────────────
|
|
28
|
+
export function TaskBoardView({ tasks, onBack: _onBack, }) {
|
|
29
|
+
const byStatus = (status) => tasks.filter((t) => t.status === status);
|
|
30
|
+
return (_jsxs(Box, { flexDirection: "column", width: "100%", children: [_jsxs(Box, { paddingX: 2, marginBottom: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "Task Board" }), _jsx(Text, { dimColor: true, children: ` (${tasks.length} tasks)` })] }), _jsx(Box, { paddingX: 1, children: COLUMNS.map((col) => (_jsx(Column, { def: col, tasks: byStatus(col.status) }, col.status))) }), _jsx(Box, { marginTop: 1, paddingX: 2, children: _jsx(Text, { dimColor: true, children: "[Esc=back]" }) })] }));
|
|
31
|
+
}
|
|
32
|
+
export default TaskBoardView;
|
|
33
|
+
//# sourceMappingURL=task-board.js.map
|