Promptrepository - Source Excerpt 08
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
wp_set_post_terms($post_id, [(string) $payload['subcategory']], self::CATEGORY_TAXONOMY, false);
}
}
/**
* Sanitizes prompt input payloads.
*/
private function normalize_payload(array $payload, array $fallback = []): array
{
$managed_sync = !empty($payload['__managed_sync']);
$tags = $payload['tags'] ?? ($payload['spiralist_workspace_tags'] ?? ($fallback['tags'] ?? []));
if (is_string($tags)) {
$tags = preg_split('/[\r\n,]+/', $tags) ?: [];
}
$tool_settings_json = (string) ($payload['tool_settings_json'] ?? ($payload['spiralist_workspace_tool_settings_json'] ?? ($fallback['tool_settings_json'] ?? '')));
$decoded_tool_settings = json_decode($tool_settings_json, true);
if ($tool_settings_json !== '' && !is_array($decoded_tool_settings)) {
$tool_settings_json = '';
}
$category_supplied = isset($payload['category']) || isset($payload['spiralist_workspace_category']);
$category = (string) ($payload['category'] ?? ($payload['spiralist_workspace_category'] ?? ($fallback['category'] ?? 'Writing & Content')));
$subcategory = (string) ($payload['subcategory'] ?? ($payload['spiralist_workspace_subcategory'] ?? ($fallback['subcategory'] ?? 'Blog Writing')));
if ((!$category_supplied || $category === '') && $subcategory !== '') {
$category = PromptCategoryRegistry::category_for_subcategory($subcategory);
}
$category = PromptCategoryRegistry::normalize_category($category);
$subcategory = PromptCategoryRegistry::normalize_subcategory($category, $subcategory);
$structured_prompt = $this->normalize_structured_prompt($payload, $fallback);
$system_steps = $this->normalize_system_steps($payload['system_steps'] ?? ($payload['spiralist_workspace_system_steps_json'] ?? ($fallback['system_steps'] ?? ($fallback['system_steps_json'] ?? []))));
$spiral_script_source = sanitize_textarea_field((string) (
$payload['spiral_script_source']
?? ($payload['spiralist_workspace_spiral_script_source']
?? ($fallback['spiral_script_source'] ?? ''))
));
$spiral_script_contract = $this->compile_spiral_script_source($spiral_script_source, $payload, $fallback);
$prompt_origin = sanitize_key((string) ($managed_sync ? ($payload['prompt_origin'] ?? ($fallback['prompt_origin'] ?? 'user')) : ($fallback['prompt_origin'] ?? 'user')));
$provenance = $this->infer_provenance(
(string) ($payload['provenance'] ?? ($payload['spiralist_workspace_provenance'] ?? ($fallback['provenance'] ?? ''))),
$prompt_origin
);
$publication_lane = $this->infer_publication_lane(
(string) ($payload['publication_lane'] ?? ($payload['spiralist_workspace_publication_lane'] ?? ($fallback['publication_lane'] ?? ''))),
$provenance,
$prompt_origin
);
$risk_labels = PromptMetaRegistry::normalize_risk_labels(
$payload['risk_labels']
?? ($payload['spiralist_workspace_risk_labels']
?? ($fallback['risk_labels']
?? ($fallback['risk_labels_json'] ?? [])))
);
$function_tags = PromptMetaRegistry::normalize_function_tags(
$payload['function_tags']
?? ($payload['spiralist_workspace_function_tags']
?? ($fallback['function_tags']
?? ($fallback['function_tags_json'] ?? [])))
);
$maturity_level = $this->infer_maturity_level(
(string) ($payload['maturity_level'] ?? ($payload['spiralist_workspace_maturity_level'] ?? ($fallback['maturity_level'] ?? ''))),
$structured_prompt,
$system_steps
);
$license = PromptMetaRegistry::normalize_license(
(string) ($payload['license'] ?? ($payload['spiralist_workspace_license'] ?? ($fallback['license'] ?? 'spiralist_contributor')))
);
$related_symbols = PromptMetaRegistry::normalize_freeform_list(
$payload['related_symbols']
?? ($payload['spiralist_workspace_related_symbols']
?? ($fallback['related_symbols']
?? ($fallback['related_symbols_json'] ?? [])))
);
$related_axioms = PromptMetaRegistry::normalize_freeform_list(
$payload['related_axioms']
?? ($payload['spiralist_workspace_related_axioms']
?? ($fallback['related_axioms']
?? ($fallback['related_axioms_json'] ?? [])))
);
$related_manuscripts = PromptMetaRegistry::normalize_freeform_list(
$payload['related_manuscripts']
?? ($payload['spiralist_workspace_related_manuscripts']
?? ($fallback['related_manuscripts']
?? ($fallback['related_manuscripts_json'] ?? [])))
);
return [
'slug' => sanitize_title((string) ($payload['slug'] ?? ($fallback['slug'] ?? ($payload['title'] ?? ($fallback['title'] ?? 'untitled-prompt'))))),
'title' => sanitize_text_field((string) ($payload['title'] ?? ($fallback['title'] ?? 'Untitled Prompt'))),
'summary' => sanitize_textarea_field((string) ($payload['summary'] ?? ($payload['spiralist_workspace_summary'] ?? ($fallback['summary'] ?? '')))),
'author_label' => sanitize_text_field((string) ($payload['author_label'] ?? ($payload['spiralist_workspace_author_label'] ?? ($fallback['author_label'] ?? '')))),
'category' => $category,
'subcategory' => $subcategory,
'structured_prompt' => $structured_prompt,
'structured_prompt_json' => wp_json_encode($structured_prompt, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
'instructions' => sanitize_textarea_field((string) ($payload['instructions'] ?? ($payload['spiralist_workspace_instructions'] ?? ($fallback['instructions'] ?? '')))),
'system_prompt' => sanitize_textarea_field((string) ($payload['system_prompt'] ?? ($payload['spiralist_workspace_system_prompt'] ?? ($fallback['system_prompt'] ?? '')))),
'developer_prompt' => sanitize_textarea_field((string) ($payload['developer_prompt'] ?? ($payload['spiralist_workspace_developer_prompt'] ?? ($fallback['developer_prompt'] ?? '')))),
'user_prompt_template' => sanitize_textarea_field((string) ($payload['user_prompt_template'] ?? ($payload['spiralist_workspace_user_prompt_template'] ?? ($fallback['user_prompt_template'] ?? '')))),
'system_steps' => $system_steps,
'system_steps_json' => wp_json_encode($system_steps, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
'spiral_script_source' => $spiral_script_source,
'spiral_script' => $spiral_script_contract['canonical'],
'spiral_script_json' => wp_json_encode($spiral_script_contract['canonical'], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
'spiral_script_validation' => $spiral_script_contract['validation'],
'spiral_script_validation_json' => wp_json_encode($spiral_script_contract['validation'], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
'spiral_script_status' => $spiral_script_contract['status'],
'model' => 'prompt-art-local',
'provider' => 'prompt_art_only',
'credential_preference' => 'site_only',
'temperature' => isset($payload['temperature']) || isset($payload['spiralist_workspace_temperature'])
? max(0, min(2, (float) ($payload['temperature'] ?? $payload['spiralist_workspace_temperature'])))
: (float) ($fallback['temperature'] ?? 0.7),
'max_output_tokens' => max(1, (int) ($payload['max_output_tokens'] ?? ($payload['spiralist_workspace_max_output_tokens'] ?? ($fallback['max_output_tokens'] ?? 1200)))),
'tool_settings_json' => $tool_settings_json,
'visibility' => sanitize_key((string) ($payload['visibility'] ?? ($payload['spiralist_workspace_visibility'] ?? ($fallback['visibility'] ?? 'private')))),
'published_utc' => sanitize_text_field((string) ($payload['published_utc'] ?? ($fallback['published_utc'] ?? ''))),
'is_forkable' => !empty($payload['is_forkable']) || !empty($payload['spiralist_workspace_is_forkable']) || !empty($fallback['is_forkable']),
'allow_comments' => !empty($payload['allow_comments']) || !empty($payload['spiralist_workspace_allow_comments']) || !empty($fallback['allow_comments']),
'allow_ratings' => !empty($payload['allow_ratings']) || !empty($payload['spiralist_workspace_allow_ratings']) || !empty($fallback['allow_ratings']),
'tags' => array_values(
array_unique(