ai-agentmanager 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.
Files changed (58) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +4 -0
  3. package/README.md +767 -2
  4. package/SECURITY.md +44 -0
  5. package/bin/agentmgr-hub.js +16 -0
  6. package/bin/agentmgr.js +4 -0
  7. package/docs/architecture.md +67 -0
  8. package/docs/distributed.md +147 -0
  9. package/docs/engines.md +177 -0
  10. package/docs/images/agents.jpg +0 -0
  11. package/docs/images/conflict-radar.jpg +0 -0
  12. package/docs/plugins.md +81 -0
  13. package/package.json +56 -4
  14. package/public/app.js +3083 -0
  15. package/public/hub/hub.css +230 -0
  16. package/public/hub/hub.js +766 -0
  17. package/public/hub/index.html +146 -0
  18. package/public/hub/term.js +147 -0
  19. package/public/index.html +342 -0
  20. package/public/share.html +34 -0
  21. package/public/share.js +41 -0
  22. package/public/style.css +541 -0
  23. package/public/touchscroll.js +73 -0
  24. package/public/transport.js +78 -0
  25. package/scripts/build-release.sh +58 -0
  26. package/scripts/fix-pty.js +15 -0
  27. package/src/backlog.js +413 -0
  28. package/src/brief.js +512 -0
  29. package/src/cli.js +1447 -0
  30. package/src/client.js +49 -0
  31. package/src/config.js +109 -0
  32. package/src/conflicts.js +105 -0
  33. package/src/engines/antigravity.js +296 -0
  34. package/src/engines/claude.js +98 -0
  35. package/src/engines/codex.js +331 -0
  36. package/src/engines/index.js +37 -0
  37. package/src/fleet.js +176 -0
  38. package/src/git.js +340 -0
  39. package/src/hub.js +857 -0
  40. package/src/hubactions.js +107 -0
  41. package/src/hubbacklog.js +373 -0
  42. package/src/hublink.js +437 -0
  43. package/src/inbox.js +94 -0
  44. package/src/judge.js +278 -0
  45. package/src/livebrowser.js +637 -0
  46. package/src/manager.js +2554 -0
  47. package/src/notify.js +284 -0
  48. package/src/plugins.js +119 -0
  49. package/src/preview.js +334 -0
  50. package/src/races.js +192 -0
  51. package/src/remote.js +284 -0
  52. package/src/server.js +759 -0
  53. package/src/service.js +150 -0
  54. package/src/sessions.js +160 -0
  55. package/src/store.js +104 -0
  56. package/src/stuck.js +160 -0
  57. package/src/tracker.js +311 -0
  58. package/src/trust.js +44 -0
