<sectionclass="hero"id="dashboard"><div><pclass="eyebrow">EVIDENCE-LED PROSPECTING</p><h1>Good morning, Alex <span>✦</span></h1><pclass="hero-sub">Your pipeline has <strongid="heroCount">0 prospects</strong> ready for review.</p></div><buttonclass="button primary"data-scroll="#add">+ Add prospect</button></section>
<divclass="discovery-hero panel"><div><pclass="eyebrow">BUILT-IN DISCOVERY</p><h2id="discoveryWorkspaceTitle">Find prospects from approved seed sites</h2><pclass="muted">Describe the market, provide up to five public seed URLs, and let the bounded workspace job return reviewable candidates. No manual source registration required.</p></div><spanclass="discovery-badge">Bounded · review first</span></div>
<divclass="discovery-workspace-grid">
<articleclass="panel direct-discovery-form-panel"><divclass="panel-heading"><div><pclass="eyebrow">DISCOVERY BRIEF</p><h3>Set your criteria</h3></div><spanclass="small-label">Max 20 pages · 50 candidates</span></div>
<formid="directDiscoveryForm"><label>Keywords or market<inputid="directDiscoveryKeywords"name="keywords"requiredmaxlength="240"placeholder="e.g. solar installers, Cape Town"></label><label>Location <spanclass="optional">optional</span><inputid="directDiscoveryLocation"name="location"maxlength="120"placeholder="Western Cape, South Africa"></label><label>Seed URLs <spanclass="optional">up to 5 · one per line</span><textareaid="directDiscoverySeeds"name="seed_urls"rows="4"requiredplaceholder="https://directory.example/ https://association.example/members"></textarea></label><divclass="discovery-limit-grid"><label>Page limit<selectid="directDiscoveryMaxPages"name="max_pages"><optionvalue="5">5 pages</option><optionvalue="10"selected>10 pages</option><optionvalue="20">20 pages</option></select></label><label>Candidate limit<selectid="directDiscoveryMaxCandidates"name="max_candidates"><optionvalue="10">10 candidates</option><optionvalue="25"selected>25 candidates</option><optionvalue="50">50 candidates</option></select></label></div><divclass="form-footer"><pid="directDiscoveryMessage"class="form-message"role="status"aria-live="polite"></p><buttonclass="button primary"id="directDiscoveryRunBtn"type="submit">Run discovery <spanaria-hidden="true">→</span></button></div></form>
</article>
<asideclass="panel discovery-runs-panel"><divclass="panel-heading"><div><pclass="eyebrow">RUN HISTORY</p><h3>Discovery runs</h3></div><buttonclass="button ghost compact"id="directDiscoveryRefreshBtn"type="button">↻ Refresh</button></div><divid="directDiscoveryRunsState"class="discovery-runs-state"aria-live="polite"><divclass="detail-loading">Sign in to load discovery runs.</div></div></aside>
</div>
<divclass="panel discovery-results-panel"id="directDiscoveryResultsPanel"><divclass="panel-heading"><div><pclass="eyebrow">RESULT STATUS</p><h3id="directDiscoveryResultTitle">Select a run to inspect results</h3></div><spanid="directDiscoveryResultStatus"class="small-label">No run selected</span></div><divid="directDiscoveryResultState"aria-live="polite"><pclass="muted">Results appear here with job state, partial-result handling, and candidate provenance.</p></div></div>
<aclass="metric-card metric-link"data-dashboard-filter="fresh"href="#explorer"><divclass="metric-icon blue">◷</div><div><p>Freshness under 7d</p><h2id="metricFresh">0%</h2><spanclass="trend neutral">● Evidence coverage</span></div></a>
<aclass="metric-card metric-link"data-dashboard-filter="suppressed"href="#explorer"><divclass="metric-icon violet">⊘</div><div><p>Suppressed</p><h2id="metricSuppressed">0</h2><spanclass="trend neutral">● Do not contact</span></div></a>
<sectionclass="score-overview"aria-label="Score overview"><articleclass="panel score-distribution-panel"id="scoreDistributionPanel"data-smoke="score-distribution"><divclass="detail-loading"aria-live="polite">Sign in to load score distribution…</div></article></section>
<sectionclass="score-rules-section"id="scoreRules"aria-labelledby="scoreRulesTitle"><articleclass="panel"id="scoreRulesPanel"data-smoke="score-rules"><divclass="detail-loading"aria-live="polite">Sign in to load score rules…</div></article></section>
<asideclass="detail-panel panel"id="detailPanel"><divclass="empty-detail"><spanclass="empty-icon">◒</span><h3>Select a prospect</h3><p>Review evidence, confidence, and eligibility before taking action.</p></div></aside>
<div><pclass="eyebrow">OPERATIONS</p><h2id="jobsTitle">Job monitor</h2><pclass="muted">Track authenticated workspace jobs and their progress. No job data is shown until the API responds.</p></div>
<divclass="jobs-list panel"><divclass="panel-heading"><div><pclass="eyebrow">QUEUE</p><h3>Recent jobs</h3></div><spanid="jobsUpdatedAt"class="small-label">Not loaded</span></div><divid="jobsList"class="jobs-list-body"><divclass="job-empty">Sign in to load jobs from the workspace.</div></div></div>
<asideclass="job-detail panel"id="jobDetailPanel"><divclass="empty-detail"><spanclass="empty-icon">◷</span><h3>Select a job</h3><p>Inspect progress, structured errors, and the event timeline.</p></div></aside>
<divclass="sources-header panel"><div><pclass="eyebrow">GOVERNANCE</p><h2id="sourcesTitle">Sources</h2><pclass="muted">Review source ownership, terms, limits, and health before using discovery.</p></div><buttonclass="button ghost"id="sourcesRefreshBtn"type="button">↻ Refresh</button></div>
<divclass="source-safety"role="note"><strong>Discovery is disabled by default.</strong> No live source is enabled in this workspace. Enable a source only after its terms, owner, rate limit, and health have been reviewed.</div>
<articleclass="panel source-config-panel"><divclass="panel-heading"><div><pclass="eyebrow">CONFIGURATION</p><h3>Add a source</h3></div><spanclass="small-label">Manual or CSV</span></div><formid="sourceForm"><divclass="form-grid"><label>Source name<inputname="name"requiredplaceholder="Public business directory"></label><label>Source type<selectname="source_type"id="sourceType"><optionvalue="manual">Manual / API</option><optionvalue="csv">CSV upload</option></select></label><label>Source URL <spanclass="optional">optional</span><inputname="url"type="url"placeholder="https://…"></label><label>Terms URL <spanclass="optional">required for enablement</span><inputname="terms_url"type="url"placeholder="https://…/terms"></label><label>Owner<inputname="owner"requiredplaceholder="Team or accountable person"></label><label>Rate limit<inputname="rate_limit"requiredplaceholder="e.g. 60 requests/hour"></label></div><labelclass="source-csv-field"id="sourceCsvField"hidden>CSV content<textareaname="csv_content"id="sourceCsvContent"rows="4"placeholder="Paste CSV content; it is sent only when you save this source."></textarea></label><divclass="form-footer"><pid="sourceFormMessage"class="form-message"role="status"></p><buttonclass="button primary"type="submit">Save source</button></div></form></article>
<articleclass="panel discovery-panel"><divclass="panel-heading"><div><pclass="eyebrow">DISCOVERY</p><h3>Query a source</h3></div><spanclass="small-label">No automatic runs</span></div><formid="discoveryForm"><label>Source<selectname="source_id"id="discoverySource"required><optionvalue="">Select a source</option></select></label><label>Query<inputname="query"requiredplaceholder="e.g. renewable energy firms in Cape Town"></label><labelclass="checkbox-label"><inputtype="checkbox"name="dry_run"id="discoveryDryRun"checked> Dry run (preview only)</label><divclass="form-footer"><pid="discoveryMessage"class="form-message"role="status"></p><divclass="discovery-actions"><buttonclass="button ghost"id="discoveryDryRunBtn"type="submit">Validate query</button><buttonclass="button primary"id="discoveryRunBtn"type="button">Run discovery</button></div></div></form></article>
</div>
<divclass="sources-list panel"><divclass="panel-heading"><div><pclass="eyebrow">REGISTRY</p><h3>Configured sources</h3></div><spanid="sourcesUpdatedAt"class="small-label">Not loaded</span></div><divid="sourcesList"class="sources-list-body"><divclass="source-empty">Sign in to load sources from the workspace.</div></div></div>
<divclass="source-records panel"><divclass="panel-heading"><div><pclass="eyebrow">RECENT OUTPUT</p><h3>Recent source records</h3></div></div><divid="sourceRecordsList"class="source-records-body"><divclass="source-empty">No records loaded.</div></div></div>
<sectionclass="lower-grid"id="add"><articleclass="panel add-panel"><divclass="panel-heading"><div><pclass="eyebrow">INTAKE</p><h2>Add a prospect</h2></div><spanclass="small-label">Manual entry</span></div><formid="addForm"><divclass="form-grid"><label>Company name<inputrequiredname="name"placeholder="Acme Inc."></label><label>Website <spanclass="optional">optional</span><inputname="website"type="url"placeholder="https://acme.com"></label><label>Location<inputname="location"placeholder="Cape Town, ZA"></label><label>Notes <spanclass="optional">optional</span><inputname="description"placeholder="Why this is a fit…"></label></div><divclass="form-footer"><pid="formMessage"class="form-message"role="status"></p><buttonclass="button primary"type="submit">Add to review queue</button></div></form></article>
<articleclass="panel csv-panel"><divclass="panel-heading"><div><pclass="eyebrow">BULK INTAKE</p><h2>CSV preview</h2></div><labelclass="button ghost upload-label"for="csvInput">↑ Choose CSV</label><inputid="csvInput"type="file"accept=".csv,text/csv"hidden></div><pclass="muted">Preview rows before adding them to your review queue.</p><divid="csvPreview"class="csv-empty"><span>⊞</span><p>No file selected</p><small>CSV stays in your browser until you confirm.</small></div></article></section>
<divclass="crm-header panel"><div><pclass="eyebrow">CRM WORKFLOW</p><h2id="crmPipelineTitle">Pipeline board</h2><pclass="muted">Move prospects through explicit human stages. Stage changes never send outreach.</p></div><divclass="crm-actions"><buttonclass="button ghost"id="crmRefreshBtn"type="button">↻ Refresh CRM</button><buttonclass="button ghost"id="pipelineViewToggle"type="button"aria-pressed="false">☷ List view</button></div></div>
<divclass="crm-safety"role="note"><strong>No outreach from this workspace.</strong> Pipeline actions, interactions, and follow-ups are internal CRM records only. Suppressed or unreviewed prospects remain unavailable for contact.</div>
<divclass="crm-header panel"><div><pclass="eyebrow">RELATIONSHIP HISTORY</p><h2id="crmActivityTitle">Interactions & follow-ups</h2><pclass="muted">Capture outcomes and next steps without contacting anyone.</p></div></div>
<divclass="crm-two-col"><articleclass="panel interaction-panel"><divid="interactionState"class="detail-loading">Select a prospect to load interactions.</div></article><articleclass="panel"><divclass="panel-heading"><div><pclass="eyebrow">ADD RECORD</p><h3>Log an interaction</h3></div><spanclass="small-label">Internal only</span></div><formid="interactionForm"class="crm-form"><label>Channel<selectname="kind"><optionvalue="note">Note</option><optionvalue="phone">Phone</option><optionvalue="email">Email (record only)</option><optionvalue="meeting">Meeting</option><optionvalue="other">Other</option></select></label><label>Outcome<selectname="outcome"><optionvalue="other"selected>Other / not specified</option><optionvalue="connected">Connected</option><optionvalue="no_answer">No answer</option><optionvalue="left_message">Left message</option><optionvalue="meeting_booked">Meeting booked</option><optionvalue="meeting_held">Meeting held</option><optionvalue="qualified">Qualified</option><optionvalue="disqualified">Disqualified</option><optionvalue="won">Won</option><optionvalue="lost">Lost</option></select></label><label>Follow-up date <spanclass="optional">optional</span><inputname="follow_up_at"type="date"></label><label>Body<textareaname="body"rows="4"requiredplaceholder="What happened? Keep this an internal record."></textarea></label><pid="interactionMessage"class="form-message"role="status"></p><buttonclass="button primary"type="submit">Save interaction</button></form></article></div>
<divclass="crm-header panel"><div><pclass="eyebrow">REPORTING</p><h2id="crmReportsTitle">CRM reports</h2><pclass="muted">Tenant-scoped pipeline, outcomes, and activity summaries from the API.</p></div><buttonclass="button ghost"id="reportsRefreshBtn"type="button">↻ Refresh reports</button></div>
<divclass="suppression-warning"role="alert"><strong>Suppression always wins.</strong> Suppressed contacts and domains cannot be contacted, regardless of score, stage, or interaction outcome.</div>
<sectionclass="crm-section outreach-settings-section"id="outreachSettings"aria-labelledby="outreachSettingsTitle"data-smoke="outreach-provider-policy"><divclass="crm-header panel"><div><pclass="eyebrow">GOVERNANCE</p><h2id="outreachSettingsTitle">Outreach provider policy</h2><pclass="muted">View approved provider status without exposing credentials or secrets.</p></div><buttonclass="button ghost"id="outreachPolicyRefreshBtn"type="button">↻ Refresh policy</button></div><divclass="outreach-settings-safety"role="note"><strong>Sending is disabled by default.</strong> This panel is status-only. Provider configuration never creates a send trigger, and no credentials are displayed.</div><divid="providerPolicyPanel"class="provider-policy-panel"aria-live="polite"><divclass="detail-loading">Sign in to load provider policy.</div></div></section>
<divclass="merge-dialog-card"><divclass="panel-heading"><div><pclass="eyebrow">REVIEW REQUIRED</p><h2id="mergeDialogTitle">Confirm merge</h2></div><buttonclass="icon-button"id="cancelMergeBtn"type="button"aria-label="Close merge confirmation">×</button></div><pid="mergeDialogCopy"></p><divclass="merge-warning"><strong>This action is reversible.</strong> The merge will be recorded in history and can be reversed later.</div><pid="mergeDialogMessage"class="form-message"role="alert"aria-live="polite"></p><divclass="merge-dialog-actions"><buttonclass="button ghost"id="cancelMergeBtnSecondary"type="button">Cancel</button><buttonclass="button primary"id="confirmMergeBtn"type="button">Confirm merge</button></div></div>