fix: rename Browser workspace tool

This commit is contained in:
mirivlad 2026-07-14 22:33:43 +08:00
parent 5cad11f3f9
commit 2da414fb3b
8 changed files with 47 additions and 47 deletions

View File

@ -1,7 +1,7 @@
import { test, expect } from '@playwright/test'; import { test, expect } from '@playwright/test';
import { waitForAppReady, setupConsoleCollector, resetMockState } from './helpers.js'; import { waitForAppReady, setupConsoleCollector, resetMockState } from './helpers.js';
test.describe('Browser Inbox workflow', () => { test.describe('Browser workflow', () => {
let consoleCollector; let consoleCollector;
test.beforeEach(async ({ page }) => { test.beforeEach(async ({ page }) => {
@ -16,14 +16,14 @@ test.describe('Browser Inbox workflow', () => {
}); });
test('global inbox explains empty capture flow and exposes assignment filters', async ({ page }) => { test('global inbox explains empty capture flow and exposes assignment filters', async ({ page }) => {
await page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser Inbox' }).click(); await page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser' }).click();
const inbox = page.locator('.browser-inbox-root'); const inbox = page.locator('.browser-inbox-root');
await expect(inbox).toBeVisible({ timeout: 10000 }); await expect(inbox).toBeVisible({ timeout: 10000 });
await expect(inbox.locator('.browser-inbox-title')).toContainText('Browser Inbox'); await expect(inbox.locator('.browser-inbox-title')).toHaveText('Browser');
await expect(inbox.locator('.browser-inbox-count')).toHaveText('0 items'); await expect(inbox.locator('.browser-inbox-count')).toHaveText('0 items');
await expect(inbox.locator('.browser-inbox-empty')).toContainText('No browser captures yet'); await expect(inbox.locator('.browser-inbox-empty')).toContainText('No browser materials yet');
await expect(inbox.locator('.browser-inbox-empty')).toContainText('send a page, selection, link, or file from the browser extension'); await expect(inbox.locator('.browser-inbox-empty')).toContainText('Send a page, selection, or link from the extension');
await expect(inbox.locator('[data-browser-inbox-filter="status"]')).toBeVisible(); await expect(inbox.locator('[data-browser-inbox-filter="status"]')).toBeVisible();
await expect(inbox.locator('[data-browser-inbox-filter="workspace"]')).toBeVisible(); await expect(inbox.locator('[data-browser-inbox-filter="workspace"]')).toBeVisible();
await expect(inbox.locator('[data-browser-inbox-action="clear"]')).toBeDisabled(); await expect(inbox.locator('[data-browser-inbox-action="clear"]')).toBeDisabled();
@ -47,7 +47,7 @@ test.describe('Browser Inbox workflow', () => {
}], }],
}); });
}); });
await page.getByRole('tab', { name: 'Browser Inbox' }).click(); await page.getByRole('tab', { name: 'Browser' }).click();
const inbox = page.locator('.browser-inbox-root'); const inbox = page.locator('.browser-inbox-root');
await expect(inbox.locator('.browser-inbox-count')).toHaveText('1 item'); await expect(inbox.locator('.browser-inbox-count')).toHaveText('1 item');
@ -94,7 +94,7 @@ test.describe('Browser Inbox workflow', () => {
], ],
}); });
}); });
await page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser Inbox' }).click(); await page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser' }).click();
const inbox = page.locator('.browser-inbox-root'); const inbox = page.locator('.browser-inbox-root');
await expect(inbox.locator('.browser-inbox-count')).toHaveText('3 items'); await expect(inbox.locator('.browser-inbox-count')).toHaveText('3 items');

View File

