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.
Files changed (140) hide show
  1. package/.claude/settings.local.json +28 -0
  2. package/dist/app.d.ts +10 -0
  3. package/dist/app.d.ts.map +1 -0
  4. package/dist/app.js +121 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/config.d.ts +9 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +19 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/db/database.d.ts +5 -0
  11. package/dist/db/database.d.ts.map +1 -0
  12. package/dist/db/database.js +39 -0
  13. package/dist/db/database.js.map +1 -0
  14. package/dist/db/schema.d.ts +3 -0
  15. package/dist/db/schema.d.ts.map +1 -0
  16. package/dist/db/schema.js +621 -0
  17. package/dist/db/schema.js.map +1 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +49 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/logger.d.ts +4 -0
  23. package/dist/logger.d.ts.map +1 -0
  24. package/dist/logger.js +9 -0
  25. package/dist/logger.js.map +1 -0
  26. package/dist/middleware/auth.d.ts +13 -0
  27. package/dist/middleware/auth.d.ts.map +1 -0
  28. package/dist/middleware/auth.js +733 -0
  29. package/dist/middleware/auth.js.map +1 -0
  30. package/dist/routes/agents.d.ts +3 -0
  31. package/dist/routes/agents.d.ts.map +1 -0
  32. package/dist/routes/agents.js +1058 -0
  33. package/dist/routes/agents.js.map +1 -0
  34. package/dist/routes/issues.d.ts +4 -0
  35. package/dist/routes/issues.d.ts.map +1 -0
  36. package/dist/routes/issues.js +946 -0
  37. package/dist/routes/issues.js.map +1 -0
  38. package/dist/routes/knowledge.d.ts +3 -0
  39. package/dist/routes/knowledge.d.ts.map +1 -0
  40. package/dist/routes/knowledge.js +117 -0
  41. package/dist/routes/knowledge.js.map +1 -0
  42. package/dist/routes/memories.d.ts +3 -0
  43. package/dist/routes/memories.d.ts.map +1 -0
  44. package/dist/routes/memories.js +115 -0
  45. package/dist/routes/memories.js.map +1 -0
  46. package/dist/routes/messages.d.ts +3 -0
  47. package/dist/routes/messages.d.ts.map +1 -0
  48. package/dist/routes/messages.js +130 -0
  49. package/dist/routes/messages.js.map +1 -0
  50. package/dist/routes/projects.d.ts +3 -0
  51. package/dist/routes/projects.d.ts.map +1 -0
  52. package/dist/routes/projects.js +754 -0
  53. package/dist/routes/projects.js.map +1 -0
  54. package/dist/routes/templates.d.ts +3 -0
  55. package/dist/routes/templates.d.ts.map +1 -0
  56. package/dist/routes/templates.js +117 -0
  57. package/dist/routes/templates.js.map +1 -0
  58. package/dist/routes/ui.d.ts +3 -0
  59. package/dist/routes/ui.d.ts.map +1 -0
  60. package/dist/routes/ui.js +38 -0
  61. package/dist/routes/ui.js.map +1 -0
  62. package/dist/services/agent-hierarchy.d.ts +14 -0
  63. package/dist/services/agent-hierarchy.d.ts.map +1 -0
  64. package/dist/services/agent-hierarchy.js +58 -0
  65. package/dist/services/agent-hierarchy.js.map +1 -0
  66. package/dist/services/agent-issue-batch.d.ts +17 -0
  67. package/dist/services/agent-issue-batch.d.ts.map +1 -0
  68. package/dist/services/agent-issue-batch.js +57 -0
  69. package/dist/services/agent-issue-batch.js.map +1 -0
  70. package/dist/services/controller.d.ts +4 -0
  71. package/dist/services/controller.d.ts.map +1 -0
  72. package/dist/services/controller.js +237 -0
  73. package/dist/services/controller.js.map +1 -0
  74. package/dist/services/langgraph-runner.d.ts +33 -0
  75. package/dist/services/langgraph-runner.d.ts.map +1 -0
  76. package/dist/services/langgraph-runner.js +478 -0
  77. package/dist/services/langgraph-runner.js.map +1 -0
  78. package/dist/services/orchestrator.d.ts +9 -0
  79. package/dist/services/orchestrator.d.ts.map +1 -0
  80. package/dist/services/orchestrator.js +116 -0
  81. package/dist/services/orchestrator.js.map +1 -0
  82. package/dist/services/pre-controller.d.ts +7 -0
  83. package/dist/services/pre-controller.d.ts.map +1 -0
  84. package/dist/services/pre-controller.js +101 -0
  85. package/dist/services/pre-controller.js.map +1 -0
  86. package/dist/services/process-manager.d.ts +67 -0
  87. package/dist/services/process-manager.d.ts.map +1 -0
  88. package/dist/services/process-manager.js +938 -0
  89. package/dist/services/process-manager.js.map +1 -0
  90. package/dist/services/project-permissions.d.ts +84 -0
  91. package/dist/services/project-permissions.d.ts.map +1 -0
  92. package/dist/services/project-permissions.js +129 -0
  93. package/dist/services/project-permissions.js.map +1 -0
  94. package/dist/services/scheduler.d.ts +6 -0
  95. package/dist/services/scheduler.d.ts.map +1 -0
  96. package/dist/services/scheduler.js +300 -0
  97. package/dist/services/scheduler.js.map +1 -0
  98. package/dist/services/system-prompt.d.ts +3 -0
  99. package/dist/services/system-prompt.d.ts.map +1 -0
  100. package/dist/services/system-prompt.js +285 -0
  101. package/dist/services/system-prompt.js.map +1 -0
  102. package/dist/services/terminal.d.ts +18 -0
  103. package/dist/services/terminal.d.ts.map +1 -0
  104. package/dist/services/terminal.js +222 -0
  105. package/dist/services/terminal.js.map +1 -0
  106. package/dist/services/websocket.d.ts +15 -0
  107. package/dist/services/websocket.d.ts.map +1 -0
  108. package/dist/services/websocket.js +204 -0
  109. package/dist/services/websocket.js.map +1 -0
  110. package/dist/types.d.ts +108 -0
  111. package/dist/types.d.ts.map +1 -0
  112. package/dist/types.js +3 -0
  113. package/dist/types.js.map +1 -0
  114. package/env.ini +18 -0
  115. package/package.json +38 -0
  116. package/project_id +0 -0
  117. package/public/admin-users.html +188 -0
  118. package/public/agent.html +199 -0
  119. package/public/css/issues.css +275 -0
  120. package/public/css/style.css +1299 -0
  121. package/public/index.html +166 -0
  122. package/public/issue.html +76 -0
  123. package/public/js/agent.js +19 -0
  124. package/public/js/common.js +735 -0
  125. package/public/js/dashboard.js +772 -0
  126. package/public/js/files-panel.js +703 -0
  127. package/public/js/interactive-terminal.js +201 -0
  128. package/public/js/issue-renderer.js +559 -0
  129. package/public/js/issue.js +57 -0
  130. package/public/js/project.js +2425 -0
  131. package/public/js/terminal.js +564 -0
  132. package/public/project.html +430 -0
  133. package/public/terminal.html +67 -0
  134. package/public/vendor/marked.js +74 -0
  135. package/public/vendor/xterm-addon-fit.js +2 -0
  136. package/public/vendor/xterm.css +209 -0
  137. package/public/vendor/xterm.js +2 -0
  138. package/send_message_and_update_issue.js +65 -0
  139. package/tsconfig.json +19 -0
  140. package/update_round2_and_create_round3.js +284 -0
