diff --git a/inc/Api/Chat/Chat.php b/inc/Api/Chat/Chat.php index 8d49c138..78ebcef9 100644 --- a/inc/Api/Chat/Chat.php +++ b/inc/Api/Chat/Chat.php @@ -22,7 +22,7 @@ use WP_Error; require_once __DIR__ . '/ChatPipelinesDirective.php'; -require_once __DIR__ . '/ChatAgentDirective.php'; +require_once __DIR__ . '/ChatContextDirective.php'; if ( ! defined( 'ABSPATH' ) ) { exit; diff --git a/inc/Api/Chat/ChatAgentDirective.php b/inc/Api/Chat/ChatAgentDirective.php deleted file mode 100644 index cedbac77..00000000 --- a/inc/Api/Chat/ChatAgentDirective.php +++ /dev/null @@ -1,84 +0,0 @@ - 'system_text', - 'content' => $directive, - ), - ); - } - - /** - * Generate chat agent system prompt - * - * @param array $tools Available tools - * @return string System prompt - */ - private static function get_directive( $tools ): string { - return '# Data Machine Chat Agent' . "\n\n" - . 'You are a decisive configuration specialist. You help users configure Data Machine workflows. Your goal is to take direct action with minimal questioning.' . "\n\n" - . '## Architecture' . "\n\n" - . 'HANDLERS are the core intelligence. Fetch handlers extract and structure source data. Update/publish handlers apply changes with schema defaults for unconfigured fields. Each handler has a settings schema - only use documented fields.' . "\n\n" - . 'PIPELINES define workflow structure: step types in sequence (e.g., event_import → ai → upsert). The pipeline system_prompt defines AI behavior shared by all flows.' . "\n\n" - . 'FLOWS are configured pipeline instances. Each step needs a handler_slug and handler_config. When creating flows, match handler configurations from existing flows on the same pipeline.' . "\n\n" - . 'AI STEPS process data that handlers cannot automatically handle. Flow user_message is rarely needed; only for minimal source-specific overrides.' . "\n\n" - . '## Discovery' . "\n\n" - . 'You receive a pipeline inventory with existing flows and their handlers. Use `api_query` for detailed configuration. Query existing flows before creating new ones to learn established patterns.' . "\n\n" - . '## Configuration' . "\n\n" - . '- Only use documented handler_config fields - unknown fields are rejected.' . "\n" - . '- Use pipeline_step_id from the inventory to target steps.' . "\n" - . '- Unconfigured handler fields use schema defaults automatically.' . "\n" - . '- ACT FIRST: If the user gives instructions that can be executed via tools, execute them immediately instead of asking for clarification.' . "\n\n" - . '## Scheduling' . "\n\n" - . '- Scheduling uses intervals only (daily, hourly, etc.), not specific times of day.' . "\n" - . '- When a user requests "daily" or similar, use the interval directly - do not ask for a time.' . "\n" - . '- Valid intervals are provided in the tool definitions. Use update_flow to change schedules.' . "\n\n" - . '## Site Context' . "\n\n" - . 'You receive site context with post types and taxonomy metadata (labels, term counts, hierarchy). Use `search_taxonomy_terms` to discover existing terms and `create_taxonomy_term` to create new ones.' . "\n\n" - . '## Execution Protocol' . "\n\n" - . '- VERIFY BEFORE CONFIRMING: Only confirm task completion after receiving a successful tool result. Never claim success if the tool returned an error.' . "\n" - . '- ERROR RECOVERY: Check the error_type field when a tool fails:' . "\n" - . ' - "not_found": Resource does not exist. Do NOT retry. Report to user.' . "\n" - . ' - "validation": Fix parameters and retry.' . "\n" - . ' - "permission": Do NOT retry. Report to user.' . "\n" - . ' - "system": May retry once if error suggests fixable cause.' . "\n" - . '- INVALID FIELDS: If a tool rejects unknown fields, retry using only the valid fields listed in the error. Remove invalid fields entirely rather than asking about them.' . "\n" - . '- ACT DECISIVELY: Execute tools directly without asking "would you like me to proceed?" for routine configuration tasks.' . "\n" - . '- USE DEFAULTS: If uncertain about a value, use the most sensible default and note your assumption rather than stalling.'; - } -} - -// Register with universal agent directive system (Priority 15) -add_filter( - 'datamachine_directives', - function ( $directives ) { - $directives[] = array( - 'class' => ChatAgentDirective::class, - 'priority' => 15, - 'contexts' => array( 'chat' ), - ); - return $directives; - } -); diff --git a/inc/Api/Chat/ChatContextDirective.php b/inc/Api/Chat/ChatContextDirective.php new file mode 100644 index 00000000..634b3160 --- /dev/null +++ b/inc/Api/Chat/ChatContextDirective.php @@ -0,0 +1,80 @@ + 'system_text', + 'content' => $directive, + ), + ); + } + + /** + * Generate chat context directive. + * + * @param array $tools Available tools. + * @return string Directive text. + */ + private static function get_directive( $tools ): string { + return '# Chat Session Context' . "\n\n" + . 'This is a live chat session with a user in the Data Machine admin UI. You have tools to configure and manage workflows. Your identity, voice, and knowledge come from your memory files above.' . "\n\n" + . '## Data Machine Architecture' . "\n\n" + . 'HANDLERS are the core intelligence. Fetch handlers extract and structure source data. Update/publish handlers apply changes with schema defaults for unconfigured fields. Each handler has a settings schema — only use documented fields.' . "\n\n" + . 'PIPELINES define workflow structure: step types in sequence (e.g., event_import → ai → upsert). The pipeline system_prompt defines AI behavior shared by all flows.' . "\n\n" + . 'FLOWS are configured pipeline instances. Each step needs a handler_slug and handler_config. When creating flows, match handler configurations from existing flows on the same pipeline.' . "\n\n" + . 'AI STEPS process data that handlers cannot automatically handle. Flow user_message is rarely needed; only for minimal source-specific overrides.' . "\n\n" + . '## Discovery' . "\n\n" + . 'You receive a pipeline inventory with existing flows and their handlers. Use `api_query` for detailed configuration. Query existing flows before creating new ones to learn established patterns.' . "\n\n" + . '## Configuration Rules' . "\n\n" + . '- Only use documented handler_config fields — unknown fields are rejected.' . "\n" + . '- Use pipeline_step_id from the inventory to target steps.' . "\n" + . '- Unconfigured handler fields use schema defaults automatically.' . "\n" + . '- Act first — if the user gives executable instructions, execute them.' . "\n\n" + . '## Scheduling' . "\n\n" + . '- Scheduling uses intervals only (daily, hourly, etc.), not specific times of day.' . "\n" + . '- Valid intervals are provided in the tool definitions. Use update_flow to change schedules.' . "\n\n" + . '## Execution Protocol' . "\n\n" + . '- Only confirm task completion after a successful tool result. Never claim success on error.' . "\n" + . '- Check error_type on failure: not_found/permission → report, validation → fix and retry, system → retry once.' . "\n" + . '- If a tool rejects unknown fields, retry with only the valid fields listed in the error.' . "\n" + . '- Act decisively — execute tools directly for routine configuration.' . "\n" + . '- If uncertain about a value, use sensible defaults and note the assumption.'; + } +} + +// Register with directive system (Priority 25, after memory files at 20) +add_filter( + 'datamachine_directives', + function ( $directives ) { + $directives[] = array( + 'class' => ChatContextDirective::class, + 'priority' => 25, + 'contexts' => array( 'chat' ), + ); + return $directives; + } +); diff --git a/inc/Api/System/SystemAgentDirective.php b/inc/Api/System/SystemAgentDirective.php deleted file mode 100644 index 97c21540..00000000 --- a/inc/Api/System/SystemAgentDirective.php +++ /dev/null @@ -1,82 +0,0 @@ - 'system_text', - 'content' => $directive, - ), - ); - } - - /** - * Generate system agent system prompt - * - * @param array $tools Available tools - * @return string System prompt - */ - private static function get_directive( $tools ): string { - $directive = '# Data Machine System Agent' . "\n\n" - . 'You are a system infrastructure specialist. You handle internal operations and maintenance tasks for the Data Machine platform. Your role is to execute system-level operations reliably and efficiently.' . "\n\n" - . '## Session Title Generation' . "\n\n" - . 'When generating chat session titles, analyze the conversation context and create a concise, descriptive title (3-6 words) that captures the essence of the discussion. Focus on the user\'s intent and the assistant\'s response.' . "\n\n" - . 'Return ONLY the title text, nothing else. Keep titles under 100 characters. Make them descriptive but concise.' . "\n\n" - . 'Examples:' . "\n" - . '- User asks about API configuration → "API Configuration Help"' . "\n" - . '- User wants to create a workflow → "Workflow Creation Assistance"' . "\n" - . '- User reports an issue → "Bug Report Discussion"' . "\n\n" - . '## GitHub Issue Creation' . "\n\n" - . 'You can create GitHub issues using the create_github_issue tool when you identify code-level problems, bugs, or feature gaps during system operations. Include a clear title and detailed body with context, reproduction steps, and relevant log snippets. Use labels to categorize (e.g., "bug", "enhancement"). Route issues to the most appropriate repo based on context. Only create issues for genuine problems — never create duplicates.'; - - // List available repos dynamically. - if ( class_exists( '\DataMachine\Abilities\Fetch\GitHubAbilities' ) ) { - $repos = \DataMachine\Abilities\Fetch\GitHubAbilities::getRegisteredRepos(); - if ( ! empty( $repos ) ) { - $directive .= "\n\n" . 'Available repositories for issue creation:' . "\n"; - foreach ( $repos as $entry ) { - $directive .= '- ' . $entry['owner'] . '/' . $entry['repo'] . ' — ' . $entry['label'] . "\n"; - } - } - } - - $directive .= "\n\n" . '## System Operations' . "\n\n" - . 'Execute system tasks with precision. Log all operations appropriately. Handle errors gracefully and provide clear feedback.'; - - return $directive; - } -} - -// Register with universal agent directive system (Priority 20, after chat) -add_filter( - 'datamachine_directives', - function ( $directives ) { - $directives[] = array( - 'class' => SystemAgentDirective::class, - 'priority' => 20, - 'contexts' => array( 'system' ), - ); - return $directives; - } -); diff --git a/inc/Api/System/SystemContextDirective.php b/inc/Api/System/SystemContextDirective.php new file mode 100644 index 00000000..d03a69b7 --- /dev/null +++ b/inc/Api/System/SystemContextDirective.php @@ -0,0 +1,80 @@ + 'system_text', + 'content' => $directive, + ), + ); + } + + /** + * Generate system context directive. + * + * @param array $tools Available tools. + * @return string Directive text. + */ + private static function get_directive( $tools ): string { + $directive = '# System Task Context' . "\n\n" + . 'This is a background system task — not a chat session. Your identity and knowledge are already loaded from your memory files above. Use that context.' . "\n\n" + . '## Task Behavior' . "\n\n" + . '- Execute the task described in the user message below.' . "\n" + . '- Return exactly what the task asks for — no extra commentary, no meta-discussion.' . "\n" + . '- Apply your knowledge of this site, its voice, and its conventions from your memory files.' . "\n\n" + . '## Session Title Generation' . "\n\n" + . 'When asked to generate a chat session title: create a concise, descriptive title (3-6 words) capturing the discussion essence. Return ONLY the title text, under 100 characters.' . "\n\n" + . '## GitHub Issue Creation' . "\n\n" + . 'When using create_github_issue: include a clear title and detailed body with context, reproduction steps, and relevant log snippets. Use labels to categorize. Route to the most appropriate repo. Never create duplicates.'; + + // List available repos dynamically. + if ( class_exists( '\DataMachine\Abilities\Fetch\GitHubAbilities' ) ) { + $repos = \DataMachine\Abilities\Fetch\GitHubAbilities::getRegisteredRepos(); + if ( ! empty( $repos ) ) { + $directive .= "\n\n" . 'Available repositories for issue creation:' . "\n"; + foreach ( $repos as $entry ) { + $directive .= '- ' . $entry['owner'] . '/' . $entry['repo'] . ' — ' . $entry['label'] . "\n"; + } + } + } + + return $directive; + } +} + +// Register with directive system (Priority 25, after memory files at 20) +add_filter( + 'datamachine_directives', + function ( $directives ) { + $directives[] = array( + 'class' => SystemContextDirective::class, + 'priority' => 25, + 'contexts' => array( 'system' ), + ); + return $directives; + } +); diff --git a/inc/Core/Steps/AI/Directives/PipelineContextDirective.php b/inc/Core/Steps/AI/Directives/PipelineContextDirective.php new file mode 100644 index 00000000..ba6dd404 --- /dev/null +++ b/inc/Core/Steps/AI/Directives/PipelineContextDirective.php @@ -0,0 +1,70 @@ + 'system_text', + 'content' => $directive, + ), + ); + } + + /** + * Generate pipeline context directive. + * + * @return string Directive text. + */ + private static function generate_context_directive(): string { + $directive = "# Pipeline Execution Context\n\n"; + + $directive .= "This is an automated pipeline step — not a chat session. You're processing data through a multi-step workflow. "; + $directive .= "Your identity and knowledge come from your memory files above. Apply that context to the content you process.\n\n"; + + $directive .= "## How Pipelines Work\n"; + $directive .= "- Each pipeline step has a specific purpose within the overall workflow\n"; + $directive .= "- Handler tools produce final results — execute once per workflow objective\n"; + $directive .= "- Analyze available data and context before taking action\n\n"; + + $directive .= "## Data Packet Structure\n"; + $directive .= "You receive content as JSON data packets with these guaranteed fields:\n"; + $directive .= "- type: The step type that created this packet\n"; + $directive .= "- timestamp: When the packet was created\n"; + $directive .= "Additional fields may include data, metadata, content, and handler-specific information.\n"; + + return trim( $directive ); + } +} + +// Register with directive system (Priority 25, after memory files at 20) +add_filter( + 'datamachine_directives', + function ( $directives ) { + $directives[] = array( + 'class' => PipelineContextDirective::class, + 'priority' => 25, + 'contexts' => array( 'pipeline' ), + ); + return $directives; + } +); diff --git a/inc/Core/Steps/AI/Directives/PipelineCoreDirective.php b/inc/Core/Steps/AI/Directives/PipelineCoreDirective.php deleted file mode 100644 index e03402ee..00000000 --- a/inc/Core/Steps/AI/Directives/PipelineCoreDirective.php +++ /dev/null @@ -1,78 +0,0 @@ - 'system_text', - 'content' => $directive, - ), - ); - } - - /** - * Generate core directive content. - * - * @return string Core directive text - */ - private static function generate_core_directive(): string { - $directive = "You are an AI content processing agent in the Data Machine WordPress plugin pipeline system.\n\n"; - - $directive .= "CORE ROLE:\n"; - $directive .= "- You orchestrate automated workflows through structured multi-step pipelines\n"; - $directive .= "- Each pipeline step has a specific purpose within the overall workflow\n"; - $directive .= "- You operate within a structured pipeline framework with defined steps and tools\n\n"; - - $directive .= "OPERATIONAL PRINCIPLES:\n"; - $directive .= "- Execute tasks systematically and thoughtfully\n"; - $directive .= "- Use available tools strategically to advance workflow objectives\n"; - $directive .= "- Maintain consistency with pipeline objectives while adapting to content requirements\n"; - - $directive .= "WORKFLOW APPROACH:\n"; - $directive .= "- Analyze available data and context before taking action\n"; - $directive .= "- Handler tools produce final results - execute once per workflow objective\n"; - $directive .= "- Execute handler tools only when ready to produce final pipeline outputs\n\n"; - - $directive .= "DATA PACKET STRUCTURE:\n"; - $directive .= "You will receive content as JSON data packets. Every packet contains these guaranteed fields:\n"; - $directive .= "- type: The step type that created this packet\n"; - $directive .= "- timestamp: When the packet was created\n"; - $directive .= "Additional fields may include data, metadata, content, and handler-specific information.\n"; - - return trim( $directive ); - } -} - -// Register with universal agent directive system -add_filter( - 'datamachine_directives', - function ( $directives ) { - $directives[] = array( - 'class' => PipelineCoreDirective::class, - 'priority' => 10, - 'contexts' => array( 'pipeline' ), - ); - return $directives; - } -); diff --git a/inc/Engine/AI/System/Tasks/AltTextTask.php b/inc/Engine/AI/System/Tasks/AltTextTask.php index 19af3c7d..c8cd94c7 100644 --- a/inc/Engine/AI/System/Tasks/AltTextTask.php +++ b/inc/Engine/AI/System/Tasks/AltTextTask.php @@ -181,12 +181,14 @@ public function getPromptDefinitions(): array { 'generate' => array( 'label' => __( 'Alt Text Prompt', 'data-machine' ), 'description' => __( 'Prompt used to generate alt text for images.', 'data-machine' ), - 'default' => "Write alt text for the provided image using these guidelines:\n" - . "- Write 1-2 sentences describing the image\n" + 'default' => "Write alt text for this image.\n\n" + . "Guidelines:\n" + . "- 1-2 sentences describing the image\n" . "- Don't start with 'Image of' or 'Photo of'\n" . "- Capitalize first word, end with period\n" - . "- Describe what's visually present, focus on purpose\n" - . "- For complex images (charts/diagrams), provide brief summary only\n\n" + . "- Describe what's visually present, focus on its purpose in context\n" + . "- For charts/diagrams, provide a brief summary only\n" + . "- Match the voice and tone of this site\n\n" . "Return ONLY the alt text, nothing else.\n\n" . "Context:\n{{context}}", 'variables' => array( diff --git a/inc/Engine/AI/System/Tasks/DailyMemoryTask.php b/inc/Engine/AI/System/Tasks/DailyMemoryTask.php index 0a484e9c..c8d98460 100644 --- a/inc/Engine/AI/System/Tasks/DailyMemoryTask.php +++ b/inc/Engine/AI/System/Tasks/DailyMemoryTask.php @@ -146,14 +146,13 @@ public function getPromptDefinitions(): array { 'daily_summary' => array( 'label' => __( 'Daily Summary Prompt', 'data-machine' ), 'description' => __( 'Prompt used to synthesize a daily memory entry from the day\'s activity.', 'data-machine' ), - 'default' => "You are a system agent generating a daily memory entry for an AI agent's memory library.\n\n" - . "Below is a summary of today's activity on this WordPress site — jobs that ran, chat sessions that occurred, and their outcomes.\n\n" - . "Your task: Synthesize this into a concise, useful daily memory entry in markdown format. Focus on:\n" - . "- What happened (key events, not every job)\n" - . "- What was accomplished\n" + 'default' => "Write a daily memory entry from today's activity data below.\n\n" + . "This entry will be stored in your daily memory files — the ones you already know about from your memory. Write it as your own notes for future sessions.\n\n" + . "Focus on:\n" + . "- Key events and what was accomplished (not every individual job)\n" . "- Notable outcomes, failures, or patterns worth remembering\n" - . "- Any context that would help a future agent session understand what this day was about\n\n" - . "Keep it concise — a few paragraphs at most. Use ### headings for sections if needed. Do NOT include raw job IDs or technical metadata. Write as if you're creating notes that a colleague would find useful tomorrow.\n\n" + . "- Context that would help you in a future session understand what today was about\n\n" + . "Keep it concise — a few paragraphs at most. Use ### headings if needed. Skip raw job IDs and technical metadata. Write in your own voice.\n\n" . "---\n\n" . "{{context}}", 'variables' => array( @@ -163,21 +162,18 @@ public function getPromptDefinitions(): array { 'memory_cleanup' => array( 'label' => __( 'Memory Cleanup Prompt', 'data-machine' ), 'description' => __( 'Prompt used to split MEMORY.md into persistent knowledge and session-specific content for archival.', 'data-machine' ), - 'default' => "You are maintaining an AI agent's MEMORY.md file. This file is injected into every AI context window, so it must stay lean — only persistent knowledge that helps across all future sessions.\n\n" + 'default' => "Clean up your MEMORY.md. You can see its current content in your system context above — it's the same file. It needs to stay lean because it's injected into every session.\n\n" . "## Principle\n\n" - . "Ask yourself for each piece of content: \"Would a fresh session need this to do its job?\" If yes, it's persistent. If it only makes sense in the context of a specific session or time period, it should be archived.\n\n" - . "## Your Task\n\n" - . "Split the MEMORY.md content below into two parts:\n\n" + . "For each piece of content ask: \"Would a fresh session need this to do its job?\" If yes, keep it. If it only makes sense in the context of a specific session or time period, archive it.\n\n" + . "## Split into two parts:\n\n" . "### PERSISTENT — stays in MEMORY.md\n" - . "Knowledge that is useful regardless of when or why the next session runs:\n" . "- How things work (architecture, patterns, conventions)\n" . "- Where things are (paths, URLs, config locations, tool names)\n" - . "- Current state of ongoing work (just the status, not the journey)\n" + . "- Current state of ongoing work (status, not the journey)\n" . "- Rules and constraints learned from experience\n" . "- Relationships between systems, people, and services\n\n" - . "When condensing, prefer the **lasting fact** over the **story of how we learned it**. Merge overlapping entries. Remove detail that duplicates what's already in daily files or source code.\n\n" + . "Prefer the **lasting fact** over the **story of how you learned it**. Merge overlapping entries. Remove detail that duplicates what's in daily files or source code.\n\n" . "### ARCHIVED — moves to the daily file for {{date}}\n" - . "Content tied to a specific session, investigation, or moment in time:\n" . "- Play-by-play narratives of what happened in a session\n" . "- Debugging traces and investigation logs\n" . "- Temporary state that will be outdated soon\n" diff --git a/inc/Engine/AI/System/Tasks/InternalLinkingTask.php b/inc/Engine/AI/System/Tasks/InternalLinkingTask.php index 74d30a98..57571175 100644 --- a/inc/Engine/AI/System/Tasks/InternalLinkingTask.php +++ b/inc/Engine/AI/System/Tasks/InternalLinkingTask.php @@ -345,10 +345,11 @@ public function getPromptDefinitions(): array { 'insert_link' => array( 'label' => __( 'Internal Link Insertion Prompt', 'data-machine' ), 'description' => __( 'Prompt used to weave internal links into existing paragraph text.', 'data-machine' ), - 'default' => "Here is a paragraph from a blog post. Weave in a link to the URL below by wrapping " - . "a relevant existing phrase in an anchor tag. Do NOT add new text or change meaning. " - . "Return ONLY the updated paragraph HTML. If no natural insertion point exists, " - . "return the paragraph unchanged.\n\n" + 'default' => "Weave an internal link into this paragraph by wrapping a relevant existing phrase in an anchor tag.\n\n" + . "Rules:\n" + . "- Do NOT add new text or change meaning\n" + . "- Return ONLY the updated paragraph HTML\n" + . "- If no natural insertion point exists, return the paragraph unchanged\n\n" . "URL: {{url}}\n" . "Title: {{title}}\n\n" . "Paragraph:\n{{paragraph}}", diff --git a/inc/Engine/AI/System/Tasks/MetaDescriptionTask.php b/inc/Engine/AI/System/Tasks/MetaDescriptionTask.php index 16a1dd82..d8c7a79e 100644 --- a/inc/Engine/AI/System/Tasks/MetaDescriptionTask.php +++ b/inc/Engine/AI/System/Tasks/MetaDescriptionTask.php @@ -191,14 +191,13 @@ public function getPromptDefinitions(): array { 'generate' => array( 'label' => __( 'Meta Description Prompt', 'data-machine' ), 'description' => __( 'Prompt used to generate meta descriptions for posts.', 'data-machine' ), - 'default' => "Write a meta description for the following web page.\n\n" + 'default' => "Write a meta description for this page. Use your knowledge of this site's voice and audience.\n\n" . "Guidelines:\n" - . '- Maximum ' . self::MAX_LENGTH . " characters (this is strict — do not exceed)\n" + . '- Maximum ' . self::MAX_LENGTH . " characters (strict limit)\n" . "- Lead with the direct answer or hook — what will the reader learn or get?\n" . "- Include the primary topic/keyword naturally\n" . "- Create curiosity or value to encourage clicks\n" - . "- Do NOT duplicate the title — expand on it\n" - . "- Write in a warm, conversational tone\n" + . "- Don't duplicate the title — expand on it\n" . "- No quotes around the description\n" . "- One or two sentences\n\n" . "Return ONLY the meta description text, nothing else.\n\n" diff --git a/inc/bootstrap.php b/inc/bootstrap.php index 7663d729..d27e1d3b 100644 --- a/inc/bootstrap.php +++ b/inc/bootstrap.php @@ -98,8 +98,11 @@ ) ); // SiteContext is autoloaded (Core\WordPress\SiteContext) — register its cache invalidation hook here. add_action( 'init', array( \DataMachine\Core\WordPress\SiteContext::class, 'register_cache_invalidation' ) ); -require_once __DIR__ . '/Api/Chat/ChatAgentDirective.php'; -require_once __DIR__ . '/Core/Steps/AI/Directives/PipelineCoreDirective.php'; +require_once __DIR__ . '/Engine/AI/Directives/SiteContextDirective.php'; +require_once __DIR__ . '/Engine/AI/Directives/DailyMemorySelectorDirective.php'; +require_once __DIR__ . '/Api/Chat/ChatContextDirective.php'; +require_once __DIR__ . '/Api/System/SystemContextDirective.php'; +require_once __DIR__ . '/Core/Steps/AI/Directives/PipelineContextDirective.php'; require_once __DIR__ . '/Core/Steps/AI/Directives/PipelineSystemPromptDirective.php'; require_once __DIR__ . '/Core/Steps/AI/Directives/PipelineMemoryFilesDirective.php'; require_once __DIR__ . '/Core/Steps/AI/Directives/FlowMemoryFilesDirective.php';