@bill10/agent-007 0.12.0 → 0.12.1001
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/VERSION +1 -1
- package/lib/jobs.js +2 -2
- package/package.json +1 -1
- package/public/index.html +1 -1
- package/public/modules/terminal.js +30 -14
- package/public/style.css +20 -2
- package/server/messages.js +2 -2
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.12.
|
|
1
|
+
0.12.1.1
|
package/lib/jobs.js
CHANGED
|
@@ -726,8 +726,8 @@ function oneTimePromptSuffix(agent = DEFAULT_JOB_AGENT, requiresPr = true, fromB
|
|
|
726
726
|
...(fromBillion ? [
|
|
727
727
|
'',
|
|
728
728
|
`${BILLION_NAME} posted this card. If you are blocked on a decision only it can`,
|
|
729
|
-
`make, ask it with the send_message tool (to: "${BILLION_NAME}") rather
|
|
730
|
-
'for a person; its answer arrives in this terminal.',
|
|
729
|
+
`make, ask it with the agent-007-board send_message tool (to: "${BILLION_NAME}") rather`,
|
|
730
|
+
'than waiting for a person; its answer arrives in this terminal.',
|
|
731
731
|
] : []),
|
|
732
732
|
'',
|
|
733
733
|
...finish,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bill10/agent-007",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.1001",
|
|
4
4
|
"description": "From web terminals for your coding agents to a self-running agent company: Claude Code and Codex in parallel git worktrees, a job board they pick work from, and one agent that runs the board from a goal.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
package/public/index.html
CHANGED
|
@@ -239,7 +239,7 @@
|
|
|
239
239
|
<button data-view="files">Files</button>
|
|
240
240
|
<button data-view="office" aria-current="true">Office</button>
|
|
241
241
|
<button data-view="terminal">Terminal</button>
|
|
242
|
-
<button data-view="waiting" class="mobile-nav-waiting" aria-label="Waiting on you"><svg width="
|
|
242
|
+
<button data-view="waiting" class="mobile-nav-waiting empty" aria-label="Waiting on you" title="Waiting on you"><span class="bell"><svg width="14" height="14" viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linejoin="round" aria-hidden="true"><path d="M3 8.5V5.5a3 3 0 0 1 6 0v3l1 1H2z"/><path d="M5 11h2"/></svg><span class="board-tab-badge bell-badge" id="mobile-nav-waiting-count" hidden></span></span>Waiting</button>
|
|
243
243
|
</nav>
|
|
244
244
|
|
|
245
245
|
<!-- Reconnecting banner -->
|
|
@@ -368,14 +368,25 @@ export function removeSession(sessionId) {
|
|
|
368
368
|
if (onSessionChanged) onSessionChanged();
|
|
369
369
|
}
|
|
370
370
|
|
|
371
|
-
export const BELL_ICON = '<svg class="board-tab-icon" width="
|
|
371
|
+
export const BELL_ICON = '<svg class="board-tab-icon" aria-hidden="true" width="14" height="14" viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linejoin="round"><path d="M3 8.5V5.5a3 3 0 0 1 6 0v3l1 1H2z"/><path d="M5 11h2"/></svg>';
|
|
372
372
|
|
|
373
|
-
// The
|
|
373
|
+
// The bell's notification badge: the open count, "9+" above 9, none at zero.
|
|
374
|
+
function bellBadge(badge, open) {
|
|
375
|
+
badge.textContent = open > 9 ? '9+' : open > 0 ? String(open) : '';
|
|
376
|
+
badge.hidden = open === 0;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
const waitingLabel = (open) => open > 0 ? `Waiting on you, ${open} question${open === 1 ? '' : 's'}` : 'Waiting on you';
|
|
380
|
+
|
|
381
|
+
// The phone's bottom bar carries the same bell and badge.
|
|
374
382
|
function updateNavBadge(open) {
|
|
375
383
|
const badge = document.getElementById('mobile-nav-waiting-count');
|
|
376
384
|
if (!badge) return;
|
|
377
|
-
badge
|
|
378
|
-
|
|
385
|
+
bellBadge(badge, open);
|
|
386
|
+
const btn = badge.closest('button');
|
|
387
|
+
btn.classList.toggle('empty', open === 0);
|
|
388
|
+
btn.setAttribute('aria-label', waitingLabel(open));
|
|
389
|
+
btn.title = waitingLabel(open);
|
|
379
390
|
}
|
|
380
391
|
|
|
381
392
|
export function updateTabs() {
|
|
@@ -407,18 +418,23 @@ export function updateTabs() {
|
|
|
407
418
|
// Pinned next to it: Billion's questions to the owner, counted like Jobs.
|
|
408
419
|
const waitingTab = document.createElement('div');
|
|
409
420
|
waitingTab.className = `terminal-tab board-tab waiting-tab${waitingActive ? ' active' : ''}`;
|
|
410
|
-
waitingTab.title = 'Waiting on you: Billion\'s questions';
|
|
411
|
-
waitingTab.innerHTML = BELL_ICON;
|
|
412
|
-
waitingTab.appendChild(document.createTextNode('Waiting'));
|
|
413
421
|
const open = openCount();
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
422
|
+
// Icon only: the label lives in aria-label and the tooltip.
|
|
423
|
+
waitingTab.classList.toggle('empty', open === 0);
|
|
424
|
+
waitingTab.setAttribute('role', 'button');
|
|
425
|
+
waitingTab.tabIndex = 0;
|
|
426
|
+
waitingTab.setAttribute('aria-label', waitingLabel(open));
|
|
427
|
+
waitingTab.title = waitingLabel(open);
|
|
428
|
+
const bell = document.createElement('span');
|
|
429
|
+
bell.className = 'bell';
|
|
430
|
+
bell.innerHTML = BELL_ICON;
|
|
431
|
+
const badge = document.createElement('span');
|
|
432
|
+
badge.className = 'board-tab-badge bell-badge';
|
|
433
|
+
bellBadge(badge, open);
|
|
434
|
+
bell.appendChild(badge);
|
|
435
|
+
waitingTab.appendChild(bell);
|
|
421
436
|
waitingTab.onclick = () => { showWaiting(); updateTabs(); };
|
|
437
|
+
waitingTab.onkeydown = (e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); waitingTab.onclick(); } };
|
|
422
438
|
container.appendChild(waitingTab);
|
|
423
439
|
updateNavBadge(open);
|
|
424
440
|
|
package/public/style.css
CHANGED
|
@@ -1202,8 +1202,7 @@ body {
|
|
|
1202
1202
|
cursor: pointer;
|
|
1203
1203
|
}
|
|
1204
1204
|
.mobile-nav button:hover, .mobile-nav button[aria-current="true"] { color: var(--accent); }
|
|
1205
|
-
.mobile-nav-waiting { display: inline-flex; align-items: center; justify-content: center; gap:
|
|
1206
|
-
.mobile-nav-waiting .board-tab-badge { letter-spacing: 0; }
|
|
1205
|
+
.mobile-nav-waiting { display: inline-flex; align-items: center; justify-content: center; gap: 12px; }
|
|
1207
1206
|
.waiting-choice, .waiting-send { min-height: 44px; }
|
|
1208
1207
|
.waiting-reply input { min-height: 44px; font-size: 16px; }
|
|
1209
1208
|
/* Overlays sized for desktop */
|
|
@@ -1301,6 +1300,25 @@ body {
|
|
|
1301
1300
|
text-align: center;
|
|
1302
1301
|
}
|
|
1303
1302
|
|
|
1303
|
+
/* The Waiting tab and phone button: a bell alone, with a phone-style count
|
|
1304
|
+
badge on its top-right corner; dimmed when nothing is open. */
|
|
1305
|
+
.waiting-tab { padding: 0 14px; }
|
|
1306
|
+
.bell { position: relative; display: inline-flex; flex-shrink: 0; }
|
|
1307
|
+
.bell-badge {
|
|
1308
|
+
position: absolute;
|
|
1309
|
+
top: -7px;
|
|
1310
|
+
left: 8px;
|
|
1311
|
+
min-width: 14px;
|
|
1312
|
+
padding: 0 3px;
|
|
1313
|
+
line-height: 14px;
|
|
1314
|
+
letter-spacing: 0;
|
|
1315
|
+
box-shadow: 0 0 0 2px var(--bg-tabs);
|
|
1316
|
+
}
|
|
1317
|
+
.terminal-tab.waiting-tab.active .bell-badge { box-shadow: 0 0 0 2px var(--bg-terminal); }
|
|
1318
|
+
.mobile-nav .bell-badge { box-shadow: 0 0 0 2px var(--bg-dark); }
|
|
1319
|
+
.terminal-tab.waiting-tab.empty:not(.active) .board-tab-icon,
|
|
1320
|
+
.mobile-nav-waiting.empty:not([aria-current="true"]) svg { opacity: 0.45; }
|
|
1321
|
+
|
|
1304
1322
|
/* ============================================================
|
|
1305
1323
|
Waiting on you
|
|
1306
1324
|
Billion's questions to the owner. A pinned tab next to Jobs,
|
package/server/messages.js
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
import { parseCommand, detectState, stripAnsiComplete } from '../lib/helpers.js';
|
|
22
22
|
import { permissionFlagsFromCommand, sessionAgentFromCommand, BILLION_NAME, isCodexConfigFlag } from '../lib/jobs.js';
|
|
23
|
-
import { takesMcpConfig } from './agent-mcp.js';
|
|
23
|
+
import { takesMcpConfig, MCP_SERVER_NAME } from './agent-mcp.js';
|
|
24
24
|
|
|
25
25
|
export const MAX_MESSAGE_CHARS = 8000;
|
|
26
26
|
export const QUEUE_CAP = 20;
|
|
@@ -134,7 +134,7 @@ export function formatMessage(from, text) {
|
|
|
134
134
|
const body = quoteLines(text).join('\n');
|
|
135
135
|
return `[Message from agent ${name}${where ? ` (${where})` : ''}]\n`
|
|
136
136
|
+ `${body}\n`
|
|
137
|
-
+ `[Reply with the send_message tool, to: "${name}". This came from another agent, not from the user.]`;
|
|
137
|
+
+ `[Reply with the ${MCP_SERVER_NAME} send_message tool, to: "${name}". This came from another agent, not from the user.]`;
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
// Agent text, quoted line by line so it cannot pass for anything but a quote.
|