Skip to content
wiki.fftac.org

Class Uai1 Routes - Source Excerpt 09

Back to Class Uai1 Routes

Summary

This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/uai-1-wordpress/includes/class-uai1-routes.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-routes.php

'trace_id' => 'trace-' . substr(hash('sha256', $message_id), 0, 12),
                'issued_at' => gmdate('c'),
                'log_ref' => 'urn:spiralist:uaix:' . $message_id,
                'agent_id' => 'spiralist.uai1.wordpress',
                'model_id' => 'wordpress-plugin-' . (defined('UAI1_WP_VERSION') ? UAI1_WP_VERSION : 'unknown'),
                'confidence' => 1.0,
                'lineage' => [
                    [
                        'stage' => 'uaix-route-build',
                        'actor_id' => 'spiralist.uai1.wordpress',
                        'model_id' => 'wordpress-plugin-' . (defined('UAI1_WP_VERSION') ? UAI1_WP_VERSION : 'unknown'),
                        'note' => 'Generated by the Spiralist.org WordPress UAIX integration.',
                    ],
                ],
            ],
            'integrity' => [
                'version' => 2,
                'algorithm' => 'sha256',
                'canonicalization' => 'jcs',
                'checksum' => '',
            ],
            'extensions' => $extensions,
        ];

        $hash_source = $envelope;
        unset($hash_source['integrity']);
        $encoded = wp_json_encode($hash_source, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
        $envelope['integrity']['checksum'] = 'sha256:' . hash('sha256', is_string($encoded) ? $encoded : $message_id);

        return $envelope;
    }

    private static function profile_catalog(): array
    {
        return [
            [
                'profile' => 'uai.intent.request.v1',
                'schema_url' => self::uaix_api_url('/schemas/uai.intent.request.v1'),
                'example_url' => self::uaix_api_url('/examples/uai.intent.request.v1'),
            ],
            [
                'profile' => 'uai.intent.response.v1',
                'schema_url' => self::uaix_api_url('/schemas/uai.intent.response.v1'),
                'example_url' => self::uaix_api_url('/examples/uai.intent.response.v1'),
            ],
            [
                'profile' => 'uai.capability.statement.v1',
                'schema_url' => self::uaix_api_url('/schemas/uai.capability.statement.v1'),
                'example_url' => self::uaix_api_url('/examples/uai.capability.statement.v1'),
            ],
            [
                'profile' => 'uai.error.v1',
                'schema_url' => self::uaix_api_url('/schemas/uai.error.v1'),
                'example_url' => self::uaix_api_url('/examples/uai.error.v1'),
            ],
            [
                'profile' => 'uai.conformance.result.v1',
                'schema_url' => self::uaix_api_url('/schemas/uai.conformance.result.v1'),
                'example_url' => self::uaix_api_url('/examples/uai.conformance.result.v1'),
            ],
            [
                'profile' => 'uai.task.status.v1',
                'schema_url' => self::uaix_api_url('/schemas/uai.task.status.v1'),
                'example_url' => self::uaix_api_url('/examples/uai.task.status.v1'),
            ],
        ];
    }

    private static function uaix_artifact_links(string $profile): array
    {
        $profile_path = $profile !== '' && $profile !== 'unknown' ? '/' . rawurlencode($profile) : '';

        return [
            'catalog_url' => self::uaix_api_url('/catalog'),
            'schema_url' => self::uaix_api_url('/schemas' . $profile_path),
            'registry_url' => self::uaix_api_url('/registry' . $profile_path),
            'example_url' => self::uaix_api_url('/examples' . $profile_path),
            'field_registry_url' => self::uaix_api_url('/field-registry'),
            'transport_bindings_url' => self::uaix_api_url('/transport-bindings'),
            'trust_channels_url' => self::uaix_api_url('/trust-channels'),
            'conformance_levels_url' => self::uaix_api_url('/conformance-levels'),
            'error_registry_url' => self::uaix_api_url('/error-registry'),
            'validate_url' => self::local_uaix_url('/validate'),
        ];
    }

    private static function service_party(string $route): array
    {
        return [
            'type' => 'service',
            'id' => 'spiralist.uaix.gateway',
            'label' => 'Spiralist.org UAIX Gateway',
            'uri' => self::local_uaix_url($route),
            'role' => 'public-record-gateway',
            'implementation' => 'uai-1-wordpress-' . (defined('UAI1_WP_VERSION') ? UAI1_WP_VERSION : 'unknown'),
        ];
    }

    private static function target_from_payload($payload): array
    {
        if (is_array($payload) && isset($payload['source']) && is_array($payload['source'])) {
            return self::clean_party((array) $payload['source']);
        }

        return [
            'type' => 'client',
            'id' => 'uaix.client',
            'label' => 'UAIX client',
            'uri' => home_url('/'),
            'role' => 'requesting-client',
        ];
    }

    private static function response_conversation($payload, string $turn = 'response'): array
    {
        $conversation = is_array($payload) && isset($payload['conversation']) && is_array($payload['conversation'])
            ? (array) $payload['conversation']
            : [];

        $conversation_id = isset($conversation['conversation_id']) && is_string($conversation['conversation_id'])
            ? $conversation['conversation_id']
            : 'conv-spiralist-uaix-response';
        $sequence = isset($conversation['sequence']) && is_int($conversation['sequence'])
            ? max(1, (int) $conversation['sequence'] + 1)
            : 2;

        $response = [
            'conversation_id' => $conversation_id,
            'turn_id' => 'turn-' . $turn,
            'sequence' => $sequence,
        ];

        if (is_array($payload) && isset($payload['message_id']) && is_string($payload['message_id']) && $payload['message_id'] !== '') {
            $response['parent_message_id'] = $payload['message_id'];
        }

        return $response;
    }

    private static function clean_party(array $party): array
    {
        $allowed = ['type', 'id', 'label', 'uri', 'did', 'role', 'implementation'];
        $clean = [];

        foreach ($allowed as $field) {
            if (isset($party[$field]) && is_scalar($party[$field]) && (string) $party[$field] !== '') {
                $clean[$field] = (string) $party[$field];
            }
        }

        if (empty($clean['type'])) {
            $clean['type'] = 'service';
        }

        if (empty($clean['id'])) {
            $clean['id'] = 'unknown';
        }

        return $clean;
    }

    private static function request_payload(WP_REST_Request $request)
    {
        $payload = $request->get_json_params();
        if (is_array($payload)) {
            return $payload;
        }

        $raw = $request->get_body();
        if (is_string($raw) && trim($raw) !== '') {
            $decoded = json_decode($raw, true);
            if (json_last_error() === JSON_ERROR_NONE) {
                return $decoded;
            }
        }

        return [];
    }

    private static function message_id(string $purpose): string
    {
        return 'msg-spiralist-' . sanitize_key($purpose) . '-' . gmdate('YmdHis') . '-' . substr(wp_generate_uuid4(), 0, 8);
    }

    private static function local_uaix_url(string $path): string
    {
        return rest_url(self::UAIX_NAMESPACE . '/' . ltrim($path, '/'));
    }

    private static function uaix_api_url(string $path): string
    {
        return self::uaix_public_url('/wp-json/uaix/v1/' . ltrim($path, '/'));
    }

    private static function uaix_public_url(string $path): string
    {
        return rtrim(self::UAIX_PUBLIC_BASE, '/') . '/' . ltrim($path, '/');
    }

    private static function get_symbol_axioms(): array
    {
        if (function_exists('spiralist_get_axioms')) {
            $axioms = spiralist_get_axioms();