claudeck 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +233 -0
  3. package/cli.js +2 -0
  4. package/config/agent-chains.json +16 -0
  5. package/config/agent-dags.json +16 -0
  6. package/config/agents.json +46 -0
  7. package/config/bot-prompt.json +3 -0
  8. package/config/folders.json +66 -0
  9. package/config/prompts.json +92 -0
  10. package/config/repos.json +86 -0
  11. package/config/telegram-config.json +17 -0
  12. package/config/workflows.json +90 -0
  13. package/db.js +1198 -0
  14. package/package.json +55 -0
  15. package/plugins/claude-editor/client.css +171 -0
  16. package/plugins/claude-editor/client.js +183 -0
  17. package/plugins/event-stream/client.css +207 -0
  18. package/plugins/event-stream/client.js +271 -0
  19. package/plugins/linear/client.css +345 -0
  20. package/plugins/linear/client.js +380 -0
  21. package/plugins/linear/config.json +5 -0
  22. package/plugins/linear/server.js +312 -0
  23. package/plugins/repos/client.css +549 -0
  24. package/plugins/repos/client.js +663 -0
  25. package/plugins/repos/server.js +232 -0
  26. package/plugins/sudoku/client.css +196 -0
  27. package/plugins/sudoku/client.js +329 -0
  28. package/plugins/tasks/client.css +414 -0
  29. package/plugins/tasks/client.js +394 -0
  30. package/plugins/tasks/server.js +116 -0
  31. package/plugins/tic-tac-toe/client.css +167 -0
  32. package/plugins/tic-tac-toe/client.js +241 -0
  33. package/public/css/core/components.css +232 -0
  34. package/public/css/core/layout.css +330 -0
  35. package/public/css/core/print.css +18 -0
  36. package/public/css/core/reset.css +36 -0
  37. package/public/css/core/responsive.css +378 -0
  38. package/public/css/core/theme.css +116 -0
  39. package/public/css/core/variables.css +93 -0
  40. package/public/css/features/agent-monitor.css +297 -0
  41. package/public/css/features/agent-sidebar.css +525 -0
  42. package/public/css/features/agents.css +996 -0
  43. package/public/css/features/analytics.css +181 -0
  44. package/public/css/features/background-sessions.css +321 -0
  45. package/public/css/features/cost-dashboard.css +168 -0
  46. package/public/css/features/home.css +313 -0
  47. package/public/css/features/retro-terminal.css +88 -0
  48. package/public/css/features/telegram.css +127 -0
  49. package/public/css/features/tour.css +148 -0
  50. package/public/css/features/voice-input.css +60 -0
  51. package/public/css/features/welcome.css +241 -0
  52. package/public/css/panels/assistant-bot.css +442 -0
  53. package/public/css/panels/dev-docs.css +292 -0
  54. package/public/css/panels/file-explorer.css +322 -0
  55. package/public/css/panels/git-panel.css +221 -0
  56. package/public/css/panels/mcp-manager.css +199 -0
  57. package/public/css/panels/tips-feed.css +353 -0
  58. package/public/css/ui/commands.css +273 -0
  59. package/public/css/ui/context-gauge.css +76 -0
  60. package/public/css/ui/file-picker.css +69 -0
  61. package/public/css/ui/image-attachments.css +106 -0
  62. package/public/css/ui/messages.css +884 -0
  63. package/public/css/ui/modals.css +122 -0
  64. package/public/css/ui/parallel.css +217 -0
  65. package/public/css/ui/permissions.css +110 -0
  66. package/public/css/ui/right-panel.css +481 -0
  67. package/public/css/ui/sessions.css +689 -0
  68. package/public/css/ui/status-bar.css +425 -0
  69. package/public/css/ui/toolbox.css +206 -0
  70. package/public/data/tips.json +218 -0
  71. package/public/icons/favicon.png +0 -0
  72. package/public/icons/icon-192.png +0 -0
  73. package/public/icons/icon-512.png +0 -0
  74. package/public/icons/whaly.png +0 -0
  75. package/public/index.html +1140 -0
  76. package/public/js/core/api.js +591 -0
  77. package/public/js/core/constants.js +3 -0
  78. package/public/js/core/dom.js +270 -0
  79. package/public/js/core/events.js +10 -0
  80. package/public/js/core/plugin-loader.js +153 -0
  81. package/public/js/core/store.js +39 -0
  82. package/public/js/core/utils.js +25 -0
  83. package/public/js/core/ws.js +64 -0
  84. package/public/js/features/agent-monitor.js +222 -0
  85. package/public/js/features/agents.js +1209 -0
  86. package/public/js/features/analytics.js +397 -0
  87. package/public/js/features/attachments.js +251 -0
  88. package/public/js/features/background-sessions.js +475 -0
  89. package/public/js/features/chat.js +589 -0
  90. package/public/js/features/cost-dashboard.js +152 -0
  91. package/public/js/features/dag-editor.js +399 -0
  92. package/public/js/features/easter-egg.js +46 -0
  93. package/public/js/features/home.js +270 -0
  94. package/public/js/features/projects.js +372 -0
  95. package/public/js/features/prompts.js +228 -0
  96. package/public/js/features/sessions.js +332 -0
  97. package/public/js/features/telegram.js +131 -0
  98. package/public/js/features/tour.js +210 -0
  99. package/public/js/features/voice-input.js +185 -0
  100. package/public/js/features/welcome.js +43 -0
  101. package/public/js/features/workflows.js +277 -0
  102. package/public/js/main.js +51 -0
  103. package/public/js/panels/assistant-bot.js +445 -0
  104. package/public/js/panels/dev-docs.js +380 -0
  105. package/public/js/panels/file-explorer.js +486 -0
  106. package/public/js/panels/git-panel.js +285 -0
  107. package/public/js/panels/mcp-manager.js +311 -0
  108. package/public/js/panels/tips-feed.js +303 -0
  109. package/public/js/ui/commands.js +114 -0
  110. package/public/js/ui/context-gauge.js +100 -0
  111. package/public/js/ui/diff.js +124 -0
  112. package/public/js/ui/disabled-tools.js +36 -0
  113. package/public/js/ui/export.js +74 -0
  114. package/public/js/ui/formatting.js +206 -0
  115. package/public/js/ui/header-dropdowns.js +72 -0
  116. package/public/js/ui/input-meta.js +71 -0
  117. package/public/js/ui/max-turns.js +21 -0
  118. package/public/js/ui/messages.js +387 -0
  119. package/public/js/ui/model-selector.js +20 -0
  120. package/public/js/ui/notifications.js +232 -0
  121. package/public/js/ui/parallel.js +176 -0
  122. package/public/js/ui/permissions.js +168 -0
  123. package/public/js/ui/right-panel.js +173 -0
  124. package/public/js/ui/shortcuts.js +143 -0
  125. package/public/js/ui/sidebar-toggle.js +29 -0
  126. package/public/js/ui/status-bar.js +172 -0
  127. package/public/js/ui/tab-sdk.js +623 -0
  128. package/public/js/ui/theme.js +38 -0
  129. package/public/manifest.json +13 -0
  130. package/public/offline.html +190 -0
  131. package/public/style.css +42 -0
  132. package/public/sw.js +91 -0
  133. package/server/agent-loop.js +385 -0
  134. package/server/dag-executor.js +265 -0
  135. package/server/orchestrator.js +514 -0
  136. package/server/paths.js +61 -0
  137. package/server/plugin-mount.js +56 -0
  138. package/server/push-sender.js +31 -0
  139. package/server/routes/agents.js +294 -0
  140. package/server/routes/bot.js +45 -0
  141. package/server/routes/exec.js +35 -0
  142. package/server/routes/files.js +218 -0
  143. package/server/routes/mcp.js +82 -0
  144. package/server/routes/messages.js +36 -0
  145. package/server/routes/notifications.js +37 -0
  146. package/server/routes/projects.js +207 -0
  147. package/server/routes/prompts.js +53 -0
  148. package/server/routes/sessions.js +103 -0
  149. package/server/routes/stats.js +143 -0
  150. package/server/routes/telegram.js +71 -0
  151. package/server/routes/tips.js +135 -0
  152. package/server/routes/workflows.js +81 -0
  153. package/server/summarizer.js +55 -0
  154. package/server/telegram-poller.js +205 -0
  155. package/server/telegram-sender.js +304 -0
  156. package/server/ws-handler.js +926 -0
  157. package/server.js +179 -0
