agent-tasks 1.9.8 → 1.9.9

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/dist/ui/app.js CHANGED
@@ -30,6 +30,7 @@ TaskBoard._fetch = function (url, opts) {
30
30
  return fetch(TaskBoard._baseUrl + url, opts);
31
31
  };
32
32
  TaskBoard._wsUrl = null;
33
+ TaskBoard._root = document;
33
34
 
34
35
  var filters = {
35
36
  search: '',
@@ -75,7 +76,7 @@ TaskBoard.saveCollapsed = saveCollapsed;
75
76
  // ---- Theme ----
76
77
 
77
78
  function updateThemeIcon(theme) {
78
- var icon = document.querySelector('.theme-icon');
79
+ var icon = TaskBoard._root.querySelector('.theme-icon');
79
80
  if (icon) icon.textContent = theme === 'dark' ? 'light_mode' : 'dark_mode';
80
81
  }
81
82
 
@@ -121,14 +122,14 @@ function updateFilterDropdowns() {
121
122
  var projects = [...new Set(state.tasks.map((t) => t.project).filter(Boolean))].sort();
122
123
  var assignees = [...new Set(state.tasks.map((t) => t.assigned_to).filter(Boolean))].sort();
123
124
 
124
- var projectSelect = document.getElementById('filter-project');
125
+ var projectSelect = TaskBoard._root.getElementById('filter-project');
125
126
  var currentProject = projectSelect.value;
126
127
  projectSelect.innerHTML =
127
128
  '<option value="">All projects</option>' +
128
129
  projects.map((p) => `<option value="${esc(p)}">${esc(p)}</option>`).join('');
129
130
  projectSelect.value = currentProject;
130
131
 
131
- var assigneeSelect = document.getElementById('filter-assignee');
132
+ var assigneeSelect = TaskBoard._root.getElementById('filter-assignee');
132
133
  var currentAssignee = assigneeSelect.value;
133
134
  assigneeSelect.innerHTML =
134
135
  '<option value="">All assignees</option>' +
@@ -137,13 +138,13 @@ function updateFilterDropdowns() {
137
138
  }
138
139
 
139
140
  function applyRestoredFilters() {
140
- var searchInput = document.getElementById('filter-search');
141
+ var searchInput = TaskBoard._root.getElementById('filter-search');
141
142
  if (filters.search && searchInput) searchInput.value = filters.search;
142
- var projectSelect = document.getElementById('filter-project');
143
+ var projectSelect = TaskBoard._root.getElementById('filter-project');
143
144
  if (filters.project && projectSelect) projectSelect.value = filters.project;
144
- var assigneeSelect = document.getElementById('filter-assignee');
145
+ var assigneeSelect = TaskBoard._root.getElementById('filter-assignee');
145
146
  if (filters.assignee && assigneeSelect) assigneeSelect.value = filters.assignee;
146
- var prioritySelect = document.getElementById('filter-priority');
147
+ var prioritySelect = TaskBoard._root.getElementById('filter-priority');
147
148
  if (filters.minPriority && prioritySelect) prioritySelect.value = String(filters.minPriority);
148
149
  }
149
150
 
@@ -191,7 +192,7 @@ function connect() {
191
192
  }
192
193
 
193
194
  function setConnectionStatus(status) {
194
- var el = document.getElementById('connection-status');
195
+ var el = TaskBoard._root.getElementById('connection-status');
195
196
  el.textContent =
196
197
  status === 'connected' ? 'Connected' : status === 'connecting' ? 'Connecting' : 'Disconnected';
197
198
  el.className = 'status-badge ' + status;
@@ -215,7 +216,7 @@ function handleFullState(data) {
215
216
  if (data.stages) state.stages = data.stages;
216
217
  if (data.gateConfigs) state.gateConfigs = data.gateConfigs;
217
218
  if (data.version) {
218
- document.getElementById('version').textContent = 'v' + data.version;
219
+ TaskBoard._root.getElementById('version').textContent = 'v' + data.version;
219
220
  }
220
221
  updateFilterDropdowns();
221
222
  applyRestoredFilters();
@@ -239,7 +240,7 @@ function quickFingerprint(data) {
239
240
  }
240
241
 
241
242
  function dismissLoading() {
242
- var overlay = document.getElementById('loading-overlay');
243
+ var overlay = TaskBoard._root.getElementById('loading-overlay');
243
244
  if (overlay && !overlay.classList.contains('hidden')) {
244
245
  overlay.classList.add('hidden');
245
246
  overlay.setAttribute('aria-hidden', 'true');
@@ -357,7 +358,7 @@ function handleEvent(event) {
357
358
  // ---- Legacy Modal (cleanup only) ----
358
359
 
359
360
  function closeModal() {
360
- document.getElementById('task-modal').hidden = true;
361
+ TaskBoard._root.getElementById('task-modal').hidden = true;
361
362
  }
362
363
 
363
364
  // ---- Init ----
@@ -367,7 +368,7 @@ function _init() {
367
368
  if (savedTheme === 'dark') document.documentElement.setAttribute('data-theme', 'dark');
368
369
  updateThemeIcon(savedTheme || 'light');
369
370
 
370
- document.getElementById('theme-toggle')?.addEventListener('click', () => {
371
+ TaskBoard._root.getElementById('theme-toggle')?.addEventListener('click', () => {
371
372
  var isDark = document.documentElement.getAttribute('data-theme') === 'dark';
372
373
  var next = isDark ? 'light' : 'dark';
373
374
  if (isDark) {
@@ -379,7 +380,7 @@ function _init() {
379
380
  updateThemeIcon(next);
380
381
  });
381
382
 
382
- document.getElementById('filter-search')?.addEventListener('input', (e) => {
383
+ TaskBoard._root.getElementById('filter-search')?.addEventListener('input', (e) => {
383
384
  clearTimeout(searchDebounce);
384
385
  searchDebounce = setTimeout(() => {
385
386
  filters.search = e.target.value;
@@ -389,21 +390,21 @@ function _init() {
389
390
  }, 200);
390
391
  });
391
392
 
392
- document.getElementById('filter-project')?.addEventListener('change', (e) => {
393
+ TaskBoard._root.getElementById('filter-project')?.addEventListener('change', (e) => {
393
394
  filters.project = e.target.value;
394
395
  saveFilters();
395
396
  TaskBoard.resetColumnVisibleCounts();
396
397
  render();
397
398
  });
398
399
 
399
- document.getElementById('filter-assignee')?.addEventListener('change', (e) => {
400
+ TaskBoard._root.getElementById('filter-assignee')?.addEventListener('change', (e) => {
400
401
  filters.assignee = e.target.value;
401
402
  saveFilters();
402
403
  TaskBoard.resetColumnVisibleCounts();
403
404
  render();
404
405
  });
405
406
 
406
- document.getElementById('filter-priority')?.addEventListener('change', (e) => {
407
+ TaskBoard._root.getElementById('filter-priority')?.addEventListener('change', (e) => {
407
408
  filters.minPriority = parseInt(e.target.value) || 0;
408
409
  saveFilters();
409
410
  TaskBoard.resetColumnVisibleCounts();
@@ -412,7 +413,7 @@ function _init() {
412
413
 
413
414
  // ---- Event Delegation (board) ----
414
415
 
415
- document.getElementById('board')?.addEventListener('click', (e) => {
416
+ TaskBoard._root.getElementById('board')?.addEventListener('click', (e) => {
416
417
  var action = e.target.closest('[data-action]');
417
418
 
418
419
  if (action) {
@@ -469,7 +470,7 @@ function _init() {
469
470
  }
470
471
  });
471
472
 
472
- document.getElementById('board')?.addEventListener('dblclick', (e) => {
473
+ TaskBoard._root.getElementById('board')?.addEventListener('dblclick', (e) => {
473
474
  var titleEl = e.target.closest('[data-action="edit-title"]');
474
475
  if (titleEl) {
475
476
  e.stopPropagation();
@@ -477,7 +478,7 @@ function _init() {
477
478
  }
478
479
  });
479
480
 
480
- document.getElementById('board')?.addEventListener('keydown', (e) => {
481
+ TaskBoard._root.getElementById('board')?.addEventListener('keydown', (e) => {
481
482
  if (e.key === 'Enter') {
482
483
  var card = e.target.closest('.task-card[data-task-id]');
483
484
  if (card) TaskBoard.openPanel(parseInt(card.dataset.taskId, 10));
@@ -486,7 +487,7 @@ function _init() {
486
487
 
487
488
  // ---- Collapsed column click (expand) ----
488
489
 
489
- document.getElementById('board')?.addEventListener('click', (e) => {
490
+ TaskBoard._root.getElementById('board')?.addEventListener('click', (e) => {
490
491
  var col = e.target.closest('.kanban-column.collapsed');
491
492
  if (col) {
492
493
  var stage = col.dataset.stage;
@@ -496,8 +497,8 @@ function _init() {
496
497
  }
497
498
  });
498
499
 
499
- document.getElementById('modal-close-btn')?.addEventListener('click', closeModal);
500
- document.getElementById('task-modal')?.addEventListener('click', (e) => {
500
+ TaskBoard._root.getElementById('modal-close-btn')?.addEventListener('click', closeModal);
501
+ TaskBoard._root.getElementById('task-modal')?.addEventListener('click', (e) => {
501
502
  if (e.target === e.currentTarget) closeModal();
502
503
  });
503
504
 
@@ -517,12 +518,12 @@ function _init() {
517
518
  TaskBoard.closePanel();
518
519
  return;
519
520
  }
520
- var modal = document.getElementById('task-modal');
521
+ var modal = TaskBoard._root.getElementById('task-modal');
521
522
  if (modal && !modal.hidden) {
522
523
  closeModal();
523
524
  return;
524
525
  }
525
- var cleanupModal = document.getElementById('cleanup-modal');
526
+ var cleanupModal = TaskBoard._root.getElementById('cleanup-modal');
526
527
  if (cleanupModal && !cleanupModal.classList.contains('hidden')) {
527
528
  cleanupModal.classList.add('hidden');
528
529
  return;
@@ -539,29 +540,29 @@ function _init() {
539
540
  ((e.ctrlKey || e.metaKey) && e.key === 'k')
540
541
  ) {
541
542
  e.preventDefault();
542
- document.getElementById('filter-search')?.focus();
543
+ TaskBoard._root.getElementById('filter-search')?.focus();
543
544
  }
544
545
  });
545
546
 
546
547
  // ---- Cleanup Dialog ----
547
548
 
548
- document.getElementById('cleanup-btn')?.addEventListener('click', () => {
549
- document.getElementById('cleanup-modal').classList.remove('hidden');
549
+ TaskBoard._root.getElementById('cleanup-btn')?.addEventListener('click', () => {
550
+ TaskBoard._root.getElementById('cleanup-modal').classList.remove('hidden');
550
551
  });
551
552
 
552
- document.getElementById('cleanup-close-btn')?.addEventListener('click', () => {
553
- document.getElementById('cleanup-modal').classList.add('hidden');
553
+ TaskBoard._root.getElementById('cleanup-close-btn')?.addEventListener('click', () => {
554
+ TaskBoard._root.getElementById('cleanup-modal').classList.add('hidden');
554
555
  });
555
556
 
556
- document.getElementById('cleanup-modal')?.addEventListener('click', (e) => {
557
+ TaskBoard._root.getElementById('cleanup-modal')?.addEventListener('click', (e) => {
557
558
  if (e.target === e.currentTarget) {
558
- document.getElementById('cleanup-modal').classList.add('hidden');
559
+ TaskBoard._root.getElementById('cleanup-modal').classList.add('hidden');
559
560
  }
560
561
  });
561
562
 
562
- document.getElementById('cleanup-completed')?.addEventListener('click', () => {
563
+ TaskBoard._root.getElementById('cleanup-completed')?.addEventListener('click', () => {
563
564
  var showToast = TaskBoard.showToast;
564
- document.getElementById('cleanup-modal').classList.add('hidden');
565
+ TaskBoard._root.getElementById('cleanup-modal').classList.add('hidden');
565
566
  TaskBoard._fetch('/api/cleanup', {
566
567
  method: 'POST',
567
568
  headers: { 'Content-Type': 'application/json' },
@@ -578,7 +579,7 @@ function _init() {
578
579
  .catch(() => showToast('Cleanup failed', 'Network error', 'error'));
579
580
  });
580
581
 
581
- document.getElementById('cleanup-everything')?.addEventListener('click', () => {
582
+ TaskBoard._root.getElementById('cleanup-everything')?.addEventListener('click', () => {
582
583
  var showToast = TaskBoard.showToast;
583
584
  if (
584
585
  !confirm(
@@ -586,7 +587,7 @@ function _init() {
586
587
  )
587
588
  )
588
589
  return;
589
- document.getElementById('cleanup-modal').classList.add('hidden');
590
+ TaskBoard._root.getElementById('cleanup-modal').classList.add('hidden');
590
591
  TaskBoard._fetch('/api/cleanup', {
591
592
  method: 'POST',
592
593
  headers: { 'Content-Type': 'application/json' },
@@ -756,7 +757,7 @@ function _init() {
756
757
  updateThemeIcon(theme);
757
758
  }
758
759
 
759
- var themeToggle = document.getElementById('theme-toggle');
760
+ var themeToggle = TaskBoard._root.getElementById('theme-toggle');
760
761
  if (themeToggle) themeToggle.style.display = 'none';
761
762
  });
762
763
 
@@ -777,16 +778,42 @@ TaskBoard.mount = function (container, options) {
777
778
  options = options || {};
778
779
  TaskBoard._baseUrl = options.baseUrl || '';
779
780
  TaskBoard._wsUrl = options.wsUrl || null;
780
- if (options.cssUrl && !document.getElementById('tb-plugin-css')) {
781
+
782
+ var shadow = container.attachShadow({ mode: 'open' });
783
+
784
+ if (options.cssUrl) {
781
785
  var link = document.createElement('link');
782
- link.id = 'tb-plugin-css';
783
786
  link.rel = 'stylesheet';
784
787
  link.href = options.cssUrl;
785
- document.head.appendChild(link);
788
+ shadow.appendChild(link);
786
789
  }
790
+
791
+ var fonts = document.createElement('link');
792
+ fonts.rel = 'stylesheet';
793
+ fonts.href =
794
+ 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap';
795
+ shadow.appendChild(fonts);
796
+ var icons = document.createElement('link');
797
+ icons.rel = 'stylesheet';
798
+ icons.href =
799
+ 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap';
800
+ shadow.appendChild(icons);
801
+
802
+ var pluginStyle = document.createElement('style');
803
+ pluginStyle.textContent =
804
+ ':host { display:block; width:100%; height:100%; overflow:hidden; }' +
805
+ '.tb-wrapper { font-family:var(--font-sans); font-size:14px; color:var(--text); background:var(--bg); line-height:1.5; width:100%; height:100%; overflow:hidden; }' +
806
+ '.tb-wrapper #app { height:100%; }';
807
+ shadow.appendChild(pluginStyle);
808
+
787
809
  if (typeof TaskBoard._template === 'function') {
788
- container.innerHTML = TaskBoard._template();
810
+ var wrapper = document.createElement('div');
811
+ wrapper.className = 'theme-dark tb-wrapper';
812
+ wrapper.innerHTML = TaskBoard._template();
813
+ shadow.appendChild(wrapper);
789
814
  }
815
+
816
+ TaskBoard._root = shadow;
790
817
  _init();
791
818
  };
792
819
 
@@ -797,8 +824,12 @@ TaskBoard.unmount = function () {
797
824
  ws = null;
798
825
  }
799
826
  clearTimeout(reconnectTimer);
827
+ TaskBoard._root = document;
800
828
  };
801
829
 
802
- // ---- Auto-init for standalone mode ----
830
+ // ---- Auto-init — check URL params for embedded mode (iframe in agent-desk) ----
803
831
 
832
+ var _params = new URLSearchParams(location.search);
833
+ if (_params.get('baseUrl')) TaskBoard._baseUrl = _params.get('baseUrl');
834
+ if (_params.get('wsUrl')) TaskBoard._wsUrl = _params.get('wsUrl');
804
835
  _init();
package/dist/ui/board.js CHANGED
@@ -212,7 +212,7 @@ function renderBoard() {
212
212
  var getFilteredTasks = TaskBoard.getFilteredTasks;
213
213
  var getBlockedTaskIds = TaskBoard.getBlockedTaskIds;
214
214
 
215
- const board = document.getElementById('board');
215
+ const board = TaskBoard._root.getElementById('board');
216
216
  const blocked = getBlockedTaskIds();
217
217
  const filtered = getFilteredTasks();
218
218
  const visibleStages = state.stages.filter((s) => s !== 'cancelled');
@@ -350,7 +350,7 @@ function renderStats() {
350
350
  const pending = state.tasks.filter((t) => t.status === 'pending').length;
351
351
  const done = state.tasks.filter((t) => t.status === 'completed').length;
352
352
 
353
- const statsEl = document.getElementById('stats');
353
+ const statsEl = TaskBoard._root.getElementById('stats');
354
354
  const values = { total, active, pending, done };
355
355
 
356
356
  morph(
package/dist/ui/drag.js CHANGED
@@ -27,11 +27,11 @@ function onDragEnd(e) {
27
27
  if (card) card.classList.remove('dragging');
28
28
  draggedTaskId = null;
29
29
  stopDragAutoScroll();
30
- document
30
+ TaskBoard._root
31
31
  .querySelectorAll('.kanban-column.drag-over')
32
32
  .forEach((c) => c.classList.remove('drag-over'));
33
- document.querySelectorAll('.drop-placeholder').forEach((p) => p.remove());
34
- const board = document.getElementById('board');
33
+ TaskBoard._root.querySelectorAll('.drop-placeholder').forEach((p) => p.remove());
34
+ const board = TaskBoard._root.getElementById('board');
35
35
  board.classList.remove('drag-scroll-left', 'drag-scroll-right');
36
36
  }
37
37
 
@@ -39,7 +39,7 @@ function onDragOver(e, col) {
39
39
  e.preventDefault();
40
40
  e.dataTransfer.dropEffect = 'move';
41
41
  if (col && !col.classList.contains('drag-over')) {
42
- document
42
+ TaskBoard._root
43
43
  .querySelectorAll('.kanban-column.drag-over')
44
44
  .forEach((c) => c.classList.remove('drag-over'));
45
45
  col.classList.add('drag-over');
@@ -52,7 +52,7 @@ function onDrop(e, col) {
52
52
 
53
53
  e.preventDefault();
54
54
  if (col) col.classList.remove('drag-over');
55
- document.querySelectorAll('.drop-placeholder').forEach((p) => p.remove());
55
+ TaskBoard._root.querySelectorAll('.drop-placeholder').forEach((p) => p.remove());
56
56
 
57
57
  if (!draggedTaskId) return;
58
58
  const targetStage = col.dataset.stage;
@@ -74,7 +74,7 @@ function onDrop(e, col) {
74
74
  }
75
75
 
76
76
  function startDragAutoScroll() {
77
- const board = document.getElementById('board');
77
+ const board = TaskBoard._root.getElementById('board');
78
78
  dragScrollInterval = setInterval(() => {
79
79
  if (!draggedTaskId) return;
80
80
  const rect = board.getBoundingClientRect();
@@ -105,7 +105,7 @@ function stopDragAutoScroll() {
105
105
  // ---- Drag event wiring ----
106
106
 
107
107
  function initDragEvents() {
108
- var board = document.getElementById('board');
108
+ var board = TaskBoard._root.getElementById('board');
109
109
 
110
110
  board.addEventListener('dragstart', (e) => {
111
111
  const card = e.target.closest('.task-card[data-task-id]');
@@ -15,7 +15,7 @@ var activeDropdown = null;
15
15
  function showInlineCreate(stage) {
16
16
  dismissInlineCreate();
17
17
 
18
- const col = document.querySelector(`.kanban-column[data-stage="${stage}"]`);
18
+ const col = TaskBoard._root.querySelector(`.kanban-column[data-stage="${stage}"]`);
19
19
  if (!col) return;
20
20
 
21
21
  const addBtn = col.querySelector('.column-add-btn');
package/dist/ui/panel.js CHANGED
@@ -117,10 +117,10 @@ function openPanel(id) {
117
117
  if (!task) return;
118
118
 
119
119
  state.panelTaskId = id;
120
- const wrapper = document.getElementById('board-wrapper');
120
+ const wrapper = TaskBoard._root.getElementById('board-wrapper');
121
121
  wrapper.classList.add('panel-open');
122
122
 
123
- const panel = document.getElementById('side-panel');
123
+ const panel = TaskBoard._root.getElementById('side-panel');
124
124
  const hasArtifacts = (state.artifactCounts[id] || 0) > 0;
125
125
  if (hasArtifacts) {
126
126
  panel.classList.add('panel-wide');
@@ -136,14 +136,14 @@ function openPanel(id) {
136
136
 
137
137
  function closePanel() {
138
138
  TaskBoard.state.panelTaskId = null;
139
- const wrapper = document.getElementById('board-wrapper');
139
+ const wrapper = TaskBoard._root.getElementById('board-wrapper');
140
140
  wrapper.classList.remove('panel-open');
141
141
  hidePanelBackdrop();
142
142
  highlightActiveCard(null);
143
143
  }
144
144
 
145
145
  function showPanelBackdrop() {
146
- let backdrop = document.getElementById('panel-backdrop');
146
+ let backdrop = TaskBoard._root.getElementById('panel-backdrop');
147
147
  if (!backdrop) {
148
148
  backdrop = document.createElement('div');
149
149
  backdrop.id = 'panel-backdrop';
@@ -155,16 +155,16 @@ function showPanelBackdrop() {
155
155
  }
156
156
 
157
157
  function hidePanelBackdrop() {
158
- const backdrop = document.getElementById('panel-backdrop');
158
+ const backdrop = TaskBoard._root.getElementById('panel-backdrop');
159
159
  if (backdrop) backdrop.style.display = 'none';
160
160
  }
161
161
 
162
162
  function highlightActiveCard(id) {
163
- document
163
+ TaskBoard._root
164
164
  .querySelectorAll('.task-card.active-card')
165
165
  .forEach((c) => c.classList.remove('active-card'));
166
166
  if (id) {
167
- const card = document.querySelector(`.task-card[data-task-id="${id}"]`);
167
+ const card = TaskBoard._root.querySelector(`.task-card[data-task-id="${id}"]`);
168
168
  if (card) card.classList.add('active-card');
169
169
  }
170
170
  }
@@ -179,8 +179,8 @@ function renderPanelContent(task) {
179
179
  var renderMarkdown = TaskBoard.renderMarkdown;
180
180
  var renderAvatar = TaskBoard.renderAvatar;
181
181
 
182
- const panelBody = document.getElementById('panel-body');
183
- const panelHeader = document.getElementById('panel-header-content');
182
+ const panelBody = TaskBoard._root.getElementById('panel-body');
183
+ const panelHeader = TaskBoard._root.getElementById('panel-header-content');
184
184
 
185
185
  const stageClass = `stage-${task.stage}`;
186
186
 
@@ -375,7 +375,7 @@ function renderPanelContent(task) {
375
375
  // ---- Comment submission ----
376
376
 
377
377
  function submitComment(taskId) {
378
- const input = document.getElementById('comment-input');
378
+ const input = TaskBoard._root.getElementById('comment-input');
379
379
  const content = input?.value?.trim();
380
380
  if (!content) return;
381
381
 
@@ -394,7 +394,7 @@ function submitComment(taskId) {
394
394
  // ---- Artifact interactions ----
395
395
 
396
396
  function toggleArtifact(id) {
397
- const wrapper = document.getElementById(id);
397
+ const wrapper = TaskBoard._root.getElementById(id);
398
398
  if (!wrapper) return;
399
399
  const isCollapsed = wrapper.classList.contains('artifact-collapsed');
400
400
  wrapper.classList.toggle('artifact-collapsed', !isCollapsed);
@@ -438,7 +438,7 @@ function copyArtifact(btn) {
438
438
 
439
439
  function openArtifactFullscreen(artId) {
440
440
  var esc = TaskBoard.esc;
441
- const wrapper = document.getElementById(artId);
441
+ const wrapper = TaskBoard._root.getElementById(artId);
442
442
  if (!wrapper) return;
443
443
  const content = wrapper.querySelector('.artifact-code, .diff-viewer');
444
444
  if (!content) return;
@@ -479,7 +479,7 @@ function openArtifactFullscreen(artId) {
479
479
  // ---- Panel resize ----
480
480
 
481
481
  function initPanelResize() {
482
- const panel = document.getElementById('side-panel');
482
+ const panel = TaskBoard._root.getElementById('side-panel');
483
483
  if (!panel) return;
484
484
  const handle = document.createElement('div');
485
485
  handle.className = 'panel-resize-handle';
@@ -517,7 +517,7 @@ function initPanelResize() {
517
517
  // ---- Panel event delegation ----
518
518
 
519
519
  function initPanelEvents() {
520
- document.getElementById('side-panel').addEventListener('click', (e) => {
520
+ TaskBoard._root.getElementById('side-panel').addEventListener('click', (e) => {
521
521
  const closeBtn = e.target.closest('[data-action="close-panel"]');
522
522
  if (closeBtn) {
523
523
  closePanel();
@@ -282,7 +282,7 @@ function renderDiff(content) {
282
282
  // ---- Toast ----
283
283
 
284
284
  function showToast(title, body, type) {
285
- const container = document.getElementById('toast-container');
285
+ const container = TaskBoard._root.getElementById('toast-container');
286
286
  const el = document.createElement('div');
287
287
  el.className = 'toast';
288
288
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-tasks",
3
- "version": "1.9.8",
3
+ "version": "1.9.9",
4
4
  "description": "Pipeline-driven task management for AI coding agents — stages, dependencies, artifacts, and multi-agent claiming",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",