@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.
Files changed (158) hide show
  1. package/CHANGELOG.md +318 -0
  2. package/LOOP_MODE.md +446 -0
  3. package/dist/index.d.ts +10 -0
  4. package/dist/index.js +59398 -698
  5. package/dist/lancedb.linux-x64-gnu-b7f0jgsz.node +0 -0
  6. package/dist/lancedb.linux-x64-musl-tgcv22rx.node +0 -0
  7. package/dist/shared/chunk-25dwp0dp.js +89 -0
  8. package/dist/shared/chunk-3pjb6063.js +208 -0
  9. package/dist/shared/chunk-4d6ydpw7.js +2854 -0
  10. package/dist/shared/chunk-4wjcadjk.js +225 -0
  11. package/dist/shared/chunk-5j4w74t6.js +30 -0
  12. package/dist/shared/chunk-5j8m3dh3.js +58 -0
  13. package/dist/shared/chunk-5thh3qem.js +91 -0
  14. package/dist/shared/chunk-6g9xy73m.js +252 -0
  15. package/dist/shared/chunk-7eq34c42.js +23 -0
  16. package/dist/shared/chunk-c2gwgx3r.js +115 -0
  17. package/dist/shared/chunk-cjd3mk4c.js +1320 -0
  18. package/dist/shared/chunk-g5cv6703.js +368 -0
  19. package/dist/shared/chunk-hpkhykhq.js +574 -0
  20. package/dist/shared/chunk-m2322pdk.js +122 -0
  21. package/dist/shared/chunk-nd5fdvaq.js +26 -0
  22. package/dist/shared/chunk-pgd3m6zf.js +108 -0
  23. package/dist/shared/chunk-qk8n91hw.js +494 -0
  24. package/dist/shared/chunk-rkkn8szp.js +16855 -0
  25. package/dist/shared/chunk-t16rfxh0.js +61 -0
  26. package/dist/shared/chunk-t4fbfa5v.js +19 -0
  27. package/dist/shared/chunk-t77h86w6.js +276 -0
  28. package/dist/shared/chunk-v0ez4aef.js +71 -0
  29. package/dist/shared/chunk-v29j2r3s.js +32051 -0
  30. package/dist/shared/chunk-vfbc6ew5.js +765 -0
  31. package/dist/shared/chunk-vmeqwm1c.js +204 -0
  32. package/dist/shared/chunk-x66eh37x.js +137 -0
  33. package/package.json +45 -93
  34. package/README.md +0 -625
  35. package/assets/agents/coder.md +0 -32
  36. package/assets/agents/orchestrator.md +0 -36
  37. package/assets/agents/reviewer.md +0 -30
  38. package/assets/agents/writer.md +0 -30
  39. package/assets/knowledge/data/sql.md +0 -216
  40. package/assets/knowledge/guides/saas-template.md +0 -85
  41. package/assets/knowledge/guides/system-prompt.md +0 -344
  42. package/assets/knowledge/guides/tech-stack.md +0 -92
  43. package/assets/knowledge/guides/ui-ux.md +0 -44
  44. package/assets/knowledge/stacks/nextjs-app.md +0 -165
  45. package/assets/knowledge/stacks/node-api.md +0 -220
  46. package/assets/knowledge/stacks/react-app.md +0 -232
  47. package/assets/knowledge/universal/deployment.md +0 -109
  48. package/assets/knowledge/universal/performance.md +0 -121
  49. package/assets/knowledge/universal/security.md +0 -79
  50. package/assets/knowledge/universal/testing.md +0 -111
  51. package/assets/output-styles/silent.md +0 -23
  52. package/assets/rules/core.md +0 -197
  53. package/assets/slash-commands/commit.md +0 -23
  54. package/assets/slash-commands/context.md +0 -112
  55. package/assets/slash-commands/explain.md +0 -35
  56. package/assets/slash-commands/mep.md +0 -63
  57. package/assets/slash-commands/review.md +0 -39
  58. package/assets/slash-commands/test.md +0 -30
  59. package/dist/assets/agents/coder.md +0 -32
  60. package/dist/assets/agents/orchestrator.md +0 -36
  61. package/dist/assets/agents/reviewer.md +0 -30
  62. package/dist/assets/agents/writer.md +0 -30
  63. package/dist/assets/knowledge/data/sql.md +0 -216
  64. package/dist/assets/knowledge/guides/saas-template.md +0 -85
  65. package/dist/assets/knowledge/guides/system-prompt.md +0 -344
  66. package/dist/assets/knowledge/guides/tech-stack.md +0 -92
  67. package/dist/assets/knowledge/guides/ui-ux.md +0 -44
  68. package/dist/assets/knowledge/stacks/nextjs-app.md +0 -165
  69. package/dist/assets/knowledge/stacks/node-api.md +0 -220
  70. package/dist/assets/knowledge/stacks/react-app.md +0 -232
  71. package/dist/assets/knowledge/universal/deployment.md +0 -109
  72. package/dist/assets/knowledge/universal/performance.md +0 -121
  73. package/dist/assets/knowledge/universal/security.md +0 -79
  74. package/dist/assets/knowledge/universal/testing.md +0 -111
  75. package/dist/assets/output-styles/silent.md +0 -23
  76. package/dist/assets/rules/core.md +0 -197
  77. package/dist/assets/slash-commands/commit.md +0 -23
  78. package/dist/assets/slash-commands/context.md +0 -112
  79. package/dist/assets/slash-commands/explain.md +0 -35
  80. package/dist/assets/slash-commands/mep.md +0 -63
  81. package/dist/assets/slash-commands/review.md +0 -39
  82. package/dist/assets/slash-commands/test.md +0 -30
  83. package/dist/chunk-01gv4qey.js +0 -4
  84. package/dist/chunk-01gv4qey.js.map +0 -11
  85. package/dist/chunk-1e8xf3f6.js +0 -27
  86. package/dist/chunk-1e8xf3f6.js.map +0 -23
  87. package/dist/chunk-3m9whg4q.js +0 -4
  88. package/dist/chunk-3m9whg4q.js.map +0 -9
  89. package/dist/chunk-3qxj0zy3.js +0 -23
  90. package/dist/chunk-3qxj0zy3.js.map +0 -11
  91. package/dist/chunk-3w6pd43t.js +0 -25
  92. package/dist/chunk-3w6pd43t.js.map +0 -61
  93. package/dist/chunk-4e5g3df9.js +0 -105
  94. package/dist/chunk-4e5g3df9.js.map +0 -27
  95. package/dist/chunk-4nm4ere4.js +0 -4
  96. package/dist/chunk-4nm4ere4.js.map +0 -11
  97. package/dist/chunk-4vrj3f8r.js +0 -26
  98. package/dist/chunk-4vrj3f8r.js.map +0 -75
  99. package/dist/chunk-5njgv5k5.js +0 -161
  100. package/dist/chunk-5njgv5k5.js.map +0 -83
  101. package/dist/chunk-67n29s4q.js +0 -7
  102. package/dist/chunk-67n29s4q.js.map +0 -10
  103. package/dist/chunk-7yyg008s.js +0 -27
  104. package/dist/chunk-7yyg008s.js.map +0 -14
  105. package/dist/chunk-86ce45n6.js +0 -3
  106. package/dist/chunk-86ce45n6.js.map +0 -10
  107. package/dist/chunk-99pz5wm0.js +0 -75
  108. package/dist/chunk-99pz5wm0.js.map +0 -12
  109. package/dist/chunk-cv1nhr27.js +0 -2
  110. package/dist/chunk-cv1nhr27.js.map +0 -9
  111. package/dist/chunk-g4baca7p.js +0 -10
  112. package/dist/chunk-g4baca7p.js.map +0 -23
  113. package/dist/chunk-gc66xe7z.js +0 -4
  114. package/dist/chunk-gc66xe7z.js.map +0 -11
  115. package/dist/chunk-hj6qtsqp.js +0 -15
  116. package/dist/chunk-hj6qtsqp.js.map +0 -10
  117. package/dist/chunk-jbd95k1f.js +0 -14
  118. package/dist/chunk-jbd95k1f.js.map +0 -20
  119. package/dist/chunk-jk1ebfqn.js +0 -23
  120. package/dist/chunk-jk1ebfqn.js.map +0 -132
  121. package/dist/chunk-kn908zkk.js +0 -4
  122. package/dist/chunk-kn908zkk.js.map +0 -10
  123. package/dist/chunk-mw13a082.js +0 -4
  124. package/dist/chunk-mw13a082.js.map +0 -10
  125. package/dist/chunk-n8vzewr3.js +0 -4
  126. package/dist/chunk-n8vzewr3.js.map +0 -12
  127. package/dist/chunk-nke51f3c.js +0 -4
  128. package/dist/chunk-nke51f3c.js.map +0 -10
  129. package/dist/chunk-ns5atzyz.js +0 -3
  130. package/dist/chunk-ns5atzyz.js.map +0 -10
  131. package/dist/chunk-q4nh3vst.js +0 -54
  132. package/dist/chunk-q4nh3vst.js.map +0 -53
  133. package/dist/chunk-q5gqgs0p.js +0 -4
  134. package/dist/chunk-q5gqgs0p.js.map +0 -10
  135. package/dist/chunk-qpej66sh.js +0 -6
  136. package/dist/chunk-qpej66sh.js.map +0 -11
  137. package/dist/chunk-s9bsh0gp.js +0 -4
  138. package/dist/chunk-s9bsh0gp.js.map +0 -10
  139. package/dist/chunk-waemzsf4.js +0 -4
  140. package/dist/chunk-waemzsf4.js.map +0 -10
  141. package/dist/chunk-wnhhwtsy.js +0 -19
  142. package/dist/chunk-wnhhwtsy.js.map +0 -11
  143. package/dist/chunk-xs370t8p.js +0 -119
  144. package/dist/chunk-xs370t8p.js.map +0 -26
  145. package/dist/chunk-xtrn4wn0.js +0 -3
  146. package/dist/chunk-xtrn4wn0.js.map +0 -10
  147. package/dist/index.js.map +0 -920
  148. package/drizzle/0000_wooden_lady_bullseye.sql +0 -52
  149. package/drizzle/0001_material_pyro.sql +0 -85
  150. package/drizzle/0002_lyrical_random.sql +0 -2
  151. package/drizzle/0003_romantic_lockjaw.sql +0 -4
  152. package/drizzle/0004_blushing_meteorite.sql +0 -6
  153. package/drizzle/meta/0000_snapshot.json +0 -310
  154. package/drizzle/meta/0001_snapshot.json +0 -906
  155. package/drizzle/meta/0002_snapshot.json +0 -920
  156. package/drizzle/meta/0003_snapshot.json +0 -920
  157. package/drizzle/meta/0004_snapshot.json +0 -921
  158. package/drizzle/meta/_journal.json +0 -41
