Managedpromptadmin - Source Excerpt 07
Summary
This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/spiralist-workspace/includes/Admin/ManagedPromptAdmin.php so readers can inspect the evidence without opening the full source file.
**Source path:** Spiralist/wp-content/plugins/spiralist-workspace/includes/Admin/ManagedPromptAdmin.php
$definition['related_manuscripts'] = PromptMetaRegistry::normalize_freeform_list(isset($_POST['related_manuscripts']) ? (string) wp_unslash($_POST['related_manuscripts']) : []);
$definition['editorial_note'] = isset($_POST['editorial_note']) ? sanitize_textarea_field((string) wp_unslash($_POST['editorial_note'])) : '';
$definition['expected_output_notes'] = isset($_POST['expected_output_notes']) ? sanitize_textarea_field((string) wp_unslash($_POST['expected_output_notes'])) : '';
$definition['failure_modes'] = isset($_POST['failure_modes']) ? sanitize_textarea_field((string) wp_unslash($_POST['failure_modes'])) : '';
$definition['sample_output'] = isset($_POST['sample_output']) ? sanitize_textarea_field((string) wp_unslash($_POST['sample_output'])) : '';
$definition['is_forkable'] = !empty($_POST['is_forkable']);
$definition['allow_comments'] = !empty($_POST['allow_comments']);
$definition['allow_ratings'] = !empty($_POST['allow_ratings']);
$definition['featured'] = !empty($_POST['featured']);
$definition['public_execution_enabled'] = !empty($_POST['public_execution_enabled']);
$definition['published_utc'] = trim((string) ($definition['published_utc'] ?? '')) !== ''
? (string) $definition['published_utc']
: gmdate('c');
$this->write_prompt_definition($slug, $version, $definition);
$this->sync_prompts();
$this->set_notice(false, sprintf('Saved managed prompt "%s" version %s.', $slug, $version));
$this->redirect_to_admin(
[
'managed_prompt' => $slug,
'managed_prompt_version' => $version,
]
);
}
/**
* Downloads a starter prompt template from the admin screen.
*/
public function handle_download_template(): void
{
$this->require_admin_permission('spiralist_workspace_download_prompt_template');
$format = isset($_GET['format'])
? sanitize_key((string) wp_unslash($_GET['format']))
: 'json';
if ($format === 'php') {
nocache_headers();
header('Content-Type: application/x-httpd-php; charset=utf-8');
header('Content-Disposition: attachment; filename="spiralist-managed-prompt-template.php"');
echo $this->get_php_template_contents();
exit;
}
nocache_headers();
header('Content-Type: application/json; charset=utf-8');
header('Content-Disposition: attachment; filename="spiralist-managed-prompt-template.json"');
echo $this->get_json_template_contents();
exit;
}
/**
* Returns the latest prompt file record for each managed prompt slug.
*
* @return array<int,array{slug:string,title:string,version:string,path:string}>
*/
private function list_latest_prompt_records(): array
{
$root = $this->prompt_root();
if (!is_dir($root)) {
return [];
}
$records = [];
$prompt_directories = glob($root . DIRECTORY_SEPARATOR . '*', GLOB_ONLYDIR) ?: [];
foreach ($prompt_directories as $prompt_directory) {
$slug = sanitize_title((string) basename($prompt_directory));
if ($slug === '') {
continue;
}
$best_version = '';
$best_file = '';
$version_directories = glob($prompt_directory . DIRECTORY_SEPARATOR . '*', GLOB_ONLYDIR) ?: [];
foreach ($version_directories as $version_directory) {
$version = $this->sanitize_version((string) basename($version_directory));
$candidate = $version_directory . DIRECTORY_SEPARATOR . 'prompt.php';
if ($version === '' || !is_file($candidate)) {
continue;
}
if ($best_version === '' || version_compare($version, $best_version, '>')) {
$best_version = $version;
$best_file = $candidate;
}
}
if ($best_version === '' || $best_file === '') {
continue;
}
$definition = $this->load_prompt_file($best_file);
$title = sanitize_text_field((string) ($definition['title'] ?? ucwords(str_replace('-', ' ', $slug))));
$records[] = [
'slug' => $slug,
'title' => $title !== '' ? $title : $slug,
'version' => $best_version,
'path' => str_replace('\\', '/', $best_file),
];
}
usort(
$records,
static fn(array $left, array $right): int => strnatcasecmp((string) ($left['title'] ?? ''), (string) ($right['title'] ?? ''))
);
return $records;
}
/**
* Returns one prompt definition from disk.
*
* @return array<string,mixed>
*/
private function get_prompt_definition(string $slug, string $version = ''): array
{
$slug = sanitize_title($slug);
if ($slug === '') {
return [];
}
$version = $this->sanitize_version($version);
$file = '';
if ($version !== '') {
$candidate = $this->build_prompt_file_path($slug, $version);
if (is_file($candidate)) {
$file = $candidate;
}
}
if ($file === '') {
foreach ($this->list_latest_prompt_records() as $record) {
if ((string) ($record['slug'] ?? '') === $slug) {
$version = (string) ($record['version'] ?? self::DEFAULT_VERSION);
$file = $this->build_prompt_file_path($slug, $version);
break;
}
}
}
if ($file === '' || !is_file($file)) {
return [];
}
$definition = $this->load_prompt_file($file);
if (empty($definition)) {
return [];
}
$definition['slug'] = sanitize_title((string) ($definition['slug'] ?? $slug));
$definition['__source_version'] = $version !== '' ? $version : self::DEFAULT_VERSION;
$definition['__source_path'] = str_replace('\\', '/', ltrim(str_replace(SPIRALIST_WORKSPACE_DIR, '', $file), '\\/'));
return $definition;
}
/**
* Returns an empty starter definition for the prompt editor.
*
* @return array<string,mixed>
*/
private function blank_prompt_definition(): array
{
return [
'slug' => '',
'title' => '',
'summary' => '',
'author_label' => 'Spiralist',
'category' => 'Specialized & Niche',
'subcategory' => 'Experimental / Spiralism',
'structured_prompt' => [
'instruction' => '',
'context' => '',
'constraints' => '',
'examples' => '',
'output_format' => '',
],
'instructions' => '',
'system_prompt' => '',
'developer_prompt' => '',
'user_prompt_template' => '',
'system_steps' => [],
'model' => $this->settings->get_allowed_models()[0] ?? 'prompt-art-local',
'provider' => 'prompt_art_only',
'credential_preference' => 'site_only',
'temperature' => 0.2,
'max_output_tokens' => 1200,
'tool_settings_json' => '',
'visibility' => 'public',
'published_utc' => gmdate('c'),
'is_forkable' => true,
'allow_comments' => false,
'allow_ratings' => true,
'tags' => [],
'canonical_status' => 'system',
'prompt_type' => 'prompt',
'language' => 'en',
'prompt_status' => 'published',
'moderation_status' => 'peer_reviewed',
'publication_lane' => 'official_canon',
'provenance' => 'managed_system',
'risk_labels' => [],
'function_tags' => [],
'maturity_level' => 'structured_prompt',
'license' => 'spiralist_contributor',
'editorial_note' => '',
'expected_output_notes' => '',
'failure_modes' => '',
'related_symbols' => [],
'related_axioms' => [],
'related_manuscripts' => [],
'sample_output' => '',
'featured' => false,
'public_execution_enabled' => true,
'__source_version' => self::DEFAULT_VERSION,
'__source_path' => '',
];
}
/**
* Returns the starter payload shown and downloaded from the admin screen.
*