Promptrepository - Source Excerpt 10
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.
*