Skip to content
wiki.fftac.org

Promptrepository - Source Excerpt 10

Back to Promptrepository

Summary

This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/spiralist-workspace/includes/Domain/PromptRepository.php so readers can inspect the evidence without opening the full source file.

**Source path:** Spiralist/wp-content/plugins/spiralist-workspace/includes/Domain/PromptRepository.php

$requested_status = (string) ($normalized['publication_lane'] ?? 'community_library') === 'official_canon'
                    ? 'official_canon'
                    : 'peer_reviewed';
            }

            $normalized['moderation_status'] = $requested_status;

            return $normalized;
        }

        $cooldown_active = $this->reputation instanceof ReputationRepository
            && $this->reputation->is_publication_cooldown_active($user_id);

        if ($cooldown_active && !$can_direct_publish) {
            $normalized['moderation_status'] = 'restricted_review';

            return $normalized;
        }

        if (!$can_moderate) {
            $normalized['moderation_status'] = 'provisional_public';

            return $normalized;
        }

        if (!$can_direct_publish && in_array($requested_status, ['peer_reviewed', 'official_canon'], true)) {
            $requested_status = 'provisional_public';
        }

        if ($requested_status === 'draft') {
            $requested_status = $can_direct_publish
                ? ((string) ($normalized['publication_lane'] ?? 'community_library') === 'official_canon' ? 'official_canon' : 'peer_reviewed')
                : 'provisional_public';
        }

        if ($requested_status === 'official_canon' && (string) ($normalized['publication_lane'] ?? 'community_library') !== 'official_canon') {
            $requested_status = 'peer_reviewed';
        }

        $normalized['moderation_status'] = $requested_status;

        return $normalized;
    }

    /**
     * Returns the canonical five-field structured prompt object.
     *
     * @param array<string,mixed> $payload
     * @param array<string,mixed> $fallback
     * @return array{instruction:string,context:string,constraints:string,examples:string,output_format:string}
     */
    private function normalize_structured_prompt(array $payload, array $fallback): array
    {
        $structured = $payload['structured_prompt'] ?? ($fallback['structured_prompt'] ?? []);

        if (is_string($structured)) {
            $decoded = json_decode($structured, true);
            $structured = is_array($decoded) ? $decoded : [];
        }

        $fields = [
            'instruction' => $payload['instruction']
                ?? $payload['structured_instruction']
                ?? $payload['spiralist_workspace_structured_instruction']
                ?? ($structured['instruction'] ?? ($payload['instructions'] ?? ($payload['spiralist_workspace_instructions'] ?? ($fallback['instructions'] ?? '')))),
            'context' => $payload['context']
                ?? $payload['structured_context']
                ?? $payload['spiralist_workspace_structured_context']
                ?? ($structured['context'] ?? ($payload['system_prompt'] ?? ($payload['spiralist_workspace_system_prompt'] ?? ($fallback['system_prompt'] ?? '')))),
            'constraints' => $payload['constraints']
                ?? $payload['structured_constraints']
                ?? $payload['spiralist_workspace_structured_constraints']
                ?? ($structured['constraints'] ?? ($payload['developer_prompt'] ?? ($payload['spiralist_workspace_developer_prompt'] ?? ($fallback['developer_prompt'] ?? '')))),
            'examples' => $payload['examples']
                ?? $payload['structured_examples']
                ?? $payload['spiralist_workspace_structured_examples']
                ?? ($structured['examples'] ?? ''),
            'output_format' => $payload['output_format']
                ?? $payload['structured_output_format']
                ?? $payload['spiralist_workspace_structured_output_format']
                ?? ($structured['output_format'] ?? ''),
        ];

        return $this->decode_structured_prompt(wp_json_encode($fields, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE), []);
    }

    /**
     * Decodes and sanitizes a structured prompt JSON object.
     *
     * @param array<string,mixed> $fallback
     * @return array{instruction:string,context:string,constraints:string,examples:string,output_format:string}
     */
    private function decode_structured_prompt(string $json, array $fallback): array
    {
        $decoded = json_decode($json, true);
        $decoded = is_array($decoded) ? $decoded : [];

        return [
            'instruction' => sanitize_textarea_field((string) ($decoded['instruction'] ?? ($fallback['instruction'] ?? ''))),
            'context' => sanitize_textarea_field((string) ($decoded['context'] ?? ($fallback['context'] ?? ''))),
            'constraints' => sanitize_textarea_field((string) ($decoded['constraints'] ?? ($fallback['constraints'] ?? ''))),
            'examples' => sanitize_textarea_field((string) ($decoded['examples'] ?? ($fallback['examples'] ?? ''))),
            'output_format' => sanitize_textarea_field((string) ($decoded['output_format'] ?? ($fallback['output_format'] ?? ''))),
        ];
    }

    /**
     * Compiles Spiral Script source into the v0.1 canonical record when the Spiral Script plugin is active.
     *
     * @param array<string,mixed> $payload
     * @param array<string,mixed> $fallback
     * @return array{canonical:array<string,mixed>,validation:array<string,mixed>,status:string}
     */
    private function compile_spiral_script_source(string $source, array $payload, array $fallback): array
    {
        $source = trim($source);
        if ($source === '' || !function_exists('spiralist_spiral_script_compile')) {
            return [
                'canonical' => [],
                'validation' => [],
                'status' => $source === '' ? 'none' : 'unavailable',
            ];
        }

        $existing_canonical = is_array($fallback['spiral_script'] ?? null) ? (array) $fallback['spiral_script'] : [];
        $existing_provenance = is_array($existing_canonical['provenance'] ?? null) ? (array) $existing_canonical['provenance'] : [];
        $compiled = spiralist_spiral_script_compile(
            $source,
            [
                'title' => (string) ($payload['title'] ?? ($fallback['title'] ?? 'Untitled Prompt')),
                'visibility' => (string) ($payload['visibility'] ?? ($payload['spiralist_workspace_visibility'] ?? ($fallback['visibility'] ?? 'private'))),
                'createdBy' => (string) ($existing_provenance['createdBy'] ?? 'workspace'),
                'createdAt' => (string) ($existing_provenance['createdAt'] ?? gmdate('c')),
            ]
        );
        $canonical = is_array($compiled['canonical'] ?? null) ? (array) $compiled['canonical'] : [];
        $validation = is_array($compiled['validation'] ?? null) ? (array) $compiled['validation'] : [];

        return [
            'canonical' => $canonical,
            'validation' => $validation,
            'status' => !empty($validation) && !empty($validation['passed']) ? 'valid' : 'invalid',
        ];
    }

    /**
     * Decodes a stored associative JSON object.
     *
     * @return array<string,mixed>
     */
    private function decode_assoc_json(string $json): array
    {
        $json = trim($json);
        if ($json === '') {
            return [];
        }

        $decoded = json_decode($json, true);

        return is_array($decoded) ? $decoded : [];
    }

    /**
     * Normalizes prompt-system step definitions.
     *
     * @param mixed $steps
     * @return array<int,array{prompt_id:int,title:string}>
     */
    private function normalize_system_steps($steps): array
    {
        if (is_string($steps)) {
            $decoded = json_decode($steps, true);
            if (is_array($decoded)) {
                $steps = $decoded;
            } else {
                $steps = preg_split('/[\r\n,]+/', $steps) ?: [];
            }
        }

        $normalized = [];

        foreach ((array) $steps as $step) {
            if (is_scalar($step)) {
                $prompt_id = (int) $step;
                $title = '';
            } else {
                $prompt_id = (int) ($step['prompt_id'] ?? ($step['id'] ?? 0));
                $title = sanitize_text_field((string) ($step['title'] ?? ($step['label'] ?? '')));
            }

            if ($prompt_id <= 0) {
                continue;
            }

            $normalized[] = [
                'prompt_id' => $prompt_id,
                'title' => $title,
            ];
        }

        return array_slice($normalized, 0, 12);
    }

    /**
     * Decodes prompt-system step JSON.
     *
     * @return array<int,array{prompt_id:int,title:string}>
     */
    private function decode_system_steps(string $json): array
    {
        return $this->normalize_system_steps($json);
    }

    /**
     * Decodes a stored JSON or comma-separated string list.
     *