@ -30,23 +30,23 @@ test.describe('B: Sidebar opens plugin view by item.view', () => {
test('Sidebar item exists with correct label', async ({ page }) => { test('Sidebar item exists with correct label', async ({ page }) => {
await expect(page.locator('.sidebar .nav-item').filter({ hasText: 'Plugin Manager' })).not.toBeVisible(); await expect(page.locator('.sidebar .nav-item').filter({ hasText: 'Plugin Manager' })).not.toBeVisible();
await expect(page.locator('.sidebar .plugin-item').filter({ hasText: 'Activity' })).toBeVisible(); await expect(page.locator('.sidebar .plugin-item').filter({ hasText: 'Activity' })).toBeVisible();
await expect(page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser Inbox' })).toBeVisible(); await expect(page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser' })).toBeVisible();
const sidebarItem = page.locator('.sidebar .plugin-item').filter({ hasText: 'Platform Test' }); const sidebarItem = page.locator('.sidebar .plugin-item').filter({ hasText: 'Platform Test' });
await expect(sidebarItem).toBeVisible(); await expect(sidebarItem).toBeVisible();
}); });
test('Global Activity and Browser Inbox sidebar items open plugin views', async ({ page }) => { test('Global Activity and Browser sidebar items open plugin views', async ({ page }) => {
await page.locator('.sidebar .plugin-item').filter({ hasText: 'Activity' }).click(); await page.locator('.sidebar .plugin-item').filter({ hasText: 'Activity' }).click();
await expect(page.locator('.view-container .view-header h2')).toHaveText('Activity', { timeout: 10000 }); await expect(page.locator('.view-container .view-header h2')).toHaveText('Activity', { timeout: 10000 });
await page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser Inbox' }).click(); await page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser' }).click();
await expect(page.locator('.view-container .view-header h2')).toHaveText('Browser Inbox', { timeout: 10000 }); await expect(page.locator('.view-container .view-header h2')).toHaveText('Browser', { timeout: 10000 });
}); });
test('selected global tool remains visibly active through navigation and sidebar reloads', async ({ page }) => { test('selected global tool remains visibly active through navigation and sidebar reloads', async ({ page }) => {
const activity = page.locator('.sidebar .plugin-item').filter({ hasText: 'Activity' }); const activity = page.locator('.sidebar .plugin-item').filter({ hasText: 'Activity' });
const browserInbox = page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser Inbox' }); const browserInbox = page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser' });
await activity.click(); await activity.click();
await expect(activity).toHaveAttribute('aria-current', 'page'); await expect(activity).toHaveAttribute('aria-current', 'page');
@ -62,7 +62,7 @@ test.describe('B: Sidebar opens plugin view by item.view', () => {
detail: { viewId: 'verstak.browser-inbox.view', pluginId: 'verstak.browser-inbox' }, detail: { viewId: 'verstak.browser-inbox.view', pluginId: 'verstak.browser-inbox' },
})); }));
}); });
await expect(page.locator('.view-container .view-header h2')).toHaveText('Browser Inbox', { timeout: 10000 }); await expect(page.locator('.view-container .view-header h2')).toHaveText('Browser', { timeout: 10000 });
await expect(browserInbox).toHaveAttribute('aria-current', 'page'); await expect(browserInbox).toHaveAttribute('aria-current', 'page');
await expect(browserInbox).toHaveClass(/is-active/); await expect(browserInbox).toHaveClass(/is-active/);
await expect(activity).not.toHaveAttribute('aria-current', 'page'); await expect(activity).not.toHaveAttribute('aria-current', 'page');

View File

