Skip to content
wiki.fftac.org

Managedpromptadmin - Source Excerpt 06

Back to Managedpromptadmin

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']) : []);