@sylphx/flow 0.2.13 → 1.0.1
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/CHANGELOG.md +318 -0
- package/LOOP_MODE.md +446 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +59398 -698
- package/dist/lancedb.linux-x64-gnu-b7f0jgsz.node +0 -0
- package/dist/lancedb.linux-x64-musl-tgcv22rx.node +0 -0
- package/dist/shared/chunk-25dwp0dp.js +89 -0
- package/dist/shared/chunk-3pjb6063.js +208 -0
- package/dist/shared/chunk-4d6ydpw7.js +2854 -0
- package/dist/shared/chunk-4wjcadjk.js +225 -0
- package/dist/shared/chunk-5j4w74t6.js +30 -0
- package/dist/shared/chunk-5j8m3dh3.js +58 -0
- package/dist/shared/chunk-5thh3qem.js +91 -0
- package/dist/shared/chunk-6g9xy73m.js +252 -0
- package/dist/shared/chunk-7eq34c42.js +23 -0
- package/dist/shared/chunk-c2gwgx3r.js +115 -0
- package/dist/shared/chunk-cjd3mk4c.js +1320 -0
- package/dist/shared/chunk-g5cv6703.js +368 -0
- package/dist/shared/chunk-hpkhykhq.js +574 -0
- package/dist/shared/chunk-m2322pdk.js +122 -0
- package/dist/shared/chunk-nd5fdvaq.js +26 -0
- package/dist/shared/chunk-pgd3m6zf.js +108 -0
- package/dist/shared/chunk-qk8n91hw.js +494 -0
- package/dist/shared/chunk-rkkn8szp.js +16855 -0
- package/dist/shared/chunk-t16rfxh0.js +61 -0
- package/dist/shared/chunk-t4fbfa5v.js +19 -0
- package/dist/shared/chunk-t77h86w6.js +276 -0
- package/dist/shared/chunk-v0ez4aef.js +71 -0
- package/dist/shared/chunk-v29j2r3s.js +32051 -0
- package/dist/shared/chunk-vfbc6ew5.js +765 -0
- package/dist/shared/chunk-vmeqwm1c.js +204 -0
- package/dist/shared/chunk-x66eh37x.js +137 -0
- package/package.json +45 -93
- package/README.md +0 -625
- package/assets/agents/coder.md +0 -32
- package/assets/agents/orchestrator.md +0 -36
- package/assets/agents/reviewer.md +0 -30
- package/assets/agents/writer.md +0 -30
- package/assets/knowledge/data/sql.md +0 -216
- package/assets/knowledge/guides/saas-template.md +0 -85
- package/assets/knowledge/guides/system-prompt.md +0 -344
- package/assets/knowledge/guides/tech-stack.md +0 -92
- package/assets/knowledge/guides/ui-ux.md +0 -44
- package/assets/knowledge/stacks/nextjs-app.md +0 -165
- package/assets/knowledge/stacks/node-api.md +0 -220
- package/assets/knowledge/stacks/react-app.md +0 -232
- package/assets/knowledge/universal/deployment.md +0 -109
- package/assets/knowledge/universal/performance.md +0 -121
- package/assets/knowledge/universal/security.md +0 -79
- package/assets/knowledge/universal/testing.md +0 -111
- package/assets/output-styles/silent.md +0 -23
- package/assets/rules/core.md +0 -197
- package/assets/slash-commands/commit.md +0 -23
- package/assets/slash-commands/context.md +0 -112
- package/assets/slash-commands/explain.md +0 -35
- package/assets/slash-commands/mep.md +0 -63
- package/assets/slash-commands/review.md +0 -39
- package/assets/slash-commands/test.md +0 -30
- package/dist/assets/agents/coder.md +0 -32
- package/dist/assets/agents/orchestrator.md +0 -36
- package/dist/assets/agents/reviewer.md +0 -30
- package/dist/assets/agents/writer.md +0 -30
- package/dist/assets/knowledge/data/sql.md +0 -216
- package/dist/assets/knowledge/guides/saas-template.md +0 -85
- package/dist/assets/knowledge/guides/system-prompt.md +0 -344
- package/dist/assets/knowledge/guides/tech-stack.md +0 -92
- package/dist/assets/knowledge/guides/ui-ux.md +0 -44
- package/dist/assets/knowledge/stacks/nextjs-app.md +0 -165
- package/dist/assets/knowledge/stacks/node-api.md +0 -220
- package/dist/assets/knowledge/stacks/react-app.md +0 -232
- package/dist/assets/knowledge/universal/deployment.md +0 -109
- package/dist/assets/knowledge/universal/performance.md +0 -121
- package/dist/assets/knowledge/universal/security.md +0 -79
- package/dist/assets/knowledge/universal/testing.md +0 -111
- package/dist/assets/output-styles/silent.md +0 -23
- package/dist/assets/rules/core.md +0 -197
- package/dist/assets/slash-commands/commit.md +0 -23
- package/dist/assets/slash-commands/context.md +0 -112
- package/dist/assets/slash-commands/explain.md +0 -35
- package/dist/assets/slash-commands/mep.md +0 -63
- package/dist/assets/slash-commands/review.md +0 -39
- package/dist/assets/slash-commands/test.md +0 -30
- package/dist/chunk-01gv4qey.js +0 -4
- package/dist/chunk-01gv4qey.js.map +0 -11
- package/dist/chunk-1e8xf3f6.js +0 -27
- package/dist/chunk-1e8xf3f6.js.map +0 -23
- package/dist/chunk-3m9whg4q.js +0 -4
- package/dist/chunk-3m9whg4q.js.map +0 -9
- package/dist/chunk-3qxj0zy3.js +0 -23
- package/dist/chunk-3qxj0zy3.js.map +0 -11
- package/dist/chunk-3w6pd43t.js +0 -25
- package/dist/chunk-3w6pd43t.js.map +0 -61
- package/dist/chunk-4e5g3df9.js +0 -105
- package/dist/chunk-4e5g3df9.js.map +0 -27
- package/dist/chunk-4nm4ere4.js +0 -4
- package/dist/chunk-4nm4ere4.js.map +0 -11
- package/dist/chunk-4vrj3f8r.js +0 -26
- package/dist/chunk-4vrj3f8r.js.map +0 -75
- package/dist/chunk-5njgv5k5.js +0 -161
- package/dist/chunk-5njgv5k5.js.map +0 -83
- package/dist/chunk-67n29s4q.js +0 -7
- package/dist/chunk-67n29s4q.js.map +0 -10
- package/dist/chunk-7yyg008s.js +0 -27
- package/dist/chunk-7yyg008s.js.map +0 -14
- package/dist/chunk-86ce45n6.js +0 -3
- package/dist/chunk-86ce45n6.js.map +0 -10
- package/dist/chunk-99pz5wm0.js +0 -75
- package/dist/chunk-99pz5wm0.js.map +0 -12
- package/dist/chunk-cv1nhr27.js +0 -2
- package/dist/chunk-cv1nhr27.js.map +0 -9
- package/dist/chunk-g4baca7p.js +0 -10
- package/dist/chunk-g4baca7p.js.map +0 -23
- package/dist/chunk-gc66xe7z.js +0 -4
- package/dist/chunk-gc66xe7z.js.map +0 -11
- package/dist/chunk-hj6qtsqp.js +0 -15
- package/dist/chunk-hj6qtsqp.js.map +0 -10
- package/dist/chunk-jbd95k1f.js +0 -14
- package/dist/chunk-jbd95k1f.js.map +0 -20
- package/dist/chunk-jk1ebfqn.js +0 -23
- package/dist/chunk-jk1ebfqn.js.map +0 -132
- package/dist/chunk-kn908zkk.js +0 -4
- package/dist/chunk-kn908zkk.js.map +0 -10
- package/dist/chunk-mw13a082.js +0 -4
- package/dist/chunk-mw13a082.js.map +0 -10
- package/dist/chunk-n8vzewr3.js +0 -4
- package/dist/chunk-n8vzewr3.js.map +0 -12
- package/dist/chunk-nke51f3c.js +0 -4
- package/dist/chunk-nke51f3c.js.map +0 -10
- package/dist/chunk-ns5atzyz.js +0 -3
- package/dist/chunk-ns5atzyz.js.map +0 -10
- package/dist/chunk-q4nh3vst.js +0 -54
- package/dist/chunk-q4nh3vst.js.map +0 -53
- package/dist/chunk-q5gqgs0p.js +0 -4
- package/dist/chunk-q5gqgs0p.js.map +0 -10
- package/dist/chunk-qpej66sh.js +0 -6
- package/dist/chunk-qpej66sh.js.map +0 -11
- package/dist/chunk-s9bsh0gp.js +0 -4
- package/dist/chunk-s9bsh0gp.js.map +0 -10
- package/dist/chunk-waemzsf4.js +0 -4
- package/dist/chunk-waemzsf4.js.map +0 -10
- package/dist/chunk-wnhhwtsy.js +0 -19
- package/dist/chunk-wnhhwtsy.js.map +0 -11
- package/dist/chunk-xs370t8p.js +0 -119
- package/dist/chunk-xs370t8p.js.map +0 -26
- package/dist/chunk-xtrn4wn0.js +0 -3
- package/dist/chunk-xtrn4wn0.js.map +0 -10
- package/dist/index.js.map +0 -920
- package/drizzle/0000_wooden_lady_bullseye.sql +0 -52
- package/drizzle/0001_material_pyro.sql +0 -85
- package/drizzle/0002_lyrical_random.sql +0 -2
- package/drizzle/0003_romantic_lockjaw.sql +0 -4
- package/drizzle/0004_blushing_meteorite.sql +0 -6
- package/drizzle/meta/0000_snapshot.json +0 -310
- package/drizzle/meta/0001_snapshot.json +0 -906
- package/drizzle/meta/0002_snapshot.json +0 -920
- package/drizzle/meta/0003_snapshot.json +0 -920
- package/drizzle/meta/0004_snapshot.json +0 -921
- package/drizzle/meta/_journal.json +0 -41
package/dist/chunk-qpej66sh.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
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
|
|
@@ -1,11 +0,0 @@
|
|
|
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": "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",
|
|
9
|
-
"debugId": "E8841C8E4E0A1CC464756E2164756E21",
|
|
10
|
-
"names": []
|
|
11
|
-
}
|
package/dist/chunk-s9bsh0gp.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{Ub as I}from"./chunk-3m9whg4q.js";var X=I((Y,H)=>{var{defineProperty:z,getOwnPropertyDescriptor:K,getOwnPropertyNames:L}=Object,Q=Object.prototype.hasOwnProperty,R=(j,b)=>{for(var v in b)z(j,v,{get:b[v],enumerable:!0})},U=(j,b,v,B)=>{if(b&&typeof b==="object"||typeof b==="function"){for(let q of L(b))if(!Q.call(j,q)&&q!==v)z(j,q,{get:()=>b[q],enumerable:!(B=K(b,q))||B.enumerable})}return j},W=(j)=>U(z({},"__esModule",{value:!0}),j),F={};R(F,{VercelOidcTokenError:()=>G});H.exports=W(F);class G extends Error{constructor(j,b){super(j);this.name="VercelOidcTokenError",this.cause=b}toString(){if(this.cause)return`${this.name}: ${this.message}: ${this.cause}`;return`${this.name}: ${this.message}`}}});
|
|
2
|
-
export{X as U};
|
|
3
|
-
|
|
4
|
-
//# debugId=B7BCE56989FD943264756E2164756E21
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../node_modules/@vercel/oidc/dist/token-error.js"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\nvar token_error_exports = {};\n__export(token_error_exports, {\n VercelOidcTokenError: () => VercelOidcTokenError\n});\nmodule.exports = __toCommonJS(token_error_exports);\nclass VercelOidcTokenError extends Error {\n constructor(message, cause) {\n super(message);\n this.name = \"VercelOidcTokenError\";\n this.cause = cause;\n }\n toString() {\n if (this.cause) {\n return `${this.name}: ${this.message}: ${this.cause}`;\n }\n return `${this.name}: ${this.message}`;\n }\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n VercelOidcTokenError\n});\n"
|
|
6
|
-
],
|
|
7
|
-
"mappings": "yDACA,IAAuB,eAAnB,EAC0B,yBAA1B,EAC2B,oBAA3B,GADmB,OAEnB,EAAe,OAAO,UAAU,eAChC,EAAW,CAAC,EAAQ,IAAQ,CAC9B,QAAS,KAAQ,EACf,EAAU,EAAQ,EAAM,CAAE,IAAK,EAAI,GAAO,WAAY,EAAK,CAAC,GAE5D,EAAc,CAAC,EAAI,EAAM,EAAQ,IAAS,CAC5C,GAAI,GAAQ,OAAO,IAAS,UAAY,OAAO,IAAS,YACtD,QAAS,KAAO,EAAkB,CAAI,EACpC,GAAI,CAAC,EAAa,KAAK,EAAI,CAAG,GAAK,IAAQ,EACzC,EAAU,EAAI,EAAK,CAAE,IAAK,IAAM,EAAK,GAAM,WAAY,EAAE,EAAO,EAAiB,EAAM,CAAG,IAAM,EAAK,UAAW,CAAC,EAEvH,OAAO,GAEL,EAAe,CAAC,IAAQ,EAAY,EAAU,CAAC,EAAG,aAAc,CAAE,MAAO,EAAK,CAAC,EAAG,CAAG,EACrF,EAAsB,CAAC,EAC3B,EAAS,EAAqB,CAC5B,qBAAsB,IAAM,CAC9B,CAAC,EACD,EAAO,QAAU,EAAa,CAAmB,EACjD,MAAM,UAA6B,KAAM,CACvC,WAAW,CAAC,EAAS,EAAO,CAC1B,MAAM,CAAO,EACb,KAAK,KAAO,uBACZ,KAAK,MAAQ,EAEf,QAAQ,EAAG,CACT,GAAI,KAAK,MACP,MAAO,GAAG,KAAK,SAAS,KAAK,YAAY,KAAK,QAEhD,MAAO,GAAG,KAAK,SAAS,KAAK,UAEjC",
|
|
8
|
-
"debugId": "B7BCE56989FD943264756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|
package/dist/chunk-waemzsf4.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
var z=(j,b)=>({kind:"ConfigError",message:j,configKey:b?.configKey,configPath:b?.configPath,context:b?.context,cause:b?.cause}),B=(j,b,x,v)=>({kind:"FileSystemError",message:j,path:b,operation:x,context:v?.context,cause:v?.cause});
|
|
2
|
-
export{z as a,B as b};
|
|
3
|
-
|
|
4
|
-
//# debugId=7529AED28F6F19CD64756E2164756E21
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/core/functional/error-types.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * Standard error types for the application\n * Typed errors enable better error handling and recovery\n *\n * DESIGN RATIONALE:\n * - Discriminated union for all error types\n * - Each error type has specific context\n * - Enables type-safe error handling\n * - Clear error categories for recovery strategies\n */\n\n/**\n * Base error type with common fields\n */\nexport interface BaseError {\n readonly kind: string;\n readonly message: string;\n readonly context?: Record<string, unknown>;\n readonly cause?: Error;\n}\n\n/**\n * Configuration error - invalid configuration or missing required config\n */\nexport interface ConfigError extends BaseError {\n readonly kind: 'ConfigError';\n readonly configKey?: string;\n readonly configPath?: string;\n}\n\n/**\n * File system error - file not found, permission denied, etc.\n */\nexport interface FileSystemError extends BaseError {\n readonly kind: 'FileSystemError';\n readonly path: string;\n readonly operation: 'read' | 'write' | 'delete' | 'create' | 'stat';\n}\n\n/**\n * Database error - query failure, connection error, etc.\n */\nexport interface DatabaseError extends BaseError {\n readonly kind: 'DatabaseError';\n readonly operation: string;\n readonly table?: string;\n}\n\n/**\n * Validation error - input validation failure\n */\nexport interface ValidationError extends BaseError {\n readonly kind: 'ValidationError';\n readonly field?: string;\n readonly errors: string[];\n}\n\n/**\n * Network error - HTTP error, timeout, connection refused, etc.\n */\nexport interface NetworkError extends BaseError {\n readonly kind: 'NetworkError';\n readonly url?: string;\n readonly statusCode?: number;\n}\n\n/**\n * CLI error - command line interface specific errors\n */\nexport interface CLIError extends BaseError {\n readonly kind: 'CLIError';\n readonly command?: string;\n readonly exitCode?: number;\n}\n\n/**\n * Not found error - resource not found\n */\nexport interface NotFoundError extends BaseError {\n readonly kind: 'NotFoundError';\n readonly resourceType: string;\n readonly resourceId: string;\n}\n\n/**\n * Permission error - insufficient permissions\n */\nexport interface PermissionError extends BaseError {\n readonly kind: 'PermissionError';\n readonly resource: string;\n readonly requiredPermission: string;\n}\n\n/**\n * Unknown error - catch-all for unexpected errors\n */\nexport interface UnknownError extends BaseError {\n readonly kind: 'UnknownError';\n}\n\n/**\n * Union of all error types\n */\nexport type AppError =\n | ConfigError\n | FileSystemError\n | DatabaseError\n | ValidationError\n | NetworkError\n | CLIError\n | NotFoundError\n | PermissionError\n | UnknownError;\n\n/**\n * Error constructors\n */\n\nexport const configError = (\n message: string,\n options?: {\n configKey?: string;\n configPath?: string;\n context?: Record<string, unknown>;\n cause?: Error;\n }\n): ConfigError => ({\n kind: 'ConfigError',\n message,\n configKey: options?.configKey,\n configPath: options?.configPath,\n context: options?.context,\n cause: options?.cause,\n});\n\nexport const fileSystemError = (\n message: string,\n path: string,\n operation: 'read' | 'write' | 'delete' | 'create' | 'stat',\n options?: { context?: Record<string, unknown>; cause?: Error }\n): FileSystemError => ({\n kind: 'FileSystemError',\n message,\n path,\n operation,\n context: options?.context,\n cause: options?.cause,\n});\n\nexport const databaseError = (\n message: string,\n operation: string,\n options?: { table?: string; context?: Record<string, unknown>; cause?: Error }\n): DatabaseError => ({\n kind: 'DatabaseError',\n message,\n operation,\n table: options?.table,\n context: options?.context,\n cause: options?.cause,\n});\n\nexport const validationError = (\n message: string,\n errors: string[],\n options?: { field?: string; context?: Record<string, unknown> }\n): ValidationError => ({\n kind: 'ValidationError',\n message,\n field: options?.field,\n errors,\n context: options?.context,\n});\n\nexport const networkError = (\n message: string,\n options?: { url?: string; statusCode?: number; context?: Record<string, unknown>; cause?: Error }\n): NetworkError => ({\n kind: 'NetworkError',\n message,\n url: options?.url,\n statusCode: options?.statusCode,\n context: options?.context,\n cause: options?.cause,\n});\n\nexport const cliError = (\n message: string,\n options?: {\n command?: string;\n exitCode?: number;\n context?: Record<string, unknown>;\n cause?: Error;\n }\n): CLIError => ({\n kind: 'CLIError',\n message,\n command: options?.command,\n exitCode: options?.exitCode,\n context: options?.context,\n cause: options?.cause,\n});\n\nexport const notFoundError = (\n message: string,\n resourceType: string,\n resourceId: string,\n options?: { context?: Record<string, unknown>; cause?: Error }\n): NotFoundError => ({\n kind: 'NotFoundError',\n message,\n resourceType,\n resourceId,\n context: options?.context,\n cause: options?.cause,\n});\n\nexport const permissionError = (\n message: string,\n resource: string,\n requiredPermission: string,\n options?: { context?: Record<string, unknown>; cause?: Error }\n): PermissionError => ({\n kind: 'PermissionError',\n message,\n resource,\n requiredPermission,\n context: options?.context,\n cause: options?.cause,\n});\n\nexport const unknownError = (\n message: string,\n options?: { context?: Record<string, unknown>; cause?: Error }\n): UnknownError => ({\n kind: 'UnknownError',\n message,\n context: options?.context,\n cause: options?.cause,\n});\n\n/**\n * Convert unknown error to AppError\n */\nexport const toAppError = (error: unknown): AppError => {\n if (isAppError(error)) {\n return error;\n }\n\n if (error instanceof Error) {\n return unknownError(error.message, { cause: error });\n }\n\n return unknownError(String(error));\n};\n\n/**\n * Type guard for AppError\n */\nexport const isAppError = (error: unknown): error is AppError => {\n return typeof error === 'object' && error !== null && 'kind' in error && 'message' in error;\n};\n\n/**\n * Format error for display\n */\nexport const formatError = (error: AppError): string => {\n let formatted = `[${error.kind}] ${error.message}`;\n\n if (error.kind === 'ConfigError' && error.configKey) {\n formatted += `\\n Config key: ${error.configKey}`;\n }\n\n if (error.kind === 'FileSystemError') {\n formatted += `\\n Path: ${error.path}`;\n formatted += `\\n Operation: ${error.operation}`;\n }\n\n if (error.kind === 'DatabaseError') {\n formatted += `\\n Operation: ${error.operation}`;\n if (error.table) {\n formatted += `\\n Table: ${error.table}`;\n }\n }\n\n if (error.kind === 'ValidationError') {\n formatted += `\\n Errors:`;\n for (const err of error.errors) {\n formatted += `\\n - ${err}`;\n }\n }\n\n if (error.kind === 'NetworkError') {\n if (error.url) {\n formatted += `\\n URL: ${error.url}`;\n }\n if (error.statusCode) {\n formatted += `\\n Status: ${error.statusCode}`;\n }\n }\n\n if (error.context) {\n formatted += `\\n Context: ${JSON.stringify(error.context, null, 2)}`;\n }\n\n if (error.cause) {\n formatted += `\\n Caused by: ${error.cause.message}`;\n }\n\n return formatted;\n};\n"
|
|
6
|
-
],
|
|
7
|
-
"mappings": "AAsHO,IAAM,EAAc,CACzB,EACA,KAMiB,CACjB,KAAM,cACN,UACA,UAAW,GAAS,UACpB,WAAY,GAAS,WACrB,QAAS,GAAS,QAClB,MAAO,GAAS,KAClB,GAEa,EAAkB,CAC7B,EACA,EACA,EACA,KACqB,CACrB,KAAM,kBACN,UACA,OACA,YACA,QAAS,GAAS,QAClB,MAAO,GAAS,KAClB",
|
|
8
|
-
"debugId": "7529AED28F6F19CD64756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|
package/dist/chunk-wnhhwtsy.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
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
|
-
|
|
3
|
-
User's first message: "${z}"
|
|
4
|
-
|
|
5
|
-
Requirements:
|
|
6
|
-
- Summarize the TOPIC or INTENT, don't just copy the message
|
|
7
|
-
- Be concise and descriptive
|
|
8
|
-
- Maximum 50 characters
|
|
9
|
-
- Output ONLY the title, nothing else
|
|
10
|
-
|
|
11
|
-
Examples:
|
|
12
|
-
- Message: "How do I implement authentication?" → Title: "Authentication Implementation"
|
|
13
|
-
- Message: "你好,请帮我修复这个 bug" → Title: "Bug 修复请求"
|
|
14
|
-
- Message: "Can you help me with React hooks?" → Title: "React Hooks Help"
|
|
15
|
-
|
|
16
|
-
Now generate the title:`}]}),W="";for await(let V of _)if(V.type==="text-delta"&&V.textDelta)W+=V.textDelta,J(V.textDelta);let F=W.trim();return F=F.replace(/^["'「『]+|["'」』]+$/g,""),F=F.replace(/^(Title:|标题:)\s*/i,""),F=F.replace(/\n+/g," "),F=F.trim(),F.length>50?F.substring(0,50)+"...":F}catch(K){return generateSessionTitle(z)}}export{Y as truncateTitle,Q as generateSessionTitleWithStreaming,$ as generateSessionTitle,q as formatSessionDisplay,w as formatRelativeTime,X as cleanTitle};
|
|
17
|
-
export{$ as l,Q as m};
|
|
18
|
-
|
|
19
|
-
//# debugId=C1E6EF4D915BD17A64756E2164756E21
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/features/session/utils/title.ts", "../src/utils/session-title.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * Session Title Utils\n * Pure functions for session title generation and formatting\n */\n\n/**\n * Generate a session title from the first user message\n * Takes the first 50 characters and adds ellipsis if truncated\n * Pure function - no side effects\n */\nexport function generateSessionTitle(firstMessage: string, maxLength = 50): string {\n if (!firstMessage || firstMessage.trim().length === 0) {\n return 'New Chat';\n }\n\n // Remove leading/trailing whitespace and normalize newlines\n const cleaned = cleanTitle(firstMessage);\n\n // Truncate to maxLength\n return truncateTitle(cleaned, maxLength);\n}\n\n/**\n * Clean title text\n * Removes leading/trailing whitespace and normalizes newlines to spaces\n */\nexport function cleanTitle(title: string): string {\n return title.trim().replace(/\\n+/g, ' ');\n}\n\n/**\n * Truncate title to max length\n * Tries to break at word boundaries when possible\n */\nexport function truncateTitle(title: string, maxLength = 50): string {\n if (title.length <= maxLength) {\n return title;\n }\n\n // Find last space before maxLength to avoid cutting words\n const truncated = title.substring(0, maxLength);\n const lastSpace = truncated.lastIndexOf(' ');\n\n // If there's a space in reasonable range (> 60% of maxLength), cut there\n const minReasonableLength = Math.floor(maxLength * 0.6);\n\n if (lastSpace > minReasonableLength) {\n return truncated.substring(0, lastSpace) + '...';\n }\n\n // Otherwise just truncate and add ellipsis\n return truncated + '...';\n}\n\n/**\n * Remove common title prefixes and quotes\n * Used to clean AI-generated titles\n */\nexport function removeQuotes(title: string): string {\n // Remove matching leading/trailing quotes (English, Chinese, Japanese)\n // Only remove if quotes appear at BOTH start and end\n let result = title;\n\n // Try to remove matching pairs of quotes\n const quotesPairs = [\n ['\"', '\"'],\n [\"'\", \"'\"],\n ['「', '」'],\n ['『', '』'],\n ];\n\n for (const [open, close] of quotesPairs) {\n // Keep removing matching pairs as long as they exist\n while (result.startsWith(open) && result.endsWith(close) && result.length > 1) {\n result = result.slice(open.length, -close.length);\n }\n }\n\n return result;\n}\n\n/**\n * Remove common \"Title:\" prefixes\n */\nexport function removeTitlePrefix(title: string): string {\n return title.replace(/^(Title:|标题:)\\s*/i, '');\n}\n\n/**\n * Clean AI-generated title\n * Removes quotes, prefixes, extra whitespace\n */\nexport function cleanAITitle(title: string, maxLength = 50): string {\n let cleaned = title.trim();\n\n // Remove quotes and prefixes iteratively until no more changes\n let previous = '';\n while (previous !== cleaned) {\n previous = cleaned;\n cleaned = removeTitlePrefix(cleaned);\n cleaned = removeQuotes(cleaned);\n }\n\n // Replace newlines with spaces\n cleaned = cleaned.replace(/\\n+/g, ' ');\n\n // Remove extra whitespace\n cleaned = cleaned.replace(/\\s+/g, ' ').trim();\n\n // Truncate if needed\n return truncateTitle(cleaned, maxLength);\n}\n\n/**\n * Format session title for display with timestamp\n * Returns \"Title (HH:MM)\" for today, \"Title (Mon DD)\" for other dates\n */\nexport function formatSessionDisplay(title: string | undefined, created: number): string {\n const displayTitle = title || 'New Chat';\n const date = new Date(created);\n const now = new Date();\n\n // Show time if today, otherwise show date\n const isToday = date.toDateString() === now.toDateString();\n\n if (isToday) {\n const timeStr = date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n });\n return `${displayTitle} (${timeStr})`;\n }\n\n const dateStr = date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n });\n return `${displayTitle} (${dateStr})`;\n}\n\n/**\n * Format relative time for session display\n * Returns \"just now\", \"5m ago\", \"2h ago\", \"3 days ago\", etc.\n */\nexport function formatRelativeTime(timestamp: number): string {\n const now = Date.now();\n const diff = now - timestamp;\n\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (seconds < 30) {\n return 'just now';\n } else if (seconds < 60) {\n return `${seconds}s ago`;\n } else if (minutes < 60) {\n return `${minutes}m ago`;\n } else if (hours < 24) {\n return `${hours}h ago`;\n } else if (days < 7) {\n return `${days} ${days === 1 ? 'day' : 'days'} ago`;\n } else {\n // For older sessions, show date\n const date = new Date(timestamp);\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: date.getFullYear() !== new Date().getFullYear() ? 'numeric' : undefined,\n });\n }\n}\n\n/**\n * Check if title needs truncation\n */\nexport function needsTruncation(title: string, maxLength = 50): boolean {\n return title.length > maxLength;\n}\n\n/**\n * Validate title\n * Returns true if title is valid (not empty, not too long)\n */\nexport function isValidTitle(title: string, maxLength = 100): boolean {\n const trimmed = title.trim();\n return trimmed.length > 0 && trimmed.length <= maxLength;\n}\n\n/**\n * Get title length\n * Returns length after trimming\n */\nexport function getTitleLength(title: string): number {\n return title.trim().length;\n}\n\n/**\n * Compare titles for sorting\n * Case-insensitive alphabetical comparison\n */\nexport function compareTitles(a: string, b: string): number {\n return a.toLowerCase().localeCompare(b.toLowerCase());\n}\n\n/**\n * Extract title from message content\n * Takes first line or first N characters\n */\nexport function extractTitleFromMessage(message: string, maxLength = 50): string {\n // Take first line\n const firstLine = message.split('\\n')[0];\n\n // Clean and truncate\n return generateSessionTitle(firstLine, maxLength);\n}\n",
|
|
6
|
-
"/**\n * Session Title Generation Utility\n * Re-exports pure functions from feature and adds streaming functionality\n */\n\nimport { createAIStream } from '../core/ai-sdk.js';\nimport type { ProviderId } from '../types/config.types.js';\n\n// Re-export pure functions from feature\nexport {\n generateSessionTitle,\n formatSessionDisplay,\n formatRelativeTime,\n cleanTitle,\n truncateTitle,\n} from '../features/session/utils/title.js';\n\n/**\n * Generate a session title using LLM with streaming\n */\nexport async function generateSessionTitleWithStreaming(\n firstMessage: string,\n provider: ProviderId,\n modelName: string,\n providerConfig: any,\n onChunk: (chunk: string) => void\n): Promise<string> {\n if (!firstMessage || firstMessage.trim().length === 0) {\n return 'New Chat';\n }\n\n try {\n // Get the provider instance and create the model\n const { getProvider } = await import('../providers/index.js');\n const providerInstance = getProvider(provider);\n const model = providerInstance.createClient(providerConfig, modelName);\n\n const streamGenerator = createAIStream({\n model,\n messages: [\n {\n role: 'user',\n content: `You need to generate a SHORT, DESCRIPTIVE title (maximum 50 characters) for a chat conversation.\n\nUser's first message: \"${firstMessage}\"\n\nRequirements:\n- Summarize the TOPIC or INTENT, don't just copy the message\n- Be concise and descriptive\n- Maximum 50 characters\n- Output ONLY the title, nothing else\n\nExamples:\n- Message: \"How do I implement authentication?\" → Title: \"Authentication Implementation\"\n- Message: \"你好,请帮我修复这个 bug\" → Title: \"Bug 修复请求\"\n- Message: \"Can you help me with React hooks?\" → Title: \"React Hooks Help\"\n\nNow generate the title:`,\n },\n ],\n });\n\n let fullTitle = '';\n\n // Iterate the async generator and stream to UI\n for await (const chunk of streamGenerator) {\n if (chunk.type === 'text-delta' && chunk.textDelta) {\n fullTitle += chunk.textDelta;\n onChunk(chunk.textDelta);\n }\n }\n\n // Clean up title\n let cleaned = fullTitle.trim();\n cleaned = cleaned.replace(/^[\"'「『]+|[\"'」』]+$/g, ''); // Remove quotes\n cleaned = cleaned.replace(/^(Title:|标题:)\\s*/i, ''); // Remove \"Title:\" prefix\n cleaned = cleaned.replace(/\\n+/g, ' '); // Replace newlines with spaces\n cleaned = cleaned.trim();\n\n // Return truncated if needed\n return cleaned.length > 50 ? cleaned.substring(0, 50) + '...' : cleaned;\n } catch (error) {\n // Fallback to simple title generation on any error\n return generateSessionTitle(firstMessage);\n }\n}\n\n"
|
|
7
|
-
],
|
|
8
|
-
"mappings": "yhBAUO,GAAS,LAAoB,LAAC,JAAsB,JAAY,HAAY,LACjF,HAAI,LAAC,HAAgB,JAAa,DAAK,JAAE,GAAW,EAClD,MAAO,WAIT,IAAM,EAAU,EAAW,CAAY,EAGvC,OAAO,EAAc,EAAS,CAAS,EAOlC,SAAS,CAAU,CAAC,EAAuB,CAChD,OAAO,EAAM,KAAK,EAAE,QAAQ,OAAQ,GAAG,EAOlC,SAAS,CAAa,CAAC,EAAe,EAAY,GAAY,CACnE,GAAI,EAAM,QAAU,EAClB,OAAO,EAIT,IAAM,EAAY,EAAM,UAAU,EAAG,CAAS,EACxC,EAAY,EAAU,YAAY,GAAG,EAGrC,EAAsB,KAAK,MAAM,EAAY,GAAG,EAEtD,GAAI,EAAY,EACd,OAAO,EAAU,UAAU,EAAG,CAAS,EAAI,MAI7C,OAAO,EAAY,MAkEd,SAAS,CAAoB,CAAC,EAA2B,EAAyB,CACvF,IAAM,EAAe,GAAS,WACxB,EAAO,IAAI,KAAK,CAAO,EACvB,EAAM,IAAI,KAKhB,GAFgB,EAAK,aAAa,IAAM,EAAI,aAAa,EAE5C,CACX,IAAM,EAAU,EAAK,mBAAmB,QAAS,CAC/C,KAAM,UACN,OAAQ,SACV,CAAC,EACD,MAAO,GAAG,MAAiB,KAG7B,IAAM,EAAU,EAAK,mBAAmB,QAAS,CAC/C,MAAO,QACP,IAAK,SACP,CAAC,EACD,MAAO,GAAG,MAAiB,KAOtB,SAAS,CAAkB,CAAC,EAA2B,CAE5D,IAAM,EADM,KAAK,IAAI,EACF,EAEb,EAAU,KAAK,MAAM,EAAO,IAAI,EAChC,EAAU,KAAK,MAAM,EAAU,EAAE,EACjC,EAAQ,KAAK,MAAM,EAAU,EAAE,EAC/B,EAAO,KAAK,MAAM,EAAQ,EAAE,EAElC,GAAI,EAAU,GACZ,MAAO,WACF,QAAI,EAAU,GACnB,MAAO,GAAG,SACL,QAAI,EAAU,GACnB,MAAO,GAAG,SACL,QAAI,EAAQ,GACjB,MAAO,GAAG,SACL,QAAI,EAAO,EAChB,MAAO,GAAG,KAAQ,IAAS,EAAI,MAAQ,aAClC,KAEL,IAAM,EAAO,IAAI,KAAK,CAAS,EAC/B,OAAO,EAAK,mBAAmB,QAAS,CACtC,MAAO,QACP,IAAK,UACL,KAAM,EAAK,YAAY,IAAM,IAAI,KAAK,EAAE,YAAY,EAAI,UAAY,MACtE,CAAC,GCtJL,eAAsB,CAAiC,CACrD,EACA,EACA,EACA,EACA,EACiB,CACjB,GAAI,CAAC,GAAgB,EAAa,KAAK,EAAE,SAAW,EAClD,MAAO,WAGT,GAAI,CAEF,IAAQ,eAAgB,KAAa,+BAE/B,EADmB,EAAY,CAAQ,EACd,aAAa,EAAgB,CAAS,EAE/D,EAAkB,EAAe,CACrC,QACA,SAAU,CACR,CACE,KAAM,OACN,QAAS;AAAA;AAAA,yBAEM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAcjB,CACF,CACF,CAAC,EAEG,EAAY,GAGhB,cAAiB,KAAS,EACxB,GAAI,EAAM,OAAS,cAAgB,EAAM,UACvC,GAAa,EAAM,UACnB,EAAQ,EAAM,SAAS,EAK3B,IAAI,EAAU,EAAU,KAAK,EAO7B,OANA,EAAU,EAAQ,QAAQ,qBAAqB,EAAE,EACjD,EAAU,EAAQ,QAAQ,oBAAoB,EAAE,EAChD,EAAU,EAAQ,QAAQ,OAAQ,GAAG,EACrC,EAAU,EAAQ,KAAK,EAGhB,EAAQ,OAAS,GAAK,EAAQ,UAAU,EAAG,EAAE,EAAI,MAAQ,EAChE,MAAO,EAAO,CAEd,OAAO,qBAAqB,CAAY",
|
|
9
|
-
"debugId": "C1E6EF4D915BD17A64756E2164756E21",
|
|
10
|
-
"names": []
|
|
11
|
-
}
|