@oddessentials/agent-guild 0.3.0 → 0.5.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/web/art/art.css CHANGED
@@ -155,6 +155,26 @@
155
155
  .badge { background: rgba(0, 0, 0, 0.45); border-color: #4a3d25; }
156
156
  .model-pill:hover { border-color: var(--gold-dim); }
157
157
 
158
+ .news-latest {
159
+ border-radius: 6px; border-color: #4a3d25; background: var(--card-bg);
160
+ box-shadow: inset 0 0 0 1px rgba(232, 196, 124, 0.06), 0 8px 24px rgba(0, 0, 0, 0.35);
161
+ }
162
+ .news-row + .news-row, .news-bar, .news-filters, .news-item, .news-status { border-color: #2a2418; }
163
+ .news-link { color: #f3ead8; }
164
+ a.news-link:visited { color: var(--muted); }
165
+ .news-panel {
166
+ background: #12141a; border-left-color: #4a3d25;
167
+ box-shadow: inset 1px 0 0 rgba(232, 196, 124, 0.08), -24px 0 60px rgba(0, 0, 0, 0.6);
168
+ }
169
+ .news-panel::backdrop { background: rgba(5, 6, 9, 0.72); }
170
+ .news-bar { padding: 16px 18px 12px; }
171
+ .news-filters, .news-status { padding-left: 18px; padding-right: 18px; }
172
+ .news-body { padding: 0 18px 14px; }
173
+ .news-day { background: #12141a; color: #c9ab72; }
174
+ .news-filter { border-color: #4a3d25; background: rgba(0, 0, 0, 0.35); }
175
+ .news-filter:hover { border-color: var(--gold-dim); }
176
+ .news-filter[aria-pressed="true"] { border-color: #b8955a; color: #fff; background: linear-gradient(#8e8ef6, #6262d6); }
177
+
158
178
  .session-card { padding-left: 152px; min-height: 196px; }
159
179
  .session-card::before {
160
180
  inset: 0 auto 0 0; width: 168px; background-size: 168px auto;
package/web/index.html CHANGED
@@ -16,6 +16,7 @@
16
16
  <div class="brand">
17
17
  <svg class="brand-mark" viewBox="0 0 32 32" aria-hidden="true"><rect width="32" height="32" rx="8" fill="currentColor"/><path d="M9 22l7-12 7 12" stroke="#fff" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg>
18
18
  <h1>Agent Guild</h1>
19
+ <span id="version" class="version" hidden></span>
19
20
  </div>
20
21
  <div class="topbar-end">
21
22
  <div id="connection" class="connection" role="status" aria-live="polite">
@@ -24,6 +25,7 @@
24
25
  <span id="upgrade-note" class="upgrade-note" hidden></span>
25
26
  <button id="upgrade" class="btn upgrade" type="button" hidden></button>
26
27
  <button id="theme-toggle" class="btn theme-toggle" type="button"></button>
28
+ <button id="restart-manager" class="btn restart-manager" type="button" hidden>Restart manager</button>
27
29
  <button id="stop-manager" class="btn danger stop-manager" type="button" hidden title="Stop the session manager. This ends every session.">Stop manager</button>
28
30
  </div>
29
31
  </header>
@@ -47,6 +49,15 @@
47
49
  <div id="sessions" class="session-grid" role="list"></div>
48
50
  <p id="empty" class="empty">No sessions yet. Pick a provider above to start one. Sessions keep running when you close this page.</p>
49
51
  </section>
52
+
53
+ <section class="news" aria-labelledby="news-heading">
54
+ <div class="section-head">
55
+ <h2 id="news-heading">Latest news <span id="news-count" class="count"></span></h2>
56
+ <button id="news-all" class="btn" type="button" aria-haspopup="dialog">All news</button>
57
+ </div>
58
+ <ol id="news-latest" class="news-latest" hidden></ol>
59
+ <p id="news-note" class="empty">Loading news…</p>
60
+ </section>
50
61
  </main>
51
62
 
52
63
  <section id="auth" class="auth" hidden>
@@ -64,9 +75,15 @@
64
75
  <section id="stopped" class="auth notice" hidden aria-live="polite">
65
76
  <h2 id="stopped-title">Stopping the session manager…</h2>
66
77
  <p id="stopped-text">Ending every session. This can take a few seconds.</p>
67
- <p>To start again, run this command or double-click the launcher:</p>
68
- <pre>agent-guild open</pre>
69
- <p>This page reconnects by itself when the manager is back.</p>
78
+ <div id="stopped-help" class="stopped-help" hidden>
79
+ <p id="stopped-how">To start again, open a terminal and run:</p>
80
+ <div class="command">
81
+ <pre>agent-guild open</pre>
82
+ <button id="copy-command" class="btn" type="button" title="Copy the command">Copy</button>
83
+ </div>
84
+ <p id="stopped-launcher" hidden>Or double-click <code id="stopped-launcher-path"></code> in your file manager.</p>
85
+ <p>This page reconnects by itself when the manager is back.</p>
86
+ </div>
70
87
  </section>
71
88
 
72
89
  <div id="terminal-panel" class="terminal-panel" hidden role="dialog" aria-modal="false" aria-labelledby="panel-title">
@@ -105,6 +122,47 @@
105
122
  <p id="models-source" class="models-source"></p>
106
123
  </dialog>
107
124
 
125
+ <dialog id="news" class="news-panel" aria-labelledby="news-title">
126
+ <div class="news-bar">
127
+ <div class="news-heading">
128
+ <h2 id="news-title">News</h2>
129
+ <p id="news-sub" class="sub"></p>
130
+ </div>
131
+ <button id="news-close" class="btn" type="button">Close</button>
132
+ </div>
133
+ <div id="news-filters" class="news-filters" role="group" aria-label="Show"></div>
134
+ <div class="news-body">
135
+ <button id="news-fresh" class="btn news-fresh" type="button" hidden></button>
136
+ <div id="news-list"></div>
137
+ <p id="news-empty" class="news-empty" hidden></p>
138
+ </div>
139
+ <p id="news-status" class="news-status" hidden></p>
140
+ </dialog>
141
+
142
+ <dialog id="history" class="models history" aria-labelledby="history-title">
143
+ <div class="models-bar">
144
+ <span id="history-icon" class="provider-icon small"></span>
145
+ <div class="models-heading">
146
+ <h2 id="history-title"></h2>
147
+ <p id="history-sub" class="sub"></p>
148
+ </div>
149
+ <button id="history-close" class="btn" type="button">Close</button>
150
+ </div>
151
+ <div class="history-tools">
152
+ <input id="history-filter" type="search" placeholder="Filter by title, folder or id" aria-label="Filter sessions" spellcheck="false" autocomplete="off">
153
+ <label class="history-here"><input id="history-here" type="checkbox"><span>Working folder only</span></label>
154
+ </div>
155
+ <div class="models-body">
156
+ <div id="history-list" class="history-list" role="list"></div>
157
+ <p id="history-note" class="models-note"></p>
158
+ </div>
159
+ <form id="history-form" class="history-form">
160
+ <label for="history-id">Resume by id</label>
161
+ <input id="history-id" type="text" placeholder="Session id or name" spellcheck="false" autocomplete="off">
162
+ <button type="submit" class="btn">Resume</button>
163
+ </form>
164
+ </dialog>
165
+
108
166
  <div id="tip" class="tip" aria-hidden="true" hidden><strong id="tip-title"></strong><span id="tip-source"></span><p id="tip-text"></p></div>
109
167
 
110
168
  <div id="toast" class="toast" role="alert" hidden></div>
@@ -168,6 +226,17 @@
168
226
  </section>
169
227
  </template>
170
228
 
229
+ <template id="history-template">
230
+ <article class="history-row" role="listitem">
231
+ <div class="history-main">
232
+ <div class="history-title"></div>
233
+ <div class="history-meta"></div>
234
+ </div>
235
+ <button class="session-id" type="button"></button>
236
+ <button class="btn primary history-resume" type="button"></button>
237
+ </article>
238
+ </template>
239
+
171
240
  <template id="session-template">
172
241
  <article class="session-card" role="listitem" tabindex="0">
173
242
  <span class="level-badge" aria-hidden="true"></span>
@@ -175,7 +244,7 @@
175
244
  <span class="provider-icon"></span>
176
245
  <div class="card-title">
177
246
  <div class="name"></div>
178
- <div class="meta"></div>
247
+ <div class="meta"><span class="meta-text"></span><button class="session-id" type="button" hidden></button></div>
179
248
  </div>
180
249
  <button class="model-pill" type="button"></button>
181
250
  <span class="status-pill"></span>
@@ -187,6 +256,7 @@
187
256
  </div>
188
257
  <div class="card-actions">
189
258
  <button class="btn primary open" type="button">Open</button>
259
+ <button class="btn resume" type="button" hidden>Resume</button>
190
260
  <button class="btn rename" type="button">Rename</button>
191
261
  <button class="btn danger stop" type="button">Stop</button>
192
262
  <button class="btn remove" type="button">Remove</button>
package/web/styles.css CHANGED
@@ -49,6 +49,10 @@ code, pre { font-family: ui-monospace, "Cascadia Code", Menlo, Consolas, monospa
49
49
  }
50
50
  .brand { display: flex; align-items: center; gap: 10px; }
51
51
  .brand-mark { width: 26px; height: 26px; color: var(--accent); flex: none; }
52
+ .version {
53
+ font-size: 0.72rem; font-weight: 600; padding: 1px 7px; border-radius: 999px; white-space: nowrap;
54
+ background: var(--surface-2); color: var(--muted); border: 1px solid var(--border); font-variant-numeric: tabular-nums;
55
+ }
52
56
  .topbar-end { display: flex; align-items: center; justify-content: flex-end; gap: 14px; flex-wrap: wrap; min-width: 0; }
53
57
  .connection { display: flex; align-items: center; gap: 8px; color: var(--muted); font-size: 0.85rem; }
54
58
  .connection .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--warn); }
@@ -249,8 +253,8 @@ main { max-width: 1200px; margin: 0 auto; padding: 20px 16px 48px; display: grid
249
253
  .btn.danger { color: var(--danger); }
250
254
  .btn.danger:hover { border-color: var(--danger); }
251
255
  .btn:disabled { opacity: 0.6; cursor: progress; }
252
- .stop-manager, .theme-toggle, .upgrade { white-space: nowrap; }
253
- .btn.upgrade { color: var(--warn); border-color: var(--warn); }
256
+ .stop-manager, .restart-manager, .theme-toggle, .upgrade { white-space: nowrap; }
257
+ .btn.upgrade, .btn.restart-manager.pending { color: var(--warn); border-color: var(--warn); }
254
258
  .upgrade-note { font-size: 0.85rem; color: var(--warn); }
255
259
 
256
260
  .empty { color: var(--muted); margin: 8px 0 0; }
@@ -259,8 +263,12 @@ main { max-width: 1200px; margin: 0 auto; padding: 20px 16px 48px; display: grid
259
263
  .auth p { margin: 0; color: var(--muted); line-height: 1.5; }
260
264
  .auth pre { margin: 0; padding: 10px 12px; background: var(--surface-2); border-radius: 8px; }
261
265
  .auth form { display: flex; gap: 8px; }
266
+ .stopped-help { display: grid; gap: 12px; }
267
+ .command { display: flex; align-items: center; gap: 8px; }
268
+ .command pre { flex: 1; min-width: 0; overflow-x: auto; }
269
+ .stopped-help code { color: var(--text); overflow-wrap: anywhere; }
262
270
  .notice h2 { color: var(--danger); }
263
- .notice.stopping h2 { color: var(--warn); }
271
+ .notice.stopping h2, .notice.restarting h2 { color: var(--warn); }
264
272
  .error { color: var(--danger); min-height: 1.2em; }
265
273
 
266
274
  .terminal-panel {
@@ -341,6 +349,91 @@ main { max-width: 1200px; margin: 0 auto; padding: 20px 16px 48px; display: grid
341
349
  .models-note { margin: 14px 0 0; color: var(--muted); }
342
350
  .models-source { margin: 0; padding: 10px 14px; border-top: 1px solid var(--border); color: var(--muted); font-size: 0.75rem; line-height: 1.45; }
343
351
 
352
+ .news-latest {
353
+ list-style: none; margin: 0; padding: 0;
354
+ border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); box-shadow: var(--shadow);
355
+ }
356
+ .news-row { display: flex; align-items: baseline; gap: 4px 10px; min-width: 0; padding: 9px 14px; }
357
+ .news-row + .news-row { border-top: 1px solid var(--border); }
358
+ .news-row .news-link { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
359
+ .news-row .badge, .news-row .news-meta { flex: none; }
360
+ .news-link { color: var(--text); font-weight: 600; text-decoration: none; }
361
+ a.news-link:hover, .news-discussion:hover { text-decoration: underline; }
362
+ a.news-link:visited { color: var(--muted); }
363
+ .news-link:focus-visible, .news-discussion:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 3px; }
364
+ .news-meta { color: var(--muted); font-size: 0.78rem; white-space: nowrap; font-variant-numeric: tabular-nums; }
365
+
366
+ .news-panel {
367
+ width: min(460px, 100vw); max-width: 100vw; height: 100dvh; max-height: 100dvh; margin: 0 0 0 auto; padding: 0;
368
+ border: 0; border-left: 1px solid var(--border); background: var(--surface); color: var(--text);
369
+ box-shadow: -16px 0 48px rgba(0, 0, 0, 0.25);
370
+ }
371
+ .news-panel[open] { display: flex; flex-direction: column; animation: news-in 0.18s ease-out; }
372
+ .news-panel::backdrop { background: rgba(15, 17, 21, 0.4); }
373
+ .news-bar { display: flex; align-items: center; gap: 10px; padding: 12px 14px; border-bottom: 1px solid var(--border); }
374
+ .news-heading { flex: 1; min-width: 0; }
375
+ .news-heading .sub { margin: 2px 0 0; color: var(--muted); font-size: 0.78rem; }
376
+ .news-filters { display: flex; flex-wrap: wrap; gap: 6px; padding: 10px 14px; border-bottom: 1px solid var(--border); }
377
+ .news-filter {
378
+ font: inherit; font-size: 0.75rem; font-weight: 600; padding: 3px 11px; border-radius: 999px; cursor: pointer;
379
+ border: 1px solid var(--border); background: var(--surface-2); color: var(--muted);
380
+ }
381
+ .news-filter:hover { border-color: var(--muted); }
382
+ .news-filter:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
383
+ .news-filter[aria-pressed="true"] { background: var(--accent); border-color: var(--accent); color: var(--accent-text); }
384
+ .news-body { flex: 1; min-height: 0; overflow: auto; padding: 0 14px 14px; }
385
+ .news-fresh { width: 100%; margin-top: 12px; }
386
+ .news-day {
387
+ position: sticky; top: 0; z-index: 1; margin: 0; padding: 12px 0 6px; background: var(--surface);
388
+ color: var(--muted); font-size: 0.7rem; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase;
389
+ }
390
+ .news-items { list-style: none; margin: 0; padding: 0; }
391
+ .news-item { padding: 10px 0; border-top: 1px solid var(--border); }
392
+ .news-head { display: flex; align-items: baseline; gap: 6px; }
393
+ .news-head .news-link { overflow-wrap: anywhere; }
394
+ .news-head .badge { flex: none; margin-left: auto; }
395
+ .news-item .news-meta { display: block; margin-top: 3px; }
396
+ .news-summary {
397
+ margin: 4px 0 0; color: var(--muted); font-size: 0.82rem; line-height: 1.45; overflow-wrap: anywhere;
398
+ display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden;
399
+ }
400
+ .news-discussion { color: inherit; text-decoration: none; }
401
+ .news-empty { margin: 14px 0 0; color: var(--muted); }
402
+ .news-status { margin: 0; padding: 10px 14px; border-top: 1px solid var(--border); color: var(--muted); font-size: 0.75rem; line-height: 1.45; }
403
+ .news-status span { display: block; }
404
+
405
+ .history-tools { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; padding: 10px 14px 0; }
406
+ .history-tools input[type="search"] {
407
+ flex: 1 1 220px; min-width: 0; padding: 7px 10px; border-radius: 8px; border: 1px solid var(--border);
408
+ background: var(--surface); color: var(--text); font: inherit; font-size: 0.9rem;
409
+ }
410
+ .history-tools input:focus-visible, .history-form input:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
411
+ .history-here { display: flex; align-items: center; gap: 6px; font-size: 0.8rem; color: var(--muted); white-space: nowrap; cursor: pointer; }
412
+ .history-here:has(input:disabled) { opacity: 0.6; cursor: default; }
413
+ .history .models-body { padding-top: 6px; }
414
+ .history-row {
415
+ display: grid; grid-template-columns: minmax(0, 1fr) auto auto; align-items: center; gap: 4px 12px;
416
+ padding: 10px 8px; border-bottom: 1px solid var(--border);
417
+ }
418
+ .history-main { min-width: 0; }
419
+ .history-title { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
420
+ .history-row.untitled .history-title { font-weight: 500; color: var(--muted); }
421
+ .history-meta { color: var(--muted); font-size: 0.78rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
422
+ .history-row.running .history-meta { color: var(--ok); }
423
+ .session-id {
424
+ font-family: ui-monospace, "Cascadia Code", "SF Mono", Menlo, Consolas, monospace; font-size: 0.72rem; padding: 2px 7px;
425
+ border-radius: 6px; border: 1px solid var(--border); background: var(--surface-2); color: var(--muted); cursor: copy; white-space: nowrap;
426
+ }
427
+ .session-id:hover { color: var(--text); border-color: var(--muted); }
428
+ .session-id:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
429
+ .card-title .meta { display: flex; align-items: center; gap: 8px; min-width: 0; }
430
+ .card-title .meta-text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
431
+ .history-form { display: flex; align-items: center; gap: 8px; padding: 10px 14px; border-top: 1px solid var(--border); font-size: 0.85rem; color: var(--muted); }
432
+ .history-form input {
433
+ flex: 1; min-width: 0; padding: 6px 10px; border-radius: 8px; border: 1px solid var(--border);
434
+ background: var(--surface); color: var(--text); font: inherit; font-size: 0.85rem;
435
+ }
436
+
344
437
  .toast {
345
438
  position: fixed; left: 50%; bottom: 20px; transform: translateX(-50%); z-index: 20;
346
439
  max-width: min(640px, calc(100vw - 32px)); padding: 10px 14px; border-radius: 8px;
@@ -350,9 +443,10 @@ main { max-width: 1200px; margin: 0 auto; padding: 20px 16px 48px; display: grid
350
443
  @keyframes pulse { 50% { opacity: 0.35; } }
351
444
  @keyframes ring { 0% { transform: scale(0.85); opacity: 0.8; } 100% { transform: scale(1.3); opacity: 0; } }
352
445
  @keyframes stat-fill { from { transform: scaleX(0); } }
446
+ @keyframes news-in { from { transform: translateX(24px); opacity: 0; } }
353
447
 
354
448
  @media (prefers-reduced-motion: reduce) {
355
- .status-pill.active::before, .agent.working::after, .model-detail .stat-fill { animation: none; }
449
+ .status-pill.active::before, .agent.working::after, .model-detail .stat-fill, .news-panel[open] { animation: none; }
356
450
  .model-name::before { transition: none; }
357
451
  }
358
452
 
@@ -370,4 +464,10 @@ main { max-width: 1200px; margin: 0 auto; padding: 20px 16px 48px; display: grid
370
464
  .model-detail .stat { padding-bottom: 6px; }
371
465
  .model-detail .stat-reading { row-gap: 1px; }
372
466
  .model-detail .stat-note { grid-column: 1 / -1; }
467
+ .news-row { flex-wrap: wrap; }
468
+ .news-row .news-link { flex-basis: 100%; white-space: normal; }
469
+ .news-panel { border-left: 0; }
470
+ .history-row { grid-template-columns: minmax(0, 1fr) auto; }
471
+ .history-row .session-id { grid-row: 2; justify-self: start; }
472
+ .history-form { flex-wrap: wrap; }
373
473
  }