Managedpromptadmin - Source Excerpt 06
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
$archive_result = $this->import_prompt_archive((string) ($upload['tmp_name'] ?? ''), $default_version);
$imported = array_merge($imported, (array) ($archive_result['imported'] ?? []));
$errors = array_merge($errors, (array) ($archive_result['errors'] ?? []));
continue;
}
if ($extension === 'json') {
$result = $this->import_json_prompt_file((string) ($upload['tmp_name'] ?? ''), $default_version);
if (!empty($result['slug'])) {
$imported[] = sprintf('%s (%s)', (string) $result['slug'], (string) ($result['version'] ?? $default_version));
}
if (!empty($result['error'])) {
$errors[] = (string) $result['error'];
}
continue;
}
$errors[] = sprintf('%s has an unsupported file type. Use JSON or ZIP prompt packs.', (string) ($upload['name'] ?? 'Prompt file'));
}
if (!empty($imported)) {
$this->sync_prompts();
}
if (empty($imported)) {
$this->set_notice(true, 'No prompt files were imported.', $errors);
$this->redirect_to_admin();
}
$details = array_merge(
array_map(
static fn(string $item): string => 'Imported: ' . $item,
array_slice(array_values(array_unique($imported)), 0, 8)
),
$errors
);
$this->set_notice(false, sprintf('Imported %d managed prompt file(s).', count(array_unique($imported))), $details);
$this->redirect_to_admin();
}
/**
* Saves one managed prompt definition directly to disk.
*/
public function handle_save_prompt(): void
{
$this->require_admin_permission('spiralist_workspace_save_managed_prompt');
$existing_slug = isset($_POST['existing_slug'])
? sanitize_title((string) wp_unslash($_POST['existing_slug']))
: '';
$existing_version = isset($_POST['existing_version'])
? $this->sanitize_version((string) wp_unslash($_POST['existing_version']))
: self::DEFAULT_VERSION;
$definition = $existing_slug !== ''
? $this->get_prompt_definition($existing_slug, $existing_version)
: $this->blank_prompt_definition();
if (empty($definition)) {
$definition = $this->blank_prompt_definition();
}
$slug = isset($_POST['prompt_slug'])
? sanitize_title((string) wp_unslash($_POST['prompt_slug']))
: '';
$version = isset($_POST['prompt_version'])
? $this->sanitize_version((string) wp_unslash($_POST['prompt_version']))
: self::DEFAULT_VERSION;
if ($slug === '') {
$this->set_notice(true, 'Prompt slug is required before saving.');
$this->redirect_to_admin(['managed_prompt' => $existing_slug, 'managed_prompt_version' => $existing_version]);
}
$title = isset($_POST['title']) ? sanitize_text_field((string) wp_unslash($_POST['title'])) : '';
if ($title === '') {
$this->set_notice(true, 'Prompt title is required before saving.');
$this->redirect_to_admin(['managed_prompt' => $existing_slug ?: $slug, 'managed_prompt_version' => $version]);
}
$definition['slug'] = $slug;
$definition['title'] = $title;
$definition['summary'] = isset($_POST['summary']) ? sanitize_textarea_field((string) wp_unslash($_POST['summary'])) : '';
$definition['author_label'] = isset($_POST['author_label']) ? sanitize_text_field((string) wp_unslash($_POST['author_label'])) : '';
$category = isset($_POST['category']) ? (string) wp_unslash($_POST['category']) : 'Specialized & Niche';
$subcategory = isset($_POST['subcategory']) ? (string) wp_unslash($_POST['subcategory']) : 'Experimental / Spiralism';
$definition['category'] = PromptCategoryRegistry::normalize_category($category);
$definition['subcategory'] = PromptCategoryRegistry::normalize_subcategory($definition['category'], $subcategory);
$definition['structured_prompt'] = [
'instruction' => isset($_POST['structured_instruction']) ? sanitize_textarea_field((string) wp_unslash($_POST['structured_instruction'])) : '',
'context' => isset($_POST['structured_context']) ? sanitize_textarea_field((string) wp_unslash($_POST['structured_context'])) : '',
'constraints' => isset($_POST['structured_constraints']) ? sanitize_textarea_field((string) wp_unslash($_POST['structured_constraints'])) : '',
'examples' => isset($_POST['structured_examples']) ? sanitize_textarea_field((string) wp_unslash($_POST['structured_examples'])) : '',
'output_format' => isset($_POST['structured_output_format']) ? sanitize_textarea_field((string) wp_unslash($_POST['structured_output_format'])) : '',
];
$definition['instructions'] = isset($_POST['instructions']) ? sanitize_textarea_field((string) wp_unslash($_POST['instructions'])) : '';
$definition['system_prompt'] = isset($_POST['system_prompt']) ? sanitize_textarea_field((string) wp_unslash($_POST['system_prompt'])) : '';
$definition['developer_prompt'] = isset($_POST['developer_prompt']) ? sanitize_textarea_field((string) wp_unslash($_POST['developer_prompt'])) : '';
$definition['user_prompt_template'] = isset($_POST['user_prompt_template']) ? sanitize_textarea_field((string) wp_unslash($_POST['user_prompt_template'])) : '';
$definition['model'] = isset($_POST['model']) ? sanitize_text_field((string) wp_unslash($_POST['model'])) : ($definition['model'] ?? ($this->settings->get_allowed_models()[0] ?? 'gpt-5.5'));
$definition['provider'] = 'prompt_art_only';
$definition['credential_preference'] = isset($_POST['credential_preference']) ? sanitize_key((string) wp_unslash($_POST['credential_preference'])) : 'site_default';
$definition['temperature'] = isset($_POST['temperature']) ? max(0, min(2, (float) wp_unslash($_POST['temperature']))) : 0.2;
$definition['max_output_tokens'] = isset($_POST['max_output_tokens']) ? max(1, (int) wp_unslash($_POST['max_output_tokens'])) : 1200;
$definition['tool_settings_json'] = isset($_POST['tool_settings_json']) ? sanitize_textarea_field((string) wp_unslash($_POST['tool_settings_json'])) : '';
$definition['visibility'] = isset($_POST['visibility']) ? sanitize_key((string) wp_unslash($_POST['visibility'])) : 'public';
$definition['tags'] = $this->parse_text_list(isset($_POST['tags']) ? (string) wp_unslash($_POST['tags']) : '');
$definition['prompt_type'] = isset($_POST['prompt_type']) ? sanitize_key((string) wp_unslash($_POST['prompt_type'])) : 'prompt';
$definition['language'] = isset($_POST['language']) ? sanitize_text_field((string) wp_unslash($_POST['language'])) : 'en';
$definition['prompt_status'] = isset($_POST['prompt_status']) ? sanitize_key((string) wp_unslash($_POST['prompt_status'])) : 'published';
$definition['moderation_status'] = isset($_POST['moderation_status'])
? PromptMetaRegistry::normalize_moderation_status((string) wp_unslash($_POST['moderation_status']))
: 'peer_reviewed';
$definition['publication_lane'] = PromptMetaRegistry::normalize_publication_lane(isset($_POST['publication_lane']) ? (string) wp_unslash($_POST['publication_lane']) : 'official_canon');
$definition['provenance'] = PromptMetaRegistry::normalize_provenance(isset($_POST['provenance']) ? (string) wp_unslash($_POST['provenance']) : 'managed_system');
$definition['maturity_level'] = PromptMetaRegistry::normalize_maturity_level(isset($_POST['maturity_level']) ? (string) wp_unslash($_POST['maturity_level']) : 'structured_prompt');
$definition['license'] = PromptMetaRegistry::normalize_license(isset($_POST['license']) ? (string) wp_unslash($_POST['license']) : 'spiralist_contributor');
$definition['function_tags'] = PromptMetaRegistry::normalize_function_tags(isset($_POST['function_tags']) ? (string) wp_unslash($_POST['function_tags']) : []);
$definition['risk_labels'] = PromptMetaRegistry::normalize_risk_labels(isset($_POST['risk_labels']) ? (string) wp_unslash($_POST['risk_labels']) : []);
$definition['related_symbols'] = PromptMetaRegistry::normalize_freeform_list(isset($_POST['related_symbols']) ? (string) wp_unslash($_POST['related_symbols']) : []);
$definition['related_axioms'] = PromptMetaRegistry::normalize_freeform_list(isset($_POST['related_axioms']) ? (string) wp_unslash($_POST['related_axioms']) : []);