agenter-app 0.0.0-stage → 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/Agenter.vbs +9 -0
- package/LICENSE +21 -0
- package/README.md +168 -2
- package/cli.js +71 -0
- package/hook.js +49 -0
- package/install.js +73 -0
- package/lib/open-dashboard.js +26 -0
- package/open.js +29 -0
- package/package.json +47 -4
- package/public/app.js +1414 -0
- package/public/index.html +188 -0
- package/public/style.css +551 -0
- package/scripts/install-shortcuts.ps1 +36 -0
- package/server.js +1434 -0
|
@@ -0,0 +1,188 @@
|
|
|
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">
|
|
6
|
+
<title>Agenter</title>
|
|
7
|
+
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='8' fill='%23b7d4a6'/%3E%3Cpath d='M16 7l8 9-8 9-8-9z' fill='%23161813'/%3E%3C/svg%3E">
|
|
8
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
9
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
10
|
+
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&family=Geist+Mono:wght@400;500;600&display=swap">
|
|
11
|
+
<link rel="stylesheet" href="/style.css">
|
|
12
|
+
<script>
|
|
13
|
+
// Applied before first paint so there's no flash of the wrong theme.
|
|
14
|
+
(() => {
|
|
15
|
+
const read = (k) => { try { return JSON.parse(localStorage.getItem('agenter.' + k)); } catch { return null; } };
|
|
16
|
+
const theme = read('theme') || 'system';
|
|
17
|
+
const dark = theme === 'dark' || (theme === 'system' && matchMedia('(prefers-color-scheme: dark)').matches);
|
|
18
|
+
document.documentElement.dataset.theme = dark ? 'dark' : 'light';
|
|
19
|
+
const accent = read('accent');
|
|
20
|
+
if (accent && accent !== 'sage') document.documentElement.dataset.accent = accent;
|
|
21
|
+
})();
|
|
22
|
+
</script>
|
|
23
|
+
</head>
|
|
24
|
+
<body>
|
|
25
|
+
<div class="app" id="app">
|
|
26
|
+
<aside class="sidebar" id="sidebar">
|
|
27
|
+
<div class="brand-row">
|
|
28
|
+
<div class="brand"><span class="logo"></span>Agenter</div>
|
|
29
|
+
<span class="conn" id="conn" title="Connecting…"></span>
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
<button class="nav-item" id="navInbox" type="button">
|
|
33
|
+
<svg class="ic" viewBox="0 0 24 24"><polyline points="22 12 16 12 14 15 10 15 8 12 2 12"/><path d="M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z"/></svg>
|
|
34
|
+
<span>Inbox</span>
|
|
35
|
+
<span class="count" id="inboxCount" hidden></span>
|
|
36
|
+
</button>
|
|
37
|
+
|
|
38
|
+
<button class="nav-item" id="navNew" type="button" title="Start a Claude or Codex session that runs here">
|
|
39
|
+
<svg class="ic" viewBox="0 0 24 24"><path d="M12 5v14"/><path d="M5 12h14"/></svg>
|
|
40
|
+
<span>New session</span>
|
|
41
|
+
</button>
|
|
42
|
+
|
|
43
|
+
<div class="search">
|
|
44
|
+
<svg class="ic" viewBox="0 0 24 24"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg>
|
|
45
|
+
<input id="search" type="search" placeholder="Filter sessions" autocomplete="off" spellcheck="false">
|
|
46
|
+
<kbd>/</kbd>
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
<div class="session-list" id="sessionList"></div>
|
|
50
|
+
|
|
51
|
+
<section class="usage" id="usage" hidden aria-label="Plan usage"></section>
|
|
52
|
+
|
|
53
|
+
<div class="sidebar-foot">
|
|
54
|
+
<details class="settings" id="settingsPanel">
|
|
55
|
+
<summary>
|
|
56
|
+
<svg class="ic" viewBox="0 0 24 24"><line x1="4" x2="4" y1="21" y2="14"/><line x1="4" x2="4" y1="10" y2="3"/><line x1="12" x2="12" y1="21" y2="12"/><line x1="12" x2="12" y1="8" y2="3"/><line x1="20" x2="20" y1="21" y2="16"/><line x1="20" x2="20" y1="12" y2="3"/><line x1="2" x2="6" y1="14" y2="14"/><line x1="10" x2="14" y1="8" y2="8"/><line x1="18" x2="22" y1="16" y2="16"/></svg>
|
|
57
|
+
Settings
|
|
58
|
+
<svg class="ic chev" viewBox="0 0 24 24"><path d="m18 15-6-6-6 6"/></svg>
|
|
59
|
+
</summary>
|
|
60
|
+
<div class="settings-body">
|
|
61
|
+
<label class="switch" title="When a session finishes its turn, keep it waiting here so you can reply from the dashboard">
|
|
62
|
+
<input type="checkbox" id="holdAll"><span class="track"></span><span>Hold finished sessions</span>
|
|
63
|
+
</label>
|
|
64
|
+
<label class="select-row" title="While something waits here, VS Code shows a spinner. After this long it goes back to VS Code.">
|
|
65
|
+
<span>Hand back to VS Code after</span>
|
|
66
|
+
<select id="holdMinutes">
|
|
67
|
+
<option value="1">1 min</option>
|
|
68
|
+
<option value="3">3 min</option>
|
|
69
|
+
<option value="10">10 min</option>
|
|
70
|
+
<option value="30">30 min</option>
|
|
71
|
+
<option value="0">Never</option>
|
|
72
|
+
</select>
|
|
73
|
+
</label>
|
|
74
|
+
<label class="switch">
|
|
75
|
+
<input type="checkbox" id="soundToggle"><span class="track"></span><span>Sound alerts</span>
|
|
76
|
+
</label>
|
|
77
|
+
<div class="theme-row">
|
|
78
|
+
<span>Theme</span>
|
|
79
|
+
<div class="segmented" id="themePicker" role="radiogroup" aria-label="Theme">
|
|
80
|
+
<button type="button" role="radio" data-theme-pick="system" title="Match Windows">
|
|
81
|
+
<svg class="ic" viewBox="0 0 24 24"><rect width="20" height="14" x="2" y="3" rx="2"/><line x1="8" x2="16" y1="21" y2="21"/><line x1="12" x2="12" y1="17" y2="21"/></svg>
|
|
82
|
+
</button>
|
|
83
|
+
<button type="button" role="radio" data-theme-pick="light" title="Light">
|
|
84
|
+
<svg class="ic" viewBox="0 0 24 24"><circle cx="12" cy="12" r="4"/><path d="M12 2v2"/><path d="M12 20v2"/><path d="m4.93 4.93 1.41 1.41"/><path d="m17.66 17.66 1.41 1.41"/><path d="M2 12h2"/><path d="M20 12h2"/><path d="m6.34 17.66-1.41 1.41"/><path d="m19.07 4.93-1.41 1.41"/></svg>
|
|
85
|
+
</button>
|
|
86
|
+
<button type="button" role="radio" data-theme-pick="dark" title="Dark">
|
|
87
|
+
<svg class="ic" viewBox="0 0 24 24"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"/></svg>
|
|
88
|
+
</button>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
<div class="accent-row" id="accentPicker" role="radiogroup" aria-label="Accent color">
|
|
92
|
+
<span>Accent</span>
|
|
93
|
+
<button type="button" role="radio" data-accent="sage" style="--sw:#b7d4a6" title="Sage"></button>
|
|
94
|
+
<button type="button" role="radio" data-accent="clay" style="--sw:#dc9474" title="Clay"></button>
|
|
95
|
+
<button type="button" role="radio" data-accent="teal" style="--sw:#73cfcb" title="Teal"></button>
|
|
96
|
+
<button type="button" role="radio" data-accent="rose" style="--sw:#e58aa6" title="Rose"></button>
|
|
97
|
+
<button type="button" role="radio" data-accent="lavender" style="--sw:#b8acf2" title="Lavender"></button>
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
</details>
|
|
101
|
+
<div class="foot-row">
|
|
102
|
+
<button class="btn ghost small" id="notifyBtn" type="button" hidden>
|
|
103
|
+
<svg class="ic" viewBox="0 0 24 24"><path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9"/><path d="M10.3 21a1.94 1.94 0 0 0 3.4 0"/></svg>
|
|
104
|
+
Enable notifications
|
|
105
|
+
</button>
|
|
106
|
+
<button class="btn ghost small" id="helpBtn" type="button" title="Keyboard shortcuts">Shortcuts <kbd>?</kbd></button>
|
|
107
|
+
<button class="btn ghost small" id="clearEnded" type="button" title="Hide sessions that aren't live">Clear earlier</button>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
</aside>
|
|
111
|
+
<div class="scrim" id="scrim"></div>
|
|
112
|
+
|
|
113
|
+
<main class="main">
|
|
114
|
+
<header class="main-head" id="mainHead"></header>
|
|
115
|
+
<div class="split" id="split">
|
|
116
|
+
<div class="chat-col">
|
|
117
|
+
<div class="scroll" id="scroll">
|
|
118
|
+
<div class="content" id="content"></div>
|
|
119
|
+
</div>
|
|
120
|
+
<div class="dock" id="dock"></div>
|
|
121
|
+
</div>
|
|
122
|
+
<div class="splitter" id="splitter" role="separator" aria-orientation="vertical" title="Drag to resize" hidden></div>
|
|
123
|
+
<section class="preview" id="preview" aria-label="App preview" hidden>
|
|
124
|
+
<form class="pv-bar" id="pvForm" autocomplete="off">
|
|
125
|
+
<button class="btn ghost icon" type="button" data-pv-reload title="Reload">
|
|
126
|
+
<svg class="ic" viewBox="0 0 24 24"><path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"/><path d="M21 3v5h-5"/><path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"/><path d="M8 16H3v5"/></svg>
|
|
127
|
+
</button>
|
|
128
|
+
<input class="pv-url mono" id="pvUrl" type="text" placeholder="http://localhost:5173" spellcheck="false" aria-label="App address">
|
|
129
|
+
<button class="btn ghost icon" type="button" data-pv-pop title="Open in your browser">
|
|
130
|
+
<svg class="ic" viewBox="0 0 24 24"><path d="M15 3h6v6"/><path d="M10 14 21 3"/><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/></svg>
|
|
131
|
+
</button>
|
|
132
|
+
<button class="btn ghost icon" type="button" data-pv-close title="Close preview">
|
|
133
|
+
<svg class="ic" viewBox="0 0 24 24"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>
|
|
134
|
+
</button>
|
|
135
|
+
</form>
|
|
136
|
+
<div class="pv-apps" id="pvApps"></div>
|
|
137
|
+
<div class="pv-body" id="pvBody"></div>
|
|
138
|
+
</section>
|
|
139
|
+
</div>
|
|
140
|
+
</main>
|
|
141
|
+
</div>
|
|
142
|
+
|
|
143
|
+
<div class="toasts" id="toasts" aria-live="polite"></div>
|
|
144
|
+
|
|
145
|
+
<dialog id="newDialog" class="new-dialog">
|
|
146
|
+
<form id="newForm" autocomplete="off">
|
|
147
|
+
<div class="new-head">
|
|
148
|
+
<h2>New session</h2>
|
|
149
|
+
<div class="segmented" id="newAgent" role="radiogroup" aria-label="Agent">
|
|
150
|
+
<button type="button" role="radio" data-new-agent="claude">Claude</button>
|
|
151
|
+
<button type="button" role="radio" data-new-agent="codex">Codex</button>
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
<p class="dlg-sub" id="newSub"></p>
|
|
155
|
+
<label class="field-label" for="newCwd">Project folder</label>
|
|
156
|
+
<input class="field mono" id="newCwd" list="newCwdList" placeholder="C:\Users\you\Projects\my-app" spellcheck="false" required>
|
|
157
|
+
<datalist id="newCwdList"></datalist>
|
|
158
|
+
<label class="field-label" for="newMsg">First message</label>
|
|
159
|
+
<textarea class="field" id="newMsg" rows="4" placeholder="What should Claude do?" required></textarea>
|
|
160
|
+
<div class="dlg-error" id="newError" hidden></div>
|
|
161
|
+
<div class="dlg-actions">
|
|
162
|
+
<button class="btn ghost" type="button" data-new-cancel>Cancel</button>
|
|
163
|
+
<button class="btn primary" type="submit" id="newStart">Start session</button>
|
|
164
|
+
</div>
|
|
165
|
+
</form>
|
|
166
|
+
</dialog>
|
|
167
|
+
|
|
168
|
+
<dialog id="helpDialog">
|
|
169
|
+
<h2>Keyboard shortcuts</h2>
|
|
170
|
+
<dl class="keys">
|
|
171
|
+
<dt><kbd>A</kbd></dt><dd>Allow the permission request showing the key hints (the oldest one). If it's off screen, the first press scrolls to it. Not available for destructive-looking commands</dd>
|
|
172
|
+
<dt><kbd>Shift</kbd> <kbd>A</kbd></dt><dd>Always allow it</dd>
|
|
173
|
+
<dt><kbd>D</kbd></dt><dd>Deny it (type a reason first to tell Claude what to do instead)</dd>
|
|
174
|
+
<dt><kbd>R</kbd></dt><dd>Jump to the reply box</dd>
|
|
175
|
+
<dt><kbd>Enter</kbd></dt><dd>Send a reply (<kbd>Shift</kbd>+<kbd>Enter</kbd> for a new line)</dd>
|
|
176
|
+
<dt><kbd>J</kbd> / <kbd>K</kbd></dt><dd>Next / previous session</dd>
|
|
177
|
+
<dt><kbd>N</kbd></dt><dd>Next session that needs you</dd>
|
|
178
|
+
<dt><kbd>I</kbd></dt><dd>Open the inbox</dd>
|
|
179
|
+
<dt><kbd>/</kbd></dt><dd>Filter sessions</dd>
|
|
180
|
+
<dt><kbd>T</kbd></dt><dd>Switch theme (system → light → dark)</dd>
|
|
181
|
+
<dt><kbd>Esc</kbd></dt><dd>Leave a text box / close this</dd>
|
|
182
|
+
</dl>
|
|
183
|
+
<form method="dialog"><button class="btn primary">Got it</button></form>
|
|
184
|
+
</dialog>
|
|
185
|
+
|
|
186
|
+
<script src="/app.js"></script>
|
|
187
|
+
</body>
|
|
188
|
+
</html>
|