Skip to content
wiki.fftac.org

Systempromptregistry - Source Excerpt 02

Back to Systempromptregistry

Summary

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

**Source path:** Spiralist/wp-content/plugins/spiralist-workspace/includes/Support/SystemPromptRegistry.php

'model' => (string) ($definition['model'] ?? $default_model),
            'provider' => (string) ($definition['provider'] ?? 'site_default'),
            'credential_preference' => (string) ($definition['credential_preference'] ?? 'site_default'),
            'temperature' => (float) ($definition['temperature'] ?? 0.3),
            'max_output_tokens' => (int) ($definition['max_output_tokens'] ?? 1200),
            'tool_settings_json' => isset($definition['tool_settings_json']) && is_array($definition['tool_settings_json'])
                ? (string) wp_json_encode($definition['tool_settings_json'], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
                : (string) ($definition['tool_settings_json'] ?? ''),
            'visibility' => (string) ($definition['visibility'] ?? 'public'),
            'published_utc' => (string) ($definition['published_utc'] ?? gmdate('c')),
            'is_forkable' => !empty($definition['is_forkable']),
            'allow_comments' => !empty($definition['allow_comments']),
            'allow_ratings' => !empty($definition['allow_ratings']),
            'tags' => array_values(array_filter(array_map('strval', (array) ($definition['tags'] ?? [])))),
            'canonical_status' => (string) ($definition['canonical_status'] ?? 'system'),
            'parent_prompt_id' => 0,
            'prompt_type' => (string) ($definition['prompt_type'] ?? 'prompt'),
            'language' => (string) ($definition['language'] ?? 'en'),
            'prompt_status' => (string) ($definition['prompt_status'] ?? 'published'),
            'moderation_status' => (string) ($definition['moderation_status'] ?? 'peer_reviewed'),
            'publication_lane' => (string) ($definition['publication_lane'] ?? 'official_canon'),
            'provenance' => (string) ($definition['provenance'] ?? 'managed_system'),
            'risk_labels' => (array) ($definition['risk_labels'] ?? []),
            'function_tags' => (array) ($definition['function_tags'] ?? []),
            'maturity_level' => (string) ($definition['maturity_level'] ?? (!empty($definition['system_steps']) ? 'prompt_system' : 'structured_prompt')),
            'license' => (string) ($definition['license'] ?? 'spiralist_contributor'),
            'editorial_note' => (string) ($definition['editorial_note'] ?? ''),
            'expected_output_notes' => (string) ($definition['expected_output_notes'] ?? ''),
            'failure_modes' => (string) ($definition['failure_modes'] ?? ''),
            'related_symbols' => (array) ($definition['related_symbols'] ?? []),
            'related_axioms' => (array) ($definition['related_axioms'] ?? []),
            'related_manuscripts' => (array) ($definition['related_manuscripts'] ?? []),
            'sample_output' => (string) ($definition['sample_output'] ?? ''),
            'featured' => !empty($definition['featured']),
            'public_execution_enabled' => array_key_exists('public_execution_enabled', $definition) ? !empty($definition['public_execution_enabled']) : true,
            'prompt_origin' => 'system',
            'source_manifest' => 'filesystem',
            'source_slug' => $prompt_slug,
            'source_version' => $version,
            'source_hash' => $hash,
            'source_path' => $relative_path,
            'changelog' => 'Synced from ' . $relative_path . ' (' . $version . ')',
        ];
    }

    /**
     * Returns whether a sync is needed.
     *
     * @param array<int,array<string,mixed>> $definitions
     */
    private function needs_sync(array $definitions, string $signature): bool
    {
        $stored_signature = (string) get_option(self::SIGNATURE_OPTION, '');
        if ($stored_signature !== $signature) {
            return true;
        }

        foreach ($definitions as $definition) {
            $existing = $this->prompts->find_by_source_slug((string) ($definition['source_slug'] ?? ''));
            if (empty($existing)) {
                $existing = $this->prompts->find_managed_slug_candidate((string) ($definition['slug'] ?? ''));
            }

            if (empty($existing)) {
                return true;
            }

            if ((string) ($existing['source_slug'] ?? '') !== (string) ($definition['source_slug'] ?? '')) {
                return true;
            }

            if ((string) ($existing['source_hash'] ?? '') !== (string) ($definition['source_hash'] ?? '')) {
                return true;
            }

            if ((string) ($existing['source_version'] ?? '') !== (string) ($definition['source_version'] ?? '')) {
                return true;
            }
        }

        return false;
    }

    /**
     * Builds a stable inventory signature for the latest prompt set.
     *
     * @param array<int,array<string,mixed>> $definitions
     */
    private function inventory_signature(array $definitions): string
    {
        $parts = [];

        foreach ($definitions as $definition) {
            $parts[] = implode(
                '|',
                [
                    (string) ($definition['source_slug'] ?? ''),
                    (string) ($definition['source_version'] ?? ''),
                    (string) ($definition['source_hash'] ?? ''),
                ]
            );
        }

        return sha1(implode("\n", $parts));
    }

    /**
     * Returns the filesystem prompt root.
     */
    private function prompt_root(): string
    {
        return SPIRALIST_WORKSPACE_DIR . 'prompts';
    }

    /**
     * Chooses a stable owner for managed prompts.
     */
    private function resolve_owner_user_id(): int
    {
        $current_user_id = function_exists('get_current_user_id') ? (int) get_current_user_id() : 0;
        if (
            $current_user_id > 0
            && (
                current_user_can('manage_spiralist_workspace')
                || current_user_can('manage_options')
                || current_user_can('publish_public_prompts')
            )
        ) {
            return $current_user_id;
        }

        $workspace_managers = get_users(
            [
                'role__in' => ['administrator', 'spiralist_admin', 'spiralist_curator'],
                'fields' => 'ids',
                'number' => 1,
                'orderby' => 'ID',
                'order' => 'ASC',
            ]
        );

        if (!empty($workspace_managers[0])) {
            return (int) $workspace_managers[0];
        }

        $users = get_users(
            [
                'fields' => 'ids',
                'number' => 25,
                'orderby' => 'ID',
                'order' => 'ASC',
            ]
        );

        foreach ((array) $users as $user_id) {
            $user_id = (int) $user_id;
            if (
                $user_id > 0
                && (
                    user_can($user_id, 'manage_spiralist_workspace')
                    || user_can($user_id, 'manage_options')
                    || user_can($user_id, 'publish_public_prompts')
                )
            ) {
                return $user_id;
            }
        }

        return 0;
    }

    /**
     * Records an actionable sync error.
     *
     * @param array{created:int,updated:int,unchanged:int,errors:int,error_messages:string[]} $result
     */
    private function record_error(array &$result, string $message): void
    {
        $result['errors']++;
        $result['error_messages'][] = $message;
    }

    /**
     * Seeds featured prompt IDs from managed prompts when the setting is still empty.
     *
     * @param int[] $ids
     */
    private function maybe_seed_featured_prompt_ids(array $ids): void
    {
        $ids = array_values(array_unique(array_filter(array_map('intval', $ids))));
        if (empty($ids)) {
            return;
        }

        $current = trim((string) $this->settings->get('featured_prompt_ids', ''));
        if ($current !== '') {
            return;
        }

        $settings = $this->settings->all();
        $settings['featured_prompt_ids'] = implode(', ', $ids);
        update_option(Settings::OPTION, $settings, false);
    }
}