Prompt - Source Excerpt 08
Summary
This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/spiralist-workspace/templates/prompt.php so readers can inspect the evidence without opening the full source file.
**Source path:** Spiralist/wp-content/plugins/spiralist-workspace/templates/prompt.php
<p class="spiralist-section-tag">Conversation Layer</p>
<h2 class="spiralist-section-title">Prompt-based conversation</h2>
<?php if (is_user_logged_in()) : ?>
<form class="spiralist-workspace-form" data-start-conversation-form data-auth-required-form="start-conversation" data-prompt-id="<?php echo esc_attr((string) ($prompt['id'] ?? 0)); ?>">
<?php if (!empty($placeholders)) : ?>
<div class="spiralist-workspace-input-grid">
<?php foreach ($placeholders as $placeholder) : ?>
<label class="spiralist-form__field">
<span><?php echo esc_html($placeholder); ?></span>
<input type="text" name="variables[<?php echo esc_attr($placeholder); ?>]" />
</label>
<?php endforeach; ?>
</div>
<?php endif; ?>
<label class="spiralist-form__field">
<span>Opening message</span>
<textarea rows="5" name="message" placeholder="Start the conversation."></textarea>
</label>
<div class="spiralist-cta-row spiralist-cta-row--start">
<button class="spiralist-button spiralist-button--primary" type="submit">Start Conversation</button>
<span class="spiralist-muted" data-form-result></span>
</div>
</form>
<div class="spiralist-workspace-chat-app spiralist-workspace-chat-app--inline" data-inline-conversation data-fullscreen-chat hidden>
<div class="spiralist-workspace-chat-toolbar">
<div>
<p class="spiralist-section-tag">User AI Chat</p>
<h3 class="spiralist-card-title" data-inline-conversation-title>Prompt conversation</h3>
<span class="spiralist-muted" data-inline-conversation-status aria-live="polite"></span>
</div>
<div class="spiralist-cta-row spiralist-cta-row--start">
<a class="spiralist-button spiralist-button--secondary" data-open-conversation hidden href="#">Open Conversation Page</a>
<button class="spiralist-button spiralist-button--secondary" type="button" data-chat-fullscreen-toggle aria-pressed="false">Full Screen</button>
</div>
</div>
<div class="spiralist-workspace-transcript" data-conversation-transcript>
<p class="spiralist-muted" data-conversation-empty>No messages yet.</p>
</div>
<form class="spiralist-workspace-form spiralist-workspace-chat-composer" data-conversation-form data-auth-required-form="conversation-message" data-conversation-id="">
<label class="spiralist-form__field">
<span>Message</span>
<textarea name="message" rows="5" placeholder="Continue the conversation."></textarea>
</label>
<div class="spiralist-cta-row spiralist-cta-row--start">
<button class="spiralist-button spiralist-button--primary" type="submit">Send Message</button>
<span class="spiralist-muted" data-form-result></span>
</div>
</form>
</div>
<?php else : ?>
<p class="spiralist-muted">Conversations are private by default and live inside the member workspace.</p>
<a class="spiralist-button spiralist-button--primary" href="<?php echo esc_url($login_url); ?>">Log In to Converse</a>
<?php endif; ?>
</article>
</div>
</section>
<section class="spiralist-page-section">
<div class="spiralist-shell spiralist-grid spiralist-grid--split">
<article class="spiralist-panel">
<p class="spiralist-section-tag">Placeholders</p>
<h2 class="spiralist-section-title">Variable surface</h2>
<?php if (!empty($placeholders)) : ?>
<div class="spiralist-chip-row">
<?php foreach ($placeholders as $placeholder) : ?>
<span class="spiralist-chip"><?php echo esc_html('{{' . $placeholder . '}}'); ?></span>
<?php endforeach; ?>
</div>
<?php else : ?>
<p class="spiralist-muted">This prompt does not currently declare generic placeholders.</p>
<?php endif; ?>
</article>
<article class="spiralist-panel">
<p class="spiralist-section-tag">Version History</p>
<h2 class="spiralist-section-title">Immutable snapshots</h2>
<?php if (!empty($versions)) : ?>
<div class="spiralist-simple-list">
<?php foreach ($versions as $version) : ?>
<div class="spiralist-simple-list__item" data-version-item>
<strong>Version <?php echo esc_html((string) ($version['version_number'] ?? '')); ?></strong>
<span class="spiralist-simple-list__meta"><?php echo esc_html($format_timestamp((string) ($version['created_utc'] ?? ''), 'M j, Y g:i a', (string) ($version['created_utc'] ?? ''))); ?></span>
<?php if (!empty($version['changelog'])) : ?>
<p class="spiralist-muted"><?php echo esc_html((string) $version['changelog']); ?></p>
<?php endif; ?>
<?php if ($plugin->permissions()->can_edit_prompt($prompt, get_current_user_id()) && (int) ($version['version_number'] ?? 0) !== (int) ($prompt['version_number'] ?? 0)) : ?>
<a
class="spiralist-button spiralist-button--secondary"
href="<?php echo esc_url(rest_url('spiralist-workspace/v1/prompts/' . (int) ($prompt['id'] ?? 0) . '/versions/' . (int) ($version['version_number'] ?? 0) . '/diff/' . (int) ($prompt['version_number'] ?? 0))); ?>"
>Show Diff</a>
<button
class="spiralist-button spiralist-button--tertiary"
type="button"
data-rollback-version
data-prompt-id="<?php echo esc_attr((string) ($prompt['id'] ?? 0)); ?>"
data-version="<?php echo esc_attr((string) ($version['version_number'] ?? 0)); ?>"
>Rollback</button>
<span class="spiralist-muted" data-version-result></span>
<?php endif; ?>
</div>
<?php endforeach; ?>
</div>
<?php else : ?>
<p class="spiralist-muted">No stored versions yet.</p>
<?php endif; ?>
</article>
</div>
</section>
<?php if (is_user_logged_in()) : ?>
<section class="spiralist-page-section">
<div class="spiralist-shell spiralist-grid spiralist-grid--split">
<article class="spiralist-panel">
<p class="spiralist-section-tag">Testing System</p>
<h2 class="spiralist-section-title">Expected output checks</h2>
<?php if ($plugin->permissions()->can_edit_prompt($prompt, get_current_user_id())) : ?>
<form class="spiralist-workspace-form" data-test-form data-auth-required-form="prompt-test" data-prompt-id="<?php echo esc_attr((string) ($prompt['id'] ?? 0)); ?>">
<label class="spiralist-form__field">
<span>Input</span>
<textarea rows="4" name="input_text" placeholder="Test input for the prompt."></textarea>
</label>
<label class="spiralist-form__field">