Skip to content
wiki.fftac.org

Managedpromptadmin - Source Excerpt 07

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

$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.
     *