Class Uai1 Agents - Source Excerpt 03
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',