@yemi33/minions 0.1.12 → 0.1.13

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 (37) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dashboard/js/command-center.js +377 -0
  3. package/dashboard/js/command-history.js +70 -0
  4. package/dashboard/js/command-input.js +268 -0
  5. package/dashboard/js/command-parser.js +129 -0
  6. package/dashboard/js/detail-panel.js +98 -0
  7. package/dashboard/js/live-stream.js +69 -0
  8. package/dashboard/js/modal-qa.js +268 -0
  9. package/dashboard/js/modal.js +131 -0
  10. package/dashboard/js/refresh.js +59 -0
  11. package/dashboard/js/render-agents.js +17 -0
  12. package/dashboard/js/render-dispatch.js +148 -0
  13. package/dashboard/js/render-inbox.js +126 -0
  14. package/dashboard/js/render-kb.js +107 -0
  15. package/dashboard/js/render-other.js +181 -0
  16. package/dashboard/js/render-plans.js +304 -0
  17. package/dashboard/js/render-prd.js +469 -0
  18. package/dashboard/js/render-prs.js +94 -0
  19. package/dashboard/js/render-schedules.js +158 -0
  20. package/dashboard/js/render-skills.js +89 -0
  21. package/dashboard/js/render-work-items.js +219 -0
  22. package/dashboard/js/settings.js +135 -0
  23. package/dashboard/js/state.js +84 -0
  24. package/dashboard/js/utils.js +39 -0
  25. package/dashboard/layout.html +123 -0
  26. package/dashboard/pages/engine.html +12 -0
  27. package/dashboard/pages/home.html +31 -0
  28. package/dashboard/pages/inbox.html +17 -0
  29. package/dashboard/pages/plans.html +4 -0
  30. package/dashboard/pages/prd.html +5 -0
  31. package/dashboard/pages/prs.html +4 -0
  32. package/dashboard/pages/schedule.html +10 -0
  33. package/dashboard/pages/work.html +5 -0
  34. package/dashboard/styles.css +598 -0
  35. package/dashboard-build.js +51 -0
  36. package/dashboard.js +44 -1
  37. package/package.json +1 -1