@ -18,7 +18,7 @@ test.describe('UX follow-up fixes', () => {
await expect(search).toBeVisible(); await expect(search).toBeVisible();
await expect(page.locator('.sidebar [data-global-search-input]')).toBeVisible(); await expect(page.locator('.sidebar [data-global-search-input]')).toBeVisible();
await page.locator('.sidebar .nav-item').filter({ hasText: 'Browser Inbox' }).click(); await page.locator('.sidebar .nav-item').filter({ hasText: 'Browser' }).click();
await expect(page.locator('.browser-inbox-root')).toBeVisible({ timeout: 10000 }); await expect(page.locator('.browser-inbox-root')).toBeVisible({ timeout: 10000 });
await expect(search).toBeVisible(); await expect(search).toBeVisible();
}); });
@ -67,7 +67,7 @@ test.describe('UX follow-up fixes', () => {
const search = page.locator('[data-global-search-input]'); const search = page.locator('[data-global-search-input]');
await search.fill('Research Search Result'); await search.fill('Research Search Result');
const result = page.locator('[data-global-search-result-type="Browser Inbox"]').filter({ hasText: 'Research Search Result' }); const result = page.locator('[data-global-search-result-type="Browser"]').filter({ hasText: 'Research Search Result' });
await expect(result).toBeVisible({ timeout: 10000 }); await expect(result).toBeVisible({ timeout: 10000 });
await result.click(); await result.click();

View File

@ -56,7 +56,7 @@ test.describe('UX Overview workspace flow', () => {
await page.getByRole('tab', { name: 'Overview' }).click(); await page.getByRole('tab', { name: 'Overview' }).click();
await overview.locator('[data-overview-summary="captures"]').click(); await overview.locator('[data-overview-summary="captures"]').click();
await expect(page.getByRole('tab', { name: 'Browser Inbox' })).toHaveAttribute('aria-selected', 'true'); await expect(page.getByRole('tab', { name: 'Browser' })).toHaveAttribute('aria-selected', 'true');
await expect(page.locator('.browser-inbox-root')).toBeVisible({ timeout: 10000 }); await expect(page.locator('.browser-inbox-root')).toBeVisible({ timeout: 10000 });
await page.getByRole('tab', { name: 'Overview' }).click(); await page.getByRole('tab', { name: 'Overview' }).click();
@ -70,7 +70,7 @@ test.describe('UX Overview workspace flow', () => {
await page.getByRole('tab', { name: 'Overview' }).click(); await page.getByRole('tab', { name: 'Overview' }).click();
await overview.locator('[data-overview-summary="attention"]').click(); await overview.locator('[data-overview-summary="attention"]').click();
await expect(page.getByRole('tab', { name: 'Browser Inbox' })).toHaveAttribute('aria-selected', 'true'); await expect(page.getByRole('tab', { name: 'Browser' })).toHaveAttribute('aria-selected', 'true');
}); });
test('Overview keeps the Notes total factual when the Files plugin is unavailable', async ({ page }) => { test('Overview keeps the Notes total factual when the Files plugin is unavailable', async ({ page }) => {
@ -80,13 +80,13 @@ test.describe('UX Overview workspace flow', () => {
await expect(page.locator('[data-overview-summary="notes"]')).toContainText('1 total'); await expect(page.locator('[data-overview-summary="notes"]')).toContainText('1 total');
}); });
test('Overview hides Browser Inbox cards and actions when the current Deal does not include it', async ({ page }) => { test('Overview hides Browser cards and actions when the current Deal does not include it', async ({ page }) => {
await page.locator('button[title="New workspace"]').click(); await page.locator('button[title="New Deal"]').click();
const modal = page.locator('[data-workspace-create-modal]'); const modal = page.locator('[data-workspace-create-modal]');
await modal.locator('[data-workspace-name]').fill('MinimalOverview'); await modal.locator('[data-workspace-name]').fill('MinimalOverview');
await modal.locator('[data-workspace-template]').selectOption('minimal'); await modal.locator('[data-workspace-template]').selectOption('minimal');
await modal.getByRole('button', { name: 'Create workspace' }).click(); await modal.getByRole('button', { name: 'Create Deal' }).click();
await expect(page.getByRole('tab', { name: 'Browser Inbox' })).toHaveCount(0); await expect(page.getByRole('tab', { name: 'Browser' })).toHaveCount(0);
await page.evaluate(async () => { await page.evaluate(async () => {
await window.go.api.App.WritePluginSettings('verstak.browser-inbox', { await window.go.api.App.WritePluginSettings('verstak.browser-inbox', {
@ -107,7 +107,7 @@ test.describe('UX Overview workspace flow', () => {
await expect(overview).not.toContainText('Inbox material must stay hidden'); await expect(overview).not.toContainText('Inbox material must stay hidden');
}); });
test('Overview refreshes when Browser Inbox is disabled through plugin state changes', async ({ page }) => { test('Overview refreshes when Browser is disabled through plugin state changes', async ({ page }) => {
await page.evaluate(async () => { await page.evaluate(async () => {
await window.go.api.App.WritePluginSettings('verstak.browser-inbox', { await window.go.api.App.WritePluginSettings('verstak.browser-inbox', {
'captures:global': [{ 'captures:global': [{
@ -123,7 +123,7 @@ test.describe('UX Overview workspace flow', () => {
}); });
const overview = page.locator('[data-overview-root]'); const overview = page.locator('[data-overview-root]');
await expect(page.getByRole('tab', { name: 'Browser Inbox' })).toHaveCount(0); await expect(page.getByRole('tab', { name: 'Browser' })).toHaveCount(0);
await expect(overview.locator('[data-overview-summary="captures"]')).toHaveCount(0); await expect(overview.locator('[data-overview-summary="captures"]')).toHaveCount(0);
await expect(overview.locator('[data-overview-action="browser-inbox"]')).toHaveCount(0); await expect(overview.locator('[data-overview-action="browser-inbox"]')).toHaveCount(0);
}); });
@ -264,7 +264,7 @@ test.describe('UX Overview workspace flow', () => {
await expect(candidates.nth(3)).toContainText('Changed file "draft.md"'); await expect(candidates.nth(3)).toContainText('Changed file "draft.md"');
await candidates.nth(0).click(); await candidates.nth(0).click();
await expect(page.getByRole('tab', { name: 'Browser Inbox' })).toHaveAttribute('aria-selected', 'true'); await expect(page.getByRole('tab', { name: 'Browser' })).toHaveAttribute('aria-selected', 'true');
await expect(page.locator('.browser-inbox-root')).toBeVisible({ timeout: 10000 }); await expect(page.locator('.browser-inbox-root')).toBeVisible({ timeout: 10000 });
await page.getByRole('tab', { name: 'Overview' }).click(); await page.getByRole('tab', { name: 'Overview' }).click();

View File

@ -28,7 +28,7 @@ test.describe('Workspace templates', () => {
await expect(templateSelect).toHaveValue('default'); await expect(templateSelect).toHaveValue('default');
await expect(templateSelect).toHaveCSS('appearance', 'none'); await expect(templateSelect).toHaveCSS('appearance', 'none');
await expect(modal.locator('[data-workspace-template-tools]')).toContainText('Notes'); await expect(modal.locator('[data-workspace-template-tools]')).toContainText('Notes');
await expect(modal.locator('[data-workspace-template-tools]')).toContainText('Browser Inbox'); await expect(modal.locator('[data-workspace-template-tools]')).toContainText('Browser');
await modal.getByRole('button', { name: 'Create Deal' }).click(); await modal.getByRole('button', { name: 'Create Deal' }).click();
await expect(modal.locator('[data-workspace-create-error]')).toContainText('Name is required'); await expect(modal.locator('[data-workspace-create-error]')).toContainText('Name is required');
@ -74,7 +74,7 @@ test.describe('Workspace templates', () => {
await expect(page.getByRole('tab', { name: 'Journal' })).toHaveCount(0); await expect(page.getByRole('tab', { name: 'Journal' })).toHaveCount(0);
await expect(page.getByRole('tab', { name: 'Secrets' })).toHaveCount(0); await expect(page.getByRole('tab', { name: 'Secrets' })).toHaveCount(0);
await expect(page.locator('.sidebar .plugin-item').filter({ hasText: 'Todos' })).toBeVisible(); await expect(page.locator('.sidebar .plugin-item').filter({ hasText: 'Todos' })).toBeVisible();
await expect(page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser Inbox' })).toBeVisible(); await expect(page.locator('.sidebar .plugin-item').filter({ hasText: 'Browser' })).toBeVisible();
}); });
test('template explains an unavailable plugin and warns after incomplete creation', async ({ page }) => { test('template explains an unavailable plugin and warns after incomplete creation', async ({ page }) => {

View File

@ -150,7 +150,7 @@ export default {
'command.openOverview': 'Open Overview', 'command.openOverview': 'Open Overview',
'command.openFiles': 'Open Files', 'command.openFiles': 'Open Files',
'command.openActivity': 'Open Activity', 'command.openActivity': 'Open Activity',
'command.openBrowserInbox': 'Open Browser Inbox', 'command.openBrowserInbox': 'Open Browser',
'command.createMarkdown': 'Create Markdown File', 'command.createMarkdown': 'Create Markdown File',
'command.createText': 'Create Text File', 'command.createText': 'Create Text File',
'command.syncNow': 'Sync Now', 'command.syncNow': 'Sync Now',
@ -172,7 +172,7 @@ export default {
'search.type.folder': 'Folder', 'search.type.folder': 'Folder',
'search.type.file': 'File', 'search.type.file': 'File',
'search.type.journal': 'Journal', 'search.type.journal': 'Journal',
'search.type.browserInbox': 'Browser Inbox', 'search.type.browserInbox': 'Browser',
'search.type.activity': 'Activity', 'search.type.activity': 'Activity',
'workbench.noProvider': 'No provider', 'workbench.noProvider': 'No provider',
'workbench.noViewer': 'No viewer/editor available', 'workbench.noViewer': 'No viewer/editor available',

View File

@ -150,7 +150,7 @@ export default {
'command.openOverview': 'Открыть обзор', 'command.openOverview': 'Открыть обзор',
'command.openFiles': 'Открыть файлы', 'command.openFiles': 'Открыть файлы',
'command.openActivity': 'Открыть активность', 'command.openActivity': 'Открыть активность',
'command.openBrowserInbox': 'Открыть входящие из браузера', 'command.openBrowserInbox': 'Открыть Браузер',
'command.createMarkdown': 'Создать файл Markdown', 'command.createMarkdown': 'Создать файл Markdown',
'command.createText': 'Создать текстовый файл', 'command.createText': 'Создать текстовый файл',
'command.syncNow': 'Синхронизировать сейчас', 'command.syncNow': 'Синхронизировать сейчас',
@ -172,7 +172,7 @@ export default {
'search.type.folder': 'Папка', 'search.type.folder': 'Папка',
'search.type.file': 'Файл', 'search.type.file': 'Файл',
'search.type.journal': 'Журнал', 'search.type.journal': 'Журнал',
'search.type.browserInbox': 'Входящие из браузера', 'search.type.browserInbox': 'Браузер',
'search.type.activity': 'Активность', 'search.type.activity': 'Активность',
'workbench.noProvider': 'Нет обработчика', 'workbench.noProvider': 'Нет обработчика',
'workbench.noViewer': 'Нет доступного средства просмотра или редактора', 'workbench.noViewer': 'Нет доступного средства просмотра или редактора',

View File

@ -242,19 +242,19 @@ import journalSource from '../../../../../verstak-official-plugins/plugins/journ
manifest: { manifest: {
schemaVersion: 1, schemaVersion: 1,
id: 'verstak.browser-inbox', id: 'verstak.browser-inbox',
name: 'Browser Inbox', name: 'Browser',
version: '0.1.0', version: '0.1.0',
apiVersion: '0.1.0', apiVersion: '0.1.0',
description: 'Global browser capture queue with explicit workspace assignment.', description: 'Global browser materials with explicit Deal assignment.',
source: 'official', source: 'official',
icon: 'inbox', icon: 'inbox',
provides: ['browser.inbox'], provides: ['browser.inbox'],
permissions: ['events.subscribe', 'files.read', 'storage.namespace', 'ui.register'], permissions: ['events.subscribe', 'files.read', 'storage.namespace', 'ui.register'],
frontend: { entry: 'frontend/dist/index.js' }, frontend: { entry: 'frontend/dist/index.js' },
contributes: { contributes: {
views: [{ id: 'verstak.browser-inbox.view', title: 'Browser Inbox', icon: 'inbox', component: 'BrowserInboxView' }], views: [{ id: 'verstak.browser-inbox.view', title: 'Browser', icon: 'inbox', component: 'BrowserInboxView' }],
sidebarItems: [{ id: 'verstak.browser-inbox.sidebar', title: 'Browser Inbox', icon: 'inbox', view: 'verstak.browser-inbox.view', position: 30 }], sidebarItems: [{ id: 'verstak.browser-inbox.sidebar', title: 'Browser', icon: 'inbox', view: 'verstak.browser-inbox.view', position: 30 }],
workspaceItems: [{ id: 'verstak.browser-inbox.workspace', title: 'Browser Inbox', icon: 'inbox', component: 'BrowserInboxView' }] workspaceItems: [{ id: 'verstak.browser-inbox.workspace', title: 'Browser', icon: 'inbox', component: 'BrowserInboxView' }]
} }
}, },
rootPath: '/tmp/verstak-test/plugins/browser-inbox', rootPath: '/tmp/verstak-test/plugins/browser-inbox',
@ -297,7 +297,7 @@ import journalSource from '../../../../../verstak-official-plugins/plugins/journ
'verstak.sync': 'Синхронизация', 'verstak.sync': 'Синхронизация',
'verstak.activity': 'Активность', 'verstak.activity': 'Активность',
'verstak.journal': 'Журнал', 'verstak.journal': 'Журнал',
'verstak.browser-inbox': 'Входящие из браузера', 'verstak.browser-inbox': 'Браузер',
'verstak.search': 'Поиск', 'verstak.search': 'Поиск',
'verstak.trash': 'Корзина', 'verstak.trash': 'Корзина',
'verstak.todo': 'Задачи', 'verstak.todo': 'Задачи',
@ -2456,7 +2456,7 @@ import journalSource from '../../../../../verstak-official-plugins/plugins/journ
} }
function title(capture) { function title(capture) {
return capture.title || capture.fileName || capture.url || capture.captureId || 'Untitled capture'; return capture.title || capture.fileName || capture.url || capture.captureId || 'Untitled material';
} }
function renderBrowserInbox(containerEl, props, api) { function renderBrowserInbox(containerEl, props, api) {
@ -2473,7 +2473,7 @@ import journalSource from '../../../../../verstak-official-plugins/plugins/journ
containerEl.innerHTML = ''; containerEl.innerHTML = '';
var root = el('div', { className: 'browser-inbox-root', 'data-plugin-id': PLUGIN_ID }); var root = el('div', { className: 'browser-inbox-root', 'data-plugin-id': PLUGIN_ID });
var toolbar = el('div', { className: 'browser-inbox-toolbar' }); var toolbar = el('div', { className: 'browser-inbox-toolbar' });
var titleEl = el('span', { className: 'browser-inbox-title', textContent: rootPath ? 'Browser Inbox · ' + rootPath : 'Browser Inbox' }); var titleEl = el('span', { className: 'browser-inbox-title', textContent: rootPath ? 'Browser · ' + rootPath : 'Browser' });
var countEl = el('span', { className: 'browser-inbox-count' }); var countEl = el('span', { className: 'browser-inbox-count' });
var statusEl = el('span', { className: 'browser-inbox-status' }); var statusEl = el('span', { className: 'browser-inbox-status' });
var filtersEl = el('div', { className: 'browser-inbox-filters' }); var filtersEl = el('div', { className: 'browser-inbox-filters' });
@ -2557,7 +2557,7 @@ import journalSource from '../../../../../verstak-official-plugins/plugins/journ
function renderWorkspaceFilterOptions() { function renderWorkspaceFilterOptions() {
if (rootPath) return; if (rootPath) return;
workspaceFilterEl.innerHTML = ''; workspaceFilterEl.innerHTML = '';
workspaceFilterEl.appendChild(option('', 'All workspaces')); workspaceFilterEl.appendChild(option('', 'All Deals'));
workspaceRoots().forEach(function (workspace) { workspaceRoots().forEach(function (workspace) {
workspaceFilterEl.appendChild(option(workspace, workspace)); workspaceFilterEl.appendChild(option(workspace, workspace));
}); });
@ -2630,7 +2630,7 @@ import journalSource from '../../../../../verstak-official-plugins/plugins/journ
}) : captures).map(function (capture) { return capture.captureId; }); }) : captures).map(function (capture) { return capture.captureId; });
captures = captures.filter(function (capture) { return ids.indexOf(capture.captureId) === -1; }); captures = captures.filter(function (capture) { return ids.indexOf(capture.captureId) === -1; });
selectedId = ''; selectedId = '';
statusText = rootPath ? 'Workspace captures cleared' : 'Inbox cleared'; statusText = rootPath ? 'Deal materials cleared' : 'Inbox cleared';
return persist(); return persist();
} }
@ -2672,7 +2672,7 @@ import journalSource from '../../../../../verstak-official-plugins/plugins/journ
listEl.appendChild(el('div', { listEl.appendChild(el('div', {
className: 'browser-inbox-empty', className: 'browser-inbox-empty',
textContent: captures.length === 0 textContent: captures.length === 0
? 'No browser captures yet. Keep this view open, then send a page, selection, link, or file from the browser extension.' ? 'No browser materials yet. Send a page, selection, or link from the extension.'
: 'No captures match the current filters.' : 'No captures match the current filters.'
})); }));
return; return;
@ -2717,7 +2717,7 @@ import journalSource from '../../../../../verstak-official-plugins/plugins/journ
el('div', { className: 'browser-inbox-meta-value', textContent: capture.domain || '-' }), el('div', { className: 'browser-inbox-meta-value', textContent: capture.domain || '-' }),
el('div', { className: 'browser-inbox-meta-label', textContent: 'Browser' }), el('div', { className: 'browser-inbox-meta-label', textContent: 'Browser' }),
el('div', { className: 'browser-inbox-meta-value', textContent: capture.browserName || capture.source || '-' }), el('div', { className: 'browser-inbox-meta-value', textContent: capture.browserName || capture.source || '-' }),
el('div', { className: 'browser-inbox-meta-label', textContent: 'Workspace' }), el('div', { className: 'browser-inbox-meta-label', textContent: 'Deal' }),
el('div', { className: 'browser-inbox-meta-value', textContent: capture.workspaceRootPath || 'Unassigned' }), el('div', { className: 'browser-inbox-meta-value', textContent: capture.workspaceRootPath || 'Unassigned' }),
el('div', { className: 'browser-inbox-meta-label', textContent: 'Status' }), el('div', { className: 'browser-inbox-meta-label', textContent: 'Status' }),
el('div', { className: 'browser-inbox-meta-value', textContent: capture.processed ? 'Processed' : 'Unprocessed' }) el('div', { className: 'browser-inbox-meta-value', textContent: capture.processed ? 'Processed' : 'Unprocessed' })
@ -4196,19 +4196,19 @@ import journalSource from '../../../../../verstak-official-plugins/plugins/journ
manifest: { manifest: {
schemaVersion: 1, schemaVersion: 1,
id: 'verstak.browser-inbox', id: 'verstak.browser-inbox',
name: 'Browser Inbox', name: 'Browser',
version: '0.1.0', version: '0.1.0',
apiVersion: '0.1.0', apiVersion: '0.1.0',
description: 'Global browser capture queue with explicit workspace assignment.', description: 'Global browser materials with explicit Deal assignment.',
source: 'official', source: 'official',
icon: 'inbox', icon: 'inbox',
provides: ['browser.inbox'], provides: ['browser.inbox'],
permissions: ['events.subscribe', 'files.read', 'storage.namespace', 'ui.register'], permissions: ['events.subscribe', 'files.read', 'storage.namespace', 'ui.register'],
frontend: { entry: 'frontend/dist/index.js' }, frontend: { entry: 'frontend/dist/index.js' },
contributes: { contributes: {
views: [{ id: 'verstak.browser-inbox.view', title: 'Browser Inbox', icon: 'inbox', component: 'BrowserInboxView' }], views: [{ id: 'verstak.browser-inbox.view', title: 'Browser', icon: 'inbox', component: 'BrowserInboxView' }],
sidebarItems: [{ id: 'verstak.browser-inbox.sidebar', title: 'Browser Inbox', icon: 'inbox', view: 'verstak.browser-inbox.view', position: 30 }], sidebarItems: [{ id: 'verstak.browser-inbox.sidebar', title: 'Browser', icon: 'inbox', view: 'verstak.browser-inbox.view', position: 30 }],
workspaceItems: [{ id: 'verstak.browser-inbox.workspace', title: 'Browser Inbox', icon: 'inbox', component: 'BrowserInboxView' }] workspaceItems: [{ id: 'verstak.browser-inbox.workspace', title: 'Browser', icon: 'inbox', component: 'BrowserInboxView' }]
} }
}, },
rootPath: '/tmp/verstak-test/plugins/browser-inbox', rootPath: '/tmp/verstak-test/plugins/browser-inbox',