feat: document & audio corpus picker for all tools

- Add "Select from My Docs" button to all text tool forms; free-tier
  users see an upgrade modal, paid (CaveauAI) users get a searchable
  multi-select modal backed by /api/dashboard/documents.php
- Add "Select from My Audio" picker on Transcribe with single-select
  and a "Save to My Audio" button for persisting uploaded clips
- New PHP helpers in bootstrap.php: dbnToolsFetchDocChunks,
  dbnToolsClientIdFromSession, dbnToolsInjectDocContent
- timeline, ask, redact APIs prepend selected document content
  (fetched from client_chunks SQL) before the textarea text
- api/dashboard/audio-upload.php stores audio files on server and
  creates a client_documents row with source_type='audio'
- api/transcribe.php falls back to stored audio via audio_doc_id POST
  field when no file is uploaded
- api/dashboard/documents.php supports ?source_type= filter
- tools.js: doc_ids added to JSON payload; stored-audio transcribe path
- New assets/css/doc-picker.css, assets/js/doc-picker.js
- SQL migration: scripts/sql/audio_docs_column.sql

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-23 21:38:04 +02:00
parent 58e1d1dae1
commit f383ad5b74
14 changed files with 857 additions and 15 deletions
+33
View File
@@ -22,11 +22,44 @@
</section><!-- /workspace -->
</main><!-- /appShell -->
<?php require_once __DIR__ . '/footer.php'; ?>
<link rel="stylesheet" href="/assets/css/doc-picker.css">
<script src="assets/js/tools.js" defer></script>
<?php if (!empty($extraScripts) && is_array($extraScripts)): foreach ($extraScripts as $extraScript): ?>
<script src="<?= htmlspecialchars((string)$extraScript) ?>" defer></script>
<?php endforeach; endif; ?>
<script src="assets/js/corpus-save.js" defer></script>
<script src="/assets/js/doc-picker.js" defer></script>
<!-- Doc picker modal (shared across all tool pages) -->
<div id="docPickerBackdrop" class="doc-picker-backdrop" hidden role="dialog" aria-modal="true" aria-labelledby="docPickerTitle">
<div class="doc-picker-dialog">
<div class="doc-picker-dialog__head">
<h3 id="docPickerTitle">Select from My Docs</h3>
<button class="doc-picker-dialog__close" aria-label="Close">&times;</button>
</div>
<input type="search" class="doc-picker-dialog__search" placeholder="Search documents…" aria-label="Search documents">
<div class="doc-picker-list" role="listbox" aria-multiselectable="true">
<p class="doc-picker-list__loading">Loading…</p>
</div>
<div class="doc-picker-dialog__foot">
<span class="doc-picker-dialog__count"></span>
<button class="doc-picker-dialog__confirm" disabled>Add to tool</button>
</div>
</div>
</div>
<!-- Upgrade modal for free-tier users -->
<div id="docPickerUpgradeBackdrop" class="doc-picker-upgrade-backdrop" hidden role="dialog" aria-modal="true" aria-labelledby="docPickerUpgradeTitle">
<div class="doc-picker-upgrade-card">
<span class="doc-picker-upgrade-card__icon">📂</span>
<h3 id="docPickerUpgradeTitle">Plus &amp; Pro feature</h3>
<p>Select documents from your uploaded corpus and feed them directly into any tool. Available on Plus and Pro plans.</p>
<div class="doc-picker-upgrade-card__actions">
<a href="/pricing.php" class="doc-picker-upgrade-card__cta">View plans</a>
<button class="doc-picker-upgrade-card__dismiss">Maybe later</button>
</div>
</div>
</div>
<!-- Save-to-corpus dialog (shared across all tool pages) -->
<dialog id="save-corpus-dialog" class="save-corpus-dialog">