@@ -0,0 +1,84 @@
1
+ // dashboard/js/state.js — Global state and page navigation extracted from dashboard.html
2
+
3
+ let inboxData = [];
4
+ let agentData = [];
5
+ let currentAgentId = null;
6
+ let currentTab = 'thought-process';
7
+
8
+ // Sidebar page navigation — URL-routed
9
+ function getPageFromUrl() {
10
+ const path = window.location.pathname.replace(/^\//, '') || 'home';
11
+ if (document.querySelector('.sidebar-link[data-page="' + path + '"]')) return path;
12
+ return 'home';
13
+ }
14
+
15
+ let currentPage = getPageFromUrl();
16
+
17
+ function switchPage(page, pushState) {
18
+ currentPage = page;
19
+ document.querySelectorAll('.page').forEach(p => p.classList.remove('active'));
20
+ const target = document.getElementById('page-' + page);
21
+ if (target) target.classList.add('active');
22
+ document.querySelectorAll('.sidebar-link').forEach(l => l.classList.remove('active'));
23
+ const link = document.querySelector('.sidebar-link[data-page="' + page + '"]');
24
+ if (link) link.classList.add('active');
25
+ if (pushState !== false) {
26
+ const url = page === 'home' ? '/' : '/' + page;
27
+ history.pushState({ page }, '', url);
28
+ }
29
+ }
30
+
31
+ // Browser back/forward navigation
32
+ window.addEventListener('popstate', (e) => {
33
+ switchPage(e.state?.page || getPageFromUrl(), false);
34
+ });
35
+ window._prdRequeueUi = window._prdRequeueUi || {};
36
+
37
+ function getPrdRequeueState(workItemId) {
38
+ const map = window._prdRequeueUi || {};
39
+ const state = map[workItemId];
40
+ if (!state) return null;
41
+ const now = Date.now();
42
+ if (state.until && now > state.until) {
43
+ delete map[workItemId];
44
+ return null;
45
+ }
46
+ return state;
47
+ }
48
+
49
+ function setPrdRequeueState(workItemId, state) {
50
+ window._prdRequeueUi = window._prdRequeueUi || {};
51
+ window._prdRequeueUi[workItemId] = Object.assign({ updatedAt: Date.now() }, state);
52
+ }
53
+
54
+ function clearPrdRequeueState(workItemId) {
55
+ const map = window._prdRequeueUi || {};
56
+ delete map[workItemId];
57
+ }
58
+
59
+ function prunePrdRequeueState(workItems) {
60
+ const map = window._prdRequeueUi || {};
61
+ if (!Object.keys(map).length) return;
62
+ const byId = {};
63
+ for (const w of (workItems || [])) {
64
+ if (w.id) byId[w.id] = w;
65
+ }
66
+ for (const [id, state] of Object.entries(map)) {
67
+ if (!state) continue;
68
+ const wi = byId[id];
69
+ if (state.status === 'pending') {
70
+ if (!wi || (wi.status !== 'failed' && wi.status !== 'paused')) delete map[id];
71
+ continue;
72
+ }
73
+ if (state.status === 'queued') {
74
+ if (wi && wi.status !== 'failed') delete map[id];
75
+ continue;
76
+ }
77
+ if (state.status === 'error' && state.until && Date.now() > state.until) delete map[id];
78
+ }
79
+ }
80
+
81
+ function rerenderPrdFromCache() {
82
+ if (!window._lastStatus || !window._lastStatus.prdProgress) return;
83
+ renderPrd(window._lastStatus.prd, window._lastStatus.prdProgress);
84
+ }
@@ -0,0 +1,39 @@
1
+ // dashboard/js/utils.js — Utility functions extracted from dashboard.html
2
+
3
+ function escHtml(s) {
4
+ return String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;').replace(/'/g,'&#39;');
5
+ }
6
+
7
+ function normalizePlanFile(file) {
8
+ return String(file || '').replace(/\\/g, '/').split('/').pop();
9
+ }
10
+
11
+ function timeAgo(isoStr) {
12
+ if (!isoStr) return '';
13
+ const ms = Date.now() - new Date(isoStr).getTime();
14
+ if (ms < 0) return 'just now';
15
+ const s = Math.floor(ms / 1000);
16
+ if (s < 60) return s + 's ago';
17
+ const m = Math.floor(s / 60);
18
+ if (m < 60) return m + 'm ago';
19
+ const h = Math.floor(m / 60);
20
+ if (h < 24) return h + 'h ago';
21
+ const d = Math.floor(h / 24);
22
+ return d + 'd ago';
23
+ }
24
+
25
+ function statusColor(s) {
26
+ return s === 'working' ? 'working' : s === 'done' ? 'done' : '';
27
+ }
28
+
29
+ function llmCopyBtn() {
30
+ return '<button class="llm-copy-btn" onclick="event.stopPropagation();copyLlmText(this)" title="Copy">&#x2398;</button>';
31
+ }
32
+ function copyLlmText(btn) {
33
+ const container = btn.parentElement;
34
+ const clone = container.cloneNode(true);
35
+ clone.querySelectorAll('.llm-copy-btn').forEach(b => b.remove());
36
+ navigator.clipboard.writeText(clone.textContent.trim());
37
+ btn.innerHTML = '&#10003;';
38
+ setTimeout(() => { btn.innerHTML = '&#x2398;'; }, 1500);
39
+ }
@@ -0,0 +1,123 @@
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.0">
6
+ <title>Minions Mission Control</title>
7
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>👽</text></svg>">
8
+ <style>/* __CSS__ */</style>
9
+ </head>
10
+ <body>
11
+
12
+ <header>
13
+ <h1>Minions Mission Control <span id="header-projects">—</span></h1>
14
+ <div style="display:flex;align-items:center;gap:8px;">
15
+ <span class="engine-badge stopped" id="engine-badge">STOPPED</span>
16
+ <div class="timestamp" id="ts">—</div>
17
+ <button onclick="toggleCommandCenter()" style="background:none;border:none;cursor:pointer;font-size:15px;color:var(--blue);padding:4px 8px;line-height:1;font-weight:700;border:1px solid var(--blue);border-radius:4px" title="Command Center" id="cc-toggle-btn">CC</button>
18
+ <button onclick="openSettings()" style="background:none;border:none;cursor:pointer;font-size:18px;color:var(--muted);padding:4px;line-height:1" title="Settings">&#9881;</button>
19
+ </div>
20
+ </header>
21
+ <div class="engine-alert" id="engine-alert"></div>
22
+
23
+ <!-- Command Center Drawer -->
24
+ <div id="cc-drawer" style="display:none;position:fixed;top:0;right:0;bottom:0;width:420px;background:var(--surface);border-left:1px solid var(--border);z-index:300;flex-direction:column">
25
+ <div style="padding:12px 16px;border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:space-between">
26
+ <div style="display:flex;align-items:center;gap:8px">
27
+ <span style="font-weight:700;color:var(--blue);font-size:14px">Command Center</span>
28
+ <span id="cc-session-info" style="font-size:10px;color:var(--muted)">New session</span>
29
+ </div>
30
+ <div style="display:flex;align-items:center;gap:8px">
31
+ <button onclick="ccNewSession()" style="background:none;border:1px solid var(--border);color:var(--muted);font-size:10px;padding:2px 8px;border-radius:3px;cursor:pointer">New Session</button>
32
+ <button onclick="toggleCommandCenter()" style="background:none;border:none;color:var(--muted);font-size:16px;cursor:pointer;padding:2px 6px">&#10005;</button>
33
+ </div>
34
+ </div>
35
+ <div id="cc-messages" style="flex:1;overflow-y:auto;padding:12px 16px;display:flex;flex-direction:column;gap:10px"></div>
36
+ <div style="padding:12px 16px;border-top:1px solid var(--border)">
37
+ <div style="display:flex;gap:8px">
38
+ <textarea id="cc-input" rows="2" placeholder="Ask anything or give a command..." style="flex:1;padding:8px 10px;background:var(--bg);border:1px solid var(--border);border-radius:6px;color:var(--text);font-size:12px;resize:none;font-family:inherit" onkeydown="if(event.key==='Enter'&&!event.shiftKey){event.preventDefault();ccSend()}"></textarea>
39
+ <button onclick="ccSend()" style="background:var(--blue);color:#fff;border:none;border-radius:6px;padding:8px 14px;font-size:12px;font-weight:600;cursor:pointer;align-self:flex-end">Send</button>
40
+ </div>
41
+ <div style="font-size:9px;color:var(--muted);margin-top:4px">Sonnet-powered. Full minions context. Enter to send, Shift+Enter for newline.</div>
42
+ </div>
43
+ </div>
44
+
45
+ <div id="projects-bar" style="background:var(--surface);border-bottom:1px solid var(--border);padding:8px 24px;display:flex;align-items:center;gap:12px;font-size:12px;">
46
+ <span style="color:var(--muted);font-weight:600;text-transform:uppercase;letter-spacing:0.5px;font-size:10px;">Projects</span>
47
+ <div id="projects-list" style="display:flex;gap:8px;flex-wrap:wrap;">—</div>
48
+ </div>
49
+
50
+ <div id="setup-banner" style="display:none;margin:16px 24px;padding:16px 20px;background:var(--surface2);border:1px dashed var(--blue);border-radius:8px;text-align:center;color:var(--text)">
51
+ <div style="font-size:18px;margin-bottom:6px">Welcome to Minions</div>
52
+ <div style="color:var(--muted);font-size:13px;margin-bottom:10px">Your minions hasn't been initialized yet. Run the following command to get started:</div>
53
+ <code style="background:var(--bg);padding:6px 16px;border-radius:4px;font-size:14px;color:var(--blue);border:1px solid var(--border)">minions init</code>
54
+ </div>
55
+
56
+ <!-- Layout replaced by page-layout sidebar navigation -->
57
+
58
+ <div class="page-layout">
59
+ <nav class="sidebar" id="sidebar">
60
+ <a class="sidebar-link" data-page="home" href="/">Home</a>
61
+ <a class="sidebar-link" data-page="work" href="/work">Work Items <span class="sidebar-count" id="sidebar-wi"></span></a>
62
+ <a class="sidebar-link" data-page="prd" href="/prd">PRD</a>
63
+ <a class="sidebar-link" data-page="prs" href="/prs">Pull Requests <span class="sidebar-count" id="sidebar-pr"></span></a>
64
+ <a class="sidebar-link" data-page="plans" href="/plans">Plans</a>
65
+ <a class="sidebar-link" data-page="inbox" href="/inbox">Notes & KB</a>
66
+ <a class="sidebar-link" data-page="schedule" href="/schedule">Schedules</a>
67
+ <a class="sidebar-link" data-page="engine" href="/engine">Engine</a>
68
+ </nav>
69
+ <div class="page-content" id="page-content"><!-- __PAGES__ --></div>
70
+ </div>
71
+
72
+ <!-- Agent Detail Panel -->
73
+ <div class="detail-overlay" id="detail-overlay" onclick="closeDetail()"></div>
74
+ <div class="detail-panel" id="detail-panel">
75
+ <div class="detail-header">
76
+ <h3 id="detail-agent-name">—</h3>
77
+ <button class="detail-close" onclick="closeDetail()">ESC / Close</button>
78
+ </div>
79
+ <div class="status-line" id="detail-status-line">—</div>
80
+ <div class="detail-tabs" id="detail-tabs"></div>
81
+ <div class="detail-body">
82
+ <div class="detail-content" id="detail-content"></div>
83
+ </div>
84
+ </div>
85
+
86
+ <!-- Modal for inbox detail -->
87
+ <div class="modal-bg" id="modal" onclick="if(event.target===this)closeModal()">
88
+ <div class="modal">
89
+ <div class="modal-header">
90
+ <h3 id="modal-title">—</h3>
91
+ <div class="modal-header-actions">
92
+ <button class="modal-copy" id="modal-edit-btn" onclick="modalToggleEdit()" title="Edit" style="display:none"><svg width="12" height="12" viewBox="0 0 16 16" fill="currentColor"><path d="M11.013 1.427a1.75 1.75 0 012.474 0l1.086 1.086a1.75 1.75 0 010 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 01-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61zM12.9 2.97L4.288 11.58l-.537 1.878 1.878-.537L14.242 4.31 12.9 2.97z"/></svg> Edit</button>
93
+ <button class="modal-copy" id="modal-save-btn" onclick="modalSaveEdit()" title="Save" style="display:none;color:var(--green);border-color:var(--green)"><svg width="12" height="12" viewBox="0 0 16 16" fill="currentColor"><path d="M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 01-1.06 0L2.22 9.28a.75.75 0 011.06-1.06L6 10.94l6.72-6.72a.75.75 0 011.06 0z"/></svg> Save</button>
94
+ <button class="modal-copy" id="modal-cancel-edit-btn" onclick="modalCancelEdit()" title="Cancel edit" style="display:none">Cancel</button>
95
+ <button class="modal-copy" id="modal-copy-btn" onclick="copyModalContent()" title="Copy to clipboard"><svg width="12" height="12" viewBox="0 0 16 16" fill="currentColor"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25z"/><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25z"/></svg> Copy</button>
96
+ <button class="modal-close" onclick="closeModal()">X</button>
97
+ </div>
98
+ </div>
99
+ <div class="modal-body" id="modal-body"></div>
100
+ <div class="modal-qa" id="modal-qa" style="display:none">
101
+ <div style="display:flex;align-items:center;justify-content:space-between;min-height:0">
102
+ <div class="modal-qa-thread" id="modal-qa-thread" style="flex:1"></div>
103
+ <button id="qa-clear-btn" style="display:none;background:none;border:none;color:var(--muted);font-size:10px;cursor:pointer;padding:2px 6px;white-space:nowrap;align-self:flex-start" onclick="clearQaConversation()" title="Clear conversation">Clear chat</button>
104
+ </div>
105
+ <div class="modal-qa-selection-pill" id="modal-qa-pill" style="display:none">
106
+ <span class="pill-label">Selection:</span>
107
+ <span class="pill-text" id="modal-qa-pill-text"></span>
108
+ <button class="pill-clear" onclick="clearQaSelection()" title="Clear selection">&times;</button>
109
+ </div>
110
+ <div class="modal-qa-input-wrap">
111
+ <input type="text" class="modal-qa-input" id="modal-qa-input" placeholder="Ask about this document..." onkeydown="if(event.key==='Enter')modalSend()">
112
+ <button class="modal-qa-btn" id="modal-send-btn" onclick="modalSend()">Send</button>
113
+ </div>
114
+ </div>
115
+ </div>
116
+ </div>
117
+
118
+ <!-- Floating "Ask about selection" button -->
119
+ <div class="ask-selection-btn" id="ask-selection-btn" onclick="modalAskAboutSelection()">Ask about this</div>
120
+
121
+ <script>/* __JS__ */</script>
122
+ </body>
123
+ </html>
@@ -0,0 +1,12 @@
1
+ <section>
2
+ <h2>Engine Log</h2>
3
+ <div class="log-list" id="engine-log">No log entries yet.</div>
4
+ </section>
5
+ <section>
6
+ <h2>Agent Metrics</h2>
7
+ <div id="metrics-content"><p class="empty">No metrics yet. Metrics appear after agents complete tasks.</p></div>
8
+ </section>
9
+ <section>
10
+ <h2>Token Usage</h2>
11
+ <div id="token-usage-content"><p class="empty">No usage data yet.</p></div>
12
+ </section>
@@ -0,0 +1,31 @@
1
+ <section class="cmd-center">
2
+ <h2>Command Center</h2>
3
+ <div class="cmd-input-wrap" id="cmd-input-wrap">
4
+ <div class="cmd-highlight-layer" id="cmd-highlight" aria-hidden="true"></div>
5
+ <textarea id="cmd-input" rows="1" placeholder='What do you need? e.g. "Fix the auth bug @dallas", "explain the dispatch flow", or "/note always use feature flags"'
6
+ oninput="cmdInputChanged()" onkeydown="cmdKeyDown(event)" onscroll="syncHighlightScroll()"></textarea>
7
+ <button class="cmd-send-btn" id="cmd-send-btn" onclick="cmdSubmit()">Send <kbd>Ctrl+Enter</kbd></button>
8
+ </div>
9
+ <div class="cmd-mention-popup" id="cmd-mention-popup"></div>
10
+ <div class="cmd-meta" id="cmd-meta" style="display:none"></div>
11
+ <div class="cmd-hints">
12
+ <span style="color:var(--blue);font-weight:600">Command Center</span>
13
+ <span>Ask anything, dispatch work, manage plans — powered by Sonnet</span>
14
+ <button class="cmd-history-btn" onclick="cmdShowHistory()">Past Commands</button>
15
+ </div>
16
+ <div class="cmd-toast" id="cmd-toast"></div>
17
+ </section>
18
+ <section>
19
+ <h2>Minions Members <span style="font-size:10px;color:var(--border);font-weight:400;text-transform:none;letter-spacing:0">click for details</span></h2>
20
+ <div class="agents" id="agents-grid">Loading...</div>
21
+ </section>
22
+ <section>
23
+ <h2>Dispatch Queue</h2>
24
+ <div class="dispatch-stats" id="dispatch-stats"></div>
25
+ <div id="dispatch-active"></div>
26
+ <div id="dispatch-pending"></div>
27
+ </section>
28
+ <section class="pr-panel" id="completed-section">
29
+ <h2>Recent Completions <span class="count" id="completed-count">0</span></h2>
30
+ <div id="completed-content"><p class="empty">No completed dispatches yet.</p></div>
31
+ </section>
@@ -0,0 +1,17 @@
1
+ <section>
2
+ <h2>Notes Inbox <span class="count" id="inbox-count">0</span> <span style="font-size:10px;color:var(--muted);font-weight:400;text-transform:none;letter-spacing:0">auto-consolidates at 3 notes</span></h2>
3
+ <div class="inbox-list" id="inbox-list">Loading...</div>
4
+ </section>
5
+ <section>
6
+ <h2 data-file="notes.md" style="position:relative">Team Notes <span style="font-size:10px;color:var(--muted);font-weight:400;text-transform:none;letter-spacing:0" id="notes-updated"></span></h2>
7
+ <div id="notes-list">Loading...</div>
8
+ </section>
9
+ <section>
10
+ <h2>Knowledge Base <span class="count" id="kb-count">0</span> <button id="kb-sweep-btn" onclick="kbSweep()" style="font-size:9px;padding:2px 8px;background:var(--surface2);border:1px solid var(--border);color:var(--muted);border-radius:4px;cursor:pointer;margin-left:8px;vertical-align:middle">sweep</button><span id="kb-swept-time" style="font-size:10px;color:var(--muted);font-weight:400;text-transform:none;letter-spacing:0;margin-left:8px"></span></h2>
11
+ <div class="kb-tabs" id="kb-tabs"></div>
12
+ <div class="kb-list" id="kb-list"><p class="empty">No knowledge entries yet. Notes are classified here after consolidation.</p></div>
13
+ </section>
14
+ <section>
15
+ <h2>Minions Skills <span class="count" id="skills-count">0</span></h2>
16
+ <div id="skills-list"><p class="empty">No skills yet. Agents create these when they discover repeatable workflows.</p></div>
17
+ </section>
@@ -0,0 +1,4 @@
1
+ <section>
2
+ <h2>Plans <span class="count" id="plans-count">0</span></h2>
3
+ <div id="plans-list"><p class="empty">No plans yet. Use /plan in the command center to create one.</p></div>
4
+ </section>
@@ -0,0 +1,5 @@
1
+ <section class="prd-panel" id="prd-section">
2
+ <h2>PRD <span class="count" id="prd-progress-count">0%</span> <span id="prd-badge"></span> <span id="archive-btns"></span></h2>
3
+ <div id="prd-content"><p class="prd-pending">No PRD found.</p></div>
4
+ <div id="prd-progress-content" style="margin-top:12px"></div>
5
+ </section>
@@ -0,0 +1,4 @@
1
+ <section class="pr-panel" id="pr-section">
2
+ <h2>Pull Requests <span class="count" id="pr-count">0</span></h2>
3
+ <div id="pr-content"><p class="pr-empty">No pull requests yet.</p></div>
4
+ </section>
@@ -0,0 +1,10 @@
1
+ <section id="scheduled-section">
2
+ <h2>Scheduled Tasks <span class="count" id="scheduled-count">0</span>
3
+ <button class="pr-pager-btn" style="font-size:9px;padding:1px 6px;color:var(--green);border-color:var(--green);margin-left:8px" onclick="openCreateScheduleModal()">+ New</button>
4
+ </h2>
5
+ <div id="scheduled-content"><p class="empty">No scheduled tasks. Add one to automate recurring work.</p></div>
6
+ </section>
7
+ <section>
8
+ <h2>MCP Servers <span class="count" id="mcp-count">0</span></h2>
9
+ <div id="mcp-list"><p class="empty">No MCP servers synced.</p></div>
10
+ </section>
@@ -0,0 +1,5 @@
1
+ <section id="work-items-section" style="overflow:visible">
2
+ <h2>Work Items <span class="count" id="wi-count">0</span> <button class="pr-pager-btn" style="font-size:9px;padding:2px 8px;margin-left:8px" onclick="toggleWorkItemArchive()">See Archive</button></h2>
3
+ <div id="work-items-content"><p class="empty">No work items. Add tasks via Command Center above.</p></div>
4
+ <div id="work-items-archive" style="display:none;margin-top:12px"></div>
5
+ </section>