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,201 @@
|
|
|
1
|
+
const qs = new URLSearchParams(window.location.search);
|
|
2
|
+
const agentId = qs.get('agentId');
|
|
3
|
+
const initialNewSession = qs.get('newSession') === null ? true : qs.get('newSession') === 'true';
|
|
4
|
+
let term = null;
|
|
5
|
+
let fitAddon = null;
|
|
6
|
+
let ws = null;
|
|
7
|
+
|
|
8
|
+
function initTerminal() {
|
|
9
|
+
const cs = getComputedStyle(document.documentElement);
|
|
10
|
+
term = new Terminal({
|
|
11
|
+
cursorBlink: true,
|
|
12
|
+
theme: {
|
|
13
|
+
background: cs.getPropertyValue('--bg').trim() || '#1e1e2e',
|
|
14
|
+
foreground: cs.getPropertyValue('--fg').trim() || '#cdd6f4',
|
|
15
|
+
cursor: cs.getPropertyValue('--accent').trim() || '#89b4fa',
|
|
16
|
+
selectionBackground: cs.getPropertyValue('--selected-bg').trim() || '#45475a',
|
|
17
|
+
},
|
|
18
|
+
fontFamily: 'Menlo, Monaco, "Courier New", monospace',
|
|
19
|
+
fontSize: 13,
|
|
20
|
+
scrollback: 50000,
|
|
21
|
+
allowProposedApi: true,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
fitAddon = new FitAddon.FitAddon();
|
|
25
|
+
term.loadAddon(fitAddon);
|
|
26
|
+
term.open(document.getElementById('terminal'));
|
|
27
|
+
fitAddon.fit();
|
|
28
|
+
|
|
29
|
+
window.addEventListener('resize', () => {
|
|
30
|
+
fitAddon.fit();
|
|
31
|
+
sendResize();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// Forward user input to PTY via WebSocket
|
|
35
|
+
term.onData(data => {
|
|
36
|
+
if (ws && ws.readyState === WebSocket.OPEN) {
|
|
37
|
+
ws.send(JSON.stringify({ type: 'input', data }));
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function sendResize() {
|
|
43
|
+
if (ws && ws.readyState === WebSocket.OPEN && term) {
|
|
44
|
+
ws.send(JSON.stringify({ type: 'resize', cols: term.cols, rows: term.rows }));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
let reconnectTimer = null;
|
|
49
|
+
let reconnectCountdown = 0;
|
|
50
|
+
|
|
51
|
+
function setStatus(text, state) {
|
|
52
|
+
const el = document.getElementById('connection-status');
|
|
53
|
+
// state: 'connected' | 'connecting' | 'disconnected' | 'error'
|
|
54
|
+
const colors = { connected: '#3fb950', connecting: '#d29922', disconnected: '#8b949e', error: '#f85149' };
|
|
55
|
+
const color = colors[state] || colors.disconnected;
|
|
56
|
+
el.innerHTML = `<span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:${color};margin-right:6px;vertical-align:middle"></span>${text}`;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function showReconnectUI(seconds) {
|
|
60
|
+
clearReconnectTimer();
|
|
61
|
+
reconnectCountdown = seconds;
|
|
62
|
+
const statusEl = document.getElementById('connection-status');
|
|
63
|
+
const updateCountdown = () => {
|
|
64
|
+
if (reconnectCountdown <= 0) {
|
|
65
|
+
connectWebSocket(false);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
statusEl.innerHTML = `<span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:#d29922;margin-right:6px;vertical-align:middle"></span>` +
|
|
69
|
+
`Reconnecting in ${reconnectCountdown}s... <button onclick="connectWebSocket(false)" style="margin-left:8px;padding:2px 8px;border:1px solid var(--border);border-radius:4px;background:var(--header-bg);color:var(--fg);cursor:pointer;font-size:12px">Reconnect now</button>`;
|
|
70
|
+
reconnectCountdown--;
|
|
71
|
+
reconnectTimer = setTimeout(updateCountdown, 1000);
|
|
72
|
+
};
|
|
73
|
+
updateCountdown();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function clearReconnectTimer() {
|
|
77
|
+
if (reconnectTimer) { clearTimeout(reconnectTimer); reconnectTimer = null; }
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function connectWebSocket(newSession) {
|
|
81
|
+
if (ws) {
|
|
82
|
+
ws.close();
|
|
83
|
+
ws = null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const proto = location.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
87
|
+
const cols = term ? term.cols : 120;
|
|
88
|
+
const rows = term ? term.rows : 30;
|
|
89
|
+
const url = `${proto}//${location.host}/ws/terminal/${agentId}?newSession=${newSession}&cols=${cols}&rows=${rows}`;
|
|
90
|
+
|
|
91
|
+
clearReconnectTimer();
|
|
92
|
+
setStatus('Connecting...', 'connecting');
|
|
93
|
+
ws = new WebSocket(url);
|
|
94
|
+
|
|
95
|
+
ws.onopen = () => {
|
|
96
|
+
setStatus('Connected', 'connected');
|
|
97
|
+
sendResize();
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
ws.onmessage = (event) => {
|
|
101
|
+
try {
|
|
102
|
+
const msg = JSON.parse(event.data);
|
|
103
|
+
switch (msg.type) {
|
|
104
|
+
case 'connected':
|
|
105
|
+
// If there's an existing session and we didn't ask for new, show dialog
|
|
106
|
+
if (msg.hasExistingSession && !newSession && !window._sessionChosen) {
|
|
107
|
+
showSessionDialog();
|
|
108
|
+
} else {
|
|
109
|
+
window._sessionChosen = true;
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
case 'output':
|
|
113
|
+
// Decode base64 and write to terminal
|
|
114
|
+
const bytes = Uint8Array.from(atob(msg.data), c => c.charCodeAt(0));
|
|
115
|
+
term.write(bytes);
|
|
116
|
+
break;
|
|
117
|
+
case 'exit':
|
|
118
|
+
setStatus(`Process exited (code: ${msg.exitCode})`);
|
|
119
|
+
term.writeln('\r\n\x1b[33m--- Process exited ---\x1b[0m');
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
} catch (e) {
|
|
123
|
+
console.error('WS message parse error', e);
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
ws.onclose = (e) => {
|
|
128
|
+
// Don't auto-reconnect if intentionally closed (code 1000) or process exited
|
|
129
|
+
if (e.code === 1000) {
|
|
130
|
+
setStatus('Disconnected', 'disconnected');
|
|
131
|
+
} else {
|
|
132
|
+
setStatus('Connection closed', 'disconnected');
|
|
133
|
+
showReconnectUI(5);
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
ws.onerror = () => {
|
|
138
|
+
setStatus('Connection failed', 'error');
|
|
139
|
+
showReconnectUI(5);
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function showSessionDialog() {
|
|
144
|
+
document.getElementById('sessionDialog').style.display = '';
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function startSession(isNew) {
|
|
148
|
+
window._sessionChosen = true;
|
|
149
|
+
document.getElementById('sessionDialog').style.display = 'none';
|
|
150
|
+
if (isNew) {
|
|
151
|
+
// Reconnect with newSession=true
|
|
152
|
+
connectWebSocket(true);
|
|
153
|
+
}
|
|
154
|
+
// If continuing, we're already connected — do nothing
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
async function reconnect(newSession) {
|
|
158
|
+
if (newSession && !await showConfirm('Start a new session? This will kill the existing one.')) return;
|
|
159
|
+
term.clear();
|
|
160
|
+
connectWebSocket(newSession);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
async function killSession() {
|
|
164
|
+
if (!await showConfirm('Kill the terminal process?')) return;
|
|
165
|
+
if (ws && ws.readyState === WebSocket.OPEN) {
|
|
166
|
+
ws.send(JSON.stringify({ type: 'kill' }));
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Load agent info for breadcrumb
|
|
171
|
+
async function loadAgentInfo() {
|
|
172
|
+
try {
|
|
173
|
+
const res = await fetch(`/api/agents/${agentId}`, { headers: apiHeaders() });
|
|
174
|
+
if (!res.ok) return;
|
|
175
|
+
const agent = await res.json();
|
|
176
|
+
document.getElementById('agent-name').textContent = agent.name;
|
|
177
|
+
document.getElementById('agent-link').textContent = agent.name;
|
|
178
|
+
document.getElementById('agent-link').href = `/agents/${agentId}`;
|
|
179
|
+
document.title = `Argus - ${agent.name} Terminal`;
|
|
180
|
+
|
|
181
|
+
// Load project info
|
|
182
|
+
const pres = await fetch(`/api/projects/${agent.project_id}`, { headers: apiHeaders() });
|
|
183
|
+
if (pres.ok) {
|
|
184
|
+
const project = await pres.json();
|
|
185
|
+
document.getElementById('project-link').textContent = project.name;
|
|
186
|
+
document.getElementById('project-link').href = `/projects/${agent.project_id}`;
|
|
187
|
+
}
|
|
188
|
+
} catch (e) {
|
|
189
|
+
console.error('Failed to load agent info', e);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Init
|
|
194
|
+
if (!agentId) {
|
|
195
|
+
document.body.innerHTML = '<div style="padding:40px;color:var(--error)">Error: No agentId provided</div>';
|
|
196
|
+
} else {
|
|
197
|
+
initTerminal();
|
|
198
|
+
loadAgentInfo();
|
|
199
|
+
// Start connection; default to new session to avoid attaching to stale blank PTY state
|
|
200
|
+
connectWebSocket(initialNewSession);
|
|
201
|
+
}
|