@@ -0,0 +1,430 @@
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 - Project</title>
7
+ <link rel="stylesheet" href="/public/css/style.css">
8
+ <link rel="stylesheet" href="/public/css/issues.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()">&times;</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-name" href="#" onclick="switchTab('overview');return false" style="color:var(--link);text-decoration:none">Loading...</a><span id="breadcrumb-section"></span>
61
+ </div>
62
+ <div class="header-right">
63
+ <div id="ws-status-indicator" style="display:flex;align-items:center;padding-right:12px"></div>
64
+ </div>
65
+ </header>
66
+
67
+ <div class="container">
68
+ <!-- Header bar with project name + actions -->
69
+ <div class="project-header mb-16">
70
+ <div class="project-header-main">
71
+ <div class="project-title-row">
72
+ <h2 id="project-title">Project</h2>
73
+ <span id="project-status" class="status-badge"></span>
74
+ <span id="project-access-badge"></span>
75
+ </div>
76
+ <div class="project-access-row">
77
+ <span class="meta-chip" id="project-access-summary"></span>
78
+ <span class="meta-chip" id="project-owner-summary"></span>
79
+ <button class="btn btn-sm" id="btn-view-members" onclick="openProjectMembersModal(false)">Members</button>
80
+ <button class="btn btn-sm btn-primary" id="btn-share-project" onclick="openProjectMembersModal(true)" style="display:none">Share Settings</button>
81
+ </div>
82
+ <div class="project-inline-note" id="project-debug-note" style="display:none"></div>
83
+ <div class="project-readonly-banner" id="project-readonly-banner" style="display:none"></div>
84
+ </div>
85
+ <div class="flex" id="project-manage-actions" style="display:none">
86
+ <button class="btn btn-sm" id="btn-toggle" onclick="toggleProjectStatus()">Pause</button>
87
+ <button class="btn btn-sm btn-primary" id="btn-trigger" onclick="triggerController()">Trigger Controller</button>
88
+ <button class="btn btn-sm btn-danger" id="btn-delete-project" onclick="deleteProject()">Delete</button>
89
+ </div>
90
+ </div>
91
+
92
+ <!-- Tabs -->
93
+ <div class="tab-bar">
94
+ <div class="tab active" onclick="switchTab('overview')">Overview</div>
95
+ <div class="tab" onclick="switchTab('agents')">Agents</div>
96
+ <div class="tab" onclick="switchTab('issues')">Issues</div>
97
+ <div class="tab" onclick="switchTab('activity')">Activity</div>
98
+ <div class="tab" onclick="switchTab('git')">Git</div>
99
+ <div class="tab" onclick="switchTab('knowledge')">Knowledge</div>
100
+ <div class="tab" onclick="switchTab('files')">Files</div>
101
+ </div>
102
+
103
+ <!-- Overview Tab -->
104
+ <div id="tab-overview">
105
+ <!-- Status Dashboard -->
106
+ <div id="project-dashboard" style="display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px"></div>
107
+
108
+ <div class="card">
109
+ <div class="form-group">
110
+ <label>Project Name</label>
111
+ <input type="text" id="project-name-edit" style="font-size:15px;font-weight:600">
112
+ </div>
113
+ <div class="form-group">
114
+ <label>Description</label>
115
+ <input type="text" id="project-desc-edit" placeholder="Short description">
116
+ </div>
117
+ <div class="form-group">
118
+ <label>Task Description</label>
119
+ <textarea id="project-task" rows="4" placeholder="What should the controller agent do?"></textarea>
120
+ </div>
121
+ <div style="display:flex;gap:16px">
122
+ <div class="form-group" style="flex:1">
123
+ <label>Tool Path</label>
124
+ <input type="text" id="project-cmd" style="font-family:monospace" placeholder="claude">
125
+ </div>
126
+ </div>
127
+ <div style="display:flex;gap:16px;font-size:11px;color:var(--text-secondary);margin-bottom:12px">
128
+ <span>Created: <span id="project-created"></span></span>
129
+ <span id="project-cost" style="display:none">Cost: <strong id="project-cost-value"></strong></span>
130
+ </div>
131
+ <div class="project-inline-note" id="project-overview-readonly-hint" style="display:none"></div>
132
+ <button class="btn btn-primary" id="btn-save-overview" onclick="saveOverview()" style="display:none">Save Changes</button>
133
+ </div>
134
+
135
+ <!-- Cost Time-Series Chart (bottom of overview) -->
136
+ <div id="cost-chart-panel" style="display:none;margin-top:16px">
137
+ <div class="card" style="padding:16px">
138
+ <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:12px">
139
+ <div style="font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;opacity:0.6">Cost Trend</div>
140
+ <div style="display:flex;gap:4px" id="cost-period-tabs">
141
+ <button class="btn btn-sm cost-period-btn" data-period="hour" onclick="switchCostPeriod('hour')" style="padding:2px 8px;font-size:10px">hr</button>
142
+ <button class="btn btn-sm cost-period-btn" data-period="day" onclick="switchCostPeriod('day')" style="padding:2px 8px;font-size:10px">day</button>
143
+ <button class="btn btn-sm cost-period-btn" data-period="week" onclick="switchCostPeriod('week')" style="padding:2px 8px;font-size:10px">wk</button>
144
+ </div>
145
+ </div>
146
+ <div id="cost-chart-agents"></div>
147
+ </div>
148
+ <div class="card" style="padding:16px;margin-top:12px">
149
+ <div style="font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;opacity:0.6;margin-bottom:12px">Cost by Agent</div>
150
+ <div id="cost-agent-comparison"></div>
151
+ </div>
152
+ </div>
153
+ </div>
154
+
155
+ <!-- Agents Tab -->
156
+ <div id="tab-agents" style="display:none">
157
+ <div id="agent-graph-container" style="margin-bottom:16px"></div>
158
+ <div id="orchestration-decision-container" style="margin-bottom:16px"></div>
159
+ <div class="flex-between mb-16">
160
+ <h3>Agents</h3>
161
+ <button class="btn btn-primary btn-sm" id="btn-new-agent" onclick="showCreateAgentModal()" style="display:none">+ New Agent</button>
162
+ </div>
163
+ <div id="agent-error-banner" style="display:none;padding:10px 14px;background:rgba(220,50,47,0.1);border:1px solid rgba(220,50,47,0.3);border-radius:6px;margin-bottom:12px;color:var(--error);font-size:12px"></div>
164
+ <div class="card">
165
+ <ul id="agent-list" class="agent-list">
166
+ <li class="empty-state">Loading agents...</li>
167
+ </ul>
168
+ </div>
169
+ <div id="agent-detail" style="display:none"></div>
170
+ </div>
171
+
172
+ <!-- Issues Tab -->
173
+ <div id="tab-issues" style="display:none">
174
+ <!-- Search + controls -->
175
+ <div style="display:flex;gap:8px;margin-bottom:12px;align-items:center;flex-wrap:wrap">
176
+ <div style="flex:1;min-width:200px;position:relative">
177
+ <input type="text" id="issue-search" placeholder="Search issues..." onkeyup="if(event.key==='Enter')searchIssues()" style="width:100%;padding:6px 30px 6px 10px;background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--fg);font-size:13px;box-sizing:border-box">
178
+ <button onclick="searchIssues()" style="position:absolute;right:2px;top:50%;transform:translateY(-50%);background:none;border:none;color:var(--text-secondary);cursor:pointer;padding:4px 6px" title="Search"><svg width="14" height="14" viewBox="0 0 16 16" fill="currentColor"><path d="M11.5 7a4.5 4.5 0 11-9 0 4.5 4.5 0 019 0zm-.82 4.74a6 6 0 111.06-1.06l3.04 3.04a.75.75 0 11-1.06 1.06l-3.04-3.04z"/></svg></button>
179
+ </div>
180
+ <select id="issue-sort" onchange="loadIssues()" style="padding:6px 8px;background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--fg);font-size:12px">
181
+ <option value="priority">Priority</option>
182
+ <option value="newest" selected>Newest</option>
183
+ <option value="oldest">Oldest</option>
184
+ <option value="updated">Recently updated</option>
185
+ <option value="comments">Most comments</option>
186
+ </select>
187
+ <button class="btn btn-primary btn-sm" id="btn-new-issue" onclick="showCreateIssueModal()" style="display:none">+ New Issue</button>
188
+ </div>
189
+ <!-- Active filters summary -->
190
+ <div id="issue-active-filters" style="display:none;margin-bottom:8px;font-size:12px;color:var(--text-secondary);align-items:center;gap:6px;flex-wrap:wrap"></div>
191
+ <!-- Filter tabs -->
192
+ <div id="issue-filter-tabs" style="display:flex;gap:2px;font-size:13px;margin-bottom:12px"></div>
193
+ <div id="issue-list"></div>
194
+ <div id="issue-pagination" style="display:flex;justify-content:center;gap:8px;margin-top:12px"></div>
195
+ <!-- Issue Detail (inline) -->
196
+ </div>
197
+
198
+ <!-- Activity Tab -->
199
+ <div id="tab-activity" style="display:none">
200
+ <div class="card" id="activity-list">
201
+ <div class="empty-state">Loading activity...</div>
202
+ </div>
203
+ </div>
204
+
205
+ <!-- Git Tab -->
206
+ <div id="tab-git" style="display:none">
207
+ <div id="git-status-summary" style="margin-bottom:16px"></div>
208
+ <div class="card" id="git-commit-list">
209
+ <div class="empty-state">Loading git information...</div>
210
+ </div>
211
+ <div id="git-uncommitted" style="margin-top:16px"></div>
212
+ </div>
213
+
214
+ <!-- Knowledge Tab -->
215
+ <div id="tab-knowledge" style="display:none">
216
+ <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px">
217
+ <div style="display:flex;gap:8px;align-items:center">
218
+ <select id="knowledge-filter-importance" onchange="loadKnowledge()" style="font-size:12px;padding:4px 8px">
219
+ <option value="">All Importance</option>
220
+ <option value="high">High (auto-inject)</option>
221
+ <option value="medium">Medium</option>
222
+ <option value="low">Low</option>
223
+ </select>
224
+ </div>
225
+ <button class="btn btn-primary" id="btn-new-knowledge" onclick="showCreateKnowledgeModal()" style="display:none">+ Add Knowledge</button>
226
+ </div>
227
+ <div id="knowledge-list" class="card">
228
+ <div class="empty-state">Loading...</div>
229
+ </div>
230
+ </div>
231
+
232
+ <!-- Files Tab -->
233
+ <div id="tab-files" style="display:none">
234
+ <div class="card" style="padding:12px 12px 16px">
235
+ <div id="project-files-note" class="file-panel-note" style="display:none"></div>
236
+ <div id="project-files-shell" class="files-shell">
237
+ <aside class="file-browser-pane">
238
+ <div class="file-browser-toolbar">
239
+ <div class="file-browser-toolbar-main">
240
+ <div class="file-toolbar-group">
241
+ <div class="file-pane-label">Agent</div>
242
+ <select id="project-files-agent" class="files-agent-select" onchange="handleProjectFilesAgentChange(this.value)"></select>
243
+ </div>
244
+ <div class="file-toolbar-group">
245
+ <div class="file-pane-label">Working Directory</div>
246
+ <div id="project-files-root-label" class="file-browser-root">Select an agent</div>
247
+ </div>
248
+ </div>
249
+ <label class="file-hidden-toggle">
250
+ <input type="checkbox" id="project-file-show-hidden" onchange="ProjectFiles.toggleHiddenFiles(this.checked)">
251
+ <span>Show hidden</span>
252
+ </label>
253
+ <button class="btn btn-sm file-upload-btn" type="button" onclick="ProjectFiles.triggerUpload()" title="Upload files">&#8613; Upload</button>
254
+ </div>
255
+ <div id="project-file-tree" class="file-tree">
256
+ <div class="empty-state" style="padding:24px 12px">Open the Files tab to load the directory tree.</div>
257
+ </div>
258
+ </aside>
259
+
260
+ <section class="file-editor-pane">
261
+ <div class="file-editor-toolbar">
262
+ <button class="btn btn-sm file-mobile-browse" type="button" onclick="ProjectFiles.showBrowser()">Browse</button>
263
+ <div class="file-editor-meta">
264
+ <div class="file-pane-label">Current File</div>
265
+ <div id="project-file-current-path" class="file-current-path">No file selected</div>
266
+ </div>
267
+ <div class="file-editor-actions">
268
+ <span class="file-save-hint">Ctrl+S</span>
269
+ <button class="btn btn-sm btn-primary" id="project-file-save-btn" type="button" onclick="ProjectFiles.saveCurrentFile()" disabled>Save</button>
270
+ </div>
271
+ </div>
272
+ <div id="project-file-editor-banner" class="file-editor-banner" hidden></div>
273
+ <div id="project-file-editor-status" class="file-editor-status">Select an agent to browse files.</div>
274
+ <div id="project-file-editor" class="file-editor-surface"></div>
275
+ </section>
276
+ </div>
277
+ </div>
278
+ </div>
279
+ </div>
280
+
281
+ <!-- Create/Edit Knowledge Modal -->
282
+ <div class="modal-overlay" id="projectMembersModal" onclick="if(event.target===this)hideModal('projectMembersModal')">
283
+ <div class="modal project-members-modal">
284
+ <div class="project-members-header">
285
+ <div>
286
+ <h3>Project Members &amp; Sharing</h3>
287
+ <div class="project-inline-note" id="project-members-subtitle"></div>
288
+ </div>
289
+ <button class="drawer-close" type="button" onclick="hideModal('projectMembersModal')">&times;</button>
290
+ </div>
291
+ <div class="project-readonly-banner" id="project-members-readonly-note" style="display:none"></div>
292
+ <div class="project-inline-note" id="project-members-debug-hint" style="display:none"></div>
293
+ <div id="project-members-manage-panel">
294
+ <div class="project-share-form">
295
+ <div class="form-group" style="margin-bottom:0">
296
+ <label for="project-share-username">Add Member</label>
297
+ <input type="text" id="project-share-username" placeholder="Enter username, e.g. alice" onkeydown="if(event.key==='Enter'){event.preventDefault();addProjectMember()}">
298
+ </div>
299
+ <button class="btn btn-primary" id="btn-add-member" onclick="addProjectMember()">Grant Access</button>
300
+ </div>
301
+ </div>
302
+ <div id="project-members-list" class="project-members-list">
303
+ <div class="empty-state">Loading members...</div>
304
+ </div>
305
+ </div>
306
+ </div>
307
+
308
+ <div class="modal-overlay" id="knowledgeModal">
309
+ <div class="modal" style="max-width:600px">
310
+ <h3 id="knowledge-modal-title">Add Knowledge Entry</h3>
311
+ <input type="hidden" id="knowledge-edit-id">
312
+ <div class="form-group">
313
+ <label>Title</label>
314
+ <input type="text" id="knowledge-title" placeholder="Knowledge entry title">
315
+ </div>
316
+ <div class="form-group">
317
+ <label>Content</label>
318
+ <textarea id="knowledge-content" rows="8" placeholder="Knowledge content (Markdown supported)..."></textarea>
319
+ </div>
320
+ <div class="form-group">
321
+ <label>Tags (comma-separated)</label>
322
+ <input type="text" id="knowledge-tags" placeholder="architecture, convention, api">
323
+ </div>
324
+ <div class="form-group">
325
+ <label>Importance</label>
326
+ <select id="knowledge-importance">
327
+ <option value="high">High — auto-injected on agent start</option>
328
+ <option value="medium" selected>Medium — queryable on demand</option>
329
+ <option value="low">Low — reference</option>
330
+ </select>
331
+ </div>
332
+ <div class="modal-actions">
333
+ <button class="btn" onclick="hideModal('knowledgeModal')">Cancel</button>
334
+ <button class="btn btn-primary" onclick="saveKnowledge()">Save</button>
335
+ </div>
336
+ </div>
337
+ </div>
338
+
339
+ <!-- Create Agent Modal -->
340
+ <div class="modal-overlay" id="createAgentModal">
341
+ <div class="modal">
342
+ <h3>Create New Agent</h3>
343
+ <div class="form-group">
344
+ <label>Name</label>
345
+ <input type="text" id="agent-name" placeholder="worker-1">
346
+ </div>
347
+ <div class="form-group">
348
+ <label>Role</label>
349
+ <textarea id="agent-role" rows="3" placeholder="Describe the agent's role in detail..."></textarea>
350
+ </div>
351
+ <div class="form-group">
352
+ <label>Working Directory</label>
353
+ <input type="text" id="agent-workdir" placeholder="/path/to/project (optional)">
354
+ </div>
355
+ <div class="form-group">
356
+ <label>Parent Agent</label>
357
+ <select id="agent-parent">
358
+ <option value="">No parent (top-level agent)</option>
359
+ </select>
360
+ <div style="font-size:11px;color:var(--fg-dim);margin-top:2px">Optional direct parent. The hierarchy graph follows this parent-child relation.</div>
361
+ </div>
362
+ <div class="form-group">
363
+ <label>Tool Path</label>
364
+ <input type="text" id="agent-cmdtpl" style="font-family:monospace;font-size:13px" placeholder="(leave blank = use project default)">
365
+ <div style="font-size:11px;color:var(--fg-dim);margin-top:2px">Leave blank to use project-level Tool Path setting</div>
366
+ </div>
367
+ <div class="modal-actions">
368
+ <button class="btn" onclick="hideModal('createAgentModal')">Cancel</button>
369
+ <button class="btn btn-primary" onclick="createAgent()">Create</button>
370
+ </div>
371
+ </div>
372
+ </div>
373
+
374
+ <!-- Start Agent Modal -->
375
+ <div class="modal-overlay" id="startAgentModal">
376
+ <div class="modal">
377
+ <h3>Start with Custom Prompt</h3>
378
+ <div class="form-group">
379
+ <label>Custom Prompt (optional — leave empty to auto-generate from role and task)</label>
380
+ <textarea id="start-prompt" placeholder="Override prompt, or leave empty..." rows="5"></textarea>
381
+ </div>
382
+ <input type="hidden" id="start-agent-id">
383
+ <div class="modal-actions">
384
+ <button class="btn" onclick="hideModal('startAgentModal')">Cancel</button>
385
+ <button class="btn btn-primary" onclick="startAgent()">Start</button>
386
+ </div>
387
+ </div>
388
+ </div>
389
+
390
+ <!-- Create Issue Modal -->
391
+ <div class="modal-overlay" id="createIssueModal">
392
+ <div class="modal">
393
+ <h3>New Issue</h3>
394
+ <div class="form-group">
395
+ <label>Template</label>
396
+ <select id="issue-template" onchange="applyIssueTemplate(this.value)">
397
+ <option value="">Blank</option>
398
+ <option value="bug">Bug Report</option>
399
+ <option value="feature">Feature Request</option>
400
+ </select>
401
+ </div>
402
+ <div class="form-group">
403
+ <label>Title</label>
404
+ <input type="text" id="issue-title" placeholder="Issue title">
405
+ </div>
406
+ <div class="form-group">
407
+ <label>Description</label>
408
+ <textarea id="issue-body" rows="6" placeholder="Describe the issue..."></textarea>
409
+ </div>
410
+ <div class="form-group">
411
+ <label>Assign to</label>
412
+ <select id="issue-assign"><option value="">Unassigned</option></select>
413
+ </div>
414
+ <div class="form-group">
415
+ <label>Labels (comma-separated)</label>
416
+ <input type="text" id="issue-labels" placeholder="bug, urgent, feature">
417
+ </div>
418
+ <div class="modal-actions">
419
+ <button class="btn" onclick="hideModal('createIssueModal')">Cancel</button>
420
+ <button class="btn btn-primary" onclick="createIssue()">Create</button>
421
+ </div>
422
+ </div>
423
+ </div>
424
+
425
+ <script src="/public/js/common.js?v=2"></script>
426
+ <script src="/public/vendor/marked.js"></script>
427
+ <script src="/public/js/files-panel.js"></script>
428
+ <script src="/public/js/project.js"></script>
429
+ </body>
430
+ </html>
@@ -0,0 +1,67 @@
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 - Terminal</title>
7
+ <link rel="stylesheet" href="/public/css/style.css">
8
+ <link rel="stylesheet" href="/public/vendor/xterm.css">
9
+ <style>
10
+ body { margin: 0; display: flex; flex-direction: column; height: 100vh; overflow: hidden; }
11
+ header { flex-shrink: 0; }
12
+ .terminal-wrap { flex: 1; display: flex; flex-direction: column; padding: 0 12px 12px; overflow: hidden; }
13
+ .terminal-toolbar { display: flex; align-items: center; justify-content: space-between; padding: 8px 4px; gap: 8px; flex-shrink: 0; }
14
+ .terminal-toolbar .agent-name { font-weight: bold; font-size: 14px; }
15
+ .terminal-toolbar .status { font-size: 12px; color: var(--text-secondary); }
16
+ #terminal { flex: 1; border-radius: 6px; overflow: hidden; }
17
+ .session-dialog { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.6); display: flex; align-items: center; justify-content: center; z-index: 100; }
18
+ .session-dialog .dialog-box { background: var(--card-bg); border: 1px solid var(--border); border-radius: 12px; padding: 24px; max-width: 400px; width: 90%; }
19
+ .session-dialog h3 { margin: 0 0 16px; }
20
+ .session-dialog .actions { display: flex; gap: 8px; margin-top: 16px; }
21
+ .session-dialog .actions button { flex: 1; }
22
+ </style>
23
+ </head>
24
+ <body>
25
+ <header>
26
+ <button class="menu-btn" onclick="history.back()">
27
+ <span></span><span></span><span></span>
28
+ </button>
29
+ <h1><a href="/" style="color:var(--accent);text-decoration:none">Argus</a></h1>
30
+ <div class="breadcrumb" style="margin-left:12px">
31
+ <a href="/">Projects</a> / <a id="project-link" href="#">Project</a> / <a id="agent-link" href="#">Agent</a> / <span>Terminal</span>
32
+ </div>
33
+ <div class="header-right"></div>
34
+ </header>
35
+
36
+ <div class="terminal-wrap">
37
+ <div class="terminal-toolbar">
38
+ <div>
39
+ <span class="agent-name" id="agent-name">Agent</span>
40
+ <span class="status" id="connection-status">Connecting...</span>
41
+ </div>
42
+ <div class="flex" style="gap:8px">
43
+ <button class="btn btn-sm" onclick="reconnect(true)">New Session</button>
44
+ <button class="btn btn-sm btn-danger" onclick="killSession()">Kill</button>
45
+ </div>
46
+ </div>
47
+ <div id="terminal"></div>
48
+ </div>
49
+
50
+ <!-- Session choice dialog -->
51
+ <div class="session-dialog" id="sessionDialog" style="display:none">
52
+ <div class="dialog-box">
53
+ <h3>Terminal Session</h3>
54
+ <p id="dialog-text">An existing session was found. Continue or start new?</p>
55
+ <div class="actions">
56
+ <button class="btn" onclick="startSession(false)">Continue Session</button>
57
+ <button class="btn btn-primary" onclick="startSession(true)">New Session</button>
58
+ </div>
59
+ </div>
60
+ </div>
61
+
62
+ <script src="/public/js/common.js?v=2"></script>
63
+ <script src="/public/vendor/xterm.js"></script>
64
+ <script src="/public/vendor/xterm-addon-fit.js"></script>
65
+ <script src="/public/js/interactive-terminal.js"></script>
66
+ </body>
67
+ </html>