@@ -0,0 +1,1140 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <meta name="theme-color" content="#0d1117">
7
+ <meta name="apple-mobile-web-app-capable" content="yes">
8
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
9
+ <title>Claudeck :: terminal</title>
10
+ <link rel="icon" type="image/png" href="/icons/favicon.png">
11
+ <link rel="manifest" href="/manifest.json">
12
+ <link rel="apple-touch-icon" href="/icons/icon-192.png">
13
+ <link rel="preconnect" href="https://fonts.googleapis.com">
14
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
15
+ <link href="https://fonts.googleapis.com/css2?family=Chakra+Petch:wght@400;500;600;700&family=Outfit:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet">
16
+ <link rel="stylesheet" href="style.css">
17
+ <link id="hljs-theme" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css">
18
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/driver.js@1.3.6/dist/driver.css">
19
+ <script src="https://cdn.jsdelivr.net/npm/driver.js@1.3.6/dist/driver.js.iife.js"></script>
20
+ </head>
21
+ <body>
22
+ <!-- Welcome Overlay (first visit only) -->
23
+ <div id="welcome-overlay" class="welcome-overlay hidden">
24
+ <div class="welcome-container">
25
+ <div class="welcome-mascot">
26
+ <img src="/icons/whaly.png" alt="Whaly" class="welcome-whaly" draggable="false">
27
+ </div>
28
+ <h1 class="welcome-title">Welcome to <span>Claudeck</span></h1>
29
+ <div class="welcome-version">v1.0 &middot; browser-based AI development environment</div>
30
+ <p class="welcome-description">
31
+ Your local command center for Claude Code. Chat with AI, run workflows,
32
+ manage projects, explore files, and orchestrate autonomous agents &mdash;
33
+ all from a single interface.
34
+ </p>
35
+ <div class="welcome-features">
36
+ <div class="welcome-feature">
37
+ <div class="welcome-feature-icon">
38
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
39
+ <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/>
40
+ </svg>
41
+ </div>
42
+ <div>
43
+ <div class="welcome-feature-title">AI Chat</div>
44
+ <div class="welcome-feature-desc">Stream conversations with Claude, run slash commands, attach files</div>
45
+ </div>
46
+ </div>
47
+ <div class="welcome-feature">
48
+ <div class="welcome-feature-icon">
49
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
50
+ <circle cx="12" cy="12" r="3"/><path d="M12 1v4M12 19v4M4.22 4.22l2.83 2.83M16.95 16.95l2.83 2.83M1 12h4M19 12h4M4.22 19.78l2.83-2.83M16.95 7.05l2.83-2.83"/>
51
+ </svg>
52
+ </div>
53
+ <div>
54
+ <div class="welcome-feature-title">Agents & Workflows</div>
55
+ <div class="welcome-feature-desc">Automate tasks with pre-built or custom agent pipelines</div>
56
+ </div>
57
+ </div>
58
+ <div class="welcome-feature">
59
+ <div class="welcome-feature-icon">
60
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
61
+ <path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/>
62
+ </svg>
63
+ </div>
64
+ <div>
65
+ <div class="welcome-feature-title">Dev Tools</div>
66
+ <div class="welcome-feature-desc">File explorer, Git panel, MCP servers, cost analytics</div>
67
+ </div>
68
+ </div>
69
+ </div>
70
+ <div class="welcome-actions">
71
+ <button id="welcome-get-started" class="welcome-btn-primary">Get Started</button>
72
+ <button id="welcome-take-tour" class="welcome-btn-secondary">Take a Tour</button>
73
+ </div>
74
+ <div class="welcome-hint">Press <kbd>Enter</kbd> or <kbd>Esc</kbd> to skip</div>
75
+ </div>
76
+ </div>
77
+
78
+ <header class="top-header">
79
+ <button id="sidebar-toggle-btn" aria-label="Toggle sidebar">
80
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
81
+ <line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="12" x2="21" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/>
82
+ </svg>
83
+ </button>
84
+ <div class="term-line">
85
+ <span class="term-prompt">&gt;</span>
86
+ <span class="term-cmd">claude</span>
87
+ <span class="term-dot" id="connection-dot" style="display:none"></span>
88
+ <span class="term-status" id="connection-text" style="display:none">connecting</span>
89
+ <span class="bg-session-indicator hidden" id="bg-session-indicator">
90
+ <span class="bg-dot-blink"></span>
91
+ <span id="bg-session-badge">0</span> bg
92
+ </span>
93
+ <span class="term-sep">&middot;</span>
94
+ <span class="term-user" id="account-email">---</span>
95
+ <span class="term-plan" id="account-plan"></span>
96
+ </div>
97
+ <span class="term-project-name" id="header-project-name"></span>
98
+
99
+ <div class="header-right">
100
+ <!-- Session Settings Dropdown -->
101
+ <div class="header-dropdown">
102
+ <button class="header-dropdown-trigger">
103
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
104
+ <circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"/>
105
+ </svg>
106
+ Session
107
+ <svg class="header-dropdown-chevron" width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"/></svg>
108
+ </button>
109
+ <div class="header-dropdown-menu header-dropdown-menu--right">
110
+ <div class="header-dropdown-item has-submenu">
111
+ <span class="header-dropdown-item-label">Approval</span>
112
+ <span class="header-dropdown-item-value" id="perm-mode-display">confirm writes</span>
113
+ <svg class="header-dropdown-arrow" width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 6 15 12 9 18"/></svg>
114
+ <div class="header-submenu header-submenu--left">
115
+ <button class="header-submenu-item" data-target="perm-mode-select" data-value="bypass">Bypass</button>
116
+ <button class="header-submenu-item active" data-target="perm-mode-select" data-value="confirmDangerous">Confirm Writes</button>
117
+ <button class="header-submenu-item" data-target="perm-mode-select" data-value="confirmAll">Confirm All</button>
118
+ <button class="header-submenu-item" data-target="perm-mode-select" data-value="plan">Plan Mode</button>
119
+ </div>
120
+ </div>
121
+ <div class="header-dropdown-item has-submenu">
122
+ <span class="header-dropdown-item-label">Model</span>
123
+ <span class="header-dropdown-item-value" id="model-display">auto</span>
124
+ <svg class="header-dropdown-arrow" width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 6 15 12 9 18"/></svg>
125
+ <div class="header-submenu header-submenu--left">
126
+ <button class="header-submenu-item active" data-target="model-select" data-value="">Auto</button>
127
+ <button class="header-submenu-item" data-target="model-select" data-value="sonnet">Sonnet</button>
128
+ <button class="header-submenu-item" data-target="model-select" data-value="opus">Opus</button>
129
+ <button class="header-submenu-item" data-target="model-select" data-value="haiku">Haiku</button>
130
+ </div>
131
+ </div>
132
+ <div class="header-dropdown-item has-submenu">
133
+ <span class="header-dropdown-item-label">Max Turns</span>
134
+ <span class="header-dropdown-item-value" id="max-turns-display">30</span>
135
+ <svg class="header-dropdown-arrow" width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 6 15 12 9 18"/></svg>
136
+ <div class="header-submenu header-submenu--left">
137
+ <button class="header-submenu-item" data-target="max-turns-select" data-value="10">10</button>
138
+ <button class="header-submenu-item active" data-target="max-turns-select" data-value="30">30</button>
139
+ <button class="header-submenu-item" data-target="max-turns-select" data-value="50">50</button>
140
+ <button class="header-submenu-item" data-target="max-turns-select" data-value="100">100</button>
141
+ <button class="header-submenu-item" data-target="max-turns-select" data-value="0">Unlimited</button>
142
+ </div>
143
+ </div>
144
+ <div class="header-dropdown-item has-submenu">
145
+ <span class="header-dropdown-item-label">Disabled Tools</span>
146
+ <span class="header-dropdown-item-value" id="disabled-tools-display">none</span>
147
+ <svg class="header-dropdown-arrow" width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 6 15 12 9 18"/></svg>
148
+ <div class="header-submenu header-submenu--left header-submenu--tools">
149
+ <label class="header-submenu-check" data-tool="WebSearch"><input type="checkbox" value="WebSearch"><span>WebSearch</span></label>
150
+ <label class="header-submenu-check" data-tool="WebFetch"><input type="checkbox" value="WebFetch"><span>WebFetch</span></label>
151
+ <label class="header-submenu-check" data-tool="Agent"><input type="checkbox" value="Agent"><span>Agent</span></label>
152
+ <label class="header-submenu-check" data-tool="NotebookEdit"><input type="checkbox" value="NotebookEdit"><span>NotebookEdit</span></label>
153
+ <label class="header-submenu-check" data-tool="TaskCreate"><input type="checkbox" value="TaskCreate"><span>TaskCreate</span></label>
154
+ <label class="header-submenu-check" data-tool="TaskUpdate"><input type="checkbox" value="TaskUpdate"><span>TaskUpdate</span></label>
155
+ <label class="header-submenu-check" data-tool="TodoRead"><input type="checkbox" value="TodoRead"><span>TodoRead</span></label>
156
+ <label class="header-submenu-check" data-tool="TodoWrite"><input type="checkbox" value="TodoWrite"><span>TodoWrite</span></label>
157
+ </div>
158
+ </div>
159
+ </div>
160
+ <!-- Hidden selects (keep for existing JS logic) -->
161
+ <select id="perm-mode-select" class="header-hidden-select" title="Tool approval mode">
162
+ <option value="bypass">bypass</option>
163
+ <option value="confirmDangerous" selected>confirm writes</option>
164
+ <option value="confirmAll">confirm all</option>
165
+ <option value="plan">plan mode</option>
166
+ </select>
167
+ <select id="model-select" class="header-hidden-select" title="Model">
168
+ <option value="">auto</option>
169
+ <option value="sonnet">sonnet</option>
170
+ <option value="opus">opus</option>
171
+ <option value="haiku">haiku</option>
172
+ </select>
173
+ <select id="max-turns-select" class="header-hidden-select" title="Max turns per query">
174
+ <option value="10">10</option>
175
+ <option value="30" selected>30</option>
176
+ <option value="50">50</option>
177
+ <option value="100">100</option>
178
+ <option value="0">unlimited</option>
179
+ </select>
180
+ </div>
181
+
182
+ <!-- Tools Dropdown -->
183
+ <div class="header-dropdown">
184
+ <button class="header-dropdown-trigger">
185
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
186
+ <rect x="2" y="7" width="20" height="14" rx="2" ry="2"/><path d="M16 7V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v3"/>
187
+ </svg>
188
+ Tools
189
+ <svg class="header-dropdown-chevron" width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"/></svg>
190
+ </button>
191
+ <div class="header-dropdown-menu header-dropdown-menu--right">
192
+ <button class="header-dropdown-item" id="mcp-toggle-btn" title="MCP Server Management">
193
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
194
+ <circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"/>
195
+ </svg>
196
+ <span>MCP Servers</span>
197
+ </button>
198
+ <button class="header-dropdown-item" id="notifications-toggle-btn" title="Toggle browser notifications">
199
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
200
+ <path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.73 21a2 2 0 0 1-3.46 0"/>
201
+ </svg>
202
+ <span id="notifications-label">Notifications</span>
203
+ </button>
204
+ <button class="header-dropdown-item" id="telegram-settings-btn" title="Telegram notifications">
205
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
206
+ <path d="M21.2 4.6L2.4 11.2c-.8.3-.8 1.5 0 1.8l4.6 1.7 1.7 5.5c.2.6 1 .8 1.4.3l2.5-2.8 4.8 3.5c.6.4 1.4.1 1.5-.6L21.2 4.6z"/>
207
+ </svg>
208
+ <span id="telegram-label">Telegram</span>
209
+ </button>
210
+ <div style="height:1px;background:var(--border);margin:4px 8px;"></div>
211
+ <button class="header-dropdown-item" id="dev-docs-btn" title="Developer Documentation">
212
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
213
+ <path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"/><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"/>
214
+ </svg>
215
+ <span>Dev Docs</span>
216
+ </button>
217
+ </div>
218
+ </div>
219
+
220
+ <button id="tips-feed-toggle-btn" class="header-icon-btn" title="Toggle tips feed (Cmd+Shift+T)">
221
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
222
+ <path d="M9 18h6"/><path d="M10 22h4"/>
223
+ <path d="M12 2a7 7 0 0 0-4 12.7V17h8v-2.3A7 7 0 0 0 12 2z"/>
224
+ </svg>
225
+ </button>
226
+
227
+ <button id="right-panel-toggle-btn" class="header-icon-btn" title="Toggle right panel (Cmd+B)">
228
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
229
+ <rect x="3" y="3" width="18" height="18" rx="2" ry="2"/><line x1="15" y1="3" x2="15" y2="21"/>
230
+ </svg>
231
+ </button>
232
+
233
+ <div class="term-costs">
234
+ <span class="term-cost-value hidden" id="project-cost">$0.00</span>
235
+ <span class="term-cost-value hidden" id="total-cost">$0.00</span>
236
+ </div>
237
+ </div>
238
+ </header>
239
+
240
+ <div class="layout">
241
+ <div id="sidebar-backdrop"></div>
242
+ <!-- Sidebar -->
243
+ <aside class="sidebar">
244
+ <div class="sidebar-header">
245
+ <button id="home-btn" class="home-btn active" title="Home">
246
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
247
+ <path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
248
+ <polyline points="9 22 9 12 15 12 15 22"/>
249
+ </svg>
250
+ </button>
251
+ <h1>Claudeck</h1>
252
+ <button id="theme-toggle-btn" class="theme-toggle-btn" title="Toggle light/dark theme">
253
+ <svg id="theme-icon-sun" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="display:none;">
254
+ <circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/>
255
+ </svg>
256
+ <svg id="theme-icon-moon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
257
+ <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
258
+ </svg>
259
+ </button>
260
+ </div>
261
+
262
+ <div class="folder-picker">
263
+ <div class="folder-picker-header">
264
+ <label for="project-select">Project <span id="system-prompt-badge" class="system-prompt-badge hidden" title="System prompt configured">SP</span></label>
265
+ <div class="folder-picker-actions">
266
+ <button id="open-vscode-btn" class="add-project-btn sidebar-tooltip" data-tooltip="Open in VS Code">
267
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
268
+ <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/>
269
+ </svg>
270
+ </button>
271
+ <button id="add-project-btn" class="add-project-btn sidebar-tooltip" data-tooltip="Add project">+</button>
272
+ <button id="system-prompt-edit-btn" class="system-prompt-edit-btn sidebar-tooltip" data-tooltip="System prompt">&#9881;</button>
273
+ </div>
274
+ </div>
275
+ <select id="project-select">
276
+ <option value="">Select a project...</option>
277
+ </select>
278
+ </div>
279
+
280
+ <div class="sessions-section">
281
+ <h2>Sessions</h2>
282
+ <div id="session-controls" class="session-controls hidden">
283
+ <div class="session-search-wrapper">
284
+ <input id="session-search" type="text" placeholder="Search sessions..." autocomplete="off">
285
+ </div>
286
+ <button id="new-session-btn" class="btn-secondary">+ New Session</button>
287
+ <div class="mode-toggle">
288
+ <label class="toggle-switch" title="Toggle parallel chat mode (2x2 grid)">
289
+ <input type="checkbox" id="toggle-parallel-btn">
290
+ <span class="toggle-slider"></span>
291
+ <span class="toggle-label">Parallel Mode</span>
292
+ </label>
293
+ </div>
294
+ </div>
295
+ <ul id="session-list" class="session-list"></ul>
296
+ </div>
297
+ </aside>
298
+
299
+ <!-- Main Chat Area -->
300
+ <main class="chat-area">
301
+ <div id="home-page" class="home-page">
302
+ <div class="home-section">
303
+ <div class="home-section-header">
304
+ <h2>AI Activity</h2>
305
+ <span class="home-subtitle" id="home-year-label"></span>
306
+ </div>
307
+ <div class="home-grid-container">
308
+ <div class="home-grid-months" id="home-grid-months"></div>
309
+ <div class="home-grid-body">
310
+ <div class="home-grid-days">
311
+ <span></span><span>Mon</span><span></span><span>Wed</span><span></span><span>Fri</span><span></span>
312
+ </div>
313
+ <div id="home-activity-grid" class="home-activity-grid"></div>
314
+ </div>
315
+ <div class="home-grid-legend">
316
+ <span>Less</span>
317
+ <span class="home-legend-cell" data-level="0"></span>
318
+ <span class="home-legend-cell" data-level="1"></span>
319
+ <span class="home-legend-cell" data-level="2"></span>
320
+ <span class="home-legend-cell" data-level="3"></span>
321
+ <span class="home-legend-cell" data-level="4"></span>
322
+ <span>More</span>
323
+ </div>
324
+ </div>
325
+ </div>
326
+ <div class="home-cards" id="home-cards"></div>
327
+ <div class="home-section home-analytics-section">
328
+ <div class="home-section-header">
329
+ <h2>Analytics</h2>
330
+ <select id="home-analytics-filter" class="analytics-project-filter">
331
+ <option value="">All Projects</option>
332
+ </select>
333
+ </div>
334
+ <div id="home-analytics-content" class="analytics-content"></div>
335
+ </div>
336
+ </div>
337
+ <!-- Agent Sidebar (left of chat) -->
338
+ <aside id="agent-sidebar" class="agent-sidebar hidden">
339
+ <div class="agent-sidebar-header">
340
+ <div class="agent-sidebar-title-row">
341
+ <svg class="agent-sidebar-logo" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="3"/><path d="M12 1v4M12 19v4M4.22 4.22l2.83 2.83M16.95 16.95l2.83 2.83M1 12h4M19 12h4M4.22 19.78l2.83-2.83M16.95 7.05l2.83-2.83"/></svg>
342
+ <span class="agent-sidebar-title">Agents & Workflows</span>
343
+ </div>
344
+ <button id="agent-sidebar-close" class="agent-sidebar-close" title="Close">&times;</button>
345
+ </div>
346
+ <div id="agent-panel" class="agent-sidebar-body"></div>
347
+ </aside>
348
+
349
+ <div class="chat-area-main hidden">
350
+ <div id="messages" class="messages"></div>
351
+
352
+ <div id="image-preview-strip" class="image-preview-strip hidden"></div>
353
+ <input type="file" id="image-file-input" accept="image/png,image/jpeg,image/gif,image/webp" multiple hidden>
354
+ <div id="input-waiting" class="input-waiting hidden">
355
+ <span class="input-waiting-dot"></span>
356
+ <span class="input-waiting-text">Claude is waiting for your response</span>
357
+ </div>
358
+ <div class="input-bar">
359
+ <button id="agent-btn" data-tooltip="Agents & Workflows" class="toolbox-toggle">
360
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
361
+ <rect x="3" y="11" width="18" height="10" rx="2"/><circle cx="9" cy="16" r="1"/><circle cx="15" cy="16" r="1"/><path d="M12 2v4"/><path d="M8 7h8a2 2 0 0 1 2 2v2H6V9a2 2 0 0 1 2-2z"/><path d="M5 11h1"/><path d="M18 11h1"/>
362
+ </svg>
363
+ </button>
364
+ <button id="attach-btn" data-tooltip="Attach Files" class="toolbox-toggle" style="position:relative;">
365
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
366
+ <path d="M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"/>
367
+ </svg>
368
+ <span id="attach-badge" class="attach-badge hidden">0</span>
369
+ </button>
370
+ <button id="image-btn" data-tooltip="Attach Images" class="toolbox-toggle">
371
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
372
+ <rect x="3" y="3" width="18" height="18" rx="2" ry="2"/>
373
+ <circle cx="8.5" cy="8.5" r="1.5"/>
374
+ <polyline points="21 15 16 10 5 21"/>
375
+ </svg>
376
+ </button>
377
+ <button id="mic-btn" data-tooltip="Voice Input" class="toolbox-toggle">
378
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
379
+ <path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"/>
380
+ <path d="M19 10v2a7 7 0 0 1-14 0v-2"/>
381
+ <line x1="12" y1="19" x2="12" y2="23"/>
382
+ <line x1="8" y1="23" x2="16" y2="23"/>
383
+ </svg>
384
+ </button>
385
+ <button id="toolbox-btn" data-tooltip="Saved Prompts" class="toolbox-toggle">
386
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
387
+ <rect x="2" y="7" width="20" height="14" rx="2" ry="2"/><path d="M16 7V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v3"/><line x1="12" y1="12" x2="12" y2="16"/><line x1="10" y1="14" x2="14" y2="14"/>
388
+ </svg>
389
+ </button>
390
+ <div class="input-textarea-wrap">
391
+ <textarea id="message-input" placeholder="> type a message or / for commands..." rows="1"></textarea>
392
+ <div class="input-meta">
393
+ <span class="input-meta-item" id="input-meta-model" title="Selected model"></span>
394
+ <span class="input-meta-sep">&middot;</span>
395
+ <span class="input-meta-item" id="input-meta-perm" title="Permission mode"></span>
396
+ <span class="input-meta-sep">&middot;</span>
397
+ <span class="input-meta-item" id="input-meta-turns" title="Max turns per query"></span>
398
+ <span class="input-meta-sep">&middot;</span>
399
+ <span class="input-meta-shortcuts">
400
+ <span class="input-meta-kbd" title="Toggle right panel">&#8984;B</span>
401
+ <span class="input-meta-kbd" title="New session">&#8984;N</span>
402
+ <span class="input-meta-kbd" title="Search sessions">&#8984;K</span>
403
+ <span class="input-meta-kbd" title="Show all shortcuts">&#8984;/</span>
404
+ </span>
405
+ </div>
406
+ </div>
407
+ <button id="send-btn" title="Send">
408
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none">
409
+ <path d="M3 10l7-7m0 0l7 7m-7-7v14" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" transform="rotate(90, 10, 10)"/>
410
+ </svg>
411
+ </button>
412
+ <button id="stop-btn" title="Stop" class="hidden">
413
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none">
414
+ <rect x="4" y="4" width="12" height="12" rx="2" fill="currentColor"/>
415
+ </svg>
416
+ </button>
417
+ <div id="slash-autocomplete" class="slash-autocomplete hidden"></div>
418
+ </div>
419
+ <div id="toolbox-panel" class="toolbox-panel hidden"></div>
420
+ <div id="workflow-panel" class="toolbox-panel hidden"></div>
421
+ </div>
422
+
423
+ <aside id="tips-feed-panel" class="tips-feed-panel hidden">
424
+ <div id="tips-feed-resize" class="tips-feed-resize"></div>
425
+ <div class="tips-feed-header">
426
+ <span class="tips-feed-title"><span class="tips-feed-title-icon">
427
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
428
+ <path d="M9 18h6"/><path d="M10 22h4"/><path d="M12 2a7 7 0 0 0-4 12.7V17h8v-2.3A7 7 0 0 0 12 2z"/>
429
+ </svg>
430
+ </span> Tips Feed</span>
431
+ <button id="tips-feed-close" class="tips-feed-close" title="Close">&times;</button>
432
+ </div>
433
+ <div class="tips-feed-tabs"></div>
434
+ <div id="tips-feed-content" class="tips-feed-content"></div>
435
+ </aside>
436
+ </main>
437
+
438
+ <!-- Right Panel (tabbed: Tasks / Files / Git) -->
439
+ <aside id="right-panel" class="right-panel hidden">
440
+ <div id="right-panel-resize" class="right-panel-resize"></div>
441
+ <div class="right-panel-tab-bar">
442
+ <button class="right-panel-tab active" data-tab="files">Files</button>
443
+ <button class="right-panel-tab" data-tab="git">Git</button>
444
+ <button id="right-panel-close" class="right-panel-close" title="Close panel">&times;</button>
445
+ </div>
446
+ <div class="right-panel-content">
447
+ <!-- Files pane -->
448
+ <div class="right-panel-pane active" data-tab="files">
449
+ <div class="file-explorer-toolbar">
450
+ <input id="file-explorer-search" type="text" placeholder="Filter files..." autocomplete="off" class="file-explorer-search">
451
+ <button id="file-refresh-btn" class="file-refresh-btn" title="Refresh file tree">
452
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
453
+ <polyline points="23 4 23 10 17 10"/><polyline points="1 20 1 14 7 14"/>
454
+ <path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"/>
455
+ </svg>
456
+ </button>
457
+ </div>
458
+ <div id="file-tree" class="file-tree"></div>
459
+ <div id="file-preview" class="file-preview hidden">
460
+ <div class="file-preview-header">
461
+ <span id="file-preview-name" class="file-preview-name"></span>
462
+ <button id="file-preview-close" class="file-preview-close" title="Close preview">&times;</button>
463
+ </div>
464
+ <pre id="file-preview-content" class="file-preview-content"><code></code></pre>
465
+ <img id="file-preview-image" class="file-preview-image hidden" alt="">
466
+ </div>
467
+ </div>
468
+
469
+ <!-- Git pane -->
470
+ <div class="right-panel-pane" data-tab="git">
471
+ <div class="git-toolbar">
472
+ <select id="git-branch-select" class="git-branch-select" title="Switch branch"></select>
473
+ <button id="git-refresh-btn" class="git-refresh-btn" title="Refresh">
474
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
475
+ <polyline points="23 4 23 10 17 10"/><polyline points="1 20 1 14 7 14"/>
476
+ <path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"/>
477
+ </svg>
478
+ </button>
479
+ </div>
480
+ <div id="git-status-list" class="git-status-list"></div>
481
+ <div class="git-commit-section">
482
+ <textarea id="git-commit-msg" class="git-commit-msg" placeholder="Commit message..." rows="2"></textarea>
483
+ <button id="git-commit-btn" class="git-commit-btn">Commit</button>
484
+ </div>
485
+ <div class="git-log-section">
486
+ <h4 class="git-log-title">Recent Commits</h4>
487
+ <div id="git-log-list" class="git-log-list"></div>
488
+ </div>
489
+ </div>
490
+
491
+
492
+
493
+ <!-- Plugin tabs are injected here by tab-sdk.js -->
494
+ </div>
495
+ </aside>
496
+ </div>
497
+
498
+ <!-- Orchestrate Modal -->
499
+ <div id="orch-modal" class="modal-overlay hidden">
500
+ <div class="modal agent-form-modal">
501
+ <div class="modal-header">
502
+ <h3>Orchestrate</h3>
503
+ <button id="orch-modal-close" class="modal-close">&times;</button>
504
+ </div>
505
+ <div class="af-section">
506
+ <div class="af-section-label">How it works</div>
507
+ <div class="orch-explainer">
508
+ <div class="orch-explainer-steps">
509
+ <div class="orch-step"><span class="orch-step-num">1</span><span>Describe your task in plain language</span></div>
510
+ <div class="orch-step"><span class="orch-step-num">2</span><span>The orchestrator analyzes and decomposes it into sub-tasks</span></div>
511
+ <div class="orch-step"><span class="orch-step-num">3</span><span>Each sub-task is delegated to the best-fit agent automatically</span></div>
512
+ <div class="orch-step"><span class="orch-step-num">4</span><span>Results are synthesized into a unified response</span></div>
513
+ </div>
514
+ </div>
515
+ </div>
516
+ <div class="af-section">
517
+ <div class="af-section-label">Task</div>
518
+ <div class="af-field">
519
+ <label for="orch-task-input">What do you need done?</label>
520
+ <textarea id="orch-task-input" rows="5" placeholder="e.g. Review the current changes for bugs and security issues, then write tests for any uncovered code paths, and finally refactor any code smells you find."></textarea>
521
+ </div>
522
+ </div>
523
+ <div class="modal-actions">
524
+ <button type="button" id="orch-modal-cancel" class="modal-btn-cancel">Cancel</button>
525
+ <button type="button" id="orch-modal-run" class="modal-btn-save">Run Orchestrator</button>
526
+ </div>
527
+ </div>
528
+ </div>
529
+
530
+ <!-- Agent Monitor Modal -->
531
+ <div id="agent-monitor-modal" class="modal-overlay hidden">
532
+ <div class="modal agent-monitor-modal">
533
+ <div class="modal-header">
534
+ <h3>Agent Monitor</h3>
535
+ <button id="agent-monitor-close" class="modal-close">&times;</button>
536
+ </div>
537
+ <div id="agent-monitor-content"></div>
538
+ </div>
539
+ </div>
540
+
541
+ <!-- DAG Editor Modal -->
542
+ <div id="dag-modal" class="modal-overlay hidden">
543
+ <div class="modal dag-modal-wide">
544
+ <div class="modal-header">
545
+ <h3 id="dag-modal-title">New DAG</h3>
546
+ <button id="dag-modal-close" class="modal-close">&times;</button>
547
+ </div>
548
+ <div class="dag-explainer af-section">
549
+ <div class="af-section-label">What is a DAG?</div>
550
+ <div class="orch-explainer">
551
+ <p class="dag-explainer-text">A <strong>DAG</strong> (Directed Acyclic Graph) lets you run agents in parallel when they have no dependencies, and sequentially when one depends on another's output.</p>
552
+ <div class="orch-explainer-steps">
553
+ <div class="orch-step"><span class="orch-step-num">1</span><span><strong>Drag agents</strong> from the palette onto the canvas</span></div>
554
+ <div class="orch-step"><span class="orch-step-num">2</span><span><strong>Connect outputs → inputs</strong> by dragging between ports to define dependencies</span></div>
555
+ <div class="orch-step"><span class="orch-step-num">3</span><span><strong>Click an edge</strong> to remove a connection</span></div>
556
+ <div class="orch-step"><span class="orch-step-num">4</span><span>Agents on the same level <strong>run in parallel</strong>, dependent agents wait</span></div>
557
+ </div>
558
+ </div>
559
+ </div>
560
+ <div class="dag-editor-toolbar af-section">
561
+ <div class="af-section-label">Details</div>
562
+ <div class="af-grid-2">
563
+ <div class="af-field">
564
+ <label for="dag-form-title">Title</label>
565
+ <input id="dag-form-title" type="text" placeholder="e.g. Full Review Pipeline" required>
566
+ </div>
567
+ <div class="af-field">
568
+ <label for="dag-form-desc">Description</label>
569
+ <input id="dag-form-desc" type="text" placeholder="Short description">
570
+ </div>
571
+ </div>
572
+ </div>
573
+ <div class="dag-editor-body">
574
+ <div class="dag-node-palette" id="dag-node-palette"></div>
575
+ <div class="dag-canvas-wrap">
576
+ <svg id="dag-canvas" class="dag-canvas"></svg>
577
+ </div>
578
+ </div>
579
+ <input id="dag-form-edit-id" type="hidden">
580
+ <div class="modal-actions">
581
+ <button type="button" id="dag-modal-cancel" class="modal-btn-cancel">Cancel</button>
582
+ <button type="button" id="dag-auto-layout" class="modal-btn-cancel">Auto Layout</button>
583
+ <button type="button" id="dag-modal-save" class="modal-btn-save">Save DAG</button>
584
+ </div>
585
+ </div>
586
+ </div>
587
+
588
+ <!-- Agent Chain Modal -->
589
+ <div id="chain-modal" class="modal-overlay hidden">
590
+ <div class="modal agent-form-modal">
591
+ <div class="modal-header">
592
+ <h3 id="chain-modal-title">New Chain</h3>
593
+ <button id="chain-modal-close" class="modal-close">&times;</button>
594
+ </div>
595
+ <form id="chain-form">
596
+ <div class="af-section">
597
+ <div class="af-section-label">Details</div>
598
+ <div class="af-field">
599
+ <label for="chain-form-title">Title</label>
600
+ <input id="chain-form-title" type="text" placeholder="e.g. Full Code Review Pipeline" required>
601
+ </div>
602
+ <div class="af-field">
603
+ <label for="chain-form-desc">Description</label>
604
+ <input id="chain-form-desc" type="text" placeholder="Short description of the chain">
605
+ </div>
606
+ </div>
607
+ <div class="af-section">
608
+ <div class="af-section-label">Pipeline</div>
609
+ <div id="chain-agent-list" class="chain-agent-list"></div>
610
+ <button type="button" id="chain-add-agent-btn" class="chain-add-agent-btn">+ Add Agent Step</button>
611
+ </div>
612
+ <div class="af-section">
613
+ <div class="af-section-label">Settings</div>
614
+ <div class="af-field">
615
+ <label for="chain-form-context">Context Passing</label>
616
+ <select id="chain-form-context">
617
+ <option value="summary">Summary (recommended)</option>
618
+ <option value="full">Full output</option>
619
+ <option value="none">None</option>
620
+ </select>
621
+ </div>
622
+ </div>
623
+ <input id="chain-form-edit-id" type="hidden">
624
+ <div class="modal-actions">
625
+ <button type="button" id="chain-modal-cancel" class="modal-btn-cancel">Cancel</button>
626
+ <button type="submit" class="modal-btn-save">Save Chain</button>
627
+ </div>
628
+ </form>
629
+ </div>
630
+ </div>
631
+
632
+ <!-- Agent CRUD Modal -->
633
+ <div id="agent-modal" class="modal-overlay hidden">
634
+ <div class="modal agent-form-modal">
635
+ <div class="modal-header">
636
+ <h3 id="agent-modal-title">New Agent</h3>
637
+ <button id="agent-modal-close" class="modal-close">&times;</button>
638
+ </div>
639
+ <form id="agent-form">
640
+ <div class="af-section">
641
+ <div class="af-section-label">Identity</div>
642
+ <div class="af-grid-2">
643
+ <div class="af-field">
644
+ <label for="agent-form-title">Title</label>
645
+ <input id="agent-form-title" type="text" placeholder="e.g. Code Documenter" required>
646
+ </div>
647
+ <div class="af-field">
648
+ <label for="agent-form-icon">Icon</label>
649
+ <select id="agent-form-icon">
650
+ <option value="search">Search</option>
651
+ <option value="bug">Bug</option>
652
+ <option value="check">Check</option>
653
+ <option value="tool" selected>Tool</option>
654
+ </select>
655
+ </div>
656
+ </div>
657
+ <div class="af-field">
658
+ <label for="agent-form-desc">Description</label>
659
+ <input id="agent-form-desc" type="text" placeholder="Short description of what this agent does" required>
660
+ </div>
661
+ </div>
662
+ <div class="af-section">
663
+ <div class="af-section-label">Behavior</div>
664
+ <div class="af-field">
665
+ <label for="agent-form-goal">Goal</label>
666
+ <textarea id="agent-form-goal" rows="4" placeholder="Describe the agent's goal in detail. Be specific about what files to look at, what to check, and what output to produce..." required></textarea>
667
+ </div>
668
+ </div>
669
+ <div class="af-section">
670
+ <div class="af-section-label">Constraints</div>
671
+ <div class="af-grid-2">
672
+ <div class="af-field">
673
+ <label for="agent-form-max-turns">Max Turns</label>
674
+ <div class="af-input-with-hint">
675
+ <input id="agent-form-max-turns" type="number" min="1" max="200" value="50">
676
+ <span class="af-hint">1 - 200</span>
677
+ </div>
678
+ </div>
679
+ <div class="af-field">
680
+ <label for="agent-form-timeout">Timeout (seconds)</label>
681
+ <div class="af-input-with-hint">
682
+ <input id="agent-form-timeout" type="number" min="30" max="3600" value="300">
683
+ <span class="af-hint">30 - 3600</span>
684
+ </div>
685
+ </div>
686
+ </div>
687
+ </div>
688
+ <input id="agent-form-edit-id" type="hidden">
689
+ <div class="modal-actions">
690
+ <button type="button" id="agent-modal-cancel" class="modal-btn-cancel">Cancel</button>
691
+ <button type="submit" class="modal-btn-save">Save Agent</button>
692
+ </div>
693
+ </form>
694
+ </div>
695
+ </div>
696
+
697
+ <!-- Workflow CRUD Modal -->
698
+ <div id="wf-modal" class="modal-overlay hidden">
699
+ <div class="modal agent-form-modal">
700
+ <div class="modal-header">
701
+ <h3 id="wf-modal-title">New Workflow</h3>
702
+ <button id="wf-modal-close" class="modal-close">&times;</button>
703
+ </div>
704
+ <form id="wf-form">
705
+ <div class="af-section">
706
+ <div class="af-section-label">Identity</div>
707
+ <div class="af-field">
708
+ <label for="wf-form-title">Title</label>
709
+ <input id="wf-form-title" type="text" placeholder="e.g. Review PR" required>
710
+ </div>
711
+ <div class="af-field">
712
+ <label for="wf-form-desc">Description</label>
713
+ <input id="wf-form-desc" type="text" placeholder="Short description of this workflow">
714
+ </div>
715
+ </div>
716
+ <div class="af-section">
717
+ <div class="af-section-label">Steps</div>
718
+ <div id="wf-steps-list" class="wf-steps-list"></div>
719
+ <button type="button" id="wf-add-step-btn" class="wf-step-add">+ Add Step</button>
720
+ </div>
721
+ <input id="wf-form-edit-id" type="hidden">
722
+ <div class="modal-actions">
723
+ <button type="button" id="wf-modal-cancel" class="modal-btn-cancel">Cancel</button>
724
+ <button type="submit" class="modal-btn-save">Save Workflow</button>
725
+ </div>
726
+ </form>
727
+ </div>
728
+ </div>
729
+
730
+ <!-- Add Prompt Modal -->
731
+ <div id="prompt-modal" class="modal-overlay hidden">
732
+ <div class="modal">
733
+ <div class="modal-header">
734
+ <h3>New Prompt</h3>
735
+ <button id="modal-close" class="modal-close">&times;</button>
736
+ </div>
737
+ <form id="prompt-form">
738
+ <label for="prompt-title">Title</label>
739
+ <input id="prompt-title" type="text" placeholder="e.g. Optimize Imports" required>
740
+ <label for="prompt-desc">Description</label>
741
+ <input id="prompt-desc" type="text" placeholder="Short description of what it does" required>
742
+ <label for="prompt-text">Prompt</label>
743
+ <textarea id="prompt-text" rows="4" placeholder="The full prompt to send to Claude..." required></textarea>
744
+ <div class="modal-actions">
745
+ <button type="button" id="modal-cancel" class="modal-btn-cancel">Cancel</button>
746
+ <button type="submit" class="modal-btn-save">Save Prompt</button>
747
+ </div>
748
+ </form>
749
+ </div>
750
+ </div>
751
+
752
+ <!-- System Prompt Modal -->
753
+ <div id="system-prompt-modal" class="modal-overlay hidden">
754
+ <div class="modal">
755
+ <div class="modal-header">
756
+ <h3>System Prompt</h3>
757
+ <button id="sp-modal-close" class="modal-close">&times;</button>
758
+ </div>
759
+ <form id="system-prompt-form">
760
+ <label for="sp-textarea">Custom instructions for Claude in this project</label>
761
+ <p class="sp-hint">If a <code>CLAUDE.md</code> file exists in the project root, it is automatically included by the SDK — no need to duplicate it here.</p>
762
+ <textarea id="sp-textarea" rows="8" placeholder="e.g., You are an expert in React + TypeScript. This is a monorepo..."></textarea>
763
+ <div class="modal-actions">
764
+ <button type="button" id="sp-clear-btn" class="modal-btn-cancel">Clear</button>
765
+ <button type="button" id="sp-cancel-btn" class="modal-btn-cancel">Cancel</button>
766
+ <button type="submit" class="modal-btn-save">Save</button>
767
+ </div>
768
+ </form>
769
+ </div>
770
+ </div>
771
+
772
+ <!-- File Picker Modal -->
773
+ <div id="file-picker-modal" class="modal-overlay hidden">
774
+ <div class="modal file-picker-modal">
775
+ <div class="modal-header">
776
+ <h3>Attach Files</h3>
777
+ <button id="fp-modal-close" class="modal-close">&times;</button>
778
+ </div>
779
+ <input id="fp-search" type="text" class="file-picker-search" placeholder="Search files..." autocomplete="off">
780
+ <div id="fp-list" class="file-picker-list"></div>
781
+ <div class="file-picker-footer">
782
+ <span id="fp-count">0 files selected</span>
783
+ <button id="fp-done-btn" class="modal-btn-save">Done</button>
784
+ </div>
785
+ </div>
786
+ </div>
787
+
788
+ <!-- Keyboard Shortcuts Modal -->
789
+ <div id="shortcuts-modal" class="modal-overlay hidden">
790
+ <div class="modal">
791
+ <div class="modal-header">
792
+ <h3>Keyboard Shortcuts</h3>
793
+ <button id="shortcuts-modal-close" class="modal-close">&times;</button>
794
+ </div>
795
+ <table class="shortcuts-table">
796
+ <tr><td><span class="kbd">&#8984;K</span></td><td>Focus session search</td></tr>
797
+ <tr><td><span class="kbd">&#8984;N</span></td><td>New session</td></tr>
798
+ <tr><td><span class="kbd">&#8984;/</span></td><td>Show keyboard shortcuts</td></tr>
799
+ <tr><td><span class="kbd">&#8984;B</span></td><td>Toggle right panel</td></tr>
800
+ <tr><td><span class="kbd">&#8984;&#8679;E</span></td><td>Open file explorer</td></tr>
801
+ <tr><td><span class="kbd">&#8984;&#8679;G</span></td><td>Open git panel</td></tr>
802
+ <tr><td><span class="kbd">&#8984;&#8679;R</span></td><td>Open repos panel</td></tr>
803
+ <tr><td><span class="kbd">&#8984;&#8679;V</span></td><td>Open events panel</td></tr>
804
+ <tr><td><span class="kbd">&#8984;&#8679;A</span></td><td>Go to home page</td></tr>
805
+ <tr><td><span class="kbd">&#8984;&#8679;T</span></td><td>Toggle tips feed</td></tr>
806
+ <tr><td><span class="kbd">&#8984;1</span>–<span class="kbd">&#8984;4</span></td><td>Focus parallel pane 1–4</td></tr>
807
+ <tr><td><span class="kbd">Esc</span></td><td>Close any open modal</td></tr>
808
+ <tr><td><span class="kbd">Enter</span></td><td>Send message</td></tr>
809
+ <tr><td><span class="kbd">Shift+Enter</span></td><td>New line in input</td></tr>
810
+ <tr><td><span class="kbd">/</span></td><td>Slash commands autocomplete</td></tr>
811
+ </table>
812
+ </div>
813
+ </div>
814
+
815
+ <!-- Cost Dashboard Modal -->
816
+ <div id="cost-dashboard-modal" class="modal-overlay hidden">
817
+ <div class="modal cost-dashboard-modal">
818
+ <div class="modal-header">
819
+ <h3>Cost Dashboard</h3>
820
+ <button id="cost-modal-close" class="modal-close">&times;</button>
821
+ </div>
822
+ <div id="cost-dashboard-content">
823
+ <div class="cost-summary-cards" id="cost-summary-cards"></div>
824
+ <div class="cost-table-container">
825
+ <table class="cost-table">
826
+ <thead>
827
+ <tr>
828
+ <th data-sort="title">Session</th>
829
+ <th data-sort="turns">Turns</th>
830
+ <th data-sort="tokens">Tokens</th>
831
+ <th data-sort="cost">Cost</th>
832
+ </tr>
833
+ </thead>
834
+ <tbody id="cost-table-body"></tbody>
835
+ </table>
836
+ </div>
837
+ <div class="cost-chart-section">
838
+ <h4>Daily Costs (Last 30 Days)</h4>
839
+ <div class="cost-chart" id="cost-chart"></div>
840
+ </div>
841
+ </div>
842
+ </div>
843
+ </div>
844
+
845
+ <!-- Background Session Confirmation Dialog -->
846
+ <div id="bg-confirm-modal" class="modal-overlay hidden" data-persistent>
847
+ <div class="modal bg-confirm-modal">
848
+ <div class="modal-header">
849
+ <h3>Session In Progress</h3>
850
+ </div>
851
+ <p class="bg-confirm-text">Claude is still responding in this session. What would you like to do?</p>
852
+ <div class="modal-actions bg-confirm-actions">
853
+ <button id="bg-confirm-cancel" class="modal-btn-cancel">Cancel</button>
854
+ <button id="bg-confirm-abort" class="modal-btn-cancel bg-confirm-abort-btn">Abort Session</button>
855
+ <button id="bg-confirm-background" class="modal-btn-save">Continue in Background</button>
856
+ </div>
857
+ </div>
858
+ </div>
859
+
860
+ <!-- Permission Approval Modal -->
861
+ <div id="perm-modal" class="modal-overlay hidden" data-persistent>
862
+ <div class="modal perm-modal">
863
+ <div class="modal-header perm-modal-header">
864
+ <h3><span class="perm-tool-icon">&#9888;</span> <span id="perm-modal-tool-name">Tool Approval</span></h3>
865
+ </div>
866
+ <span id="perm-bg-badge" class="perm-bg-badge hidden"></span>
867
+ <div id="perm-modal-summary" class="perm-modal-summary"></div>
868
+ <details class="perm-modal-details">
869
+ <summary>Full input</summary>
870
+ <pre id="perm-modal-input" class="perm-modal-input"></pre>
871
+ </details>
872
+ <label class="perm-always-allow">
873
+ <input type="checkbox" id="perm-always-allow-cb">
874
+ Always allow <strong id="perm-always-allow-tool"></strong> this session
875
+ </label>
876
+ <div class="modal-actions">
877
+ <button id="perm-deny-btn" class="perm-deny-btn">Deny</button>
878
+ <button id="perm-allow-btn" class="perm-allow-btn">Allow</button>
879
+ </div>
880
+ </div>
881
+ </div>
882
+
883
+ <!-- Linear Create Issue Modal -->
884
+ <div id="linear-create-modal" class="modal-overlay hidden">
885
+ <div class="modal">
886
+ <div class="modal-header">
887
+ <h3>Create Issue</h3>
888
+ <button id="linear-create-close" class="modal-close">&times;</button>
889
+ </div>
890
+ <form id="linear-create-form">
891
+ <label for="linear-create-title">Title</label>
892
+ <input id="linear-create-title" type="text" placeholder="Issue title" required>
893
+ <label for="linear-create-desc">Description</label>
894
+ <textarea id="linear-create-desc" rows="3" placeholder="Optional description..."></textarea>
895
+ <label for="linear-create-team">Project (Team)</label>
896
+ <select id="linear-create-team" required>
897
+ <option value="">Select a team...</option>
898
+ </select>
899
+ <label for="linear-create-state">State</label>
900
+ <select id="linear-create-state" disabled>
901
+ <option value="">Select a team first...</option>
902
+ </select>
903
+ <div class="modal-actions">
904
+ <button type="button" id="linear-create-cancel" class="modal-btn-cancel">Cancel</button>
905
+ <button type="submit" id="linear-create-submit" class="modal-btn-save">Create</button>
906
+ </div>
907
+ </form>
908
+ </div>
909
+ </div>
910
+
911
+ <!-- Telegram Settings Modal -->
912
+ <div id="telegram-modal" class="modal-overlay hidden">
913
+ <div class="modal telegram-modal">
914
+ <div class="modal-header">
915
+ <h2>
916
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
917
+ <path d="M21.2 4.6L2.4 11.2c-.8.3-.8 1.5 0 1.8l4.6 1.7 1.7 5.5c.2.6 1 .8 1.4.3l2.5-2.8 4.8 3.5c.6.4 1.4.1 1.5-.6L21.2 4.6z"/>
918
+ </svg>
919
+ Telegram Notifications
920
+ </h2>
921
+ <button class="modal-close" id="telegram-close">&times;</button>
922
+ </div>
923
+ <div class="modal-body" style="padding:16px;">
924
+ <div class="telegram-form">
925
+ <label class="telegram-toggle-row">
926
+ <input type="checkbox" id="telegram-enabled">
927
+ <span>Enable Telegram notifications</span>
928
+ </label>
929
+ <div class="telegram-field">
930
+ <label for="telegram-bot-token">Bot Token</label>
931
+ <input type="password" id="telegram-bot-token" placeholder="123456:ABC-DEF..." autocomplete="off">
932
+ </div>
933
+ <div class="telegram-field">
934
+ <label for="telegram-chat-id">Chat ID</label>
935
+ <input type="text" id="telegram-chat-id" placeholder="-100123456789" autocomplete="off">
936
+ </div>
937
+ <div class="telegram-field">
938
+ <label for="telegram-afk-timeout">AFK Approval Timeout (minutes)</label>
939
+ <input type="number" id="telegram-afk-timeout" min="1" max="120" value="15" style="width:80px;">
940
+ </div>
941
+
942
+ <div class="telegram-notify-section">
943
+ <label class="telegram-field-label">Notification Events</label>
944
+ <div class="telegram-notify-grid">
945
+ <label class="telegram-toggle-row"><input type="checkbox" id="tg-notify-session" checked> Session complete</label>
946
+ <label class="telegram-toggle-row"><input type="checkbox" id="tg-notify-workflow" checked> Workflow complete</label>
947
+ <label class="telegram-toggle-row"><input type="checkbox" id="tg-notify-chain" checked> Chain complete</label>
948
+ <label class="telegram-toggle-row"><input type="checkbox" id="tg-notify-agent" checked> Agent complete</label>
949
+ <label class="telegram-toggle-row"><input type="checkbox" id="tg-notify-orchestrator" checked> Orchestrator complete</label>
950
+ <label class="telegram-toggle-row"><input type="checkbox" id="tg-notify-dag" checked> DAG complete</label>
951
+ <label class="telegram-toggle-row"><input type="checkbox" id="tg-notify-errors" checked> Errors &amp; failures</label>
952
+ <label class="telegram-toggle-row"><input type="checkbox" id="tg-notify-permissions" checked> Permission requests (AFK approve/deny)</label>
953
+ <label class="telegram-toggle-row"><input type="checkbox" id="tg-notify-start" checked> Task start</label>
954
+ </div>
955
+ </div>
956
+
957
+ <div class="telegram-actions">
958
+ <button class="btn btn-secondary" id="telegram-test-btn">Send Test</button>
959
+ <button class="btn btn-primary" id="telegram-save-btn">Save</button>
960
+ </div>
961
+ <div id="telegram-status" class="telegram-status hidden"></div>
962
+ <details class="telegram-help">
963
+ <summary>Setup instructions</summary>
964
+ <ol>
965
+ <li>Open Telegram and search for <strong>@BotFather</strong></li>
966
+ <li>Send <code>/newbot</code> and follow the prompts to create a bot</li>
967
+ <li>Copy the <strong>Bot Token</strong> and paste it above</li>
968
+ <li>Start a chat with your new bot (send <code>/start</code>)</li>
969
+ <li>To find your <strong>Chat ID</strong>, send a message to the bot, then visit:<br>
970
+ <code>https://api.telegram.org/bot&lt;TOKEN&gt;/getUpdates</code><br>
971
+ Look for <code>"chat":{"id":...</code> in the response</li>
972
+ <li>For group chats, add the bot to the group and use the group's chat ID (starts with <code>-</code>)</li>
973
+ </ol>
974
+ </details>
975
+ </div>
976
+ </div>
977
+ </div>
978
+ </div>
979
+
980
+ <!-- MCP Server Management Modal -->
981
+ <div id="mcp-modal" class="modal-overlay hidden">
982
+ <div class="modal mcp-modal">
983
+ <div class="modal-header">
984
+ <h3>MCP Servers</h3>
985
+ <button id="mcp-modal-close" class="modal-close">&times;</button>
986
+ </div>
987
+ <div id="mcp-server-list" class="mcp-server-list"></div>
988
+ <div id="mcp-form-container" class="mcp-form-container hidden">
989
+ <h4 id="mcp-form-title" class="mcp-form-title">Add Server</h4>
990
+ <form id="mcp-form">
991
+ <label for="mcp-name">Name</label>
992
+ <input id="mcp-name" type="text" placeholder="my-server" required>
993
+ <label for="mcp-type">Type</label>
994
+ <select id="mcp-type">
995
+ <option value="stdio">stdio</option>
996
+ <option value="sse">sse</option>
997
+ <option value="http">http</option>
998
+ </select>
999
+ <div id="mcp-stdio-fields">
1000
+ <label for="mcp-command">Command</label>
1001
+ <input id="mcp-command" type="text" placeholder="npx -y @modelcontextprotocol/server-name">
1002
+ <label for="mcp-args">Args (one per line)</label>
1003
+ <textarea id="mcp-args" rows="2" placeholder="--flag&#10;value"></textarea>
1004
+ <label for="mcp-env">Environment (KEY=VALUE, one per line)</label>
1005
+ <textarea id="mcp-env" rows="2" placeholder="API_KEY=xxx"></textarea>
1006
+ </div>
1007
+ <div id="mcp-url-fields" class="hidden">
1008
+ <label for="mcp-url">URL</label>
1009
+ <input id="mcp-url" type="text" placeholder="https://...">
1010
+ </div>
1011
+ <div class="modal-actions">
1012
+ <button type="button" id="mcp-form-cancel" class="modal-btn-cancel">Cancel</button>
1013
+ <button type="submit" id="mcp-form-save" class="modal-btn-save">Save</button>
1014
+ </div>
1015
+ </form>
1016
+ </div>
1017
+ <div class="mcp-modal-footer">
1018
+ <button id="mcp-add-btn" class="modal-btn-save">+ Add Server</button>
1019
+ </div>
1020
+ </div>
1021
+ </div>
1022
+
1023
+ <!-- Add Project Modal -->
1024
+ <div id="add-project-modal" class="modal-overlay hidden">
1025
+ <div class="modal add-project-modal">
1026
+ <div class="modal-header">
1027
+ <h3>Add Project</h3>
1028
+ <button id="add-project-close" class="modal-close">&times;</button>
1029
+ </div>
1030
+ <div class="add-project-body">
1031
+ <div id="folder-breadcrumb" class="folder-breadcrumb"></div>
1032
+ <div id="folder-list" class="folder-list"></div>
1033
+ <div class="folder-select-row">
1034
+ <input id="add-project-name" type="text" placeholder="Project name" autocomplete="off">
1035
+ <button id="add-project-confirm" class="modal-btn-save">Add</button>
1036
+ </div>
1037
+ </div>
1038
+ </div>
1039
+ </div>
1040
+
1041
+ <!-- Status Bar -->
1042
+ <footer class="status-bar" id="status-bar">
1043
+ <div class="status-bar-left">
1044
+ <span class="sb-item sb-connection" id="sb-connection" title="Connection status">
1045
+ <span class="sb-dot" id="sb-dot"></span>
1046
+ <span id="sb-connection-text">connecting</span>
1047
+ </span>
1048
+ <span class="sb-sep"></span>
1049
+ <span class="sb-item sb-branch" id="sb-branch" title="Current git branch">
1050
+ <svg width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="6" y1="3" x2="6" y2="15"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M18 9a9 9 0 0 1-9 9"/></svg>
1051
+ <span id="sb-branch-name">--</span>
1052
+ </span>
1053
+ <span class="sb-sep"></span>
1054
+ <span class="sb-item sb-project" id="sb-project" title="Current project">
1055
+ <svg width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg>
1056
+ <span id="sb-project-name">no project</span>
1057
+ </span>
1058
+ </div>
1059
+ <div class="status-bar-center">
1060
+ <span class="sb-item sb-activity" id="sb-activity"></span>
1061
+ </div>
1062
+ <div class="status-bar-right">
1063
+ <span class="sb-item sb-bg-sessions hidden" id="sb-bg-sessions" title="Background sessions">
1064
+ <span class="sb-bg-dot"></span>
1065
+ <span id="sb-bg-count">0</span> bg
1066
+ </span>
1067
+ <span class="sb-sep sb-bg-sep hidden" id="sb-bg-sep"></span>
1068
+ <span class="sb-item sb-tokens hidden" id="sb-streaming-tokens" title="Streaming tokens">
1069
+ <span id="sb-tokens-value">~0 tokens</span>
1070
+ </span>
1071
+ <span class="sb-sep sb-tokens-sep hidden" id="sb-tokens-sep"></span>
1072
+ <span class="sb-item sb-context-gauge" id="sb-context-gauge-item">
1073
+ <span id="context-gauge" class="context-gauge hidden" title="Session context usage">
1074
+ <span class="context-gauge-bar"><span id="context-gauge-fill" class="context-gauge-fill"></span></span>
1075
+ <span id="context-gauge-label" class="context-gauge-label">0/200k</span>
1076
+ </span>
1077
+ </span>
1078
+ <span class="sb-sep hidden" id="sb-gauge-sep"></span>
1079
+ <span class="sb-item sb-credits" id="sb-credits" title="Credits">
1080
+ <svg width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"/></svg>
1081
+ <div class="sb-credits-popup" id="sb-credits-popup">
1082
+ <div class="sb-credits-header">Credits</div>
1083
+ <div class="sb-credits-body">
1084
+ <div class="sb-credits-row">
1085
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="var(--accent)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>
1086
+ <div class="sb-credits-info">
1087
+ <span class="sb-credits-role">Creator & Architect</span>
1088
+ <span class="sb-credits-name">Hamed Farag</span>
1089
+ </div>
1090
+ </div>
1091
+ <div class="sb-credits-divider"></div>
1092
+ <div class="sb-credits-row">
1093
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#a78bfa" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2a4 4 0 0 0-4 4c0 2 2 3 2 5h4c0-2 2-3 2-5a4 4 0 0 0-4-4z"/><line x1="10" y1="17" x2="14" y2="17"/><line x1="10" y1="20" x2="14" y2="20"/><line x1="11" y1="23" x2="13" y2="23"/></svg>
1094
+ <div class="sb-credits-info">
1095
+ <span class="sb-credits-role">AI Assistant</span>
1096
+ <span class="sb-credits-name">Claude Code AI</span>
1097
+ </div>
1098
+ </div>
1099
+ </div>
1100
+ <div class="sb-credits-sponsor">
1101
+ <div class="sb-credits-row">
1102
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#f59e0b" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="7" width="20" height="14" rx="2" ry="2"/><path d="M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"/></svg>
1103
+ <div class="sb-credits-info">
1104
+ <span class="sb-credits-role">Sponsor</span>
1105
+ <span class="sb-credits-name">WakeCap</span>
1106
+ </div>
1107
+ </div>
1108
+ </div>
1109
+ </div>
1110
+ </span>
1111
+ <span class="sb-sep sb-credits-sep"></span>
1112
+ <span class="sb-item sb-cost sb-cost-hint" id="sb-cost">
1113
+ <span id="sb-session-cost">$0.00</span>
1114
+ <span class="sb-cost-pipe">/</span>
1115
+ <span id="sb-total-cost">$0.00</span>
1116
+ <div class="sb-hint-popup">
1117
+ <div class="sb-hint-header">Session / Total Cost</div>
1118
+ <div class="sb-hint-body">
1119
+ <p>Every message carries a fixed <strong>~20k token</strong> overhead from the Claude Code SDK — this includes the system prompt (~12-15k), core tool schemas (~4-5k), and environment context (~1k).</p>
1120
+ <p>This cost is unavoidable and cannot be reduced. Disabling optional tools in Session settings saves only ~2-3k tokens.</p>
1121
+ <p class="sb-hint-dim">Subsequent turns benefit from Anthropic's prompt caching, which significantly reduces the effective cost.</p>
1122
+ </div>
1123
+ </div>
1124
+ </span>
1125
+ </div>
1126
+ </footer>
1127
+
1128
+ <!-- Toast Container -->
1129
+ <div id="toast-container" class="toast-container"></div>
1130
+
1131
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
1132
+ <script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
1133
+ <script type="module" src="js/main.js"></script>
1134
+ <script>
1135
+ if ('serviceWorker' in navigator) {
1136
+ navigator.serviceWorker.register('/sw.js');
1137
+ }
1138
+ </script>
1139
+ </body>
1140
+ </html>