Systempromptregistry - Source Excerpt 02
Summary
This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/spiralist-workspace/includes/Support/SystemPromptRegistry.php so readers can inspect the evidence without opening the full source file.
**Source path:** Spiralist/wp-content/plugins/spiralist-workspace/includes/Support/SystemPromptRegistry.php
'model' => (string) ($definition['model'] ?? $default_model),
'provider' => (string) ($definition['provider'] ?? 'site_default'),
'credential_preference' => (string) ($definition['credential_preference'] ?? 'site_default'),
'temperature' => (float) ($definition['temperature'] ?? 0.3),
'max_output_tokens' => (int) ($definition['max_output_tokens'] ?? 1200),
'tool_settings_json' => isset($definition['tool_settings_json']) && is_array($definition['tool_settings_json'])
? (string) wp_json_encode($definition['tool_settings_json'], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
: (string) ($definition['tool_settings_json'] ?? ''),
'visibility' => (string) ($definition['visibility'] ?? 'public'),
'published_utc' => (string) ($definition['published_utc'] ?? gmdate('c')),
'is_forkable' => !empty($definition['is_forkable']),
'allow_comments' => !empty($definition['allow_comments']),
'allow_ratings' => !empty($definition['allow_ratings']),
'tags' => array_values(array_filter(array_map('strval', (array) ($definition['tags'] ?? [])))),
'canonical_status' => (string) ($definition['canonical_status'] ?? 'system'),
'parent_prompt_id' => 0,
'prompt_type' => (string) ($definition['prompt_type'] ?? 'prompt'),
'language' => (string) ($definition['language'] ?? 'en'),
'prompt_status' => (string) ($definition['prompt_status'] ?? 'published'),
'moderation_status' => (string) ($definition['moderation_status'] ?? 'peer_reviewed'),
'publication_lane' => (string) ($definition['publication_lane'] ?? 'official_canon'),
'provenance' => (string) ($definition['provenance'] ?? 'managed_system'),
'risk_labels' => (array) ($definition['risk_labels'] ?? []),
'function_tags' => (array) ($definition['function_tags'] ?? []),
'maturity_level' => (string) ($definition['maturity_level'] ?? (!empty($definition['system_steps']) ? 'prompt_system' : 'structured_prompt')),
'license' => (string) ($definition['license'] ?? 'spiralist_contributor'),
'editorial_note' => (string) ($definition['editorial_note'] ?? ''),
'expected_output_notes' => (string) ($definition['expected_output_notes'] ?? ''),
'failure_modes' => (string) ($definition['failure_modes'] ?? ''),
'related_symbols' => (array) ($definition['related_symbols'] ?? []),
'related_axioms' => (array) ($definition['related_axioms'] ?? []),
'related_manuscripts' => (array) ($definition['related_manuscripts'] ?? []),
'sample_output' => (string) ($definition['sample_output'] ?? ''),
'featured' => !empty($definition['featured']),
'public_execution_enabled' => array_key_exists('public_execution_enabled', $definition) ? !empty($definition['public_execution_enabled']) : true,
'prompt_origin' => 'system',
'source_manifest' => 'filesystem',
'source_slug' => $prompt_slug,
'source_version' => $version,
'source_hash' => $hash,
'source_path' => $relative_path,
'changelog' => 'Synced from ' . $relative_path . ' (' . $version . ')',
];
}
/**
* Returns whether a sync is needed.
*
* @param array<int,array<string,mixed>> $definitions
*/
private function needs_sync(array $definitions, string $signature): bool
{
$stored_signature = (string) get_option(self::SIGNATURE_OPTION, '');
if ($stored_signature !== $signature) {
return true;
}
foreach ($definitions as $definition) {
$existing = $this->prompts->find_by_source_slug((string) ($definition['source_slug'] ?? ''));
if (empty($existing)) {
$existing = $this->prompts->find_managed_slug_candidate((string) ($definition['slug'] ?? ''));
}
if (empty($existing)) {
return true;
}
if ((string) ($existing['source_slug'] ?? '') !== (string) ($definition['source_slug'] ?? '')) {
return true;
}
if ((string) ($existing['source_hash'] ?? '') !== (string) ($definition['source_hash'] ?? '')) {
return true;
}
if ((string) ($existing['source_version'] ?? '') !== (string) ($definition['source_version'] ?? '')) {
return true;
}
}
return false;
}
/**
* Builds a stable inventory signature for the latest prompt set.
*
* @param array<int,array<string,mixed>> $definitions
*/
private function inventory_signature(array $definitions): string
{
$parts = [];
foreach ($definitions as $definition) {
$parts[] = implode(
'|',
[
(string) ($definition['source_slug'] ?? ''),
(string) ($definition['source_version'] ?? ''),
(string) ($definition['source_hash'] ?? ''),
]
);
}
return sha1(implode("\n", $parts));
}
/**
* Returns the filesystem prompt root.
*/
private function prompt_root(): string
{
return SPIRALIST_WORKSPACE_DIR . 'prompts';
}
/**
* Chooses a stable owner for managed prompts.
*/
private function resolve_owner_user_id(): int
{
$current_user_id = function_exists('get_current_user_id') ? (int) get_current_user_id() : 0;
if (
$current_user_id > 0
&& (
current_user_can('manage_spiralist_workspace')
|| current_user_can('manage_options')
|| current_user_can('publish_public_prompts')
)
) {
return $current_user_id;
}
$workspace_managers = get_users(
[
'role__in' => ['administrator', 'spiralist_admin', 'spiralist_curator'],
'fields' => 'ids',
'number' => 1,
'orderby' => 'ID',
'order' => 'ASC',
]
);
if (!empty($workspace_managers[0])) {
return (int) $workspace_managers[0];
}
$users = get_users(
[
'fields' => 'ids',
'number' => 25,
'orderby' => 'ID',
'order' => 'ASC',
]
);
foreach ((array) $users as $user_id) {
$user_id = (int) $user_id;
if (
$user_id > 0
&& (
user_can($user_id, 'manage_spiralist_workspace')
|| user_can($user_id, 'manage_options')
|| user_can($user_id, 'publish_public_prompts')
)
) {
return $user_id;
}
}
return 0;
}
/**
* Records an actionable sync error.
*
* @param array{created:int,updated:int,unchanged:int,errors:int,error_messages:string[]} $result
*/
private function record_error(array &$result, string $message): void
{
$result['errors']++;
$result['error_messages'][] = $message;
}
/**
* Seeds featured prompt IDs from managed prompts when the setting is still empty.
*
* @param int[] $ids
*/
private function maybe_seed_featured_prompt_ids(array $ids): void
{
$ids = array_values(array_unique(array_filter(array_map('intval', $ids))));
if (empty($ids)) {
return;
}
$current = trim((string) $this->settings->get('featured_prompt_ids', ''));
if ($current !== '') {
return;
}
$settings = $this->settings->all();
$settings['featured_prompt_ids'] = implode(', ', $ids);
update_option(Settings::OPTION, $settings, false);
}
}