@@ -0,0 +1,230 @@
1
+ :root {
2
+ --bg: #f6f7f9;
3
+ --panel: #ffffff;
4
+ --panel-2: #f0f2f5;
5
+ --border: #dde1e7;
6
+ --text: #1c2330;
7
+ --muted: #667085;
8
+ --accent: #3b5bdb;
9
+ --accent-text: #ffffff;
10
+ --green: #1f9d55;
11
+ --yellow: #b7791f;
12
+ --red: #d64545;
13
+ --purple: #8e59ff;
14
+ --radius: 8px;
15
+ --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
16
+ color-scheme: light;
17
+ }
18
+ @media (prefers-color-scheme: dark) {
19
+ :root {
20
+ --bg: #0d0f14;
21
+ --panel: #151821;
22
+ --panel-2: #1c202b;
23
+ --border: #2a2f3c;
24
+ --text: #e5e8ef;
25
+ --muted: #8b93a7;
26
+ --accent: #6d8bff;
27
+ --accent-text: #0d0f14;
28
+ --green: #3ecf8e;
29
+ --yellow: #e6b450;
30
+ --red: #ff6b6b;
31
+ --purple: #a98bff;
32
+ color-scheme: dark;
33
+ }
34
+ }
35
+
36
+ * { box-sizing: border-box; }
37
+ [hidden] { display: none !important; }
38
+ html, body { margin: 0; }
39
+ body {
40
+ background: var(--bg); color: var(--text); min-height: 100vh;
41
+ font: 14px/1.45 -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
42
+ }
43
+ button, input { font: inherit; color: inherit; }
44
+ code { font-family: var(--mono); font-size: 12.5px; }
45
+ a { color: var(--accent); text-decoration: none; }
46
+ a:hover { text-decoration: underline; }
47
+ .muted { color: var(--muted); }
48
+ .small { font-size: 12.5px; }
49
+ .error { color: var(--red); margin: 0; }
50
+
51
+ button {
52
+ border: 1px solid var(--border); background: var(--panel); border-radius: 6px; padding: 5px 12px; cursor: pointer;
53
+ }
54
+ button:hover { border-color: var(--accent); }
55
+ button.primary { background: var(--accent); border-color: var(--accent); color: var(--accent-text); }
56
+ button.ghost { background: transparent; }
57
+ button.danger { color: var(--red); }
58
+ button.link { border: 0; background: none; padding: 0; color: var(--muted); font-size: 12px; }
59
+ button.link:hover { color: var(--red); }
60
+
61
+ /* ---------- top bar */
62
+ .topbar {
63
+ display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap;
64
+ padding: 10px 16px; border-bottom: 1px solid var(--border); background: var(--panel);
65
+ position: sticky; top: 0; z-index: 2;
66
+ }
67
+ .brand { display: flex; align-items: baseline; gap: 10px; min-width: 0; }
68
+ .brand h1 { font-size: 16px; margin: 0; font-weight: 600; white-space: nowrap; }
69
+ .logo { color: var(--accent); }
70
+ .top-actions { display: flex; align-items: center; gap: 8px; }
71
+ .conn { font-size: 12px; color: var(--muted); }
72
+ .conn.ok::before { content: '● '; color: var(--green); }
73
+ .conn.bad::before { content: '● '; color: var(--red); }
74
+
75
+ /* ---------- sign in */
76
+ .login { display: grid; place-items: center; padding: 48px 16px; }
77
+ .card { background: var(--panel); border: 1px solid var(--border); border-radius: var(--radius); padding: 20px; }
78
+ .login .card { width: min(420px, 100%); display: grid; gap: 12px; }
79
+ .login h2 { margin: 0; font-size: 18px; }
80
+ .login p { margin: 0; }
81
+ input[type='password'], input[type='search'] {
82
+ border: 1px solid var(--border); background: var(--panel); border-radius: 6px; padding: 7px 10px; min-width: 0;
83
+ }
84
+
85
+ /* ---------- layout */
86
+ .app { max-width: 1200px; margin: 0 auto; padding: 16px; display: grid; gap: 14px; }
87
+
88
+ .machines { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 10px; }
89
+ .machine {
90
+ background: var(--panel); border: 1px solid var(--border); border-radius: var(--radius); padding: 12px 14px;
91
+ display: grid; gap: 6px; cursor: pointer; text-align: left; min-width: 0;
92
+ }
93
+ .machine:hover { border-color: var(--accent); }
94
+ .machine.selected { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent) inset; }
95
+ .machine.offline { opacity: .7; }
96
+ .machine .m-head { display: flex; align-items: center; gap: 8px; min-width: 0; }
97
+ .machine .m-name { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
98
+ .dot { width: 9px; height: 9px; border-radius: 50%; background: var(--muted); flex: none; }
99
+ .dot.on { background: var(--green); }
100
+ .machine .m-stats { display: flex; gap: 12px; font-size: 12.5px; color: var(--muted); flex-wrap: wrap; }
101
+ .machine .m-stats b { color: var(--text); font-weight: 600; }
102
+ .machine .m-stats .needs b { color: var(--red); }
103
+ .machine .m-foot { display: flex; gap: 8px; align-items: center; justify-content: space-between; font-size: 12px; color: var(--muted); flex-wrap: wrap; }
104
+ .chips { display: flex; gap: 4px; flex-wrap: wrap; }
105
+ .chip { font-size: 11px; padding: 0 7px; border-radius: 999px; background: var(--panel-2); border: 1px solid var(--border); color: var(--muted); white-space: nowrap; }
106
+ .chip.clear { cursor: pointer; }
107
+ .chip.clear::after { content: ' ×'; }
108
+ .empty-machines { grid-column: 1 / -1; text-align: center; padding: 28px 16px; }
109
+
110
+ /* ---------- tabs */
111
+ .tabs { display: flex; align-items: center; gap: 4px; border-bottom: 1px solid var(--border); flex-wrap: wrap; }
112
+ .tabs [role='tab'] {
113
+ border: 0; background: none; border-radius: 0; padding: 8px 12px; color: var(--muted); border-bottom: 2px solid transparent; margin-bottom: -1px;
114
+ }
115
+ .tabs [role='tab'].active { color: var(--text); border-bottom-color: var(--accent); font-weight: 600; }
116
+ .tabs .spacer { flex: 1; }
117
+ .tabs input[type='search'] { width: 240px; margin: 4px 0; }
118
+ .count { font-size: 11px; padding: 0 6px; border-radius: 999px; background: var(--panel-2); color: var(--muted); font-weight: 500; }
119
+ .count.hot { background: var(--red); color: #fff; }
120
+
121
+ /* ---------- lists */
122
+ .tab { display: grid; gap: 8px; }
123
+ .group-title { font-size: 12px; color: var(--muted); text-transform: uppercase; letter-spacing: .04em; margin: 8px 2px 0; display: flex; gap: 8px; align-items: center; }
124
+ .row {
125
+ background: var(--panel); border: 1px solid var(--border); border-radius: var(--radius); padding: 10px 14px;
126
+ display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 4px 12px; align-items: start;
127
+ }
128
+ .row.offline { opacity: .65; }
129
+ .row .r-title { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; min-width: 0; }
130
+ .row .r-title .name { font-weight: 600; overflow-wrap: anywhere; }
131
+ .row .r-sub { grid-column: 1; color: var(--muted); font-size: 13px; overflow-wrap: anywhere; }
132
+ .row .r-meta { grid-column: 1; display: flex; gap: 10px; flex-wrap: wrap; font-size: 12px; color: var(--muted); }
133
+ .row .r-meta .branch { font-family: var(--mono); font-size: 11.5px; max-width: 280px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
134
+ .row .r-actions { grid-column: 2; grid-row: 1 / span 3; display: flex; align-items: center; gap: 6px; }
135
+ .open { font-size: 12.5px; white-space: nowrap; }
136
+ .open.disabled { color: var(--muted); cursor: help; }
137
+ .empty { padding: 32px 16px; color: var(--muted); text-align: center; background: var(--panel); border: 1px dashed var(--border); border-radius: var(--radius); }
138
+
139
+ .pill {
140
+ display: inline-flex; align-items: center; gap: 5px; font-size: 11.5px; padding: 1px 8px; border-radius: 999px;
141
+ border: 1px solid var(--border); color: var(--muted); white-space: nowrap;
142
+ }
143
+ .pill::before { content: ''; width: 7px; height: 7px; border-radius: 50%; background: currentColor; }
144
+ .pill.working { color: var(--green); }
145
+ .pill.working::before { animation: pulse 1s infinite; }
146
+ .pill.waiting, .pill.planning { color: var(--accent); }
147
+ .pill.preparing, .pill.exited { color: var(--yellow); }
148
+ .pill.error, .pill.attention { color: var(--red); }
149
+ .pill.attention::before { animation: pulse 1s infinite; }
150
+ @keyframes pulse { 50% { opacity: .3; } }
151
+
152
+ .tag { font-size: 11px; padding: 0 6px; border-radius: 4px; background: var(--panel-2); color: var(--muted); border: 1px solid var(--border); white-space: nowrap; }
153
+ .tag.p0, .tag.p1 { color: var(--red); }
154
+ .tag.open { color: var(--green); }
155
+ .tag.merged { color: var(--purple); }
156
+ .tag.closed { color: var(--red); }
157
+ .tag.machine { font-family: var(--mono); }
158
+ .kind { font-size: 11px; font-weight: 600; padding: 1px 7px; border-radius: 4px; white-space: nowrap; }
159
+ .kind.prompt { background: color-mix(in srgb, var(--red) 15%, transparent); color: var(--red); }
160
+ .kind.question { background: color-mix(in srgb, var(--accent) 15%, transparent); color: var(--accent); }
161
+ .kind.stuck, .kind.conflict { background: color-mix(in srgb, var(--yellow) 18%, transparent); color: var(--yellow); }
162
+ .choices { display: flex; gap: 6px; flex-wrap: wrap; grid-column: 1; }
163
+ .choices span { font-size: 12px; border: 1px solid var(--border); border-radius: 4px; padding: 0 6px; background: var(--panel-2); }
164
+ .footnote { font-size: 12px; text-align: center; margin: 4px 0 24px; }
165
+
166
+ /* ---------- dialog */
167
+ dialog { border: 1px solid var(--border); border-radius: 10px; background: var(--panel); color: var(--text); padding: 0; width: min(560px, calc(100vw - 32px)); }
168
+ dialog::backdrop { background: rgb(0 0 0 / .35); }
169
+ .dialog { padding: 20px; display: grid; gap: 10px; }
170
+ .dialog h2 { margin: 0; font-size: 17px; }
171
+ .dialog p { margin: 0; }
172
+ .cmd { display: flex; gap: 8px; align-items: center; background: var(--panel-2); border: 1px solid var(--border); border-radius: 6px; padding: 8px 10px; }
173
+ .cmd code { flex: 1; overflow-wrap: anywhere; user-select: all; }
174
+ .dialog-actions { display: flex; justify-content: flex-end; }
175
+
176
+ @media (max-width: 640px) {
177
+ .brand #hub-name { display: none; }
178
+ .tabs input[type='search'] { width: 100%; }
179
+ .tabs .spacer { display: none; }
180
+ .row { grid-template-columns: minmax(0, 1fr); }
181
+ .row .r-actions { grid-column: 1; grid-row: auto; }
182
+ }
183
+
184
+ /* ---------- actions */
185
+ .actions { grid-column: 1 / -1; display: flex; gap: 6px; flex-wrap: wrap; align-items: center; margin-top: 4px; }
186
+ .actions button, .r-actions button { font-size: 12.5px; padding: 3px 10px; }
187
+ .reply { grid-column: 1 / -1; display: flex; gap: 6px; margin-top: 4px; }
188
+ .reply input, .reply textarea, .dialog textarea, .dialog select, .dialog input:not([type]) {
189
+ flex: 1; min-width: 0; border: 1px solid var(--border); background: var(--panel); border-radius: 6px; padding: 6px 9px; font: inherit; color: inherit;
190
+ }
191
+ .reply textarea { resize: vertical; }
192
+ .reply.col { flex-direction: column; }
193
+ .reply.col .actions { grid-column: auto; margin: 0; }
194
+ button:disabled { opacity: .55; cursor: default; }
195
+ .dialog label { display: grid; gap: 4px; font-size: 13px; color: var(--muted); }
196
+ .dialog label > * { color: var(--text); }
197
+ .row-fields { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
198
+
199
+ .toast {
200
+ position: fixed; left: 50%; bottom: 20px; transform: translateX(-50%); z-index: 20; max-width: calc(100vw - 32px);
201
+ background: var(--text); color: var(--bg); padding: 8px 14px; border-radius: 8px; font-size: 13px; box-shadow: 0 4px 16px rgb(0 0 0 / .25);
202
+ }
203
+ .toast.bad { background: var(--red); color: #fff; }
204
+
205
+ /* ---------- terminal */
206
+ .term-overlay { position: fixed; inset: 0; z-index: 10; background: #0f1117; display: flex; flex-direction: column; color: #e5e8ef; }
207
+ body.term-open { overflow: hidden; }
208
+ .term-head { display: flex; align-items: center; gap: 10px; padding: 8px 12px; border-bottom: 1px solid #2a2f3c; min-width: 0; }
209
+ .term-head b { font-family: var(--mono); font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
210
+ .term-status { font-size: 12px; color: #8b93a7; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
211
+ .term-status.bad { color: #ff6b6b; }
212
+ .term-head button { color: #e5e8ef; border-color: #2a2f3c; }
213
+ .term { flex: 1; min-height: 0; padding: 4px 0 0 6px; }
214
+ .term-keys { display: flex; gap: 4px; padding: 6px 8px; overflow-x: auto; border-top: 1px solid #2a2f3c; }
215
+ .term-keys button { background: #1c202b; border-color: #2a2f3c; color: #e5e8ef; padding: 4px 10px; flex: none; font-size: 13px; }
216
+ .term-compose { display: flex; gap: 6px; padding: 6px 8px calc(6px + env(safe-area-inset-bottom)); }
217
+ .term-compose textarea { flex: 1; background: #151821; color: #e5e8ef; border: 1px solid #2a2f3c; border-radius: 6px; padding: 7px 9px; font: inherit; resize: none; }
218
+ @media (pointer: fine) { .term-keys, .term-compose { display: none; } }
219
+
220
+ /* backlog */
221
+ .backlog-head { display: flex; align-items: center; gap: 12px; margin: 4px 0 12px; }
222
+ .toggle { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; color: var(--muted); cursor: pointer; }
223
+ .tag.label { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
224
+
225
+ /* sign-in */
226
+ .google-btn { display: block; text-align: center; padding: 10px 14px; border-radius: 8px; border: 1px solid var(--border); background: var(--panel); color: var(--text); font-weight: 600; text-decoration: none; margin: 8px 0 4px; }
227
+ .google-btn:hover { border-color: var(--accent); }
228
+ #token-box summary { cursor: pointer; color: var(--muted); font-size: 13px; margin: 10px 0 6px; }
229
+ #token-box[open] summary { margin-bottom: 4px; }
230
+ #token-box > * + * { margin-top: 8px; }