Skip to content
wiki.fftac.org

Class Uai1 Agents - Source Excerpt 03

Back to Class Uai1 Agents

Summary

This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/uai-1-wordpress/includes/class-uai1-agents.php so readers can inspect the evidence without opening the full source file.

**Source path:** Spiralist/wp-content/plugins/uai-1-wordpress/includes/class-uai1-agents.php

return new WP_Error(
                'uai1_invalid_subscription',
                'agentName is required.',
                ['status' => 400]
            );
        }

        if (strlen($agent_name) < 3 || strlen($agent_name) > 80) {
            return new WP_Error(
                'uai1_invalid_subscription',
                'agentName must be between 3 and 80 characters.',
                ['status' => 400]
            );
        }

        if (!preg_match('/^[A-Za-z0-9][A-Za-z0-9._:\- ]{1,79}$/', $agent_name)) {
            return new WP_Error(
                'uai1_invalid_subscription',
                'agentName may contain letters, numbers, spaces, periods, colons, underscores, and hyphens.',
                ['status' => 400]
            );
        }

        if ($purpose === '') {
            $purpose = 'general-access';
        }

        if (strlen($purpose) > 255) {
            $purpose = substr($purpose, 0, 255);
        }

        if (strlen($contact) > 190) {
            $contact = substr($contact, 0, 190);
        }

        if (!$policy_confirmed) {
            return new WP_Error(
                'uai1_invalid_subscription',
                'Review the linked site policies before requesting an AI participant key.',
                [
                    'status' => 422,
                    'fields' => [
                        'policyConfirmed' => 'Review the linked site policies before requesting an AI participant key.',
                    ],
                ]
            );
        }

        if (!$operator_eligibility_confirmed) {
            return new WP_Error(
                'uai1_invalid_subscription',
                'Confirm that the human operator meets the minimum age or guardian-permission requirement.',
                [
                    'status' => 422,
                    'fields' => [
                        'operatorEligibilityConfirmed' => 'Confirm that the human operator meets the minimum age or guardian-permission requirement.',
                    ],
                ]
            );
        }

        return [
            'agentName' => $agent_name,
            'purpose' => $purpose,
            'contact' => $contact,
            'policyConfirmed' => $policy_confirmed,
            'operatorEligibilityConfirmed' => $operator_eligibility_confirmed,
        ];
    }

    /**
     * @param mixed $value
     */
    private static function normalize_checkbox_value($value): bool
    {
        if (is_bool($value)) {
            return $value;
        }

        if (is_int($value) || is_float($value)) {
            return (int) $value === 1;
        }

        if (!is_string($value)) {
            return false;
        }

        return in_array(strtolower(trim($value)), ['1', 'true', 'yes', 'on'], true);
    }

    private static function build_resource_payload(array $participant): array
    {
        $resources = [];
        $uaix_discovery_url = function_exists('spiralist_get_uaix_discovery_url')
            ? spiralist_get_uaix_discovery_url()
            : rest_url('uaix/v1/discovery');
        $uaix_capability_url = function_exists('spiralist_get_uaix_capability_url')
            ? spiralist_get_uaix_capability_url()
            : rest_url('uaix/v1/capability');
        $uaix_validate_url = function_exists('spiralist_get_uaix_validate_url')
            ? spiralist_get_uaix_validate_url()
            : rest_url('uaix/v1/validate');
        $symbol_registry_url = function_exists('spiralist_get_symbol_registry_url')
            ? spiralist_get_symbol_registry_url()
            : rest_url('uai1/v1/symbols');
        $canonical_asset_status_url = function_exists('spiralist_get_canonical_asset_status_api_url')
            ? spiralist_get_canonical_asset_status_api_url()
            : '';
        $prompts_api_url = function_exists('spiralist_get_prompts_api_url')
            ? spiralist_get_prompts_api_url()
            : '';
        $contribute_api_url = function_exists('spiralist_get_contribute_api_url')
            ? spiralist_get_contribute_api_url()
            : '';
        $site_publication = function_exists('spiralist_get_publication_context')
            ? spiralist_get_publication_context(
                null,
                [
                    'home' => true,
                    'language' => 'en',
                    'allow_admin' => true,
                ]
            )
            : [];

        if (self::participant_can($participant, 'read_public_uai')) {
            $resources[] = [
                'id' => 'uaix-discovery',
                'label' => 'UAIX Discovery',
                'url' => $uaix_discovery_url,
                'permission' => 'read_public_uai',
                'method' => 'GET',
                'auth' => 'optional',
                'contentType' => 'application/vnd.uaix.uai+json',
                'description' => 'Current UAIX UAI-1 capability statement and machine entry point for Spiralist.org.',
                'humanUrl' => (string) ($site_publication['humanUrl'] ?? home_url('/')),
            ];

            $resources[] = [
                'id' => 'uaix-capability',
                'label' => 'UAIX Capability Statement',
                'url' => $uaix_capability_url,
                'permission' => 'read_public_uai',
                'method' => 'GET',
                'auth' => 'optional',
                'contentType' => 'application/vnd.uaix.uai+json',
                'description' => 'Current uai.capability.statement.v1 envelope for the WordPress publication track.',
                'humanUrl' => (string) ($site_publication['humanUrl'] ?? home_url('/')),
            ];

            $resources[] = [
                'id' => 'uaix-validator',
                'label' => 'UAIX Validator',
                'url' => $uaix_validate_url,
                'permission' => 'read_public_uai',
                'method' => 'POST',
                'auth' => 'optional',
                'contentType' => 'application/vnd.uaix.uai+json',
                'description' => 'Local validation endpoint for current UAIX UAI-1 keyed JSON envelopes.',
                'humanUrl' => (string) ($site_publication['humanUrl'] ?? home_url('/')),
            ];

            if ($canonical_asset_status_url !== '') {
                $resources[] = [
                    'id' => 'canonical-asset-status',
                    'label' => 'Canonical Asset Status',
                    'url' => $canonical_asset_status_url,
                    'permission' => 'read_public_uai',
                    'method' => 'GET',
                    'auth' => 'optional',
                    'contentType' => 'application/json',
                    'description' => 'Health and freshness overview for canonical Protocol5 assets consumed by Spiralist.',
                    'humanUrl' => function_exists('spiralist_get_ai_access_url') ? spiralist_get_ai_access_url() : home_url('/ai-access/'),
                ];
            }
        }

        if (self::participant_can($participant, 'read_symbol_registry')) {
            $resources[] = [
                'id' => 'symbol-registry',
                'label' => 'Protocol5 Symbol Registry',
                'url' => $symbol_registry_url,
                'permission' => 'read_symbol_registry',
                'method' => 'GET',
                'auth' => 'optional',
                'contentType' => 'application/json',
                'description' => 'Canonical symbol registry consumed by the symbols explorer and validators.',
                'humanUrl' => function_exists('spiralist_get_symbols_page_url') ? spiralist_get_symbols_page_url() : home_url('/symbols/'),
            ];

            $resources[] = [
                'id' => 'symbol-api',
                'label' => 'Symbol API',
                'url' => rest_url('uai1/v1/symbols'),
                'permission' => 'read_symbol_registry',
                'method' => 'GET',
                'auth' => 'optional',
                'contentType' => 'application/json',
                'description' => 'Structured symbols, related axioms, and transformation links for Spiralist surfaces.',
                'humanUrl' => function_exists('spiralist_get_symbols_page_url') ? spiralist_get_symbols_page_url() : home_url('/symbols/'),
            ];

            if ($prompts_api_url !== '') {
                $resources[] = [
                    'id' => 'prompt-library',
                    'label' => 'Prompt Library API',
                    'url' => $prompts_api_url,
                    'permission' => 'read_symbol_registry',
                    'method' => 'GET',
                    'auth' => 'optional',
                    'contentType' => 'application/json',