{{ selectedSite.site_name }}
{{ currentRules.input_mode || 'url' }}{{ JSON.stringify(textifyTestResult.metadata, null, 2) }}
{{ textifyTestResult.markdown }}
Operations Center
{{ JSON.stringify(textifyTestResult.metadata, null, 2) }}
{{ textifyTestResult.markdown }}
Test full extraction + AI analysis pipeline
{{ pipelineThinkingText }}
{{ pipelineStreamingAIResult || 'Waiting for AI chunks...' }}
{{ JSON.stringify(pipelineStages.extraction.metadata, null, 2) }}
{{ JSON.stringify(val, null, 2) }}
Production piece lifecycle tracking — Onboard & Recap. Only pieces that were created (onboard started) appear here; content-blocked URLs are not recorded.
| Time | Title / Source | Type | Onboard | Recap | Duration | User | Status |
|---|---|---|---|---|---|---|---|
| {{ formatTime(piece.created_at) }} |
{{ piece.title || 'Untitled' }}
{{ piece.rss_source_name || piece.source_url || piece.file_name }}
|
{{ getPieceSourceLabel(piece) }} | ✗ ◔ ✓ | ✓ ⟳ ✗ — — | {{ piece.duration_ms ? (piece.duration_ms >= 1000 ? (piece.duration_ms / 1000).toFixed(1) + 's' : piece.duration_ms + 'ms') : '-' }} |
{{ piece.user_name || '-' }}
{{ piece.user_phone }}
|
{{ piece.status }} |
| {{ monitorLoading ? 'Loading pieces...' : 'No pieces found' }} | |||||||
URLs that failed during content extraction (blocked, HTTP errors, etc.)
| Time | URL | Reason | Error Detail | User |
|---|---|---|---|---|
| {{ formatTime(f.created_at) }} | {{ getFailureReasonLabel(f.failure_reason) }} |
{{ f.error_detail || '-' }}
|
{{ f.user_name || '-' }} | |
| {{ extractionFailuresLoading ? 'Loading...' : 'No extraction failures found' }} | ||||
Top viewed and most shared pieces by time range
| # | Title | Type | Views | Pins | Shares | Created |
|---|---|---|---|---|---|---|
| {{ idx + 1 }} |
{{ piece.title || 'Untitled' }}
{{ piece.publisher }}
|
{{ (piece.source_type || 'url').toUpperCase() }} | {{ piece.view_count }} | {{ piece.pin_count || 0 }} | {{ piece.share_count || 0 }} | {{ formatTime(piece.created_at) }} |
| {{ analysisLoading ? 'Loading...' : 'No view data in this time range' }} | ||||||
| # | Title | Type | Shares | Share Views | Pins | Last Shared |
|---|---|---|---|---|---|---|
| {{ idx + 1 }} |
{{ piece.title || 'Untitled' }}
{{ piece.publisher }}
|
{{ (piece.source_type || 'url').toUpperCase() }} | {{ piece.share_count }} | {{ piece.total_share_views || 0 }} | {{ piece.pin_count || 0 }} | {{ piece.last_shared_at ? formatTime(piece.last_shared_at) : '-' }} |
| {{ analysisLoading ? 'Loading...' : 'No share data in this time range' }} | ||||||
Permanently delete this piece and all related user_pieces. This cannot be undone.
{{ JSON.stringify(val, null, 2) }}
{{ JSON.stringify(val, null, 2) }}
{{ JSON.stringify(val, null, 2) }}
{{ JSON.stringify(pieceFullDetail.metadata, null, 2) }}
{{ JSON.stringify(pieceFullDetail.ai_result, null, 2) }}
{{ JSON.stringify(pieceFullDetail, null, 2) }}
View all users membership status and credits
| # | User | Phone |
Tier
|
Credits | Action | |||
|---|---|---|---|---|---|---|---|---|
| {{ membershipFilters.offset + idx + 1 }} |
|
{{ maskPhone(user.phone) }} | {{ (user.membership_tier || 'free').toUpperCase() }} | {{ user.credits_remaining || 0 }} | {{ user.credits_used || 0 }} | {{ formatDate(user.created_at) }} | {{ formatRelativeTime(user.last_sign_in_at) }} | |
| {{ membershipLoading ? 'Loading...' : 'No users found' }} | ||||||||
Manage codes by batch, supports bulk generation
| Code | Plan | Status | Redeemed By | Redeemed At | Action |
|---|---|---|---|---|---|
| {{ code.code }} | {{ getPlanName(code.plan_id) }} | {{ code.status === 'active' ? '🟢 Active' : code.status === 'redeemed' ? '✅ Redeemed' : code.status === 'expired' ? '⏰ Expired' : '🔴 Disabled' }} | {{ code.redeemed_by_name || '-' }} | {{ code.redeemed_at ? formatDate(code.redeemed_at) : '-' }} | - |
| {{ codesLoading ? 'Loading...' : 'No codes found' }} | |||||
All subscription order history
| Order No | User | Plan | Source | Amount | Status | Created | Paid At |
|---|---|---|---|---|---|---|---|
|
{{ expandedOrderId === order.id ? '▼' : '▶' }}
R_{{ order.order_no.slice(7, 19) }}
VP{{ order.order_no.slice(2, 14) }}
{{ order.order_no.slice(0, 16) }}
|
{{ getPlanName(order.plan_id) }} | {{ order.source === 'redemption' ? 'Code' : order.source === 'virtual_payment' ? 'WxPay' : order.source === 'apple_iap' ? 'Apple' : order.source }} | ¥{{ (order.final_amount / 100).toFixed(2) }} | {{ order.status }} | {{ formatFullTime(order.created_at) }} | {{ order.paid_at ? formatFullTime(order.paid_at) : '-' }} | |
|
Order Detail
Order No:
{{ order.order_no }}
User ID:
Plan:
{{ getPlanName(order.plan_id) }} ({{ order.total_months || '-' }}mo)
Credits/mo:
{{ order.credits_granted_per_month || '-' }}
Amount:
¥{{ (order.original_amount / 100).toFixed(2) }}
-¥{{ (order.discount_amount / 100).toFixed(2) }}
= ¥{{ (order.final_amount / 100).toFixed(2) }}
Channel ID:
{{ order.payment_channel_order_id }}
Code:
{{ order.redemption_codes.code }}
Client IP:
{{ order.client_ip }}
Device
{{ (order.device_info.platform || 'unknown').toUpperCase() }}
{{ order.device_info.system }}
{{ [order.device_info.brand, order.device_info.model].filter(Boolean).join(' ') }}
WeChat {{ order.device_info.version }}
SDK {{ order.device_info.SDKVersion }}
Timeline
Created
{{ formatFullTime(order.created_at) }}
Paid
{{ formatFullTime(order.paid_at) }}
Awaiting Payment
Failed
Code: {{ order.payment_error_code }}
{{ order.payment_error_msg }}
Period
{{ formatDate(order.period_start) }} → {{ formatDate(order.period_end) }}
|
|||||||
| {{ ordersLoading ? 'Loading...' : 'No orders found' }} | |||||||
Manage blogs, podcasts, and video channels (D1)
| Name | Type | Tier | Last Sync | Items | Status | Actions |
|---|---|---|---|---|---|---|
|
{{ source.name.substring(0, 1).toUpperCase() }}
{{ source.name }}
{{ source.slug }}
|
{{ source.content_type || source.source_type }}
{{ source.platform_id }}
|
T{{ source.tier }} | {{ source.last_fetched_at ? formatRelativeTime(source.last_fetched_at) : 'Never' }} | {{ source.item_count || 0 }} | Error Inactive Active |
|
| No sources found | ||||||
Browse fetched articles, podcasts, and videos
| Title | Source | Published | Status | Actions |
|---|---|---|---|---|
|
{{ item.title }}
{{ item.excerpt }}
|
{{ item.rss_sources?.name || 'Unknown' }} | {{ item.published_at ? formatRelativeTime(item.published_at) : '-' }} | {{ item.status }} | |
| No items found | ||||
Monitor RSS synchronization history
| Time | Trigger | Sources | Items | Errors | Duration | Details |
|---|---|---|---|---|---|---|
| {{ formatDateTime(log.started_at) }} | {{ log.trigger_type }} | {{ log.sources_succeeded }} / {{ log.sources_attempted }} | {{ log.items_new }} new / {{ log.items_fetched }} | {{ log.errors_count }} - | {{ log.duration_ms ? (log.duration_ms / 1000).toFixed(1) + 's' : '-' }} | |
| No sync logs yet | ||||||
{{ JSON.stringify(notifData, null, 2) }}
Identifier will be auto-generated
{{ JSON.stringify(sourceIndexData, null, 2) }}
{{ JSON.stringify(productionRules, null, 2) }}
Are you sure you want to delete [{{ selectedSite?.site_name }}]? This will remove all versions and history from the database.
Are you sure you want to delete {{ selectedPromptApp?.app_name }}?
This will delete all versions and cannot be undone.
{{ schema.description }}
{{ JSON.stringify(productionPromptConfig, null, 2) }}
| Source | Status | New | Error |
|---|---|---|---|
| {{ r.source_name }} | OK FAIL | {{ r.items_new }} | {{ r.error || '-' }} |
修正 404 错误时,粘贴正确 URL 或留空标记为跳过