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,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
+ }