agentopia 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.
- package/.claude/settings.local.json +28 -0
- package/dist/app.d.ts +10 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +121 -0
- package/dist/app.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +19 -0
- package/dist/config.js.map +1 -0
- package/dist/db/database.d.ts +5 -0
- package/dist/db/database.d.ts.map +1 -0
- package/dist/db/database.js +39 -0
- package/dist/db/database.js.map +1 -0
- package/dist/db/schema.d.ts +3 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +621 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +4 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +9 -0
- package/dist/logger.js.map +1 -0
- package/dist/middleware/auth.d.ts +13 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +733 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/routes/agents.d.ts +3 -0
- package/dist/routes/agents.d.ts.map +1 -0
- package/dist/routes/agents.js +1058 -0
- package/dist/routes/agents.js.map +1 -0
- package/dist/routes/issues.d.ts +4 -0
- package/dist/routes/issues.d.ts.map +1 -0
- package/dist/routes/issues.js +946 -0
- package/dist/routes/issues.js.map +1 -0
- package/dist/routes/knowledge.d.ts +3 -0
- package/dist/routes/knowledge.d.ts.map +1 -0
- package/dist/routes/knowledge.js +117 -0
- package/dist/routes/knowledge.js.map +1 -0
- package/dist/routes/memories.d.ts +3 -0
- package/dist/routes/memories.d.ts.map +1 -0
- package/dist/routes/memories.js +115 -0
- package/dist/routes/memories.js.map +1 -0
- package/dist/routes/messages.d.ts +3 -0
- package/dist/routes/messages.d.ts.map +1 -0
- package/dist/routes/messages.js +130 -0
- package/dist/routes/messages.js.map +1 -0
- package/dist/routes/projects.d.ts +3 -0
- package/dist/routes/projects.d.ts.map +1 -0
- package/dist/routes/projects.js +754 -0
- package/dist/routes/projects.js.map +1 -0
- package/dist/routes/templates.d.ts +3 -0
- package/dist/routes/templates.d.ts.map +1 -0
- package/dist/routes/templates.js +117 -0
- package/dist/routes/templates.js.map +1 -0
- package/dist/routes/ui.d.ts +3 -0
- package/dist/routes/ui.d.ts.map +1 -0
- package/dist/routes/ui.js +38 -0
- package/dist/routes/ui.js.map +1 -0
- package/dist/services/agent-hierarchy.d.ts +14 -0
- package/dist/services/agent-hierarchy.d.ts.map +1 -0
- package/dist/services/agent-hierarchy.js +58 -0
- package/dist/services/agent-hierarchy.js.map +1 -0
- package/dist/services/agent-issue-batch.d.ts +17 -0
- package/dist/services/agent-issue-batch.d.ts.map +1 -0
- package/dist/services/agent-issue-batch.js +57 -0
- package/dist/services/agent-issue-batch.js.map +1 -0
- package/dist/services/controller.d.ts +4 -0
- package/dist/services/controller.d.ts.map +1 -0
- package/dist/services/controller.js +237 -0
- package/dist/services/controller.js.map +1 -0
- package/dist/services/langgraph-runner.d.ts +33 -0
- package/dist/services/langgraph-runner.d.ts.map +1 -0
- package/dist/services/langgraph-runner.js +478 -0
- package/dist/services/langgraph-runner.js.map +1 -0
- package/dist/services/orchestrator.d.ts +9 -0
- package/dist/services/orchestrator.d.ts.map +1 -0
- package/dist/services/orchestrator.js +116 -0
- package/dist/services/orchestrator.js.map +1 -0
- package/dist/services/pre-controller.d.ts +7 -0
- package/dist/services/pre-controller.d.ts.map +1 -0
- package/dist/services/pre-controller.js +101 -0
- package/dist/services/pre-controller.js.map +1 -0
- package/dist/services/process-manager.d.ts +67 -0
- package/dist/services/process-manager.d.ts.map +1 -0
- package/dist/services/process-manager.js +938 -0
- package/dist/services/process-manager.js.map +1 -0
- package/dist/services/project-permissions.d.ts +84 -0
- package/dist/services/project-permissions.d.ts.map +1 -0
- package/dist/services/project-permissions.js +129 -0
- package/dist/services/project-permissions.js.map +1 -0
- package/dist/services/scheduler.d.ts +6 -0
- package/dist/services/scheduler.d.ts.map +1 -0
- package/dist/services/scheduler.js +300 -0
- package/dist/services/scheduler.js.map +1 -0
- package/dist/services/system-prompt.d.ts +3 -0
- package/dist/services/system-prompt.d.ts.map +1 -0
- package/dist/services/system-prompt.js +285 -0
- package/dist/services/system-prompt.js.map +1 -0
- package/dist/services/terminal.d.ts +18 -0
- package/dist/services/terminal.d.ts.map +1 -0
- package/dist/services/terminal.js +222 -0
- package/dist/services/terminal.js.map +1 -0
- package/dist/services/websocket.d.ts +15 -0
- package/dist/services/websocket.d.ts.map +1 -0
- package/dist/services/websocket.js +204 -0
- package/dist/services/websocket.js.map +1 -0
- package/dist/types.d.ts +108 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/env.ini +18 -0
- package/package.json +38 -0
- package/project_id +0 -0
- package/public/admin-users.html +188 -0
- package/public/agent.html +199 -0
- package/public/css/issues.css +275 -0
- package/public/css/style.css +1299 -0
- package/public/index.html +166 -0
- package/public/issue.html +76 -0
- package/public/js/agent.js +19 -0
- package/public/js/common.js +735 -0
- package/public/js/dashboard.js +772 -0
- package/public/js/files-panel.js +703 -0
- package/public/js/interactive-terminal.js +201 -0
- package/public/js/issue-renderer.js +559 -0
- package/public/js/issue.js +57 -0
- package/public/js/project.js +2425 -0
- package/public/js/terminal.js +564 -0
- package/public/project.html +430 -0
- package/public/terminal.html +67 -0
- package/public/vendor/marked.js +74 -0
- package/public/vendor/xterm-addon-fit.js +2 -0
- package/public/vendor/xterm.css +209 -0
- package/public/vendor/xterm.js +2 -0
- package/send_message_and_update_issue.js +65 -0
- package/tsconfig.json +19 -0
- package/update_round2_and_create_round3.js +284 -0
|
@@ -0,0 +1,199 @@
|
|
|
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
|
+
<title>Argus - Agent Terminal</title>
|
|
7
|
+
<link rel="stylesheet" href="/public/css/style.css">
|
|
8
|
+
<link rel="stylesheet" href="/public/vendor/xterm.css">
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<div class="overlay" id="overlay" onclick="closeDrawer()"></div>
|
|
12
|
+
<div class="drawer" id="drawer">
|
|
13
|
+
<div class="drawer-header">
|
|
14
|
+
<h3><span style="color:var(--accent)">Argus</span></h3>
|
|
15
|
+
<button class="drawer-close" onclick="closeDrawer()">×</button>
|
|
16
|
+
</div>
|
|
17
|
+
<div class="drawer-content">
|
|
18
|
+
<div class="drawer-section">
|
|
19
|
+
<div class="drawer-section-header">Navigation</div>
|
|
20
|
+
<a href="/" class="drawer-link">Dashboard</a>
|
|
21
|
+
</div>
|
|
22
|
+
<div class="drawer-section">
|
|
23
|
+
<div class="drawer-section-header">Settings</div>
|
|
24
|
+
<div class="settings-section">
|
|
25
|
+
<div class="setting-group">
|
|
26
|
+
<label>Theme</label>
|
|
27
|
+
<select id="theme-select" onchange="changeTheme(this.value)">
|
|
28
|
+
<option value="github-dark">GitHub Dark</option>
|
|
29
|
+
<option value="dracula">Dracula</option>
|
|
30
|
+
<option value="nord-dark">Nord Dark</option>
|
|
31
|
+
<option value="nord-light">Nord Light</option>
|
|
32
|
+
<option value="monokai">Monokai</option>
|
|
33
|
+
<option value="solarized-dark">Solarized Dark</option>
|
|
34
|
+
<option value="solarized-light">Solarized Light</option>
|
|
35
|
+
</select>
|
|
36
|
+
</div>
|
|
37
|
+
<div class="setting-group">
|
|
38
|
+
<label class="toggle-label">
|
|
39
|
+
Notification Sound
|
|
40
|
+
<button type="button" class="toggle-switch notif-sound-toggle" onclick="toggleNotificationSound()">
|
|
41
|
+
<span class="toggle-knob"></span>
|
|
42
|
+
</button>
|
|
43
|
+
</label>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
<div class="drawer-section">
|
|
48
|
+
<a href="/change-password" class="drawer-link">Change Password</a>
|
|
49
|
+
<a href="#" class="drawer-link" onclick="logout();return false" style="color:var(--error)">Logout</a>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<header>
|
|
55
|
+
<button class="menu-btn" onclick="toggleDrawer()">
|
|
56
|
+
<span></span><span></span><span></span>
|
|
57
|
+
</button>
|
|
58
|
+
<h1><a href="/" style="color:var(--accent);text-decoration:none">Argus</a></h1>
|
|
59
|
+
<div class="breadcrumb" style="margin-left:12px">
|
|
60
|
+
<a href="/">Projects</a> / <a id="project-link" href="#">Project</a> / <span id="agent-name">Agent</span>
|
|
61
|
+
</div>
|
|
62
|
+
<div class="header-right"></div>
|
|
63
|
+
</header>
|
|
64
|
+
|
|
65
|
+
<div class="container">
|
|
66
|
+
<!-- Agent Info -->
|
|
67
|
+
<div class="card mb-16">
|
|
68
|
+
<div class="flex-between">
|
|
69
|
+
<h2 id="agent-title">Agent</h2>
|
|
70
|
+
<div class="flex">
|
|
71
|
+
<span id="agent-status" class="status-badge"></span>
|
|
72
|
+
<button class="btn btn-sm" id="btn-chat" onclick="openTerminal()">Chat</button>
|
|
73
|
+
<button class="btn btn-sm" id="btn-retry" onclick="retryAgent()" style="display:none;color:var(--warning)">Retry</button>
|
|
74
|
+
<button class="btn btn-primary btn-sm" id="btn-start" onclick="quickStart()">Start</button>
|
|
75
|
+
<button class="btn btn-danger btn-sm" id="btn-stop" onclick="stopAgent()" style="display:none">Stop</button>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
<div class="info-panel mt-16">
|
|
79
|
+
<dt>Role</dt><dd id="agent-role"></dd>
|
|
80
|
+
<dt>Type</dt><dd id="agent-type"></dd>
|
|
81
|
+
<dt>Status</dt><dd id="agent-status-text"></dd>
|
|
82
|
+
<dt>Started</dt><dd id="agent-started"></dd>
|
|
83
|
+
</div>
|
|
84
|
+
|
|
85
|
+
<!-- Working Directory -->
|
|
86
|
+
<div class="mt-16">
|
|
87
|
+
<label style="font-size:11px;font-weight:bold;text-transform:uppercase;letter-spacing:0.03em;opacity:0.6;margin-bottom:6px;display:block">Working Directory</label>
|
|
88
|
+
<div style="display:flex;gap:8px;align-items:center">
|
|
89
|
+
<input type="text" id="agent-workdir" style="flex:1;padding:8px 12px;background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--fg);font-size:13px;font-family:monospace" placeholder="(default: server cwd)">
|
|
90
|
+
<button class="btn btn-sm btn-primary" onclick="saveWorkdir()">Save</button>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
|
|
94
|
+
<!-- Session Settings -->
|
|
95
|
+
<div class="mt-16">
|
|
96
|
+
<label style="font-size:11px;font-weight:bold;text-transform:uppercase;letter-spacing:0.03em;opacity:0.6;margin-bottom:6px;display:block">Session Settings</label>
|
|
97
|
+
<div style="display:flex;gap:16px;align-items:center;flex-wrap:wrap">
|
|
98
|
+
<div>
|
|
99
|
+
<span style="font-size:12px;color:var(--text-secondary)">Max Cache Tokens:</span>
|
|
100
|
+
<input type="number" id="agent-maxtokens" min="0" value="0" style="width:100px;padding:6px 8px;background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--fg);font-size:13px;text-align:center;margin:0 4px">
|
|
101
|
+
<button class="btn btn-sm" onclick="saveMaxTokens()">Save</button>
|
|
102
|
+
<span style="font-size:11px;color:var(--text-secondary);opacity:0.7;margin-left:4px">0 = run-count mode; reset session when cache tokens exceed this value</span>
|
|
103
|
+
</div>
|
|
104
|
+
<div>
|
|
105
|
+
<span style="font-size:12px;color:var(--text-secondary)">Max Runs per Session:</span>
|
|
106
|
+
<input type="number" id="agent-maxruns" min="1" value="10" style="width:60px;padding:6px 8px;background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--fg);font-size:13px;text-align:center;margin:0 4px">
|
|
107
|
+
<button class="btn btn-sm" onclick="saveMaxRuns()">Save</button>
|
|
108
|
+
<span style="font-size:11px;color:var(--text-secondary);opacity:0.7;margin-left:4px">token limit takes priority</span>
|
|
109
|
+
</div>
|
|
110
|
+
<div>
|
|
111
|
+
<span style="font-size:12px;color:var(--text-secondary)">Resume Timeout (s):</span>
|
|
112
|
+
<input type="number" id="agent-resumetimeout" min="0" value="300" style="width:80px;padding:6px 8px;background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--fg);font-size:13px;text-align:center;margin:0 4px">
|
|
113
|
+
<button class="btn btn-sm" onclick="saveResumeTimeout()">Save</button>
|
|
114
|
+
<span style="font-size:11px;color:var(--text-secondary);opacity:0.7;margin-left:4px">Auto new session on timeout; 0 = unlimited</span>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
</div>
|
|
118
|
+
|
|
119
|
+
<!-- Custom Instructions -->
|
|
120
|
+
<div class="mt-16">
|
|
121
|
+
<label style="font-size:11px;font-weight:bold;text-transform:uppercase;letter-spacing:0.03em;opacity:0.6;margin-bottom:6px;display:block">Custom Instructions</label>
|
|
122
|
+
<div style="display:flex;gap:8px;align-items:flex-start">
|
|
123
|
+
<textarea id="agent-instructions" rows="4" style="flex:1;padding:8px 12px;background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--fg);font-size:13px;font-family:inherit;resize:vertical" placeholder="Extra instructions for this agent (appended to system prompt)..."></textarea>
|
|
124
|
+
<button class="btn btn-sm btn-primary" onclick="saveInstructions()">Save</button>
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
|
|
128
|
+
<!-- System Prompt Preview -->
|
|
129
|
+
<div class="mt-16">
|
|
130
|
+
<div class="flex-between" style="margin-bottom:6px">
|
|
131
|
+
<label style="font-size:11px;font-weight:bold;text-transform:uppercase;letter-spacing:0.03em;opacity:0.6">System Prompt (auto-generated, read-only)</label>
|
|
132
|
+
<button class="btn btn-sm" onclick="toggleSystemPrompt()">Show/Hide</button>
|
|
133
|
+
</div>
|
|
134
|
+
<pre id="system-prompt-preview" style="display:none;padding:12px;background:var(--bg);border:1px solid var(--border);border-radius:6px;font-size:11px;color:var(--text-secondary);max-height:300px;overflow:auto;white-space:pre-wrap;word-break:break-word"></pre>
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
|
|
138
|
+
<!-- Activity Summary -->
|
|
139
|
+
<div class="card mb-16" id="activity-panel" style="display:none">
|
|
140
|
+
<div class="flex-between mb-16">
|
|
141
|
+
<h2>Activity Summary</h2>
|
|
142
|
+
<span id="activity-count" style="font-size:12px;color:var(--text-secondary)"></span>
|
|
143
|
+
</div>
|
|
144
|
+
<div id="activity-list" class="activity-list"></div>
|
|
145
|
+
</div>
|
|
146
|
+
|
|
147
|
+
<!-- Messages Inbox -->
|
|
148
|
+
<div class="card mb-16" id="messages-panel">
|
|
149
|
+
<div class="flex-between mb-16">
|
|
150
|
+
<h2>Messages <span id="unread-badge" style="display:none;font-size:12px;background:var(--accent);color:#fff;padding:1px 8px;border-radius:10px;margin-left:6px;font-weight:600"></span></h2>
|
|
151
|
+
<div class="flex">
|
|
152
|
+
<button class="btn btn-sm" onclick="markAllRead()">Mark all read</button>
|
|
153
|
+
<button class="btn btn-sm" onclick="showSendMessage()">Send Message</button>
|
|
154
|
+
</div>
|
|
155
|
+
</div>
|
|
156
|
+
<div id="messages-list" style="max-height:300px;overflow-y:auto"></div>
|
|
157
|
+
</div>
|
|
158
|
+
|
|
159
|
+
<!-- Workspace -->
|
|
160
|
+
<div class="card workspace-card">
|
|
161
|
+
<div class="workspace-tabs" role="tablist" aria-label="Agent workspace panels">
|
|
162
|
+
<button class="workspace-tab active" type="button" data-panel="terminal" onclick="switchAgentWorkspace('terminal')">Terminal</button>
|
|
163
|
+
</div>
|
|
164
|
+
|
|
165
|
+
<div id="workspace-terminal-panel" class="workspace-panel active">
|
|
166
|
+
<div class="flex-between mb-16">
|
|
167
|
+
<h2>Terminal Output</h2>
|
|
168
|
+
<button class="btn btn-sm" onclick="clearTerminal()">Clear</button>
|
|
169
|
+
</div>
|
|
170
|
+
<div id="terminal" class="terminal-container"></div>
|
|
171
|
+
<div id="thinking-indicator" style="display:none" class="thinking-bar">
|
|
172
|
+
<span class="thinking-spinner">✦</span> Agent is thinking...
|
|
173
|
+
</div>
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
176
|
+
</div>
|
|
177
|
+
|
|
178
|
+
<!-- Start Modal -->
|
|
179
|
+
<div class="modal-overlay" id="startModal">
|
|
180
|
+
<div class="modal">
|
|
181
|
+
<h3>Start with Custom Prompt</h3>
|
|
182
|
+
<div class="form-group">
|
|
183
|
+
<label>Custom Prompt (optional — leave empty to auto-generate)</label>
|
|
184
|
+
<textarea id="start-prompt" rows="5" placeholder="Override prompt, or leave empty..."></textarea>
|
|
185
|
+
</div>
|
|
186
|
+
<div class="modal-actions">
|
|
187
|
+
<button class="btn" onclick="hideModal()">Cancel</button>
|
|
188
|
+
<button class="btn btn-primary" onclick="startAgent()">Start</button>
|
|
189
|
+
</div>
|
|
190
|
+
</div>
|
|
191
|
+
</div>
|
|
192
|
+
|
|
193
|
+
<script src="/public/js/common.js?v=2"></script>
|
|
194
|
+
<script src="/public/vendor/xterm.js"></script>
|
|
195
|
+
<script src="/public/vendor/xterm-addon-fit.js"></script>
|
|
196
|
+
<script src="/public/js/terminal.js"></script>
|
|
197
|
+
<script src="/public/js/agent.js"></script>
|
|
198
|
+
</body>
|
|
199
|
+
</html>
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/* GitHub-style Issue List */
|
|
2
|
+
.issue-list-item {
|
|
3
|
+
display: flex;
|
|
4
|
+
align-items: flex-start;
|
|
5
|
+
gap: 12px;
|
|
6
|
+
padding: 12px 16px;
|
|
7
|
+
border-bottom: 1px solid var(--border);
|
|
8
|
+
cursor: pointer;
|
|
9
|
+
transition: background 0.1s;
|
|
10
|
+
}
|
|
11
|
+
.issue-list-item:hover { background: var(--selected-bg); }
|
|
12
|
+
.issue-list-item:last-child { border-bottom: none; }
|
|
13
|
+
|
|
14
|
+
.issue-icon {
|
|
15
|
+
flex-shrink: 0;
|
|
16
|
+
width: 20px;
|
|
17
|
+
height: 20px;
|
|
18
|
+
margin-top: 2px;
|
|
19
|
+
}
|
|
20
|
+
.issue-icon-open { color: var(--success); }
|
|
21
|
+
.issue-icon-closed, .issue-icon-done { color: #8b6fcf; }
|
|
22
|
+
.issue-icon-in_progress { color: var(--warning); }
|
|
23
|
+
|
|
24
|
+
.issue-main { flex: 1; min-width: 0; }
|
|
25
|
+
|
|
26
|
+
.issue-title-row {
|
|
27
|
+
display: flex;
|
|
28
|
+
align-items: center;
|
|
29
|
+
gap: 6px;
|
|
30
|
+
flex-wrap: wrap;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.issue-title {
|
|
34
|
+
font-weight: 600;
|
|
35
|
+
font-size: 14px;
|
|
36
|
+
color: var(--fg);
|
|
37
|
+
}
|
|
38
|
+
.issue-title:hover { color: var(--accent); }
|
|
39
|
+
|
|
40
|
+
.issue-label {
|
|
41
|
+
display: inline-block;
|
|
42
|
+
padding: 1px 8px;
|
|
43
|
+
border-radius: 12px;
|
|
44
|
+
font-size: 11px;
|
|
45
|
+
font-weight: 500;
|
|
46
|
+
border: 1px solid var(--border);
|
|
47
|
+
background: var(--selected-bg);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.issue-meta {
|
|
51
|
+
font-size: 12px;
|
|
52
|
+
color: var(--text-secondary);
|
|
53
|
+
margin-top: 4px;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/* GitHub-style Issue Detail */
|
|
57
|
+
.issue-detail-header {
|
|
58
|
+
padding: 16px 0;
|
|
59
|
+
border-bottom: 1px solid var(--border);
|
|
60
|
+
margin-bottom: 16px;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.issue-detail-title {
|
|
64
|
+
font-size: 22px;
|
|
65
|
+
font-weight: 600;
|
|
66
|
+
margin-bottom: 8px;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.issue-detail-title .issue-number {
|
|
70
|
+
color: var(--text-secondary);
|
|
71
|
+
font-weight: 400;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.issue-detail-meta {
|
|
75
|
+
display: flex;
|
|
76
|
+
align-items: center;
|
|
77
|
+
gap: 8px;
|
|
78
|
+
font-size: 13px;
|
|
79
|
+
color: var(--text-secondary);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.issue-detail-layout {
|
|
83
|
+
display: flex;
|
|
84
|
+
gap: 24px;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.issue-detail-main { flex: 1; min-width: 0; }
|
|
88
|
+
|
|
89
|
+
.issue-detail-sidebar {
|
|
90
|
+
width: 240px;
|
|
91
|
+
flex-shrink: 0;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.sidebar-section {
|
|
95
|
+
padding: 12px 0;
|
|
96
|
+
border-bottom: 1px solid var(--border);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.sidebar-section-title {
|
|
100
|
+
font-size: 11px;
|
|
101
|
+
font-weight: 600;
|
|
102
|
+
text-transform: uppercase;
|
|
103
|
+
letter-spacing: 0.03em;
|
|
104
|
+
color: var(--text-secondary);
|
|
105
|
+
margin-bottom: 6px;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.sidebar-value {
|
|
109
|
+
font-size: 13px;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* Timeline / Comments */
|
|
113
|
+
.timeline { margin-top: 16px; }
|
|
114
|
+
|
|
115
|
+
.timeline-item {
|
|
116
|
+
position: relative;
|
|
117
|
+
padding-left: 40px;
|
|
118
|
+
margin-bottom: 16px;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.timeline-item::before {
|
|
122
|
+
content: '';
|
|
123
|
+
position: absolute;
|
|
124
|
+
left: 15px;
|
|
125
|
+
top: 0;
|
|
126
|
+
bottom: -16px;
|
|
127
|
+
width: 2px;
|
|
128
|
+
background: var(--border);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.timeline-item:last-child::before { display: none; }
|
|
132
|
+
|
|
133
|
+
.timeline-avatar {
|
|
134
|
+
position: absolute;
|
|
135
|
+
left: 4px;
|
|
136
|
+
top: 0;
|
|
137
|
+
width: 24px;
|
|
138
|
+
height: 24px;
|
|
139
|
+
border-radius: 50%;
|
|
140
|
+
background: var(--selected-bg);
|
|
141
|
+
border: 2px solid var(--border);
|
|
142
|
+
display: flex;
|
|
143
|
+
align-items: center;
|
|
144
|
+
justify-content: center;
|
|
145
|
+
font-size: 10px;
|
|
146
|
+
color: var(--text-secondary);
|
|
147
|
+
z-index: 1;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.timeline-comment {
|
|
151
|
+
border: 1px solid var(--border);
|
|
152
|
+
border-radius: 6px;
|
|
153
|
+
overflow: hidden;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.timeline-comment-header {
|
|
157
|
+
padding: 8px 12px;
|
|
158
|
+
background: var(--selected-bg);
|
|
159
|
+
border-bottom: 1px solid var(--border);
|
|
160
|
+
font-size: 12px;
|
|
161
|
+
color: var(--text-secondary);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.timeline-comment-header strong { color: var(--fg); }
|
|
165
|
+
|
|
166
|
+
.timeline-comment-body {
|
|
167
|
+
padding: 12px 16px;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/* Issue body (first comment) */
|
|
171
|
+
.issue-body {
|
|
172
|
+
border: 1px solid var(--border);
|
|
173
|
+
border-radius: 6px;
|
|
174
|
+
overflow: hidden;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.issue-body-header {
|
|
178
|
+
padding: 8px 12px;
|
|
179
|
+
background: var(--selected-bg);
|
|
180
|
+
border-bottom: 1px solid var(--border);
|
|
181
|
+
font-size: 12px;
|
|
182
|
+
color: var(--text-secondary);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.issue-body-content {
|
|
186
|
+
padding: 12px 16px;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/* Markdown rendered content */
|
|
190
|
+
.markdown-body {
|
|
191
|
+
font-size: 14px;
|
|
192
|
+
line-height: 1.6;
|
|
193
|
+
word-wrap: break-word;
|
|
194
|
+
}
|
|
195
|
+
.markdown-body h1, .markdown-body h2, .markdown-body h3 {
|
|
196
|
+
margin-top: 16px;
|
|
197
|
+
margin-bottom: 8px;
|
|
198
|
+
font-weight: 600;
|
|
199
|
+
border-bottom: 1px solid var(--border);
|
|
200
|
+
padding-bottom: 4px;
|
|
201
|
+
}
|
|
202
|
+
.markdown-body h1 { font-size: 1.5em; }
|
|
203
|
+
.markdown-body h2 { font-size: 1.3em; }
|
|
204
|
+
.markdown-body h3 { font-size: 1.1em; border-bottom: none; }
|
|
205
|
+
.markdown-body p { margin-bottom: 12px; }
|
|
206
|
+
.markdown-body ul, .markdown-body ol { padding-left: 24px; margin-bottom: 12px; }
|
|
207
|
+
.markdown-body li { margin-bottom: 4px; }
|
|
208
|
+
.markdown-body code {
|
|
209
|
+
padding: 2px 6px;
|
|
210
|
+
border-radius: 4px;
|
|
211
|
+
background: var(--selected-bg);
|
|
212
|
+
font-size: 0.9em;
|
|
213
|
+
font-family: monospace;
|
|
214
|
+
}
|
|
215
|
+
.markdown-body pre {
|
|
216
|
+
padding: 12px;
|
|
217
|
+
border-radius: 6px;
|
|
218
|
+
background: var(--bg);
|
|
219
|
+
border: 1px solid var(--border);
|
|
220
|
+
overflow-x: auto;
|
|
221
|
+
margin-bottom: 12px;
|
|
222
|
+
}
|
|
223
|
+
.markdown-body pre code { padding: 0; background: none; }
|
|
224
|
+
.markdown-body table {
|
|
225
|
+
border-collapse: collapse;
|
|
226
|
+
width: 100%;
|
|
227
|
+
margin-bottom: 12px;
|
|
228
|
+
}
|
|
229
|
+
.markdown-body th, .markdown-body td {
|
|
230
|
+
border: 1px solid var(--border);
|
|
231
|
+
padding: 6px 12px;
|
|
232
|
+
text-align: left;
|
|
233
|
+
}
|
|
234
|
+
.markdown-body th { background: var(--selected-bg); font-weight: 600; }
|
|
235
|
+
.markdown-body blockquote {
|
|
236
|
+
border-left: 3px solid var(--border);
|
|
237
|
+
padding-left: 12px;
|
|
238
|
+
color: var(--text-secondary);
|
|
239
|
+
margin-bottom: 12px;
|
|
240
|
+
}
|
|
241
|
+
.markdown-body strong { font-weight: 600; }
|
|
242
|
+
.markdown-body a { color: var(--accent); }
|
|
243
|
+
.markdown-body hr { border: none; border-top: 1px solid var(--border); margin: 16px 0; }
|
|
244
|
+
|
|
245
|
+
/* Comment input */
|
|
246
|
+
.comment-box {
|
|
247
|
+
margin-top: 16px;
|
|
248
|
+
border: 1px solid var(--border);
|
|
249
|
+
border-radius: 6px;
|
|
250
|
+
overflow: hidden;
|
|
251
|
+
}
|
|
252
|
+
.comment-box textarea {
|
|
253
|
+
width: 100%;
|
|
254
|
+
padding: 12px;
|
|
255
|
+
border: none;
|
|
256
|
+
background: var(--bg);
|
|
257
|
+
color: var(--fg);
|
|
258
|
+
font-size: 13px;
|
|
259
|
+
font-family: inherit;
|
|
260
|
+
resize: vertical;
|
|
261
|
+
min-height: 80px;
|
|
262
|
+
outline: none;
|
|
263
|
+
}
|
|
264
|
+
.comment-box-footer {
|
|
265
|
+
display: flex;
|
|
266
|
+
justify-content: flex-end;
|
|
267
|
+
padding: 8px 12px;
|
|
268
|
+
background: var(--selected-bg);
|
|
269
|
+
border-top: 1px solid var(--border);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
@media (max-width: 768px) {
|
|
273
|
+
.issue-detail-layout { flex-direction: column; }
|
|
274
|
+
.issue-detail-sidebar { width: 100%; }
|
|
275
|
+
}
|