@sylphx/flow 0.2.12 → 0.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/rules/core.md +56 -3
- package/dist/assets/rules/core.md +56 -3
- package/dist/{chunk-ss51dw5h.js → chunk-1e8xf3f6.js} +1 -1
- package/dist/{chunk-yxv7hqse.js → chunk-3qxj0zy3.js} +1 -1
- package/dist/{chunk-pp4r3hp4.js → chunk-4e5g3df9.js} +6 -6
- package/dist/{chunk-xytc0fks.js → chunk-7yyg008s.js} +1 -1
- package/dist/chunk-jk1ebfqn.js +23 -0
- package/dist/{chunk-g0qpndpd.js.map → chunk-jk1ebfqn.js.map} +3 -3
- package/dist/chunk-n8vzewr3.js +4 -0
- package/dist/chunk-n8vzewr3.js.map +12 -0
- package/dist/chunk-qpej66sh.js +6 -0
- package/dist/chunk-qpej66sh.js.map +11 -0
- package/dist/{chunk-zv5y8yfq.js → chunk-wnhhwtsy.js} +1 -1
- package/dist/index.js +339 -339
- package/dist/index.js.map +35 -18
- package/package.json +1 -1
- package/dist/chunk-d409xn8f.js +0 -6
- package/dist/chunk-d409xn8f.js.map +0 -11
- package/dist/chunk-g0qpndpd.js +0 -23
- package/dist/chunk-xvfz960r.js +0 -4
- package/dist/chunk-xvfz960r.js.map +0 -12
- /package/dist/{chunk-ss51dw5h.js.map → chunk-1e8xf3f6.js.map} +0 -0
- /package/dist/{chunk-yxv7hqse.js.map → chunk-3qxj0zy3.js.map} +0 -0
- /package/dist/{chunk-pp4r3hp4.js.map → chunk-4e5g3df9.js.map} +0 -0
- /package/dist/{chunk-xytc0fks.js.map → chunk-7yyg008s.js.map} +0 -0
- /package/dist/{chunk-zv5y8yfq.js.map → chunk-wnhhwtsy.js.map} +0 -0
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{Q as U}from"./chunk-q4nh3vst.js";import{Tb as C}from"./chunk-3m9whg4q.js";var b=C(U(),1);import{readFile as B,readdir as M,access as w}from"node:fs/promises";import{join as $,parse as y,relative as N,dirname as j}from"node:path";import{homedir as G}from"node:os";import{fileURLToPath as S}from"node:url";async function D(k,H=!1,x){try{let q=await B(k,"utf-8"),{data:Q,content:J}=b.default(q);if(!Q.name||typeof Q.name!=="string")return console.error(`Agent file ${k} missing required 'name' field`),null;let W={name:Q.name,description:Q.description||""};return{id:x||y(k).name,metadata:W,systemPrompt:J.trim(),isBuiltin:H,filePath:k}}catch(q){return console.error(`Failed to load agent from ${k}:`,q),null}}async function R(k,H=!1){try{let q=(await M(k,{recursive:!0,withFileTypes:!0})).filter((J)=>J.isFile()&&J.name.endsWith(".md")).map((J)=>{let W=$(J.parentPath||J.path,J.name),Z=N(k,W).replace(/\.md$/,"");return{fullPath:W,agentId:Z}});return(await Promise.all(q.map(({fullPath:J,agentId:W})=>D(J,H,W)))).filter((J)=>J!==null)}catch(x){return[]}}async function L(){let k=S(import.meta.url),H=j(k),x=$(H,"..","assets","agents"),q=$(H,"..","..","assets","agents");try{return await w(x),x}catch{return q}}function m(k){let H=$(G(),".sylphx-flow","agents"),x=$(k,".sylphx-flow","agents");return[H,x]}async function v(k){let H=await L(),[x,q]=m(k),[Q,J,W]=await Promise.all([R(H,!0),R(x,!1),R(q,!1)]),Z=new Map;for(let X of Q)Z.set(X.id,X);for(let X of J)Z.set(X.id,X);for(let X of W)Z.set(X.id,X);return Array.from(Z.values())}var Y="coder";var O=null,V=null,z={id:Y,metadata:{name:"Coder",description:"Fallback agent (agent manager not initialized)"},systemPrompt:"You are a helpful coding assistant.",isBuiltin:!0};function p(k){V=k}async function u(k){let H=await v(k),x=new Map;for(let q of H)x.set(q.id,q);if(O={agents:x,cwd:k},V){let q=V();if(q.getState){let Q=q.getState().currentAgentId||Y;if(!x.has(Q))q.getState().setCurrentAgentId(Y)}}}function l(){if(!O)return[z];return Array.from(O.agents.values())}function o(k){if(!O)return k===Y?z:null;return O.agents.get(k)||null}function E(){let k=K();if(!O)return z;return O.agents.get(k)||z}function K(){if(V){let k=V();if(k.getState)return k.getState().currentAgentId||Y}return Y}function s(k){if(!O)return!1;if(!O.agents.get(k))return!1;if(V){let x=V();if(x.getState)x.getState().setCurrentAgentId(k)}return!0}async function A(){if(!O)return;let k=O.cwd,H=K();if(await u(k),O&&!O.agents.has(H)){if(V){let x=V();if(x.getState)x.getState().setCurrentAgentId(Y)}}}function d(){return E().systemPrompt}export{s as switchAgent,p as setAppStoreGetter,A as reloadAgents,u as initializeAgentManager,d as getCurrentSystemPrompt,K as getCurrentAgentId,E as getCurrentAgent,l as getAllAgents,o as getAgentById};
|
|
2
|
+
export{p as K,u as L,l as M,o as N,s as O,d as P};
|
|
3
|
+
|
|
4
|
+
//# debugId=14D7D6301BF6514364756E2164756E21
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/agent-loader.ts", "../src/core/builtin-agents.ts", "../src/core/agent-manager.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Agent Loader\n * Loads agent definitions from markdown files with front matter\n */\n\nimport { readFile, readdir, access } from 'node:fs/promises';\nimport { join, parse, relative, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport { fileURLToPath } from 'node:url';\nimport matter from 'gray-matter';\nimport type { Agent, AgentMetadata } from '../types/agent.types.js';\n\n/**\n * Load a single agent from a markdown file\n */\nexport async function loadAgentFromFile(\n filePath: string,\n isBuiltin: boolean = false,\n agentId?: string\n): Promise<Agent | null> {\n try {\n const content = await readFile(filePath, 'utf-8');\n const { data, content: systemPrompt } = matter(content);\n\n // Validate front matter\n if (!data.name || typeof data.name !== 'string') {\n console.error(`Agent file ${filePath} missing required 'name' field`);\n return null;\n }\n\n const metadata: AgentMetadata = {\n name: data.name,\n description: data.description || '',\n };\n\n // Get agent ID from parameter or filename\n const id = agentId || parse(filePath).name;\n\n return {\n id,\n metadata,\n systemPrompt: systemPrompt.trim(),\n isBuiltin,\n filePath,\n };\n } catch (error) {\n console.error(`Failed to load agent from ${filePath}:`, error);\n return null;\n }\n}\n\n/**\n * Load all agents from a directory (recursively)\n */\nexport async function loadAgentsFromDirectory(dirPath: string, isBuiltin: boolean = false): Promise<Agent[]> {\n try {\n // Read directory recursively to support subdirectories\n const files = await readdir(dirPath, { recursive: true, withFileTypes: true });\n\n // Filter for .md files and calculate agent IDs from relative paths\n const agentFiles = files\n .filter((f) => f.isFile() && f.name.endsWith('.md'))\n .map((f) => {\n const fullPath = join(f.parentPath || f.path, f.name);\n // Calculate relative path from dirPath and remove .md extension\n const relativePath = relative(dirPath, fullPath).replace(/\\.md$/, '');\n return { fullPath, agentId: relativePath };\n });\n\n const agents = await Promise.all(\n agentFiles.map(({ fullPath, agentId }) => loadAgentFromFile(fullPath, isBuiltin, agentId))\n );\n\n return agents.filter((agent): agent is Agent => agent !== null);\n } catch (error) {\n // Directory doesn't exist or can't be read\n return [];\n }\n}\n\n/**\n * Get system agents path (bundled with the app)\n */\nexport async function getSystemAgentsPath(): Promise<string> {\n // Get the directory of the current module (cross-platform)\n const currentFile = fileURLToPath(import.meta.url);\n const currentDir = dirname(currentFile);\n\n // In production (dist), assets are at dist/assets/agents\n // In development (src), go up to project root: src/core -> project root\n const distPath = join(currentDir, '..', 'assets', 'agents');\n const devPath = join(currentDir, '..', '..', 'assets', 'agents');\n\n // Check which one exists (try dist first, then dev)\n try {\n await access(distPath);\n return distPath;\n } catch {\n return devPath;\n }\n}\n\n/**\n * Get all agent search paths\n */\nexport function getAgentSearchPaths(cwd: string): string[] {\n const globalPath = join(homedir(), '.sylphx-flow', 'agents');\n const projectPath = join(cwd, '.sylphx-flow', 'agents');\n\n return [globalPath, projectPath];\n}\n\n/**\n * Load all available agents from all sources\n */\nexport async function loadAllAgents(cwd: string): Promise<Agent[]> {\n const systemPath = await getSystemAgentsPath();\n const [globalPath, projectPath] = getAgentSearchPaths(cwd);\n\n const [systemAgents, globalAgents, projectAgents] = await Promise.all([\n loadAgentsFromDirectory(systemPath, true), // System agents are marked as builtin\n loadAgentsFromDirectory(globalPath, false),\n loadAgentsFromDirectory(projectPath, false),\n ]);\n\n // Priority: system < global < project\n // Use Map to deduplicate by ID (later entries override earlier ones)\n const agentMap = new Map<string, Agent>();\n\n // Add system agents first (lowest priority)\n for (const agent of systemAgents) {\n agentMap.set(agent.id, agent);\n }\n\n // Add global agents (override system)\n for (const agent of globalAgents) {\n agentMap.set(agent.id, agent);\n }\n\n // Add project agents (override globals and system)\n for (const agent of projectAgents) {\n agentMap.set(agent.id, agent);\n }\n\n return Array.from(agentMap.values());\n}\n",
|
|
6
|
+
"/**\n * Agent Constants\n * Default agent ID for fallback purposes\n */\n\n/**\n * Default agent ID (must match an agent in assets/agents/)\n */\nexport const DEFAULT_AGENT_ID = 'coder';\n",
|
|
7
|
+
"/**\n * Agent Manager\n * Manages agent state and operations\n */\n\nimport type { Agent } from '../types/agent.types.js';\nimport { loadAllAgents } from './agent-loader.js';\nimport { DEFAULT_AGENT_ID } from './builtin-agents.js';\n\n/**\n * Agent manager state\n */\ninterface AgentManagerState {\n agents: Map<string, Agent>;\n cwd: string;\n}\n\nlet state: AgentManagerState | null = null;\n\n/**\n * Get the app store (lazy import to avoid circular dependencies)\n */\nlet getAppStore: (() => any) | null = null;\n\n/**\n * Fallback agent when state is not initialized\n */\nconst FALLBACK_AGENT: Agent = {\n id: DEFAULT_AGENT_ID,\n metadata: {\n name: 'Coder',\n description: 'Fallback agent (agent manager not initialized)',\n },\n systemPrompt: 'You are a helpful coding assistant.',\n isBuiltin: true,\n};\n\n/**\n * Set the app store getter (called during initialization)\n */\nexport function setAppStoreGetter(getter: () => any): void {\n getAppStore = getter;\n}\n\n/**\n * Initialize agent manager\n */\nexport async function initializeAgentManager(cwd: string): Promise<void> {\n const allAgents = await loadAllAgents(cwd);\n\n const agentMap = new Map<string, Agent>();\n for (const agent of allAgents) {\n agentMap.set(agent.id, agent);\n }\n\n state = {\n agents: agentMap,\n cwd,\n };\n\n // Initialize store with default agent if store is available\n if (getAppStore) {\n const store = getAppStore();\n if (store.getState) {\n const currentAgentId = store.getState().currentAgentId || DEFAULT_AGENT_ID;\n // Ensure the current agent exists, fallback to default if not\n if (!agentMap.has(currentAgentId)) {\n store.getState().setCurrentAgentId(DEFAULT_AGENT_ID);\n }\n }\n }\n}\n\n/**\n * Get all available agents\n */\nexport function getAllAgents(): Agent[] {\n if (!state) {\n return [FALLBACK_AGENT];\n }\n return Array.from(state.agents.values());\n}\n\n/**\n * Get agent by ID\n */\nexport function getAgentById(id: string): Agent | null {\n if (!state) {\n return id === DEFAULT_AGENT_ID ? FALLBACK_AGENT : null;\n }\n return state.agents.get(id) || null;\n}\n\n/**\n * Get current agent\n */\nexport function getCurrentAgent(): Agent {\n const currentAgentId = getCurrentAgentId();\n\n if (!state) {\n return FALLBACK_AGENT;\n }\n return state.agents.get(currentAgentId) || FALLBACK_AGENT;\n}\n\n/**\n * Get current agent ID\n */\nexport function getCurrentAgentId(): string {\n // Try to get from store first\n if (getAppStore) {\n const store = getAppStore();\n if (store.getState) {\n return store.getState().currentAgentId || DEFAULT_AGENT_ID;\n }\n }\n // Fallback to default\n return DEFAULT_AGENT_ID;\n}\n\n/**\n * Switch to a different agent\n */\nexport function switchAgent(agentId: string): boolean {\n if (!state) {\n return false;\n }\n\n const agent = state.agents.get(agentId);\n if (!agent) {\n return false;\n }\n\n // Update store if available (this triggers reactive updates)\n if (getAppStore) {\n const store = getAppStore();\n if (store.getState) {\n store.getState().setCurrentAgentId(agentId);\n }\n }\n\n return true;\n}\n\n/**\n * Reload agents from disk\n */\nexport async function reloadAgents(): Promise<void> {\n if (!state) {\n return;\n }\n\n const cwd = state.cwd;\n const currentAgentId = getCurrentAgentId();\n\n await initializeAgentManager(cwd);\n\n // Restore current agent if it still exists, otherwise reset to default\n if (state && !state.agents.has(currentAgentId)) {\n if (getAppStore) {\n const store = getAppStore();\n if (store.getState) {\n store.getState().setCurrentAgentId(DEFAULT_AGENT_ID);\n }\n }\n }\n}\n\n/**\n * Get system prompt for current agent\n */\nexport function getCurrentSystemPrompt(): string {\n return getCurrentAgent().systemPrompt;\n}\n"
|
|
8
|
+
],
|
|
9
|
+
"mappings": "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",
|
|
10
|
+
"debugId": "14D7D6301BF6514364756E2164756E21",
|
|
11
|
+
"names": []
|
|
12
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{Q as C}from"./chunk-q4nh3vst.js";import{Tb as z}from"./chunk-3m9whg4q.js";var Z=z(C(),1);import{readFile as G,readdir as L,access as T}from"node:fs/promises";import{join as X,parse as U,relative as B,dirname as D}from"node:path";import{homedir as v}from"node:os";import{fileURLToPath as M}from"node:url";async function y(k,q=!1,x){try{let H=await G(k,"utf-8"),{data:O,content:K}=Z.default(H);if(!O.name||typeof O.name!=="string")return console.error(`Rule file ${k} missing required 'name' field`),null;let Q={name:O.name,description:O.description||"",enabled:O.enabled!==void 0?Boolean(O.enabled):!0};return{id:x||U(k).name,metadata:Q,content:K.trim(),isBuiltin:q,filePath:k}}catch(H){return console.error(`Failed to load rule from ${k}:`,H),null}}async function Y(k,q=!1){try{let H=(await L(k,{recursive:!0,withFileTypes:!0})).filter((K)=>K.isFile()&&K.name.endsWith(".md")).map((K)=>{let Q=X(K.parentPath||K.path,K.name),W=B(k,Q).replace(/\.md$/,"");return{fullPath:Q,ruleId:W}});return(await Promise.all(H.map(({fullPath:K,ruleId:Q})=>y(K,q,Q)))).filter((K)=>K!==null)}catch(x){return[]}}async function F(){let k=M(import.meta.url),q=D(k),x=X(q,"..","assets","rules"),H=X(q,"..","..","assets","rules");try{return await T(x),x}catch{return H}}function w(k){let q=X(v(),".sylphx-flow","rules"),x=X(k,".sylphx-flow","rules");return[q,x]}async function _(k){let q=await F(),[x,H]=w(k),[O,K,Q]=await Promise.all([Y(q,!0),Y(x,!1),Y(H,!1)]),W=new Map;for(let V of O)W.set(V.id,V);for(let V of K)W.set(V.id,V);for(let V of Q)W.set(V.id,V);return Array.from(W.values())}var J=null,N=null;function g(k){N=k}async function j(k){let q=await _(k),x=new Map;for(let H of q)x.set(H.id,H);if(J={rules:x,cwd:k},N){let H=N();if(H.getState){if((H.getState().enabledRuleIds||[]).length===0){let K=q.filter((Q)=>Q.metadata.enabled!==!1).map((Q)=>Q.id);if(K.length>0)H.getState().setEnabledRuleIds(K)}}}}function f(){if(!J)return[];return Array.from(J.rules.values())}function P(k){if(!J)return null;return J.rules.get(k)||null}function $(){if(N){let k=N();if(k.getState)return k.getState().enabledRuleIds||[]}return[]}function E(){if(!J)return[];return $().map((q)=>J.rules.get(q)).filter((q)=>q!==null)}function c(k){if(!J||!J.rules.has(k))return!1;if(N){let q=N();if(q.getState){let x=q.getState().enabledRuleIds||[];if(x.includes(k))q.getState().setEnabledRuleIds(x.filter((H)=>H!==k));else q.getState().setEnabledRuleIds([...x,k]);return!0}}return!1}function h(k){if(!J||!J.rules.has(k))return!1;if(N){let q=N();if(q.getState){let x=q.getState().enabledRuleIds||[];if(!x.includes(k))q.getState().setEnabledRuleIds([...x,k]);return!0}}return!1}function p(k){if(!J||!J.rules.has(k))return!1;if(N){let q=N();if(q.getState){let x=q.getState().enabledRuleIds||[];return q.getState().setEnabledRuleIds(x.filter((H)=>H!==k)),!0}}return!1}async function n(){if(!J)return;let k=J.cwd,q=$();if(await j(k),J&&N){let x=N();if(x.getState){let H=q.filter((O)=>J.rules.has(O));x.getState().setEnabledRuleIds(H)}}}function i(k){if(!J)return!1;let q=k.filter((x)=>J.rules.has(x));if(N){let x=N();if(x.getState)return x.getState().setEnabledRuleIds(q),!0}return!1}function o(){let k=E();if(k.length===0)return"";return k.map((q)=>q.content).join(`
|
|
2
|
+
|
|
3
|
+
`)}export{c as toggleRule,g as setRuleAppStoreGetter,i as setEnabledRules,n as reloadRules,j as initializeRuleManager,P as getRuleById,o as getEnabledRulesContent,E as getEnabledRules,$ as getEnabledRuleIds,f as getAllRules,h as enableRule,p as disableRule};
|
|
4
|
+
export{g as F,j as G,f as H,c as I,o as J};
|
|
5
|
+
|
|
6
|
+
//# debugId=E8841C8E4E0A1CC464756E2164756E21
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/rule-loader.ts", "../src/core/rule-manager.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Rule Loader\n * Loads rule definitions from markdown files with front matter\n */\n\nimport { readFile, readdir, access } from 'node:fs/promises';\nimport { join, parse, relative, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport { fileURLToPath } from 'node:url';\nimport matter from 'gray-matter';\nimport type { Rule, RuleMetadata } from '../types/rule.types.js';\n\n/**\n * Load a single rule from a markdown file\n */\nexport async function loadRuleFromFile(\n filePath: string,\n isBuiltin: boolean = false,\n ruleId?: string\n): Promise<Rule | null> {\n try {\n const fileContent = await readFile(filePath, 'utf-8');\n const { data, content } = matter(fileContent);\n\n // Validate front matter\n if (!data.name || typeof data.name !== 'string') {\n console.error(`Rule file ${filePath} missing required 'name' field`);\n return null;\n }\n\n const metadata: RuleMetadata = {\n name: data.name,\n description: data.description || '',\n enabled: data.enabled !== undefined ? Boolean(data.enabled) : true,\n };\n\n // Get rule ID from parameter or filename\n const id = ruleId || parse(filePath).name;\n\n return {\n id,\n metadata,\n content: content.trim(),\n isBuiltin,\n filePath,\n };\n } catch (error) {\n console.error(`Failed to load rule from ${filePath}:`, error);\n return null;\n }\n}\n\n/**\n * Load all rules from a directory (recursively)\n */\nexport async function loadRulesFromDirectory(dirPath: string, isBuiltin: boolean = false): Promise<Rule[]> {\n try {\n // Read directory recursively to support subdirectories\n const files = await readdir(dirPath, { recursive: true, withFileTypes: true });\n\n // Filter for .md files and calculate rule IDs from relative paths\n const ruleFiles = files\n .filter((f) => f.isFile() && f.name.endsWith('.md'))\n .map((f) => {\n const fullPath = join(f.parentPath || f.path, f.name);\n // Calculate relative path from dirPath and remove .md extension\n const relativePath = relative(dirPath, fullPath).replace(/\\.md$/, '');\n return { fullPath, ruleId: relativePath };\n });\n\n const rules = await Promise.all(\n ruleFiles.map(({ fullPath, ruleId }) => loadRuleFromFile(fullPath, isBuiltin, ruleId))\n );\n\n return rules.filter((rule): rule is Rule => rule !== null);\n } catch (error) {\n // Directory doesn't exist or can't be read\n return [];\n }\n}\n\n/**\n * Get system rules path (bundled with the app)\n */\nexport async function getSystemRulesPath(): Promise<string> {\n // Get the directory of the current module (cross-platform)\n const currentFile = fileURLToPath(import.meta.url);\n const currentDir = dirname(currentFile);\n\n // In production (dist), assets are at dist/assets/rules\n // In development (src), go up to project root: src/core -> project root\n const distPath = join(currentDir, '..', 'assets', 'rules');\n const devPath = join(currentDir, '..', '..', 'assets', 'rules');\n\n // Check which one exists (try dist first, then dev)\n try {\n await access(distPath);\n return distPath;\n } catch {\n return devPath;\n }\n}\n\n/**\n * Get all rule search paths\n */\nexport function getRuleSearchPaths(cwd: string): string[] {\n const globalPath = join(homedir(), '.sylphx-flow', 'rules');\n const projectPath = join(cwd, '.sylphx-flow', 'rules');\n\n return [globalPath, projectPath];\n}\n\n/**\n * Load all available rules from all sources\n */\nexport async function loadAllRules(cwd: string): Promise<Rule[]> {\n const systemPath = await getSystemRulesPath();\n const [globalPath, projectPath] = getRuleSearchPaths(cwd);\n\n const [systemRules, globalRules, projectRules] = await Promise.all([\n loadRulesFromDirectory(systemPath, true), // System rules are marked as builtin\n loadRulesFromDirectory(globalPath, false),\n loadRulesFromDirectory(projectPath, false),\n ]);\n\n // Priority: system < global < project\n // Use Map to deduplicate by ID (later entries override earlier ones)\n const ruleMap = new Map<string, Rule>();\n\n // Add system rules first (lowest priority)\n for (const rule of systemRules) {\n ruleMap.set(rule.id, rule);\n }\n\n // Add global rules (override system)\n for (const rule of globalRules) {\n ruleMap.set(rule.id, rule);\n }\n\n // Add project rules (override globals and system)\n for (const rule of projectRules) {\n ruleMap.set(rule.id, rule);\n }\n\n return Array.from(ruleMap.values());\n}\n",
|
|
6
|
+
"/**\n * Rule Manager\n * Manages rule state and operations\n */\n\nimport type { Rule } from '../types/rule.types.js';\nimport { loadAllRules } from './rule-loader.js';\n\n/**\n * Rule manager state\n */\ninterface RuleManagerState {\n rules: Map<string, Rule>;\n cwd: string;\n}\n\nlet state: RuleManagerState | null = null;\n\n/**\n * Get the app store (lazy import to avoid circular dependencies)\n */\nlet getAppStore: (() => any) | null = null;\n\n/**\n * Set the app store getter (called during initialization)\n */\nexport function setRuleAppStoreGetter(getter: () => any): void {\n getAppStore = getter;\n}\n\n/**\n * Initialize rule manager\n */\nexport async function initializeRuleManager(cwd: string): Promise<void> {\n const allRules = await loadAllRules(cwd);\n\n const ruleMap = new Map<string, Rule>();\n for (const rule of allRules) {\n ruleMap.set(rule.id, rule);\n }\n\n state = {\n rules: ruleMap,\n cwd,\n };\n\n // Initialize store with default enabled rules\n if (getAppStore) {\n const store = getAppStore();\n if (store.getState) {\n const currentEnabledRules = store.getState().enabledRuleIds || [];\n\n // If no rules are enabled yet, enable all rules that have enabled: true in metadata\n if (currentEnabledRules.length === 0) {\n const defaultEnabledRules = allRules\n .filter((rule) => rule.metadata.enabled !== false)\n .map((rule) => rule.id);\n\n if (defaultEnabledRules.length > 0) {\n store.getState().setEnabledRuleIds(defaultEnabledRules);\n }\n }\n }\n }\n}\n\n/**\n * Get all available rules\n */\nexport function getAllRules(): Rule[] {\n if (!state) {\n return [];\n }\n return Array.from(state.rules.values());\n}\n\n/**\n * Get rule by ID\n */\nexport function getRuleById(id: string): Rule | null {\n if (!state) {\n return null;\n }\n return state.rules.get(id) || null;\n}\n\n/**\n * Get enabled rule IDs from store\n */\nexport function getEnabledRuleIds(): string[] {\n if (getAppStore) {\n const store = getAppStore();\n if (store.getState) {\n return store.getState().enabledRuleIds || [];\n }\n }\n return [];\n}\n\n/**\n * Get enabled rules\n */\nexport function getEnabledRules(): Rule[] {\n if (!state) {\n return [];\n }\n\n const enabledIds = getEnabledRuleIds();\n return enabledIds\n .map((id) => state!.rules.get(id))\n .filter((rule): rule is Rule => rule !== null);\n}\n\n/**\n * Toggle a rule on/off\n */\nexport function toggleRule(ruleId: string): boolean {\n if (!state || !state.rules.has(ruleId)) {\n return false;\n }\n\n if (getAppStore) {\n const store = getAppStore();\n if (store.getState) {\n const currentEnabled = store.getState().enabledRuleIds || [];\n\n if (currentEnabled.includes(ruleId)) {\n // Disable: remove from list\n store.getState().setEnabledRuleIds(currentEnabled.filter((id) => id !== ruleId));\n } else {\n // Enable: add to list\n store.getState().setEnabledRuleIds([...currentEnabled, ruleId]);\n }\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Enable a rule\n */\nexport function enableRule(ruleId: string): boolean {\n if (!state || !state.rules.has(ruleId)) {\n return false;\n }\n\n if (getAppStore) {\n const store = getAppStore();\n if (store.getState) {\n const currentEnabled = store.getState().enabledRuleIds || [];\n\n if (!currentEnabled.includes(ruleId)) {\n store.getState().setEnabledRuleIds([...currentEnabled, ruleId]);\n }\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Disable a rule\n */\nexport function disableRule(ruleId: string): boolean {\n if (!state || !state.rules.has(ruleId)) {\n return false;\n }\n\n if (getAppStore) {\n const store = getAppStore();\n if (store.getState) {\n const currentEnabled = store.getState().enabledRuleIds || [];\n store.getState().setEnabledRuleIds(currentEnabled.filter((id) => id !== ruleId));\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Reload rules from disk\n */\nexport async function reloadRules(): Promise<void> {\n if (!state) {\n return;\n }\n\n const cwd = state.cwd;\n const currentEnabled = getEnabledRuleIds();\n\n await initializeRuleManager(cwd);\n\n // Keep only enabled rules that still exist\n if (state && getAppStore) {\n const store = getAppStore();\n if (store.getState) {\n const validEnabled = currentEnabled.filter((id) => state!.rules.has(id));\n store.getState().setEnabledRuleIds(validEnabled);\n }\n }\n}\n\n/**\n * Set enabled rules (replaces current enabled rules)\n */\nexport function setEnabledRules(ruleIds: string[]): boolean {\n if (!state) {\n return false;\n }\n\n // Validate all rule IDs exist\n const validRuleIds = ruleIds.filter((id) => state!.rules.has(id));\n\n if (getAppStore) {\n const store = getAppStore();\n if (store.getState) {\n store.getState().setEnabledRuleIds(validRuleIds);\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Get combined content of all enabled rules\n */\nexport function getEnabledRulesContent(): string {\n const enabledRules = getEnabledRules();\n\n if (enabledRules.length === 0) {\n return '';\n }\n\n return enabledRules.map((rule) => rule.content).join('\\n\\n');\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "uFASA,SAJA,mBAAS,aAAU,YAAS,yBAC5B,eAAS,WAAM,cAAO,aAAU,kBAChC,kBAAS,gBACT,wBAAS,iBAOT,eAAsB,CAAgB,CACpC,EACA,EAAqB,GACrB,EACsB,CACtB,GAAI,CACF,IAAM,EAAc,MAAM,EAAS,EAAU,OAAO,GAC5C,OAAM,WAAY,UAAO,CAAW,EAG5C,GAAI,CAAC,EAAK,MAAQ,OAAO,EAAK,OAAS,SAErC,OADA,QAAQ,MAAM,aAAa,iCAAwC,EAC5D,KAGT,IAAM,EAAyB,CAC7B,KAAM,EAAK,KACX,YAAa,EAAK,aAAe,GACjC,QAAS,EAAK,UAAY,OAAY,QAAQ,EAAK,OAAO,EAAI,EAChE,EAKA,MAAO,CACL,GAHS,GAAU,EAAM,CAAQ,EAAE,KAInC,WACA,QAAS,EAAQ,KAAK,EACtB,YACA,UACF,EACA,MAAO,EAAO,CAEd,OADA,QAAQ,MAAM,4BAA4B,KAAa,CAAK,EACrD,MAOX,eAAsB,CAAsB,CAAC,EAAiB,EAAqB,GAAwB,CACzG,GAAI,CAKF,IAAM,GAHQ,MAAM,EAAQ,EAAS,CAAE,UAAW,GAAM,cAAe,EAAK,CAAC,GAI1E,OAAO,CAAC,IAAM,EAAE,OAAO,GAAK,EAAE,KAAK,SAAS,KAAK,CAAC,EAClD,IAAI,CAAC,IAAM,CACV,IAAM,EAAW,EAAK,EAAE,YAAc,EAAE,KAAM,EAAE,IAAI,EAE9C,EAAe,EAAS,EAAS,CAAQ,EAAE,QAAQ,QAAS,EAAE,EACpE,MAAO,CAAE,WAAU,OAAQ,CAAa,EACzC,EAMH,OAJc,MAAM,QAAQ,IAC1B,EAAU,IAAI,EAAG,WAAU,YAAa,EAAiB,EAAU,EAAW,CAAM,CAAC,CACvF,GAEa,OAAO,CAAC,IAAuB,IAAS,IAAI,EACzD,MAAO,EAAO,CAEd,MAAO,CAAC,GAOZ,eAAsB,CAAkB,EAAoB,CAE1D,IAAM,EAAc,EAAc,YAAY,GAAG,EAC3C,EAAa,EAAQ,CAAW,EAIhC,EAAW,EAAK,EAAY,KAAM,SAAU,OAAO,EACnD,EAAU,EAAK,EAAY,KAAM,KAAM,SAAU,OAAO,EAG9D,GAAI,CAEF,OADA,MAAM,EAAO,CAAQ,EACd,EACP,KAAM,CACN,OAAO,GAOJ,SAAS,CAAkB,CAAC,EAAuB,CACxD,IAAM,EAAa,EAAK,EAAQ,EAAG,eAAgB,OAAO,EACpD,EAAc,EAAK,EAAK,eAAgB,OAAO,EAErD,MAAO,CAAC,EAAY,CAAW,EAMjC,eAAsB,CAAY,CAAC,EAA8B,CAC/D,IAAM,EAAa,MAAM,EAAmB,GACrC,EAAY,GAAe,EAAmB,CAAG,GAEjD,EAAa,EAAa,GAAgB,MAAM,QAAQ,IAAI,CACjE,EAAuB,EAAY,EAAI,EACvC,EAAuB,EAAY,EAAK,EACxC,EAAuB,EAAa,EAAK,CAC3C,CAAC,EAIK,EAAU,IAAI,IAGpB,QAAW,KAAQ,EACjB,EAAQ,IAAI,EAAK,GAAI,CAAI,EAI3B,QAAW,KAAQ,EACjB,EAAQ,IAAI,EAAK,GAAI,CAAI,EAI3B,QAAW,KAAQ,EACjB,EAAQ,IAAI,EAAK,GAAI,CAAI,EAG3B,OAAO,MAAM,KAAK,EAAQ,OAAO,CAAC,ECjIpC,IAAI,EAAiC,KAKjC,EAAkC,KAK/B,SAAS,CAAqB,CAAC,EAAyB,CAC7D,EAAc,EAMhB,eAAsB,CAAqB,CAAC,EAA4B,CACtE,IAAM,EAAW,MAAM,EAAa,CAAG,EAEjC,EAAU,IAAI,IACpB,QAAW,KAAQ,EACjB,EAAQ,IAAI,EAAK,GAAI,CAAI,EAS3B,GANA,EAAQ,CACN,MAAO,EACP,KACF,EAGI,EAAa,CACf,IAAM,EAAQ,EAAY,EAC1B,GAAI,EAAM,UAIR,IAH4B,EAAM,SAAS,EAAE,gBAAkB,CAAC,GAGxC,SAAW,EAAG,CACpC,IAAM,EAAsB,EACzB,OAAO,CAAC,IAAS,EAAK,SAAS,UAAY,EAAK,EAChD,IAAI,CAAC,IAAS,EAAK,EAAE,EAExB,GAAI,EAAoB,OAAS,EAC/B,EAAM,SAAS,EAAE,kBAAkB,CAAmB,KAUzD,SAAS,CAAW,EAAW,CACpC,GAAI,CAAC,EACH,MAAO,CAAC,EAEV,OAAO,MAAM,KAAK,EAAM,MAAM,OAAO,CAAC,EAMjC,SAAS,CAAW,CAAC,EAAyB,CACnD,GAAI,CAAC,EACH,OAAO,KAET,OAAO,EAAM,MAAM,IAAI,CAAE,GAAK,KAMzB,SAAS,CAAiB,EAAa,CAC5C,GAAI,EAAa,CACf,IAAM,EAAQ,EAAY,EAC1B,GAAI,EAAM,SACR,OAAO,EAAM,SAAS,EAAE,gBAAkB,CAAC,EAG/C,MAAO,CAAC,EAMH,SAAS,CAAe,EAAW,CACxC,GAAI,CAAC,EACH,MAAO,CAAC,EAIV,OADmB,EAAkB,EAElC,IAAI,CAAC,IAAO,EAAO,MAAM,IAAI,CAAE,CAAC,EAChC,OAAO,CAAC,IAAuB,IAAS,IAAI,EAM1C,SAAS,CAAU,CAAC,EAAyB,CAClD,GAAI,CAAC,GAAS,CAAC,EAAM,MAAM,IAAI,CAAM,EACnC,MAAO,GAGT,GAAI,EAAa,CACf,IAAM,EAAQ,EAAY,EAC1B,GAAI,EAAM,SAAU,CAClB,IAAM,EAAiB,EAAM,SAAS,EAAE,gBAAkB,CAAC,EAE3D,GAAI,EAAe,SAAS,CAAM,EAEhC,EAAM,SAAS,EAAE,kBAAkB,EAAe,OAAO,CAAC,IAAO,IAAO,CAAM,CAAC,EAG/E,OAAM,SAAS,EAAE,kBAAkB,CAAC,GAAG,EAAgB,CAAM,CAAC,EAEhE,MAAO,IAIX,MAAO,GAMF,SAAS,CAAU,CAAC,EAAyB,CAClD,GAAI,CAAC,GAAS,CAAC,EAAM,MAAM,IAAI,CAAM,EACnC,MAAO,GAGT,GAAI,EAAa,CACf,IAAM,EAAQ,EAAY,EAC1B,GAAI,EAAM,SAAU,CAClB,IAAM,EAAiB,EAAM,SAAS,EAAE,gBAAkB,CAAC,EAE3D,GAAI,CAAC,EAAe,SAAS,CAAM,EACjC,EAAM,SAAS,EAAE,kBAAkB,CAAC,GAAG,EAAgB,CAAM,CAAC,EAEhE,MAAO,IAIX,MAAO,GAMF,SAAS,CAAW,CAAC,EAAyB,CACnD,GAAI,CAAC,GAAS,CAAC,EAAM,MAAM,IAAI,CAAM,EACnC,MAAO,GAGT,GAAI,EAAa,CACf,IAAM,EAAQ,EAAY,EAC1B,GAAI,EAAM,SAAU,CAClB,IAAM,EAAiB,EAAM,SAAS,EAAE,gBAAkB,CAAC,EAE3D,OADA,EAAM,SAAS,EAAE,kBAAkB,EAAe,OAAO,CAAC,IAAO,IAAO,CAAM,CAAC,EACxE,IAIX,MAAO,GAMT,eAAsB,CAAW,EAAkB,CACjD,GAAI,CAAC,EACH,OAGF,IAAM,EAAM,EAAM,IACZ,EAAiB,EAAkB,EAKzC,GAHA,MAAM,EAAsB,CAAG,EAG3B,GAAS,EAAa,CACxB,IAAM,EAAQ,EAAY,EAC1B,GAAI,EAAM,SAAU,CAClB,IAAM,EAAe,EAAe,OAAO,CAAC,IAAO,EAAO,MAAM,IAAI,CAAE,CAAC,EACvE,EAAM,SAAS,EAAE,kBAAkB,CAAY,IAQ9C,SAAS,CAAe,CAAC,EAA4B,CAC1D,GAAI,CAAC,EACH,MAAO,GAIT,IAAM,EAAe,EAAQ,OAAO,CAAC,IAAO,EAAO,MAAM,IAAI,CAAE,CAAC,EAEhE,GAAI,EAAa,CACf,IAAM,EAAQ,EAAY,EAC1B,GAAI,EAAM,SAER,OADA,EAAM,SAAS,EAAE,kBAAkB,CAAY,EACxC,GAIX,MAAO,GAMF,SAAS,CAAsB,EAAW,CAC/C,IAAM,EAAe,EAAgB,EAErC,GAAI,EAAa,SAAW,EAC1B,MAAO,GAGT,OAAO,EAAa,IAAI,CAAC,IAAS,EAAK,OAAO,EAAE,KAAK;AAAA;AAAA,CAAM",
|
|
9
|
+
"debugId": "E8841C8E4E0A1CC464756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as Z}from"./chunk-
|
|
1
|
+
import{r as Z}from"./chunk-3qxj0zy3.js";import"./chunk-1e8xf3f6.js";import"./chunk-qpej66sh.js";import"./chunk-n8vzewr3.js";import"./chunk-q4nh3vst.js";import"./chunk-mw13a082.js";import"./chunk-3w6pd43t.js";import"./chunk-s9bsh0gp.js";import"./chunk-jk1ebfqn.js";import"./chunk-01gv4qey.js";import"./chunk-g4baca7p.js";import"./chunk-cv1nhr27.js";import"./chunk-jbd95k1f.js";import"./chunk-4vrj3f8r.js";import{Tb as A,Wb as E}from"./chunk-3m9whg4q.js";function $(z,H=50){if(!z||z.trim().length===0)return"New Chat";let D=X(z);return Y(D,H)}function X(z){return z.trim().replace(/\n+/g," ")}function Y(z,H=50){if(z.length<=H)return z;let D=z.substring(0,H),B=D.lastIndexOf(" "),J=Math.floor(H*0.6);if(B>J)return D.substring(0,B)+"...";return D+"..."}function q(z,H){let D=z||"New Chat",B=new Date(H),J=new Date;if(B.toDateString()===J.toDateString()){let U=B.toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"});return`${D} (${U})`}let O=B.toLocaleDateString("en-US",{month:"short",day:"numeric"});return`${D} (${O})`}function w(z){let D=Date.now()-z,B=Math.floor(D/1000),J=Math.floor(B/60),K=Math.floor(J/60),O=Math.floor(K/24);if(B<30)return"just now";else if(B<60)return`${B}s ago`;else if(J<60)return`${J}m ago`;else if(K<24)return`${K}h ago`;else if(O<7)return`${O} ${O===1?"day":"days"} ago`;else{let U=new Date(z);return U.toLocaleDateString("en-US",{month:"short",day:"numeric",year:U.getFullYear()!==new Date().getFullYear()?"numeric":void 0})}}async function Q(z,H,D,B,J){if(!z||z.trim().length===0)return"New Chat";try{let{getProvider:K}=await import("./chunk-xs370t8p.js"),U=K(H).createClient(B,D),_=Z({model:U,messages:[{role:"user",content:`You need to generate a SHORT, DESCRIPTIVE title (maximum 50 characters) for a chat conversation.
|
|
2
2
|
|
|
3
3
|
User's first message: "${z}"
|
|
4
4
|
|