@@ -1,7 +0,0 @@
1
- import{Ha as M}from"./chunk-kn908zkk.js";import{Ka as E}from"./chunk-xs370t8p.js";import"./chunk-cv1nhr27.js";import"./chunk-jbd95k1f.js";import{Sb as Z}from"./chunk-4vrj3f8r.js";import{Tb as N,Wb as R}from"./chunk-3m9whg4q.js";import V from"node:fs/promises";import J from"node:path";import j from"node:os";var v=E(),x=Z.object({defaultProvider:Z.enum(["anthropic","openai","google","openrouter","claude-code","zai"]).optional(),defaultModel:Z.string().optional(),providers:Z.record(Z.string(),Z.object({defaultModel:Z.string().optional()}).passthrough()).optional()}),z=J.join(j.homedir(),".sylphx-flow","settings.json"),S=".sylphx-flow/settings.json",_=".sylphx-flow/settings.local.json",G=".sylphx-flow/ai-config.json",Y=(q=process.cwd())=>({global:z,project:J.join(q,S),local:J.join(q,_),legacy:J.join(q,G)}),B=async(q)=>{try{let k=await V.readFile(q,"utf8"),D=JSON.parse(k);return x.parse(D)}catch(k){if(k.code==="ENOENT")return null;throw k}},$=(q,k)=>{let D=new Set([...Object.keys(q.providers||{}),...Object.keys(k.providers||{})]),K={};for(let H of D)K[H]={...q.providers?.[H],...k.providers?.[H]};return{defaultProvider:k.defaultProvider??q.defaultProvider,defaultModel:k.defaultModel??q.defaultModel,providers:K}},h=async(q=process.cwd())=>{let k=Y(q);try{return await V.access(k.global).catch(()=>{}),!0}catch{}try{return await V.access(k.project),!0}catch{}try{return await V.access(k.local),!0}catch{}try{return await V.access(k.legacy),!0}catch{}return!1},T=async(q=process.cwd())=>{return M(async()=>{let k=Y(q),[D,K,H,U]=await Promise.all([B(k.global),B(k.project),B(k.local),B(k.legacy)]);if(U&&!D){await y(q);let X=await B(k.global);if(X){let W={};if(W=$(W,X),K)W=$(W,K);if(H)W=$(W,H);return W}}let Q={};if(D)Q=$(Q,D);if(K)Q=$(Q,K);if(H)Q=$(Q,H);if(U)Q=$(Q,U);return Q},(k)=>Error(`Failed to load AI config: ${k.message}`))},L=async(q,k=process.cwd())=>{let K=Y(k).global;return M(async()=>{await V.mkdir(J.dirname(K),{recursive:!0});let H={...q};if(!H.defaultProvider&&H.providers){let{getProvider:Q}=await import("./chunk-xs370t8p.js"),X=[];for(let[W,O]of Object.entries(H.providers))try{if(Q(W).isConfigured(O))X.push(W)}catch{}if(X.length>0)H.defaultProvider=X[X.length-1]}let U=x.parse(H);await V.writeFile(K,JSON.stringify(U,null,2)+`
2
- `,"utf8")},(H)=>Error(`Failed to save AI config: ${H.message}`))},p=async(q,k,D=process.cwd())=>{let H=Y(D)[k];return M(async()=>{await V.mkdir(J.dirname(H),{recursive:!0});let U=x.parse(q);await V.writeFile(H,JSON.stringify(U,null,2)+`
3
- `,"utf8")},(U)=>Error(`Failed to save AI config to ${k}: ${U.message}`))},C=async(q,k=process.cwd())=>{let D=await T(k);if(D._tag==="Failure")return D;let K={...D.value,...q,providers:{...D.value.providers,...q.providers}};return L(K,k)},l=async(q=process.cwd())=>{let k=await T(q);if(k._tag==="Failure")return[];let D=[],K=k.value;if(!K.providers)return[];let{getProvider:H}=await import("./chunk-xs370t8p.js");for(let[U,Q]of Object.entries(K.providers))try{if(H(U).isConfigured(Q))D.push(U)}catch{}return D},y=async(q=process.cwd())=>{return M(async()=>{let k=Y(q),D=await B(k.legacy);if(!D)return;if(await B(k.global)){console.log("Legacy config found but global config already exists. Skipping migration."),console.log(`You can manually delete ${k.legacy} if migration is complete.`);return}await V.mkdir(J.dirname(k.global),{recursive:!0}),await V.writeFile(k.global,JSON.stringify(D,null,2)+`
4
- `,"utf8"),console.log(`✓ Migrated configuration from ${k.legacy} to ${k.global}`),console.log(` You can now safely delete the legacy file: ${k.legacy}`)},(k)=>Error(`Failed to migrate legacy config: ${k.message}`))};export{C as updateAIConfig,p as saveAIConfigTo,L as saveAIConfig,y as migrateLegacyConfig,T as loadAIConfig,l as getConfiguredProviders,Y as getAIConfigPaths,h as aiConfigExists,v as AI_PROVIDERS};
5
- export{v as Aa,T as Ba,L as Ca,l as Da};
6
-
7
- //# debugId=2920349B75A13FF164756E2164756E21
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/config/ai-config.ts"],
4
- "sourcesContent": [
5
- "/**\n * AI Configuration Management\n *\n * Three-tier configuration system:\n * 1. Global: ~/.sylphx-flow/settings.json (user defaults, contains API keys)\n * 2. Project: ./.sylphx-flow/settings.json (project preferences, no secrets)\n * 3. Local: ./.sylphx-flow/settings.local.json (local overrides, gitignored)\n *\n * Priority: local > project > global\n */\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { z } from 'zod';\nimport { type Result, success, tryCatchAsync } from '../core/functional/result.js';\nimport { getAllProviders } from '../providers/index.js';\nimport type { ProviderId, ProviderConfigValue as ProviderConfigValueType } from '../types/provider.types.js';\n\n// Re-export types for backward compatibility\nexport type { ProviderId } from '../types/provider.types.js';\n\n/**\n * AI_PROVIDERS - Provider metadata from registry\n * Contains basic info (id, name) for UI components\n * Config schemas are defined in each provider's getConfigSchema()\n */\nexport const AI_PROVIDERS = getAllProviders();\n\n/**\n * Provider configuration\n * Each provider can have different config fields (defined by provider.getConfigSchema())\n * Common fields: apiKey, defaultModel, etc\n */\nexport type ProviderConfigValue = ProviderConfigValueType;\n\n/**\n * AI configuration schema\n * Uses generic Record for provider configs - validation happens at provider level\n */\nconst aiConfigSchema = z.object({\n defaultProvider: z.enum(['anthropic', 'openai', 'google', 'openrouter', 'claude-code', 'zai']).optional(),\n defaultModel: z.string().optional(),\n providers: z.record(\n z.string(),\n z.object({\n defaultModel: z.string().optional(),\n }).passthrough() // Allow additional fields defined by provider\n ).optional(),\n});\n\nexport type AIConfig = z.infer<typeof aiConfigSchema>;\n\n/**\n * Configuration file paths\n */\nconst GLOBAL_CONFIG_FILE = path.join(os.homedir(), '.sylphx-flow', 'settings.json');\nconst PROJECT_CONFIG_FILE = '.sylphx-flow/settings.json';\nconst LOCAL_CONFIG_FILE = '.sylphx-flow/settings.local.json';\n\n/**\n * Deprecated config file (for migration)\n */\nconst LEGACY_CONFIG_FILE = '.sylphx-flow/ai-config.json';\n\n/**\n * Get AI config file paths in priority order\n */\nexport const getAIConfigPaths = (cwd: string = process.cwd()): {\n global: string;\n project: string;\n local: string;\n legacy: string;\n} => ({\n global: GLOBAL_CONFIG_FILE,\n project: path.join(cwd, PROJECT_CONFIG_FILE),\n local: path.join(cwd, LOCAL_CONFIG_FILE),\n legacy: path.join(cwd, LEGACY_CONFIG_FILE),\n});\n\n/**\n * Load config from a single file\n */\nconst loadConfigFile = async (filePath: string): Promise<AIConfig | null> => {\n try {\n const content = await fs.readFile(filePath, 'utf8');\n const parsed = JSON.parse(content);\n return aiConfigSchema.parse(parsed);\n } catch (error: any) {\n if (error.code === 'ENOENT') {\n return null; // File doesn't exist\n }\n throw error; // Re-throw other errors\n }\n};\n\n/**\n * Deep merge two configs (b overwrites a)\n */\nconst mergeConfigs = (a: AIConfig, b: AIConfig): AIConfig => {\n // Merge provider configs dynamically\n const allProviderIds = new Set([\n ...Object.keys(a.providers || {}),\n ...Object.keys(b.providers || {}),\n ]);\n\n const mergedProviders: Record<string, any> = {};\n for (const providerId of allProviderIds) {\n mergedProviders[providerId] = {\n ...a.providers?.[providerId],\n ...b.providers?.[providerId],\n };\n }\n\n return {\n defaultProvider: b.defaultProvider ?? a.defaultProvider,\n defaultModel: b.defaultModel ?? a.defaultModel,\n providers: mergedProviders,\n };\n};\n\n/**\n * Check if any AI config exists\n */\nexport const aiConfigExists = async (cwd: string = process.cwd()): Promise<boolean> => {\n const paths = getAIConfigPaths(cwd);\n try {\n // Check any of the config files\n await fs.access(paths.global).catch(() => {});\n return true;\n } catch {}\n\n try {\n await fs.access(paths.project);\n return true;\n } catch {}\n\n try {\n await fs.access(paths.local);\n return true;\n } catch {}\n\n try {\n await fs.access(paths.legacy);\n return true;\n } catch {}\n\n return false;\n};\n\n/**\n * Load AI configuration\n * Merges global, project, and local configs with priority: local > project > global\n * Automatically migrates legacy config on first load\n */\nexport const loadAIConfig = async (cwd: string = process.cwd()): Promise<Result<AIConfig, Error>> => {\n return tryCatchAsync(\n async () => {\n const paths = getAIConfigPaths(cwd);\n\n // Load all config files\n const [globalConfig, projectConfig, localConfig, legacyConfig] = await Promise.all([\n loadConfigFile(paths.global),\n loadConfigFile(paths.project),\n loadConfigFile(paths.local),\n loadConfigFile(paths.legacy),\n ]);\n\n // Auto-migrate legacy config if it exists and global doesn't\n if (legacyConfig && !globalConfig) {\n await migrateLegacyConfig(cwd);\n // Reload global config after migration\n const migratedGlobal = await loadConfigFile(paths.global);\n if (migratedGlobal) {\n // Start with empty config\n let merged: AIConfig = {};\n\n // Merge in priority order: global < project < local\n merged = mergeConfigs(merged, migratedGlobal);\n if (projectConfig) merged = mergeConfigs(merged, projectConfig);\n if (localConfig) merged = mergeConfigs(merged, localConfig);\n\n return merged;\n }\n }\n\n // Start with empty config\n let merged: AIConfig = {};\n\n // Merge in priority order: global < project < local < legacy (for backwards compat)\n if (globalConfig) merged = mergeConfigs(merged, globalConfig);\n if (projectConfig) merged = mergeConfigs(merged, projectConfig);\n if (localConfig) merged = mergeConfigs(merged, localConfig);\n if (legacyConfig) merged = mergeConfigs(merged, legacyConfig);\n\n return merged;\n },\n (error: any) => new Error(`Failed to load AI config: ${error.message}`)\n );\n};\n\n/**\n * Save AI configuration to global settings\n * By default, all configuration (including API keys) goes to ~/.sylphx-flow/settings.json\n * Automatically sets default provider if not set\n */\nexport const saveAIConfig = async (\n config: AIConfig,\n cwd: string = process.cwd()\n): Promise<Result<void, Error>> => {\n const paths = getAIConfigPaths(cwd);\n const configPath = paths.global; // Save to global by default\n\n return tryCatchAsync(\n async () => {\n // Ensure directory exists\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n\n // Auto-set default provider if not set\n const configToSave = { ...config };\n if (!configToSave.defaultProvider && configToSave.providers) {\n // Get configured providers (those that pass isConfigured check)\n const { getProvider } = await import('../providers/index.js');\n const configuredProviders: ProviderId[] = [];\n\n for (const [providerId, providerConfig] of Object.entries(configToSave.providers)) {\n try {\n const provider = getProvider(providerId as ProviderId);\n if (provider.isConfigured(providerConfig)) {\n configuredProviders.push(providerId as ProviderId);\n }\n } catch {\n // Skip unknown providers\n }\n }\n\n // Use last configured provider as default\n if (configuredProviders.length > 0) {\n configToSave.defaultProvider = configuredProviders[configuredProviders.length - 1];\n }\n }\n\n // Validate config\n const validated = aiConfigSchema.parse(configToSave);\n\n // Write config\n await fs.writeFile(configPath, JSON.stringify(validated, null, 2) + '\\n', 'utf8');\n },\n (error: any) => new Error(`Failed to save AI config: ${error.message}`)\n );\n};\n\n/**\n * Save AI configuration to a specific location\n */\nexport const saveAIConfigTo = async (\n config: AIConfig,\n location: 'global' | 'project' | 'local',\n cwd: string = process.cwd()\n): Promise<Result<void, Error>> => {\n const paths = getAIConfigPaths(cwd);\n const configPath = paths[location];\n\n return tryCatchAsync(\n async () => {\n // Ensure directory exists\n await fs.mkdir(path.dirname(configPath), { recursive: true });\n\n // Validate config\n const validated = aiConfigSchema.parse(config);\n\n // Write config\n await fs.writeFile(configPath, JSON.stringify(validated, null, 2) + '\\n', 'utf8');\n },\n (error: any) => new Error(`Failed to save AI config to ${location}: ${error.message}`)\n );\n};\n\n/**\n * Update AI configuration (merge with existing)\n * Default provider is auto-set by saveAIConfig to last configured provider\n */\nexport const updateAIConfig = async (\n updates: Partial<AIConfig>,\n cwd: string = process.cwd()\n): Promise<Result<void, Error>> => {\n const currentResult = await loadAIConfig(cwd);\n\n if (currentResult._tag === 'Failure') {\n return currentResult;\n }\n\n const merged: AIConfig = {\n ...currentResult.value,\n ...updates,\n providers: {\n ...currentResult.value.providers,\n ...updates.providers,\n },\n };\n\n // saveAIConfig will auto-set default provider if not set\n return saveAIConfig(merged, cwd);\n};\n\n/**\n * Get configured providers\n * Uses provider's isConfigured() method to check\n */\nexport const getConfiguredProviders = async (\n cwd: string = process.cwd()\n): Promise<ProviderId[]> => {\n const result = await loadAIConfig(cwd);\n\n if (result._tag === 'Failure') {\n return [];\n }\n\n const providers: ProviderId[] = [];\n const config = result.value;\n\n if (!config.providers) {\n return [];\n }\n\n // Dynamically import provider registry to avoid circular dependency\n const { getProvider } = await import('../providers/index.js');\n\n for (const [providerId, providerConfig] of Object.entries(config.providers)) {\n try {\n const provider = getProvider(providerId as ProviderId);\n if (provider.isConfigured(providerConfig)) {\n providers.push(providerId as ProviderId);\n }\n } catch {\n // Skip unknown providers\n }\n }\n\n return providers;\n};\n\n/**\n * Migrate legacy ai-config.json to new settings system\n * Automatically called on first load if legacy config exists\n */\nexport const migrateLegacyConfig = async (cwd: string = process.cwd()): Promise<Result<void, Error>> => {\n return tryCatchAsync(\n async () => {\n const paths = getAIConfigPaths(cwd);\n\n // Check if legacy config exists\n const legacyConfig = await loadConfigFile(paths.legacy);\n if (!legacyConfig) {\n return; // No legacy config to migrate\n }\n\n // Check if global config already exists\n const globalConfig = await loadConfigFile(paths.global);\n if (globalConfig) {\n // Global config exists, don't overwrite it\n console.log('Legacy config found but global config already exists. Skipping migration.');\n console.log(`You can manually delete ${paths.legacy} if migration is complete.`);\n return;\n }\n\n // Migrate to global config\n await fs.mkdir(path.dirname(paths.global), { recursive: true });\n await fs.writeFile(paths.global, JSON.stringify(legacyConfig, null, 2) + '\\n', 'utf8');\n\n console.log(`✓ Migrated configuration from ${paths.legacy} to ${paths.global}`);\n console.log(` You can now safely delete the legacy file: ${paths.legacy}`);\n },\n (error: any) => new Error(`Failed to migrate legacy config: ${error.message}`)\n );\n};\n"
6
- ],
7
- "mappings": "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",
8
- "debugId": "2920349B75A13FF164756E2164756E21",
9
- "names": []
10
- }
@@ -1,27 +0,0 @@
1
- import{ma as y}from"./chunk-jk1ebfqn.js";import"./chunk-01gv4qey.js";import"./chunk-g4baca7p.js";import{Ba as u,Da as v}from"./chunk-67n29s4q.js";import"./chunk-kn908zkk.js";import{Ia as p}from"./chunk-nke51f3c.js";import{Ja as m}from"./chunk-xs370t8p.js";import"./chunk-cv1nhr27.js";import"./chunk-jbd95k1f.js";import"./chunk-4vrj3f8r.js";import"./chunk-3m9whg4q.js";var E=(q=0)=>(V)=>`\x1B[${V+q}m`,T=(q=0)=>(V)=>`\x1B[${38+q};5;${V}m`,A=(q=0)=>(V,z,H)=>`\x1B[${38+q};2;${V};${z};${H}m`,Q={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},J1=Object.keys(Q.modifier),c=Object.keys(Q.color),d=Object.keys(Q.bgColor),K1=[...c,...d];function g(){let q=new Map;for(let[V,z]of Object.entries(Q)){for(let[H,J]of Object.entries(z))Q[H]={open:`\x1B[${J[0]}m`,close:`\x1B[${J[1]}m`},z[H]=Q[H],q.set(J[0],J[1]);Object.defineProperty(Q,V,{value:z,enumerable:!1})}return Object.defineProperty(Q,"codes",{value:q,enumerable:!1}),Q.color.close="\x1B[39m",Q.bgColor.close="\x1B[49m",Q.color.ansi=E(),Q.color.ansi256=T(),Q.color.ansi16m=A(),Q.bgColor.ansi=E(10),Q.bgColor.ansi256=T(10),Q.bgColor.ansi16m=A(10),Object.defineProperties(Q,{rgbToAnsi256:{value(V,z,H){if(V===z&&z===H){if(V<8)return 16;if(V>248)return 231;return Math.round((V-8)/247*24)+232}return 16+36*Math.round(V/255*5)+6*Math.round(z/255*5)+Math.round(H/255*5)},enumerable:!1},hexToRgb:{value(V){let z=/[a-f\d]{6}|[a-f\d]{3}/i.exec(V.toString(16));if(!z)return[0,0,0];let[H]=z;if(H.length===3)H=[...H].map((K)=>K+K).join("");let J=Number.parseInt(H,16);return[J>>16&255,J>>8&255,J&255]},enumerable:!1},hexToAnsi256:{value:(V)=>Q.rgbToAnsi256(...Q.hexToRgb(V)),enumerable:!1},ansi256ToAnsi:{value(V){if(V<8)return 30+V;if(V<16)return 90+(V-8);let z,H,J;if(V>=232)z=((V-232)*10+8)/255,H=z,J=z;else{V-=16;let G=V%36;z=Math.floor(V/36)/5,H=Math.floor(G/6)/5,J=G%6/5}let K=Math.max(z,H,J)*2;if(K===0)return 30;let X=30+(Math.round(J)<<2|Math.round(H)<<1|Math.round(z));if(K===2)X+=60;return X},enumerable:!1},rgbToAnsi:{value:(V,z,H)=>Q.ansi256ToAnsi(Q.rgbToAnsi256(V,z,H)),enumerable:!1},hexToAnsi:{value:(V)=>Q.ansi256ToAnsi(Q.hexToAnsi256(V)),enumerable:!1}}),Q}var i=g(),$=i;import P from"node:process";import a from"node:os";import F from"node:tty";function Z(q,V=globalThis.Deno?globalThis.Deno.args:P.argv){let z=q.startsWith("-")?"":q.length===1?"-":"--",H=V.indexOf(z+q),J=V.indexOf("--");return H!==-1&&(J===-1||H<J)}var{env:U}=P,w;if(Z("no-color")||Z("no-colors")||Z("color=false")||Z("color=never"))w=0;else if(Z("color")||Z("colors")||Z("color=true")||Z("color=always"))w=1;function n(){if("FORCE_COLOR"in U){if(U.FORCE_COLOR==="true")return 1;if(U.FORCE_COLOR==="false")return 0;return U.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(U.FORCE_COLOR,10),3)}}function t(q){if(q===0)return!1;return{level:q,hasBasic:!0,has256:q>=2,has16m:q>=3}}function r(q,{streamIsTTY:V,sniffFlags:z=!0}={}){let H=n();if(H!==void 0)w=H;let J=z?w:H;if(J===0)return 0;if(z){if(Z("color=16m")||Z("color=full")||Z("color=truecolor"))return 3;if(Z("color=256"))return 2}if("TF_BUILD"in U&&"AGENT_NAME"in U)return 1;if(q&&!V&&J===void 0)return 0;let K=J||0;if(U.TERM==="dumb")return K;if(P.platform==="win32"){let X=a.release().split(".");if(Number(X[0])>=10&&Number(X[2])>=10586)return Number(X[2])>=14931?3:2;return 1}if("CI"in U){if(["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some((X)=>(X in U)))return 3;if(["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some((X)=>(X in U))||U.CI_NAME==="codeship")return 1;return K}if("TEAMCITY_VERSION"in U)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(U.TEAMCITY_VERSION)?1:0;if(U.COLORTERM==="truecolor")return 3;if(U.TERM==="xterm-kitty")return 3;if(U.TERM==="xterm-ghostty")return 3;if(U.TERM==="wezterm")return 3;if("TERM_PROGRAM"in U){let X=Number.parseInt((U.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(U.TERM_PROGRAM){case"iTerm.app":return X>=3?3:2;case"Apple_Terminal":return 2}}if(/-256(color)?$/i.test(U.TERM))return 2;if(/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(U.TERM))return 1;if("COLORTERM"in U)return 1;return K}function _(q,V={}){let z=r(q,{streamIsTTY:q&&q.isTTY,...V});return t(z)}var o={stdout:_({isTTY:F.isatty(1)}),stderr:_({isTTY:F.isatty(2)})},b=o;function k(q,V,z){let H=q.indexOf(V);if(H===-1)return q;let J=V.length,K=0,X="";do X+=q.slice(K,H)+V+z,K=H+J,H=q.indexOf(V,K);while(H!==-1);return X+=q.slice(K),X}function C(q,V,z,H){let J=0,K="";do{let X=q[H-1]==="\r";K+=q.slice(J,X?H-1:H)+V+(X?`\r
2
- `:`
3
- `)+z,J=H+1,H=q.indexOf(`
4
- `,J)}while(H!==-1);return K+=q.slice(J),K}var{stdout:S,stderr:f}=b,N=Symbol("GENERATOR"),D=Symbol("STYLER"),B=Symbol("IS_EMPTY"),h=["ansi","ansi","ansi256","ansi16m"],O=Object.create(null),l=(q,V={})=>{if(V.level&&!(Number.isInteger(V.level)&&V.level>=0&&V.level<=3))throw Error("The `level` option should be an integer from 0 to 3");let z=S?S.level:0;q.level=V.level===void 0?z:V.level};var s=(q)=>{let V=(...z)=>z.join(" ");return l(V,q),Object.setPrototypeOf(V,L.prototype),V};function L(q){return s(q)}Object.setPrototypeOf(L.prototype,Function.prototype);for(let[q,V]of Object.entries($))O[q]={get(){let z=x(this,I(V.open,V.close,this[D]),this[B]);return Object.defineProperty(this,q,{value:z}),z}};O.visible={get(){let q=x(this,this[D],!0);return Object.defineProperty(this,"visible",{value:q}),q}};var Y=(q,V,z,...H)=>{if(q==="rgb"){if(V==="ansi16m")return $[z].ansi16m(...H);if(V==="ansi256")return $[z].ansi256($.rgbToAnsi256(...H));return $[z].ansi($.rgbToAnsi(...H))}if(q==="hex")return Y("rgb",V,z,...$.hexToRgb(...H));return $[z][q](...H)},e=["rgb","hex","ansi256"];for(let q of e){O[q]={get(){let{level:z}=this;return function(...H){let J=I(Y(q,h[z],"color",...H),$.color.close,this[D]);return x(this,J,this[B])}}};let V="bg"+q[0].toUpperCase()+q.slice(1);O[V]={get(){let{level:z}=this;return function(...H){let J=I(Y(q,h[z],"bgColor",...H),$.bgColor.close,this[D]);return x(this,J,this[B])}}}}var V1=Object.defineProperties(()=>{},{...O,level:{enumerable:!0,get(){return this[N].level},set(q){this[N].level=q}}}),I=(q,V,z)=>{let H,J;if(z===void 0)H=q,J=V;else H=z.openAll+q,J=V+z.closeAll;return{open:q,close:V,openAll:H,closeAll:J,parent:z}},x=(q,V,z)=>{let H=(...J)=>q1(H,J.length===1?""+J[0]:J.join(" "));return Object.setPrototypeOf(H,V1),H[N]=q,H[D]=V,H[B]=z,H},q1=(q,V)=>{if(q.level<=0||!V)return q[B]?"":V;let z=q[D];if(z===void 0)return V;let{openAll:H,closeAll:J}=z;if(V.includes("\x1B"))while(z!==void 0)V=k(V,z.close,z.open),z=z.parent;let K=V.indexOf(`
5
- `);if(K!==-1)V=C(V,J,H,K);return H+V+J};Object.defineProperties(L.prototype,O);var z1=L(),B1=L({level:f?f.level:0});var W=z1;async function H1(q,V){let z=V["default-model"];if(z)return z;try{return(await p(q,V))[0]?.id||null}catch{return null}}async function Y1(q){let V=process.cwd(),z=await u(V);if(z._tag==="Failure")return console.error(W.red("✗ Failed to load AI config")),null;let H=z.value,J=await v(V);if(J.length===0)return console.error(W.yellow(`
6
- ⚠️ No AI provider configured
7
- `)),console.error(W.dim(`Run: sylphx code (to configure AI)
8
- `)),null;let K=H.defaultProvider??J[0];if(!K)return console.error(W.yellow(`
9
- ⚠️ No provider configured
10
- `)),null;let X=H.providers?.[K];if(!X)return console.error(W.yellow(`
11
- ⚠️ Provider not configured
12
- `)),null;let G=m(K);if(!G.isConfigured(X))return console.error(W.yellow(`
13
- ⚠️ ${G.name} is not properly configured
14
- `)),console.error(W.dim(`Run: sylphx code (to configure AI)
15
- `)),null;let M=await y();if(q){let j=await M.getLastSession();if(j)return console.error(W.dim(`Continuing session: ${j.id}`)),console.error(W.dim(`Messages: ${j.messages.length}
16
- `)),j;console.error(W.yellow(`No previous session found, creating new one
17
- `))}let R=await H1(K,X);if(!R)return console.error(W.yellow(`
18
- ⚠️ No models available for this provider
19
- `)),null;return await M.createSession(K,R)}function I1(){console.error(W.red(`
20
- ✗ No text response received from model
21
- `)),console.error(W.yellow("The model may have called tools but did not generate a final text response.")),console.error(W.yellow(`This usually means:
22
- `)),console.error(W.dim(" • The current model does not fully support multi-step tool calling")),console.error(W.dim(` • Some models can call tools but cannot process results and respond
23
- `)),console.error(W.green("Recommended models with full tool support:")),console.error(W.green(" • anthropic/claude-3.5-sonnet")),console.error(W.green(" • anthropic/claude-3.5-haiku")),console.error(W.green(" • openai/gpt-4o")),console.error(W.green(` • google/gemini-2.0-flash-exp
24
- `)),console.error(W.dim("\uD83D\uDCA1 Tip: Ask questions that don't require tools, or switch to a model above")),console.error(W.dim("To configure: Run `sylphx code` (TUI mode) then type /provider\n"))}export{I1 as showModelToolSupportError,Y1 as getOrCreateSession,H1 as getDefaultModel};
25
- export{W as V,Y1 as W,I1 as X};
26
-
27
- //# debugId=36BEE0E4F2AF699364756E2164756E21
@@ -1,14 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../node_modules/chalk/source/vendor/ansi-styles/index.js", "../node_modules/chalk/source/vendor/supports-color/index.js", "../node_modules/chalk/source/utilities.js", "../node_modules/chalk/source/index.js", "../src/core/session-service.ts"],
4
- "sourcesContent": [
5
- "const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n",
6
- "import process from 'node:process';\nimport os from 'node:os';\nimport tty from 'node:tty';\n\n// From: https://github.com/sindresorhus/has-flag/blob/main/index.js\n/// function hasFlag(flag, argv = globalThis.Deno?.args ?? process.argv) {\nfunction hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process.argv) {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n}\n\nconst {env} = process;\n\nlet flagForceColor;\nif (\n\thasFlag('no-color')\n\t|| hasFlag('no-colors')\n\t|| hasFlag('color=false')\n\t|| hasFlag('color=never')\n) {\n\tflagForceColor = 0;\n} else if (\n\thasFlag('color')\n\t|| hasFlag('colors')\n\t|| hasFlag('color=true')\n\t|| hasFlag('color=always')\n) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3,\n\t};\n}\n\nfunction _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m')\n\t\t\t|| hasFlag('color=full')\n\t\t\t|| hasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// Check for Azure DevOps pipelines.\n\t// Has to be above the `!streamIsTTY` check.\n\tif ('TF_BUILD' in env && 'AGENT_NAME' in env) {\n\t\treturn 1;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10\n\t\t\t&& Number(osRelease[2]) >= 10_586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14_931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['GITHUB_ACTIONS', 'GITEA_ACTIONS', 'CIRCLECI'].some(key => key in env)) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (['TRAVIS', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-kitty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-ghostty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'wezterm') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app': {\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\t}\n\n\t\t\tcase 'Apple_Terminal': {\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nexport function createSupportsColor(stream, options = {}) {\n\tconst level = _supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options,\n\t});\n\n\treturn translateLevel(level);\n}\n\nconst supportsColor = {\n\tstdout: createSupportsColor({isTTY: tty.isatty(1)}),\n\tstderr: createSupportsColor({isTTY: tty.isatty(2)}),\n};\n\nexport default supportsColor;\n",
7
- "// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`.\nexport function stringReplaceAll(string, substring, replacer) {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.slice(endIndex, index) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n\nexport function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n",
8
- "import ansiStyles from '#ansi-styles';\nimport supportsColor from '#supports-color';\nimport { // eslint-disable-line import/order\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex,\n} from './utilities.js';\n\nconst {stdout: stdoutColor, stderr: stderrColor} = supportsColor;\n\nconst GENERATOR = Symbol('GENERATOR');\nconst STYLER = Symbol('STYLER');\nconst IS_EMPTY = Symbol('IS_EMPTY');\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m',\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nexport class Chalk {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = (...strings) => strings.join(' ');\n\tapplyOptions(chalk, options);\n\n\tObject.setPrototypeOf(chalk, createChalk.prototype);\n\n\treturn chalk;\n};\n\nfunction createChalk(options) {\n\treturn chalkFactory(options);\n}\n\nObject.setPrototypeOf(createChalk.prototype, Function.prototype);\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t},\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this[STYLER], true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t},\n};\n\nconst getModelAnsi = (model, level, type, ...arguments_) => {\n\tif (model === 'rgb') {\n\t\tif (level === 'ansi16m') {\n\t\t\treturn ansiStyles[type].ansi16m(...arguments_);\n\t\t}\n\n\t\tif (level === 'ansi256') {\n\t\t\treturn ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_));\n\t\t}\n\n\t\treturn ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_));\n\t}\n\n\tif (model === 'hex') {\n\t\treturn getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_));\n\t}\n\n\treturn ansiStyles[type][model](...arguments_);\n};\n\nconst usedModels = ['rgb', 'hex', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this[GENERATOR].level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis[GENERATOR].level = level;\n\t\t},\n\t},\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent,\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\t// Single argument is hot path, implicit coercion is faster than anything\n\t// eslint-disable-next-line no-implicit-coercion\n\tconst builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder[GENERATOR] = self;\n\tbuilder[STYLER] = _styler;\n\tbuilder[IS_EMPTY] = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self[IS_EMPTY] ? '' : string;\n\t}\n\n\tlet styler = self[STYLER];\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.includes('\\u001B')) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nObject.defineProperties(createChalk.prototype, styles);\n\nconst chalk = createChalk();\nexport const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});\n\nexport {\n\tmodifierNames,\n\tforegroundColorNames,\n\tbackgroundColorNames,\n\tcolorNames,\n\n\t// TODO: Remove these aliases in the next major version\n\tmodifierNames as modifiers,\n\tforegroundColorNames as foregroundColors,\n\tbackgroundColorNames as backgroundColors,\n\tcolorNames as colors,\n} from './vendor/ansi-styles/index.js';\n\nexport {\n\tstdoutColor as supportsColor,\n\tstderrColor as supportsColorStderr,\n};\n\nexport default chalk;\n",
9
- "/**\n * Session Service\n * Centralized session management for headless mode\n * Uses database for persistence\n */\n\nimport chalk from 'chalk';\nimport { loadAIConfig, getConfiguredProviders } from '../config/ai-config.js';\nimport type { ProviderId, ProviderConfig } from '../config/ai-config.js';\nimport type { Session } from '../types/session.types.js';\nimport { getProvider } from '../providers/index.js';\nimport { fetchModels } from '../utils/ai-model-fetcher.js';\nimport { getSessionRepository } from '../db/database.js';\n\n/**\n * Get default model for a provider\n * Priority: config default-model > first available model\n */\nexport async function getDefaultModel(providerId: ProviderId, providerConfig: ProviderConfig): Promise<string | null> {\n // Try config first\n const configModel = providerConfig['default-model'] as string | undefined;\n if (configModel) {\n return configModel;\n }\n\n // Fetch first available model\n try {\n const models = await fetchModels(providerId, providerConfig);\n return models[0]?.id || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Get or create session for headless mode\n */\nexport async function getOrCreateSession(continueSession: boolean): Promise<Session | null> {\n const cwd = process.cwd();\n const configResult = await loadAIConfig(cwd);\n\n if (configResult._tag === 'Failure') {\n console.error(chalk.red('✗ Failed to load AI config'));\n return null;\n }\n\n const config = configResult.value;\n const configuredProviders = await getConfiguredProviders(cwd);\n\n if (configuredProviders.length === 0) {\n console.error(chalk.yellow('\\n⚠️ No AI provider configured\\n'));\n console.error(chalk.dim('Run: sylphx code (to configure AI)\\n'));\n return null;\n }\n\n const providerId = config.defaultProvider ?? configuredProviders[0];\n if (!providerId) {\n console.error(chalk.yellow('\\n⚠️ No provider configured\\n'));\n return null;\n }\n\n const providerConfig = config.providers?.[providerId];\n if (!providerConfig) {\n console.error(chalk.yellow('\\n⚠️ Provider not configured\\n'));\n return null;\n }\n\n // Check if provider is properly configured\n const provider = getProvider(providerId);\n if (!provider.isConfigured(providerConfig)) {\n console.error(chalk.yellow(`\\n⚠️ ${provider.name} is not properly configured\\n`));\n console.error(chalk.dim('Run: sylphx code (to configure AI)\\n'));\n return null;\n }\n\n // Get session repository\n const repository = await getSessionRepository();\n\n // Try to continue last session\n if (continueSession) {\n const lastSession = await repository.getLastSession();\n if (lastSession) {\n console.error(chalk.dim(`Continuing session: ${lastSession.id}`));\n console.error(chalk.dim(`Messages: ${lastSession.messages.length}\\n`));\n return lastSession;\n }\n console.error(chalk.yellow('No previous session found, creating new one\\n'));\n }\n\n // Get default model (last used or first available)\n const modelName = await getDefaultModel(providerId, providerConfig);\n if (!modelName) {\n console.error(chalk.yellow('\\n⚠️ No models available for this provider\\n'));\n return null;\n }\n\n // Create new session in database\n return await repository.createSession(providerId, modelName);\n}\n\n/**\n * Show error message for models without tool support\n */\nexport function showModelToolSupportError(): void {\n console.error(chalk.red('\\n✗ No text response received from model\\n'));\n console.error(\n chalk.yellow('The model may have called tools but did not generate a final text response.')\n );\n console.error(\n chalk.yellow('This usually means:\\n')\n );\n console.error(chalk.dim(' • The current model does not fully support multi-step tool calling'));\n console.error(chalk.dim(' • Some models can call tools but cannot process results and respond\\n'));\n console.error(chalk.green('Recommended models with full tool support:'));\n console.error(chalk.green(' • anthropic/claude-3.5-sonnet'));\n console.error(chalk.green(' • anthropic/claude-3.5-haiku'));\n console.error(chalk.green(' • openai/gpt-4o'));\n console.error(chalk.green(' • google/gemini-2.0-flash-exp\\n'));\n console.error(chalk.dim('💡 Tip: Ask questions that don\\'t require tools, or switch to a model above'));\n console.error(chalk.dim('To configure: Run `sylphx code` (TUI mode) then type /provider\\n'));\n}\n"
10
- ],
11
- "mappings": "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",
12
- "debugId": "36BEE0E4F2AF699364756E2164756E21",
13
- "names": []
14
- }
@@ -1,3 +0,0 @@
1
- import{a as M}from"./chunk-waemzsf4.js";import{Ea as J,Fa as V,Ga as X}from"./chunk-kn908zkk.js";import"./chunk-3m9whg4q.js";var j=async(q)=>{return{sessionCommand:`sylphx-flow hook --type session --target ${q}`,messageCommand:`sylphx-flow hook --type message --target ${q}`,notificationCommand:`sylphx-flow hook --type notification --target ${q}`}},B={sessionCommand:"sylphx-flow hook --type session --target claude-code",messageCommand:"sylphx-flow hook --type message --target claude-code",notificationCommand:"sylphx-flow hook --type notification --target claude-code"},Z=(q)=>{return X(()=>JSON.parse(q),(v)=>M("Failed to parse Claude Code settings",{cause:v instanceof Error?v:void 0}))},Y=(q=B)=>{let v=q.sessionCommand||B.sessionCommand,G=q.messageCommand||B.messageCommand,N=q.notificationCommand||B.notificationCommand;return{SessionStart:[{hooks:[{type:"command",command:v}]}],UserPromptSubmit:[{hooks:[{type:"command",command:G}]}],Notification:[{matcher:"",hooks:[{type:"command",command:N}]}]}},$=(q,v=B)=>{let G=Y(v);return{...q,hooks:{...q.hooks||{},...G}}},W=(q=B)=>{return{hooks:Y(q)}},Q=(q)=>{return JSON.stringify(q,null,2)},y=()=>{return"Claude Code hooks configured: SessionStart (static info) + UserPromptSubmit (dynamic info)"},R=(q,v=B)=>{if(q===null||q.trim()===""){let P=W(v);return J(Q(P))}let G=Z(q);if(G._tag==="Failure"){let P=W(v);return J(Q(P))}let N=$(G.value,v);return J(Q(N))},z=(q)=>{if(q.sessionCommand!==void 0&&q.sessionCommand.trim()==="")return V(M("Session command cannot be empty"));if(q.messageCommand!==void 0&&q.messageCommand.trim()==="")return V(M("Message command cannot be empty"));return J(q)};export{z as validateHookConfig,Q as serializeSettings,R as processSettings,Z as parseSettings,$ as mergeSettings,y as getSuccessMessage,j as generateHookCommands,W as createSettings,Y as buildHookConfiguration,B as DEFAULT_HOOKS};
2
-
3
- //# debugId=4387D896057D481F64756E2164756E21
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/targets/functional/claude-code-logic.ts"],
4
- "sourcesContent": [
5
- "/**\n * Business logic for Claude Code target setup\n * Pure functions separated from I/O\n *\n * DESIGN RATIONALE:\n * - Business logic testable without file system\n * - Pure functions for settings transformation\n * - Side effects isolated\n * - Clear separation of concerns\n */\n\nimport type { ConfigError } from '../../core/functional/error-types.js';\nimport { configError } from '../../core/functional/error-types.js';\nimport type { Result } from '../../core/functional/result.js';\nimport { failure, success, tryCatch } from '../../core/functional/result.js';\n\n/**\n * Claude Code settings structure\n */\nexport interface ClaudeCodeSettings {\n hooks?: Record<\n string,\n Array<{\n hooks: Array<{\n type: string;\n command: string;\n }>;\n }>\n >;\n [key: string]: unknown;\n}\n\nexport interface HookConfig {\n sessionCommand?: string;\n messageCommand?: string;\n notificationCommand?: string;\n}\n\n/**\n * Generate hook commands for the target\n * Uses global sylphx-flow command (users must install globally first)\n */\nexport const generateHookCommands = async (targetId: string): Promise<HookConfig> => {\n return {\n sessionCommand: `sylphx-flow hook --type session --target ${targetId}`,\n messageCommand: `sylphx-flow hook --type message --target ${targetId}`,\n notificationCommand: `sylphx-flow hook --type notification --target ${targetId}`,\n };\n};\n\n/**\n * Default hook commands (fallback)\n * Now using unified hook command for all content (rules, output styles, system info)\n */\nexport const DEFAULT_HOOKS: HookConfig = {\n sessionCommand: 'sylphx-flow hook --type session --target claude-code',\n messageCommand: 'sylphx-flow hook --type message --target claude-code',\n notificationCommand: 'sylphx-flow hook --type notification --target claude-code',\n};\n\n/**\n * Parse JSON settings (pure)\n */\nexport const parseSettings = (content: string): Result<ClaudeCodeSettings, ConfigError> => {\n return tryCatch(\n () => JSON.parse(content) as ClaudeCodeSettings,\n (error) =>\n configError('Failed to parse Claude Code settings', {\n cause: error instanceof Error ? error : undefined,\n })\n );\n};\n\n/**\n * Build hook configuration (pure)\n */\nexport const buildHookConfiguration = (\n config: HookConfig = DEFAULT_HOOKS\n): ClaudeCodeSettings['hooks'] => {\n const sessionCommand = config.sessionCommand || DEFAULT_HOOKS.sessionCommand!;\n const messageCommand = config.messageCommand || DEFAULT_HOOKS.messageCommand!;\n const notificationCommand = config.notificationCommand || DEFAULT_HOOKS.notificationCommand!;\n\n return {\n SessionStart: [\n {\n hooks: [\n {\n type: 'command',\n command: sessionCommand,\n },\n ],\n },\n ],\n UserPromptSubmit: [\n {\n hooks: [\n {\n type: 'command',\n command: messageCommand,\n },\n ],\n },\n ],\n Notification: [\n {\n matcher: '',\n hooks: [\n {\n type: 'command',\n command: notificationCommand,\n },\n ],\n },\n ],\n };\n};\n\n/**\n * Merge settings with new hooks (pure)\n */\nexport const mergeSettings = (\n existingSettings: ClaudeCodeSettings,\n hookConfig: HookConfig = DEFAULT_HOOKS\n): ClaudeCodeSettings => {\n const newHooks = buildHookConfiguration(hookConfig);\n\n return {\n ...existingSettings,\n hooks: {\n ...(existingSettings.hooks || {}),\n ...newHooks,\n },\n };\n};\n\n/**\n * Create settings with hooks (pure)\n */\nexport const createSettings = (hookConfig: HookConfig = DEFAULT_HOOKS): ClaudeCodeSettings => {\n return {\n hooks: buildHookConfiguration(hookConfig),\n };\n};\n\n/**\n * Serialize settings to JSON (pure)\n */\nexport const serializeSettings = (settings: ClaudeCodeSettings): string => {\n return JSON.stringify(settings, null, 2);\n};\n\n/**\n * Get success message (pure)\n */\nexport const getSuccessMessage = (): string => {\n return 'Claude Code hooks configured: SessionStart (static info) + UserPromptSubmit (dynamic info)';\n};\n\n/**\n * Process settings: parse existing or create new, merge hooks, serialize (pure)\n */\nexport const processSettings = (\n existingContent: string | null,\n hookConfig: HookConfig = DEFAULT_HOOKS\n): Result<string, ConfigError> => {\n if (existingContent === null || existingContent.trim() === '') {\n // No existing settings, create new\n const settings = createSettings(hookConfig);\n return success(serializeSettings(settings));\n }\n\n // Parse existing settings\n const parseResult = parseSettings(existingContent);\n if (parseResult._tag === 'Failure') {\n // If parsing fails, create new settings\n const settings = createSettings(hookConfig);\n return success(serializeSettings(settings));\n }\n\n // Merge with existing\n const merged = mergeSettings(parseResult.value, hookConfig);\n return success(serializeSettings(merged));\n};\n\n/**\n * Validate hook configuration (pure)\n */\nexport const validateHookConfig = (config: HookConfig): Result<HookConfig, ConfigError> => {\n if (config.sessionCommand !== undefined && config.sessionCommand.trim() === '') {\n return failure(configError('Session command cannot be empty'));\n }\n\n if (config.messageCommand !== undefined && config.messageCommand.trim() === '') {\n return failure(configError('Message command cannot be empty'));\n }\n\n return success(config);\n};\n"
6
- ],
7
- "mappings": "yIA0CO,FAAM,JAAuB,MAAO,IAA0C,CACnF,MAAO,CACL,eAAgB,4CAA4C,IAC5D,eAAgB,4CAA4C,IAC5D,oBAAqB,iDAAiD,GACxE,GAOW,EAA4B,CACvC,eAAgB,uDAChB,eAAgB,uDAChB,oBAAqB,2DACvB,EAKa,EAAgB,CAAC,IAA6D,CACzF,OAAO,EACL,IAAM,KAAK,MAAM,CAAO,EACxB,CAAC,IACC,EAAY,uCAAwC,CAClD,MAAO,aAAiB,MAAQ,EAAQ,MAC1C,CAAC,CACL,GAMW,EAAyB,CACpC,EAAqB,IACW,CAChC,IAAM,EAAiB,EAAO,gBAAkB,EAAc,eACxD,EAAiB,EAAO,gBAAkB,EAAc,eACxD,EAAsB,EAAO,qBAAuB,EAAc,oBAExE,MAAO,CACL,aAAc,CACZ,CACE,MAAO,CACL,CACE,KAAM,UACN,QAAS,CACX,CACF,CACF,CACF,EACA,iBAAkB,CAChB,CACE,MAAO,CACL,CACE,KAAM,UACN,QAAS,CACX,CACF,CACF,CACF,EACA,aAAc,CACZ,CACE,QAAS,GACT,MAAO,CACL,CACE,KAAM,UACN,QAAS,CACX,CACF,CACF,CACF,CACF,GAMW,EAAgB,CAC3B,EACA,EAAyB,IACF,CACvB,IAAM,EAAW,EAAuB,CAAU,EAElD,MAAO,IACF,EACH,MAAO,IACD,EAAiB,OAAS,CAAC,KAC5B,CACL,CACF,GAMW,EAAiB,CAAC,EAAyB,IAAsC,CAC5F,MAAO,CACL,MAAO,EAAuB,CAAU,CAC1C,GAMW,EAAoB,CAAC,IAAyC,CACzE,OAAO,KAAK,UAAU,EAAU,KAAM,CAAC,GAM5B,EAAoB,IAAc,CAC7C,MAAO,8FAMI,EAAkB,CAC7B,EACA,EAAyB,IACO,CAChC,GAAI,IAAoB,MAAQ,EAAgB,KAAK,IAAM,GAAI,CAE7D,IAAM,EAAW,EAAe,CAAU,EAC1C,OAAO,EAAQ,EAAkB,CAAQ,CAAC,EAI5C,IAAM,EAAc,EAAc,CAAe,EACjD,GAAI,EAAY,OAAS,UAAW,CAElC,IAAM,EAAW,EAAe,CAAU,EAC1C,OAAO,EAAQ,EAAkB,CAAQ,CAAC,EAI5C,IAAM,EAAS,EAAc,EAAY,MAAO,CAAU,EAC1D,OAAO,EAAQ,EAAkB,CAAM,CAAC,GAM7B,EAAqB,CAAC,IAAwD,CACzF,GAAI,EAAO,iBAAmB,QAAa,EAAO,eAAe,KAAK,IAAM,GAC1E,OAAO,EAAQ,EAAY,iCAAiC,CAAC,EAG/D,GAAI,EAAO,iBAAmB,QAAa,EAAO,eAAe,KAAK,IAAM,GAC1E,OAAO,EAAQ,EAAY,iCAAiC,CAAC,EAG/D,OAAO,EAAQ,CAAM",
8
- "debugId": "4387D896057D481F64756E2164756E21",
9
- "names": []
10
- }