@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,105 +0,0 @@
1
- import{Tb as U,Wb as X}from"./chunk-3m9whg4q.js";async function Y$($,b,q){let{AI_PROVIDERS:G}=await import("./chunk-67n29s4q.js"),W=q.map((z)=>({label:z.label,value:z.key}));$.sendMessage(`Configure ${G[b].name} - Select setting:`);let H=await $.waitForInput({type:"selection",questions:[{id:"key",question:"Which setting do you want to configure?",options:W}]});return(typeof H==="object"&&!Array.isArray(H)?H.key:"")||null}async function Z$($,b,q){let G;if(q?.type==="boolean"){$.sendMessage(`Select value for ${b}:`);let W=await $.waitForInput({type:"selection",questions:[{id:"value",question:`${q.label}:`,options:[{label:"true",value:"true"},{label:"false",value:"false"}]}]});G=typeof W==="object"&&!Array.isArray(W)?W.value:""}else{$.sendMessage(`Enter value for ${b}:`);let W=await $.waitForInput({type:"text",placeholder:`Enter ${b}...`});G=typeof W==="string"?W:""}return G||null}async function u($,b,q,G,W){let{AI_PROVIDERS:H}=await import("./chunk-67n29s4q.js"),J=$.getConfig(),z={...J,providers:{...J.providers,[b]:{...J.providers?.[b],[q]:G}}};if(!J?.defaultProvider)z.defaultProvider=b;$.setAIConfig(z),await $.saveConfig(z);let h=W.find((Q)=>Q.key===q)?.secret?"***":G;return`Set ${H[b].name} ${q} to: ${h}`}async function w($,b){let{getProvider:q}=await import("./chunk-xs370t8p.js"),W=q(b).getConfigSchema(),H=await Y$($,b,W);if(!H)return"Configuration cancelled.";let J=W.find((F)=>F.key===H),z=await Z$($,H,J);if(!z)return"Value is required.";return await u($,b,H,z,W)}async function S($,b){return await w($,b)}async function h$($){let{AI_PROVIDERS:b}=await import("./chunk-67n29s4q.js"),{getProvider:q}=await import("./chunk-xs370t8p.js"),G=$.getConfig();return Object.values(b).map((W)=>{let H=!1;try{let J=q(W.id),z=G?.providers?.[W.id];H=z?J.isConfigured(z):!1}catch{}return{label:`${W.name} ${H?"✓":""}`,value:W.id}})}async function p($,b,q){let G=await h$($);$.sendMessage(b);let W=await $.waitForInput({type:"selection",questions:[{id:"provider",question:q,options:G}]});return(typeof W==="object"&&!Array.isArray(W)?W.provider:"")||null}async function K$($,b,q=!0){let{AI_PROVIDERS:G}=await import("./chunk-67n29s4q.js"),{getProvider:W}=await import("./chunk-xs370t8p.js"),H=$.getConfig(),J=W(b),z=H?.providers?.[b];if(z&&J.isConfigured(z))return{success:!0,config:z};if(!q)return{success:!1,message:`${G[b].name} is not configured. Use: /provider set ${b}`};$.sendMessage(`${G[b].name} is not configured yet.`);let F=await $.waitForInput({type:"selection",questions:[{id:"configure",question:"Do you want to configure it now?",options:[{label:"Yes, configure now",value:"yes"},{label:"No, cancel",value:"no"}]}]});if(!(typeof F==="object"&&!Array.isArray(F)?F.configure==="yes":!1))return{success:!1,message:"Cancelled. You can configure later using: /provider set"};let Q=await S($,b),Z=$.getConfig()?.providers?.[b];if(!Z||!J.isConfigured(Z))return{success:!1,message:`${Q}
2
-
3
- Provider still not fully configured. Please continue configuration with: /provider set ${b}`};return $.sendMessage(Q),{success:!0,config:Z}}async function M$($,b,q){let{AI_PROVIDERS:G}=await import("./chunk-67n29s4q.js"),H={...$.getConfig(),defaultProvider:b},{getDefaultModel:J}=await import("./chunk-7yyg008s.js"),z=await J(b,q);if(!z)return`Failed to get default model for ${G[b].name}`;H.providers={...H.providers,[b]:{...q,"default-model":z}},$.setAIConfig(H),await $.saveConfig(H),$.setUISelectedProvider(b),$.setUISelectedModel(z);let F=$.getCurrentSessionId();if(F)$.updateSessionProvider(F,b,z);else $.createSession(b,z);return`Now using ${G[b].name} with model: ${z}`}async function P($,b,q=!0){let G=await K$($,b,q);if(!G.success)return G.message;return await M$($,b,G.config)}var N$={id:"provider",label:"/provider",description:"Manage AI providers",args:[{name:"action",description:'Action: "use" or "set"',required:!1,loadOptions:async($)=>{return[{id:"use",label:"use",value:"use"},{id:"set",label:"set",value:"set"}]}},{name:"provider-name",description:"Provider name (anthropic, openai, google, openrouter)",required:!1,loadOptions:async($)=>{let{AI_PROVIDERS:b}=await import("./chunk-67n29s4q.js");return Object.values(b).map((q)=>({id:q.id,label:q.name,value:q.id}))}},{name:"key",description:"Setting key (for set action)",required:!1,loadOptions:async($)=>{let b=$[1];if(!b)return[];try{let{getProvider:q}=await import("./chunk-xs370t8p.js");return q(b).getConfigSchema().map((H)=>({id:H.key,label:H.label,value:H.key}))}catch(q){return[]}}},{name:"value",description:"Setting value (for set action)",required:!1,loadOptions:async($)=>{let b=$[1],q=$[2];if(!b||!q)return[];try{let{getProvider:G}=await import("./chunk-xs370t8p.js");if(G(b).getConfigSchema().find((z)=>z.key===q)?.type==="boolean")return[{id:"true",label:"true",value:"true"},{id:"false",label:"false",value:"false"}];return[]}catch(G){return[]}}}],execute:async($)=>{let{AI_PROVIDERS:b}=await import("./chunk-67n29s4q.js");if($.args.length===0){$.sendMessage("What do you want to do?");let q=await $.waitForInput({type:"selection",questions:[{id:"action",question:"Select action:",options:[{label:"Use a provider",value:"use"},{label:"Configure a provider",value:"set"}]}]}),G=typeof q==="object"&&!Array.isArray(q)?q.action:"";if(!G)return"Action cancelled.";let W=await p($,G==="use"?"Which provider do you want to use?":"Which provider do you want to configure?",G==="use"?"Select provider to use:":"Select provider to configure:");if(!W)return"Provider selection cancelled.";if(G==="use")return await P($,W,!0);else return await S($,W)}if($.args.length===1&&$.args[0]==="use"){let q=await p($,"Which provider do you want to use?","Select provider:");if(!q)return"Provider selection cancelled.";return await P($,q,!0)}if($.args.length===2&&$.args[0]==="use"){let q=$.args[1];if(!(q in b))return`Invalid provider: ${q}. Available: ${Object.keys(b).join(", ")}`;return await P($,q,!1)}if($.args.length===1&&$.args[0]==="set"){let{AI_PROVIDERS:q}=await import("./chunk-67n29s4q.js"),G=Object.values(q).map((J)=>({label:J.name,value:J.id}));$.sendMessage("Which provider do you want to configure?");let W=await $.waitForInput({type:"selection",questions:[{id:"provider",question:"Select provider:",options:G}]}),H=typeof W==="object"&&!Array.isArray(W)?W.provider:"";if(!H)return"Provider selection cancelled.";return await w($,H)}if($.args.length===2&&$.args[0]==="set"){let q=$.args[1];if(!(q in b))return`Invalid provider: ${q}. Available: ${Object.keys(b).join(", ")}`;return await w($,q)}if($.args.length>=4&&$.args[0]==="set"){let q=$.args[1],G=$.args[2],W=$.args.slice(3).join(" ");if(!(q in b))return`Invalid provider: ${q}. Available: ${Object.keys(b).join(", ")}`;let{getProvider:H}=await import("./chunk-xs370t8p.js"),z=H(q).getConfigSchema(),F=z.map((h)=>h.key);if(!F.includes(G))return`Invalid key: ${G}. Valid keys for ${q}: ${F.join(", ")}`;return await u($,q,G,W,z)}return`Usage:
4
- /provider - Select action and provider
5
- /provider use - Select provider to use
6
- /provider use [name] - Switch to provider
7
- /provider set - Configure a provider
8
- /provider set [name] - Configure specific provider
9
- /provider set [name] [key] [value] - Set provider config directly`}},l=N$;var L$={id:"model",label:"/model",description:"Switch AI model",args:[{name:"model-name",description:"Model to switch to",required:!1,loadOptions:async($,b)=>{try{let q=b?.getConfig();if(!q?.providers)return[];let W=b?.getCurrentSession()?.provider||q.defaultProvider;if(!W)return[];let H=q.providers[W];if(!H)return[];try{let{fetchModels:J}=await import("./chunk-nke51f3c.js");return(await J(W,H)).map((F)=>({id:F.id,label:F.name,value:F.id}))}catch(J){if(b)b.addLog(`Failed to fetch models for ${W}: ${J instanceof Error?J.message:String(J)}`);return[]}}catch(q){if(b)b.addLog(`Error loading models: ${q instanceof Error?q.message:String(q)}`);return[]}}}],execute:async($)=>{let b;if($.args.length===0)try{let z=$.getConfig();if(!z?.providers)return"No providers configured. Please configure a provider first.";let h=$.getCurrentSession()?.provider||z.defaultProvider;if(!h)return"No provider selected. Use /provider to select a provider first.";let Q=z.providers[h];if(!Q)return`Provider ${h} is not configured.`;let K=[];try{let{fetchModels:L}=await import("./chunk-nke51f3c.js"),M=await L(h,Q);K=M.map((D)=>({label:D.name,value:D.id})),$.addLog(`Loaded ${M.length} models from ${h}`)}catch(L){let M=L instanceof Error?L.message:String(L);return $.addLog(`Failed to fetch models for ${h}: ${M}`),`Failed to load models from ${h}: ${M}`}if(K.length===0)return`No models available for ${h}`;$.sendMessage("Which model do you want to use?");let Z=await $.waitForInput({type:"selection",questions:[{id:"model",question:"Which model do you want to use?",options:K}]});b=typeof Z==="object"&&!Array.isArray(Z)?Z.model:""}catch(z){return`Failed to load models: ${z instanceof Error?z.message:String(z)}`}else b=$.args[0];let q=$.getCurrentSession(),G=$.getConfig(),W=q?.provider||G?.defaultProvider;if(!W)return"No provider configured. Please configure a provider first.";let H={...G,defaultModel:b,providers:{...G.providers,[W]:{...G.providers?.[W],"default-model":b}}};$.setAIConfig(H),await $.saveConfig(H);let J=$.getCurrentSessionId();if(J)$.updateSessionModel(J,b);else $.createSession(W,b);return`Switched to model: ${b}`}},I=L$;var V$={id:"logs",label:"/logs",description:"View debug logs",execute:async($)=>{return $.navigateTo("logs"),"Opening debug logs..."}},v=V$;var j$={id:"help",label:"/help",description:"Show available commands",execute:async($)=>{return`Available commands:
10
- ${$.getCommands().map((G)=>{let W=G.args?` ${G.args.map((H)=>`[${H.name}]`).join(" ")}`:"";return`${G.label}${W} - ${G.description}`}).join(`
11
- `)}`}},m=j$;var O$={id:"survey",label:"/survey",description:"Test multi-question selection (demo)",execute:async($)=>{$.sendMessage("Let me ask you a few questions...");let b=await $.waitForInput({type:"selection",questions:[{id:"language",question:"What is your favorite programming language?",options:[{label:"TypeScript"},{label:"JavaScript"},{label:"Python"},{label:"Rust"},{label:"Go"}]},{id:"framework",question:"Which framework do you prefer?",options:[{label:"React"},{label:"Vue"},{label:"Angular"},{label:"Svelte"},{label:"Solid"}]},{id:"editor",question:"What is your favorite code editor?",options:[{label:"Visual Studio Code"},{label:"Vim/Neovim"},{label:"Emacs"},{label:"Sublime Text"},{label:"Atom"}]}]});if(typeof b==="object"&&!Array.isArray(b))return`Survey completed! Your answers: ${Object.entries(b).map(([G,W])=>`${G}: ${W}`).join(", ")}`;return"Survey cancelled."}},g=O$;var _$={id:"context",label:"/context",description:"Display context window usage and token breakdown",execute:async($)=>{let{countTokens:b,formatTokenCount:q}=await import("./chunk-q5gqgs0p.js"),{getSystemPrompt:G}=await import("./chunk-3qxj0zy3.js"),{getAISDKTools:W}=await import("./chunk-1e8xf3f6.js"),H=$.getCurrentSession();if(!H)return"No active session. Start chatting first to see context usage.";let J=H.model,F=((Y)=>{if(Y.includes("gpt-4")){if(Y.includes("32k")||Y.includes("turbo"))return 128000;if(Y.includes("vision"))return 128000;return 8192}if(Y.includes("gpt-3.5")){if(Y.includes("16k"))return 16385;return 4096}if(Y.includes("claude-3")){if(Y.includes("opus"))return 200000;if(Y.includes("sonnet"))return 200000;if(Y.includes("haiku"))return 200000}return 200000})(J);$.addLog(`[Context] Calculating token counts for ${J} (limit: ${q(F)})...`);let h=G(),Q=await b(h,J),{getEnabledRulesContent:K}=await import("./chunk-qpej66sh.js"),{getCurrentSystemPrompt:Z}=await import("./chunk-n8vzewr3.js"),L="You are Sylphx, an AI development assistant.",M={};try{M["Base prompt"]=await b(L,J);let Y=K();if(Y)M.Rules=await b(Y,J);let N=Z();M["Agent prompt"]=await b(N,J)}catch(Y){$.addLog(`[Context] Failed to calculate system prompt breakdown: ${Y}`)}let D=W(),A={},V=0;for(let[Y,N]of Object.entries(D)){let j={name:Y,description:N.description||"",parameters:N.parameters||{}},O=JSON.stringify(j,null,0),T=await b(O,J);A[Y]=T,V+=T}let y=0;for(let Y of H.messages){let N=Y.content;if(Y.attachments&&Y.attachments.length>0)try{let{readFile:O}=await import("node:fs/promises"),C=(await Promise.all(Y.attachments.map(async(_)=>{try{let k=await O(_.path,"utf8");return{path:_.relativePath,content:k}}catch{return{path:_.relativePath,content:"[Error reading file]"}}}))).map((_)=>`
12
-
13
- <file path="${_.path}">
14
- ${_.content}
15
- </file>`).join("");N+=C}catch(O){console.warn("[Context] Failed to read attachments for token count:",O)}let j=await b(N,J);y+=j}let E=Q+V+y,B=F-E,R=Math.floor(F*0.225),f=B-R,e=(E/F*100).toFixed(1),$$=(Q/F*100).toFixed(1),b$=(V/F*100).toFixed(1),q$=(y/F*100).toFixed(1),W$=(f/F*100).toFixed(1),G$=(R/F*100).toFixed(1),H$=()=>{let N=Math.floor(Q/F*30),j=Math.floor(V/F*30),O=Math.floor(y/F*30),C=30-(N+j+O),_="█".repeat(N)+"░".repeat(30-N),k="░".repeat(N)+"█".repeat(j)+"░".repeat(30-N-j),X$="░".repeat(N+j)+"█".repeat(O)+"░".repeat(C);return[_,k,X$]},[z$,F$,J$]=H$(),Q$=Object.entries(A).sort((Y,N)=>N[1]-Y[1]).map(([Y,N])=>` ${Y}: ${q(N)} tokens`).join(`
16
- `),U$=Object.entries(M).map(([Y,N])=>` ${Y}: ${q(N)} tokens`).join(`
17
- `);return`
18
- Context Usage: ${q(E)}/${q(F)} tokens (${e}%)
19
- Model: ${J}
20
-
21
- Visual Breakdown:
22
- ${z$} System prompt: ${q(Q)} (${$$}%)
23
- ${F$} Tools: ${q(V)} (${b$}%)
24
- ${J$} Messages: ${q(y)} (${q$}%)
25
-
26
- Available Space:
27
- • Free: ${q(f)} tokens (${W$}%)
28
- • Buffer: ${q(R)} tokens (${G$}%)
29
-
30
- System Prompt Breakdown:
31
- ${U$}
32
-
33
- System Tools (${Object.keys(D).length} total):
34
- ${Q$}
35
- `.trim()}},a=_$;var D$={id:"sessions",label:"/sessions",description:"View and switch between chat sessions",execute:async($)=>{let{formatSessionDisplay:b}=await import("./chunk-wnhhwtsy.js"),q=$.getSessions();if(q.length===0)return"No sessions available. Start chatting to create a session.";let G=$.getCurrentSessionId(),W=[...q].sort((Q,K)=>{let Z=K.updated-Q.updated;if(Z!==0)return Z;return K.created-Q.created}),H=W.map((Q)=>{let K=Q.id===G,Z=b(Q.title,Q.created);return{label:K?`${Z} (current)`:Z,value:Q.id}});$.sendMessage("Select a session to switch to:");let J=await $.waitForInput({type:"selection",questions:[{id:"session",question:"Which session do you want to switch to?",options:H}]}),z=typeof J==="object"&&!Array.isArray(J)?J.session:"";if(!z)return"Session selection cancelled.";$.setCurrentSession(z);let F=W.find((Q)=>Q.id===z);return`Switched to session: ${F?b(F.title,F.created):"Unknown session"}`}},x=D$;var B$={id:"new",label:"/new",description:"Create a new chat session",execute:async($)=>{let b=$.getConfig();if(!b?.defaultProvider||!b?.defaultModel)return"No AI provider configured. Use /provider to configure a provider first.";let q=$.createSession(b.defaultProvider,b.defaultModel);return $.setCurrentSession(q),`Created new chat session with ${b.defaultProvider} (${b.defaultModel})`}},c=B$;var y$={id:"bashes",label:"/bashes",description:"Manage background bash processes",execute:async($)=>{let{bashManager:b}=await import("./chunk-mw13a082.js"),q=b.list();if(q.length===0)return"No background bash processes found.";let G=q.map((F)=>{let h=F.isRunning?"[*] Running":"[x] Completed",Q=Math.floor(F.duration/1000),K=Q>60?`${Math.floor(Q/60)}m ${Q%60}s`:`${Q}s`;return{label:`${h} [${K}] ${F.command}`,value:F.id}});$.sendMessage(`Found ${q.length} background bash process${q.length!==1?"es":""}:`);let W=await $.waitForInput({type:"selection",questions:[{id:"action",question:"What do you want to do?",options:[{label:"View details",value:"view"},{label:"Kill a process",value:"kill"},{label:"Cancel",value:"cancel"}]}]}),H=typeof W==="object"&&!Array.isArray(W)?W.action:"";if(!H||H==="cancel")return"Cancelled.";$.sendMessage("Select a process:");let J=await $.waitForInput({type:"selection",questions:[{id:"process",question:"Which process?",options:G}]}),z=typeof J==="object"&&!Array.isArray(J)?J.process:"";if(!z)return"No process selected.";if(H==="view"){let F=b.getOutput(z);if(!F)return"Process not found.";let h=F.isRunning?"Running":`Completed (exit code: ${F.exitCode})`,Q=Math.floor(F.duration/1000),K=`
36
- Process: ${z}
37
- Command: ${F.command}
38
- Status: ${h}
39
- Duration: ${Q}s
40
-
41
- === stdout ===
42
- ${F.stdout||"(empty)"}
43
- `;if(F.stderr)K+=`
44
- === stderr ===
45
- ${F.stderr}`;return K.trim()}if(H==="kill"){if(!b.kill(z))return"Failed to kill process (not found).";return`Sent termination signal to process ${z}`}return"Unknown action."}},i=y$;var E$={id:"agent",label:"/agent",description:"Switch between AI agents with different system prompts",args:[{name:"agent-name",description:"Agent to switch to (coder, planner, etc.)",required:!1,loadOptions:async($)=>{let{getAllAgents:b}=await import("./chunk-n8vzewr3.js");return b().map((G)=>({id:G.id,label:`${G.metadata.name} - ${G.metadata.description}`,value:G.id}))}}],execute:async($)=>{let{getAllAgents:b,getCurrentAgent:q,switchAgent:G}=await import("./chunk-n8vzewr3.js"),W;if($.args.length===0){let F=b(),h=q();if(F.length===0)return"No agents available.";let Q=F.map((Z)=>{return{label:Z.id===h.id?`${Z.metadata.name} (current) - ${Z.metadata.description}`:`${Z.metadata.name} - ${Z.metadata.description}`,value:Z.id}});$.sendMessage("Which agent do you want to use?");let K=await $.waitForInput({type:"selection",questions:[{id:"agent",question:"Select agent:",options:Q}]});if(W=typeof K==="object"&&!Array.isArray(K)?K.agent:"",!W)return"Agent selection cancelled."}else W=$.args[0];if(!G(W))return`Agent not found: ${W}. Use /agent to see available agents.`;let{getAgentById:J}=await import("./chunk-n8vzewr3.js"),z=J(W);if(!z)return"Failed to get agent details.";return`Switched to agent: ${z.metadata.name}
46
- ${z.metadata.description}`}},s=E$;var R$={id:"rules",label:"/rules",description:"Select enabled shared system prompt rules",execute:async($)=>{let{getAllRules:b,getEnabledRuleIds:q,setEnabledRules:G}=await import("./chunk-qpej66sh.js"),W=b(),H=q();if(W.length===0)return"No rules available.";let J=W.map((M)=>({label:`${M.metadata.name} - ${M.metadata.description}`,value:M.id}));$.sendMessage(`Select rules to enable (currently ${H.length} enabled):`);let z=await $.waitForInput({type:"selection",questions:[{id:"rules",question:"Select all rules you want to enable:",options:J,multiSelect:!0,preSelected:H}]}),F=typeof z==="object"&&!Array.isArray(z)?Array.isArray(z.rules)?z.rules:[]:[];if(!Array.isArray(F))return"Rule selection cancelled.";if(!G(F))return"Failed to update rules.";let Q=F.length,K=W.length-Q,L=W.filter((M)=>F.includes(M.id)).map((M)=>` • ${M.metadata.name}`).join(`
47
- `);return`Updated rules configuration:
48
- ${Q} enabled, ${K} disabled
49
-
50
- Enabled rules:
51
- ${L||" (none)"}`}},d=R$;var w$={id:"compact",label:"/compact",description:"Summarize current session and create a new session with the summary",execute:async($)=>{let b=$.getCurrentSession();if(!b)return"No active session to compact.";if(b.messages.length===0)return"Current session has no messages to compact.";let q=$.getConfig();if(!q?.defaultProvider||!q?.defaultModel)return"No AI provider configured. Use /provider to configure a provider first.";$.sendMessage("Analyzing conversation and creating detailed summary...");try{let{getProvider:G}=await import("./chunk-xs370t8p.js"),{streamText:W}=await import("./chunk-3w6pd43t.js"),{getSystemPrompt:H}=await import("./chunk-3qxj0zy3.js"),J=G(b.provider),z=q.providers?.[b.provider];if(!z||!J.isConfigured(z))return`Provider ${b.provider} is not properly configured.`;let F=J.createClient(z,b.model),Q=`You are a conversation summarizer. Your task is to create a comprehensive, detailed summary of the following conversation that preserves ALL important information.
52
-
53
- CRITICAL REQUIREMENTS:
54
- 1. DO NOT omit any important details, decisions, code snippets, file paths, commands, or configurations
55
- 2. Preserve technical accuracy - include exact function names, variable names, file paths, and command syntax
56
- 3. Maintain chronological flow of the conversation
57
- 4. Highlight key decisions, problems solved, and solutions implemented
58
- 5. Include all context that would be needed to continue this conversation naturally
59
- 6. Use clear markdown formatting with sections and bullet points
60
- 7. If code was discussed or written, include the essential parts or describe what was implemented
61
- 8. **CRITICAL**: If there is ongoing work or tasks in progress, create a section called "## Current Work" that describes:
62
- - What was being worked on when the conversation was compacted
63
- - What the next steps should be
64
- - Any pending tasks or unfinished work
65
- - The current state of the implementation
66
-
67
- The summary will be used to start a fresh conversation while maintaining full context.
68
-
69
- CONVERSATION TO SUMMARIZE:
70
- ${b.messages.map((V)=>{let E=V.content.filter((B)=>B.type==="text").map((B)=>B.content).join(`
71
- `);if(V.attachments&&V.attachments.length>0){let B=V.attachments.map((R)=>`[Attached: ${R.relativePath}]`).join(`
72
- `);E+=`
73
- ${B}`}return`${V.role==="user"?"User":"Assistant"}: ${E}`}).join(`
74
-
75
- ---
76
-
77
- `)}
78
-
79
- Please provide a detailed, structured summary now:`,K=await W({model:F,messages:[{role:"user",content:Q}],maxTokens:4096}),Z="";for await(let V of K.textStream)Z+=V;if(!Z||Z.trim().length===0)return"Failed to generate summary. Please try again.";let L=$.createSession(b.provider,b.model);$.setCurrentSession(L);let M=b.messages.length,D=b.title||"Untitled session",A=`This session is being continued from a previous conversation that ran out of context. The conversation is summarized below:
80
- ${Z}`;return await $.triggerAIResponse(A),`✓ Compacted session "${D}" (${M} messages)
81
- ✓ Created new session with detailed summary
82
- ✓ Switched to new session
83
- ✓ AI is processing the summary and will continue working...`}catch(G){let W=G instanceof Error?G.message:String(G);return $.addLog(`[Compact] Error: ${W}`),`Failed to compact session: ${W}`}}},r=w$;var n={id:"notifications",label:"/notifications",description:"Manage notification settings for AI responses",args:[{name:"action",description:"Action to perform (show, enable, disable)",required:!0,suggestions:["show","enable","disable"]},{name:"type",description:"Notification type to configure (os, terminal, sound, all)",required:!1,suggestions:["os","terminal","sound","all"]}],async execute($,b){let{updateNotificationSettings:q,notificationSettings:G}=b;if($.length===0){b.updateOutput(`
84
- ❌ Please specify an action: show, enable, or disable
85
- `);return}let W=$[0].toLowerCase();switch(W){case"show":b.updateOutput(`
86
- \uD83D\uDD14 Notification Settings:
87
- `),b.updateOutput(` OS Notifications: ${G.osNotifications?"✅ Enabled":"❌ Disabled"}
88
- `),b.updateOutput(` Terminal Notifications: ${G.terminalNotifications?"✅ Enabled":"❌ Disabled"}
89
- `),b.updateOutput(` Sound Effects: ${G.sound?"✅ Enabled":"❌ Disabled"}
90
- `),b.updateOutput(`
91
- Use /notifications enable/disable [type] to change settings.
92
- `);break;case"enable":case"disable":{let H=W==="enable";if($.length===1||$[1]==="all")q({osNotifications:H,terminalNotifications:H,sound:H}),b.updateOutput(`
93
- ${H?"✅":"❌"} All notifications ${H?"enabled":"disabled"}
94
- `);else{let J=$[1].toLowerCase(),z={};switch(J){case"os":z.osNotifications=H;break;case"terminal":z.terminalNotifications=H;break;case"sound":z.sound=H;break;default:b.updateOutput(`
95
- ❌ Unknown notification type: ${J}
96
- `),b.updateOutput(`Valid types: os, terminal, sound, all
97
- `);return}q(z),b.updateOutput(`
98
- ${H?"✅":"❌"} ${J} notifications ${H?"enabled":"disabled"}
99
- `)}break}default:b.updateOutput(`
100
- ❌ Unknown action: ${W}
101
- `),b.updateOutput(`Valid actions: show, enable, disable
102
- `)}}};var o={id:"dashboard",label:"/dashboard",description:"Open control panel - central hub for all features",execute:async($)=>{return $.navigateTo("dashboard"),"Opening control panel..."}};var t=[o,l,I,s,d,r,n,v,m,g,a,x,c,i];function hb($){return t.find((b)=>b.id===$)}function Kb($){return t.find((b)=>b.label===$)}export{Kb as getCommandByLabel,hb as getCommand,t as commands};
103
- export{t as c};
104
-
105
- //# debugId=905D113790986B1164756E2164756E21
@@ -1,27 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/ui/commands/helpers/provider-set-value.ts", "../src/ui/commands/helpers/provider-config.ts", "../src/ui/commands/helpers/provider-selection.ts", "../src/ui/commands/definitions/provider.command.ts", "../src/ui/commands/definitions/model.command.ts", "../src/ui/commands/definitions/logs.command.ts", "../src/ui/commands/definitions/help.command.ts", "../src/ui/commands/definitions/survey.command.ts", "../src/ui/commands/definitions/context.command.ts", "../src/ui/commands/definitions/sessions.command.ts", "../src/ui/commands/definitions/new.command.ts", "../src/ui/commands/definitions/bashes.command.ts", "../src/ui/commands/definitions/agent.command.ts", "../src/ui/commands/definitions/rules.command.ts", "../src/ui/commands/definitions/compact.command.ts", "../src/ui/commands/definitions/notifications.command.ts", "../src/ui/commands/definitions/dashboard.command.ts", "../src/ui/commands/registry.ts"],
4
- "sourcesContent": [
5
- "/**\n * Provider Set Value Helper\n * Extract duplicated provider configuration setting logic\n */\n\nimport type { CommandContext } from '../types.js';\n\n/**\n * Ask user to select a key from provider schema\n */\nexport async function askSelectProviderKey(\n context: CommandContext,\n providerId: string,\n schema: Array<{ key: string; label: string }>\n): Promise<string | null> {\n const { AI_PROVIDERS } = await import('../../../config/ai-config.js');\n\n const availableKeys = schema.map((field) => ({\n label: field.label,\n value: field.key,\n }));\n\n context.sendMessage(`Configure ${AI_PROVIDERS[providerId as keyof typeof AI_PROVIDERS].name} - Select setting:`);\n const keyAnswers = await context.waitForInput({\n type: 'selection',\n questions: [\n {\n id: 'key',\n question: 'Which setting do you want to configure?',\n options: availableKeys,\n },\n ],\n });\n\n const key = typeof keyAnswers === 'object' && !Array.isArray(keyAnswers) ? keyAnswers['key'] : '';\n return key || null;\n}\n\n/**\n * Ask user for value (handles boolean vs text input)\n */\nexport async function askForValueByType(\n context: CommandContext,\n key: string,\n field: { key: string; label: string; type?: string } | undefined\n): Promise<string | null> {\n let value: string;\n\n if (field?.type === 'boolean') {\n context.sendMessage(`Select value for ${key}:`);\n const boolAnswers = await context.waitForInput({\n type: 'selection',\n questions: [\n {\n id: 'value',\n question: `${field.label}:`,\n options: [\n { label: 'true', value: 'true' },\n { label: 'false', value: 'false' },\n ],\n },\n ],\n });\n value = typeof boolAnswers === 'object' && !Array.isArray(boolAnswers) ? boolAnswers['value'] : '';\n } else {\n context.sendMessage(`Enter value for ${key}:`);\n const valueAnswers = await context.waitForInput({\n type: 'text',\n placeholder: `Enter ${key}...`,\n });\n value = typeof valueAnswers === 'string' ? valueAnswers : '';\n }\n\n return value || null;\n}\n\n/**\n * Set a provider config value and save\n */\nexport async function setProviderConfigValue(\n context: CommandContext,\n providerId: string,\n key: string,\n value: string,\n schema: Array<{ key: string; label: string; secret?: boolean }>\n): Promise<string> {\n const { AI_PROVIDERS } = await import('../../../config/ai-config.js');\n const aiConfig = context.getConfig();\n\n const newConfig = {\n ...aiConfig!,\n providers: {\n ...aiConfig!.providers,\n [providerId]: {\n ...aiConfig!.providers?.[providerId as keyof typeof aiConfig.providers],\n [key]: value,\n },\n },\n };\n\n if (!aiConfig?.defaultProvider) {\n newConfig.defaultProvider = providerId;\n }\n\n context.setAIConfig(newConfig);\n await context.saveConfig(newConfig);\n\n // Mask secret values in response\n const displayField = schema.find((f) => f.key === key);\n const displayValue = displayField?.secret ? '***' : value;\n\n return `Set ${AI_PROVIDERS[providerId as keyof typeof AI_PROVIDERS].name} ${key} to: ${displayValue}`;\n}\n\n/**\n * Combined flow: ask for key, ask for value, save config\n */\nexport async function interactiveSetProviderConfig(\n context: CommandContext,\n providerId: string\n): Promise<string> {\n const { getProvider } = await import('../../../providers/index.js');\n const provider = getProvider(providerId as any);\n const schema = provider.getConfigSchema();\n\n // Ask for key\n const key = await askSelectProviderKey(context, providerId, schema);\n if (!key) {\n return 'Configuration cancelled.';\n }\n\n // Ask for value\n const field = schema.find((f) => f.key === key);\n const value = await askForValueByType(context, key, field);\n if (!value) {\n return 'Value is required.';\n }\n\n // Save config\n return await setProviderConfigValue(context, providerId, key, value, schema);\n}\n",
6
- "/**\n * Provider Configuration Helper\n * Shared helper function for provider configuration\n *\n * REFACTORED: Now uses interactiveSetProviderConfig from provider-set-value helper\n */\n\nimport type { CommandContext } from '../types.js';\nimport { interactiveSetProviderConfig } from './provider-set-value.js';\n\n/**\n * Configure a provider interactively\n * @deprecated This is now a thin wrapper around interactiveSetProviderConfig\n */\nexport async function configureProvider(\n context: CommandContext,\n providerId: string\n): Promise<string> {\n // Delegate to the extracted helper\n return await interactiveSetProviderConfig(context, providerId);\n}\n\n/**\n * Options cache for dynamic option loading\n */\nexport const optionsCache = new Map<\n string,\n Array<{ id: string; name: string }>\n>();\n",
7
- "/**\n * Provider Selection Helpers\n * Extract duplicated provider selection and switching logic\n */\n\nimport type { CommandContext } from '../types.js';\nimport type { ProviderId } from '../../../types/provider.types.js';\nimport { configureProvider } from './provider-config.js';\n\n/**\n * Get provider options with configured status\n */\nexport async function getProviderOptions(context: CommandContext): Promise<Array<{ label: string; value: string }>> {\n const { AI_PROVIDERS } = await import('../../../config/ai-config.js');\n const { getProvider } = await import('../../../providers/index.js');\n const aiConfig = context.getConfig();\n\n return Object.values(AI_PROVIDERS).map((p) => {\n let isConfigured = false;\n try {\n const provider = getProvider(p.id as any);\n const providerConfig = aiConfig?.providers?.[p.id as keyof typeof aiConfig.providers];\n isConfigured = providerConfig ? provider.isConfigured(providerConfig) : false;\n } catch {\n // Provider not found or error checking config\n }\n return {\n label: `${p.name} ${isConfigured ? '✓' : ''}`,\n value: p.id,\n };\n });\n}\n\n/**\n * Ask user to select a provider\n */\nexport async function askSelectProvider(\n context: CommandContext,\n message: string,\n question: string\n): Promise<string | null> {\n const providerOptions = await getProviderOptions(context);\n\n context.sendMessage(message);\n const answers = await context.waitForInput({\n type: 'selection',\n questions: [\n {\n id: 'provider',\n question,\n options: providerOptions,\n },\n ],\n });\n\n const providerId = typeof answers === 'object' && !Array.isArray(answers) ? answers['provider'] : '';\n return providerId || null;\n}\n\n/**\n * Ensure provider is configured, optionally configure if not\n * Returns the provider config if successful, or error message\n */\nexport async function ensureProviderConfigured(\n context: CommandContext,\n providerId: string,\n autoPromptConfigure: boolean = true\n): Promise<{ success: true; config: any } | { success: false; message: string }> {\n const { AI_PROVIDERS } = await import('../../../config/ai-config.js');\n const { getProvider } = await import('../../../providers/index.js');\n const aiConfig = context.getConfig();\n\n const provider = getProvider(providerId as any);\n const providerConfig = aiConfig?.providers?.[providerId as keyof typeof aiConfig.providers];\n\n // Already configured\n if (providerConfig && provider.isConfigured(providerConfig)) {\n return { success: true, config: providerConfig };\n }\n\n // Not configured\n if (!autoPromptConfigure) {\n return {\n success: false,\n message: `${AI_PROVIDERS[providerId as keyof typeof AI_PROVIDERS].name} is not configured. Use: /provider set ${providerId}`,\n };\n }\n\n // Ask if user wants to configure now\n context.sendMessage(`${AI_PROVIDERS[providerId as keyof typeof AI_PROVIDERS].name} is not configured yet.`);\n const configureAnswers = await context.waitForInput({\n type: 'selection',\n questions: [\n {\n id: 'configure',\n question: 'Do you want to configure it now?',\n options: [\n { label: 'Yes, configure now', value: 'yes' },\n { label: 'No, cancel', value: 'no' },\n ],\n },\n ],\n });\n\n const shouldConfigure =\n typeof configureAnswers === 'object' && !Array.isArray(configureAnswers)\n ? configureAnswers['configure'] === 'yes'\n : false;\n\n if (!shouldConfigure) {\n return {\n success: false,\n message: 'Cancelled. You can configure later using: /provider set',\n };\n }\n\n // Configure the provider\n const configResult = await configureProvider(context, providerId);\n\n // Check if now configured\n const updatedConfig = context.getConfig();\n const updatedProviderConfig = updatedConfig?.providers?.[providerId as keyof typeof updatedConfig.providers];\n\n if (!updatedProviderConfig || !provider.isConfigured(updatedProviderConfig)) {\n return {\n success: false,\n message: `${configResult}\\n\\nProvider still not fully configured. Please continue configuration with: /provider set ${providerId}`,\n };\n }\n\n context.sendMessage(configResult);\n return { success: true, config: updatedProviderConfig };\n}\n\n/**\n * Switch to a provider (set as default, update model, save config, update session)\n */\nexport async function switchToProvider(\n context: CommandContext,\n providerId: string,\n providerConfig: any\n): Promise<string> {\n const { AI_PROVIDERS } = await import('../../../config/ai-config.js');\n const aiConfig = context.getConfig();\n\n const newConfig = {\n ...aiConfig!,\n defaultProvider: providerId,\n };\n\n // Get default model and update config\n const { getDefaultModel } = await import('../../../core/session-service.js');\n const defaultModel = await getDefaultModel(providerId as any, providerConfig);\n if (!defaultModel) {\n return `Failed to get default model for ${AI_PROVIDERS[providerId as keyof typeof AI_PROVIDERS].name}`;\n }\n\n // Save default model to config\n newConfig.providers = {\n ...newConfig.providers,\n [providerId]: {\n ...providerConfig,\n 'default-model': defaultModel,\n },\n };\n\n context.setAIConfig(newConfig);\n await context.saveConfig(newConfig);\n\n // Update UI state\n context.setUISelectedProvider(providerId as ProviderId);\n context.setUISelectedModel(defaultModel);\n\n // Update current session's provider (preserve history)\n const currentSessionId = context.getCurrentSessionId();\n if (currentSessionId) {\n context.updateSessionProvider(currentSessionId, providerId, defaultModel);\n } else {\n // Fallback: create new session if no active session\n context.createSession(providerId, defaultModel);\n }\n\n return `Now using ${AI_PROVIDERS[providerId as keyof typeof AI_PROVIDERS].name} with model: ${defaultModel}`;\n}\n\n/**\n * Combined flow: ensure configured and switch to provider\n */\nexport async function ensureConfiguredAndSwitch(\n context: CommandContext,\n providerId: string,\n autoPromptConfigure: boolean = true\n): Promise<string> {\n const result = await ensureProviderConfigured(context, providerId, autoPromptConfigure);\n\n if (!result.success) {\n return result.message;\n }\n\n return await switchToProvider(context, providerId, result.config);\n}\n",
8
- "/**\n * Provider Command (Refactored)\n * Configure and switch AI providers\n *\n * REFACTORED: Reduced from 759 lines to ~200 lines by extracting helpers\n */\n\nimport type { Command } from '../types.js';\nimport { configureProvider } from '../helpers/provider-config.js';\nimport {\n askSelectProvider,\n ensureConfiguredAndSwitch,\n switchToProvider,\n ensureProviderConfigured,\n} from '../helpers/provider-selection.js';\nimport {\n interactiveSetProviderConfig,\n setProviderConfigValue,\n} from '../helpers/provider-set-value.js';\n\nexport const providerCommand: Command = {\n id: 'provider',\n label: '/provider',\n description: 'Manage AI providers',\n args: [\n {\n name: 'action',\n description: 'Action: \"use\" or \"set\"',\n required: false,\n loadOptions: async (previousArgs) => {\n return [\n { id: 'use', label: 'use', value: 'use' },\n { id: 'set', label: 'set', value: 'set' },\n ];\n },\n },\n {\n name: 'provider-name',\n description: 'Provider name (anthropic, openai, google, openrouter)',\n required: false,\n loadOptions: async (previousArgs) => {\n const { AI_PROVIDERS } = await import('../../../config/ai-config.js');\n return Object.values(AI_PROVIDERS).map((p) => ({\n id: p.id,\n label: p.name,\n value: p.id,\n }));\n },\n },\n {\n name: 'key',\n description: 'Setting key (for set action)',\n required: false,\n loadOptions: async (previousArgs) => {\n const providerId = previousArgs[1];\n if (!providerId) return [];\n\n try {\n const { getProvider } = await import('../../../providers/index.js');\n const provider = getProvider(providerId as any);\n const schema = provider.getConfigSchema();\n return schema.map((field) => ({\n id: field.key,\n label: field.label,\n value: field.key,\n }));\n } catch (error) {\n return [];\n }\n },\n },\n {\n name: 'value',\n description: 'Setting value (for set action)',\n required: false,\n loadOptions: async (previousArgs) => {\n const providerId = previousArgs[1];\n const key = previousArgs[2];\n if (!providerId || !key) return [];\n\n try {\n const { getProvider } = await import('../../../providers/index.js');\n const provider = getProvider(providerId as any);\n const schema = provider.getConfigSchema();\n const field = schema.find((f) => f.key === key);\n\n // If boolean type, provide true/false options\n if (field?.type === 'boolean') {\n return [\n { id: 'true', label: 'true', value: 'true' },\n { id: 'false', label: 'false', value: 'false' },\n ];\n }\n\n return [];\n } catch (error) {\n return [];\n }\n },\n },\n ],\n execute: async (context) => {\n const { AI_PROVIDERS } = await import('../../../config/ai-config.js');\n\n // Case 1: /provider - ask use or set\n if (context.args.length === 0) {\n context.sendMessage('What do you want to do?');\n const actionAnswers = await context.waitForInput({\n type: 'selection',\n questions: [\n {\n id: 'action',\n question: 'Select action:',\n options: [\n { label: 'Use a provider', value: 'use' },\n { label: 'Configure a provider', value: 'set' },\n ],\n },\n ],\n });\n\n const action = typeof actionAnswers === 'object' && !Array.isArray(actionAnswers) ? actionAnswers['action'] : '';\n if (!action) {\n return 'Action cancelled.';\n }\n\n // Ask which provider\n const providerId = await askSelectProvider(\n context,\n action === 'use' ? 'Which provider do you want to use?' : 'Which provider do you want to configure?',\n action === 'use' ? 'Select provider to use:' : 'Select provider to configure:'\n );\n\n if (!providerId) {\n return 'Provider selection cancelled.';\n }\n\n if (action === 'use') {\n // Use provider (with optional configuration)\n return await ensureConfiguredAndSwitch(context, providerId, true);\n } else {\n // Set provider - use helper function\n return await configureProvider(context, providerId);\n }\n }\n\n // Case 2: /provider use - ask which provider to use\n if (context.args.length === 1 && context.args[0] === 'use') {\n const providerId = await askSelectProvider(context, 'Which provider do you want to use?', 'Select provider:');\n\n if (!providerId) {\n return 'Provider selection cancelled.';\n }\n\n // Ensure configured and switch\n return await ensureConfiguredAndSwitch(context, providerId, true);\n }\n\n // Case 3: /provider use [name] - switch to specific provider\n if (context.args.length === 2 && context.args[0] === 'use') {\n const providerId = context.args[1];\n\n if (!(providerId in AI_PROVIDERS)) {\n return `Invalid provider: ${providerId}. Available: ${Object.keys(AI_PROVIDERS).join(', ')}`;\n }\n\n // Ensure configured and switch (without auto-prompt)\n return await ensureConfiguredAndSwitch(context, providerId, false);\n }\n\n // Case 4: /provider set - ask which provider to configure\n if (context.args.length === 1 && context.args[0] === 'set') {\n const { AI_PROVIDERS } = await import('../../../config/ai-config.js');\n const providerOptions = Object.values(AI_PROVIDERS).map((p) => ({\n label: p.name,\n value: p.id,\n }));\n\n context.sendMessage('Which provider do you want to configure?');\n const providerAnswers = await context.waitForInput({\n type: 'selection',\n questions: [\n {\n id: 'provider',\n question: 'Select provider:',\n options: providerOptions,\n },\n ],\n });\n\n const providerId = typeof providerAnswers === 'object' && !Array.isArray(providerAnswers) ? providerAnswers['provider'] : '';\n if (!providerId) {\n return 'Provider selection cancelled.';\n }\n\n // Interactive set provider config\n return await interactiveSetProviderConfig(context, providerId);\n }\n\n // Case 5: /provider set [name] - ask which key to set\n if (context.args.length === 2 && context.args[0] === 'set') {\n const providerId = context.args[1];\n\n if (!(providerId in AI_PROVIDERS)) {\n return `Invalid provider: ${providerId}. Available: ${Object.keys(AI_PROVIDERS).join(', ')}`;\n }\n\n // Interactive set provider config\n return await interactiveSetProviderConfig(context, providerId);\n }\n\n // Case 6: /provider set [name] [key] [value] - direct configuration\n if (context.args.length >= 4 && context.args[0] === 'set') {\n const providerId = context.args[1];\n const key = context.args[2];\n const value = context.args.slice(3).join(' ');\n\n if (!(providerId in AI_PROVIDERS)) {\n return `Invalid provider: ${providerId}. Available: ${Object.keys(AI_PROVIDERS).join(', ')}`;\n }\n\n // Get valid keys from provider schema\n const { getProvider } = await import('../../../providers/index.js');\n const provider = getProvider(providerId as any);\n const schema = provider.getConfigSchema();\n\n const validKeys = schema.map((f) => f.key);\n if (!validKeys.includes(key)) {\n return `Invalid key: ${key}. Valid keys for ${providerId}: ${validKeys.join(', ')}`;\n }\n\n // Set config value directly\n return await setProviderConfigValue(context, providerId, key, value, schema);\n }\n\n return (\n 'Usage:\\n' +\n ' /provider - Select action and provider\\n' +\n ' /provider use - Select provider to use\\n' +\n ' /provider use [name] - Switch to provider\\n' +\n ' /provider set - Configure a provider\\n' +\n ' /provider set [name] - Configure specific provider\\n' +\n ' /provider set [name] [key] [value] - Set provider config directly'\n );\n },\n};\n\nexport default providerCommand;\n",
9
- "/**\n * Model Command\n * Switch AI model\n */\n\nimport type { Command } from '../types.js';\n\nexport const modelCommand: Command = {\n id: 'model',\n label: '/model',\n description: 'Switch AI model',\n args: [\n {\n name: 'model-name',\n description: 'Model to switch to',\n required: false,\n loadOptions: async (previousArgs, context) => {\n try {\n // Get AI config from context\n const aiConfig = context?.getConfig();\n if (!aiConfig?.providers) {\n return [];\n }\n\n // Get current session's provider\n const currentSession = context?.getCurrentSession();\n const currentProviderId = currentSession?.provider || aiConfig.defaultProvider;\n\n if (!currentProviderId) {\n return [];\n }\n\n // Fetch models from current provider only\n const config = aiConfig.providers[currentProviderId];\n if (!config) {\n return [];\n }\n\n try {\n const { fetchModels } = await import('../../../utils/ai-model-fetcher.js');\n const models = await fetchModels(currentProviderId as any, config);\n return models.map(m => ({\n id: m.id,\n label: m.name,\n value: m.id,\n }));\n } catch (error) {\n if (context) {\n context.addLog(`Failed to fetch models for ${currentProviderId}: ${error instanceof Error ? error.message : String(error)}`);\n }\n return [];\n }\n } catch (error) {\n if (context) {\n context.addLog(`Error loading models: ${error instanceof Error ? error.message : String(error)}`);\n }\n return [];\n }\n },\n },\n ],\n execute: async (context) => {\n let modelId: string;\n\n // If no args provided, ask user to select\n if (context.args.length === 0) {\n try {\n // Load models from current provider only\n const aiConfig = context.getConfig();\n if (!aiConfig?.providers) {\n return 'No providers configured. Please configure a provider first.';\n }\n\n // Get current session's provider\n const currentSession = context.getCurrentSession();\n const currentProviderId = currentSession?.provider || aiConfig.defaultProvider;\n\n if (!currentProviderId) {\n return 'No provider selected. Use /provider to select a provider first.';\n }\n\n const config = aiConfig.providers[currentProviderId];\n if (!config) {\n return `Provider ${currentProviderId} is not configured.`;\n }\n\n // Fetch models from current provider\n let allModels: Array<{ label: string; value: string }> = [];\n try {\n const { fetchModels } = await import('../../../utils/ai-model-fetcher.js');\n const models = await fetchModels(currentProviderId as any, config);\n allModels = models.map(m => ({ label: m.name, value: m.id }));\n context.addLog(`Loaded ${models.length} models from ${currentProviderId}`);\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n context.addLog(`Failed to fetch models for ${currentProviderId}: ${errorMsg}`);\n return `Failed to load models from ${currentProviderId}: ${errorMsg}`;\n }\n\n if (allModels.length === 0) {\n return `No models available for ${currentProviderId}`;\n }\n\n // Ask user to select\n context.sendMessage('Which model do you want to use?');\n const answers = await context.waitForInput({\n type: 'selection',\n questions: [\n {\n id: 'model',\n question: 'Which model do you want to use?',\n options: allModels,\n },\n ],\n });\n\n // Extract answer from Record\n modelId = typeof answers === 'object' && !Array.isArray(answers) ? answers['model'] : '';\n } catch (error) {\n return `Failed to load models: ${error instanceof Error ? error.message : String(error)}`;\n }\n } else {\n modelId = context.args[0];\n }\n\n const currentSession = context.getCurrentSession();\n const aiConfig = context.getConfig();\n const provider = currentSession?.provider || aiConfig?.defaultProvider;\n\n if (!provider) {\n return 'No provider configured. Please configure a provider first.';\n }\n\n // Update model and save to provider config\n const newConfig = {\n ...aiConfig!,\n defaultModel: modelId,\n providers: {\n ...aiConfig!.providers,\n [provider]: {\n ...aiConfig!.providers?.[provider],\n 'default-model': modelId,\n },\n },\n };\n context.setAIConfig(newConfig);\n\n // Save config to file\n await context.saveConfig(newConfig);\n\n // Update current session's model (preserve history)\n const currentSessionId = context.getCurrentSessionId();\n if (currentSessionId) {\n context.updateSessionModel(currentSessionId, modelId);\n } else {\n // Fallback: create new session if no active session\n context.createSession(provider, modelId);\n }\n\n return `Switched to model: ${modelId}`;\n },\n};\n\nexport default modelCommand;\n",
10
- "/**\n * Logs Command\n * View debug logs\n */\n\nimport type { Command } from '../types.js';\n\nexport const logsCommand: Command = {\n id: 'logs',\n label: '/logs',\n description: 'View debug logs',\n execute: async (context) => {\n context.navigateTo('logs');\n return 'Opening debug logs...';\n },\n};\n\nexport default logsCommand;\n",
11
- "/**\n * Help Command\n * Show available commands\n */\n\nimport type { Command } from '../types.js';\n\nexport const helpCommand: Command = {\n id: 'help',\n label: '/help',\n description: 'Show available commands',\n execute: async (context) => {\n const commands = context.getCommands();\n const commandList = commands\n .map((cmd) => {\n const argsText = cmd.args\n ? ` ${cmd.args.map((a) => `[${a.name}]`).join(' ')}`\n : '';\n return `${cmd.label}${argsText} - ${cmd.description}`;\n })\n .join('\\n');\n return `Available commands:\\n${commandList}`;\n },\n};\n\nexport default helpCommand;\n",
12
- "/**\n * Survey Command\n * Test multi-selection feature\n */\n\nimport type { Command } from '../types.js';\n\nexport const surveyCommand: Command = {\n id: 'survey',\n label: '/survey',\n description: 'Test multi-question selection (demo)',\n execute: async (context) => {\n context.sendMessage('Let me ask you a few questions...');\n\n const answers = await context.waitForInput({\n type: 'selection',\n questions: [\n {\n id: 'language',\n question: 'What is your favorite programming language?',\n options: [\n { label: 'TypeScript' },\n { label: 'JavaScript' },\n { label: 'Python' },\n { label: 'Rust' },\n { label: 'Go' },\n ],\n },\n {\n id: 'framework',\n question: 'Which framework do you prefer?',\n options: [\n { label: 'React' },\n { label: 'Vue' },\n { label: 'Angular' },\n { label: 'Svelte' },\n { label: 'Solid' },\n ],\n },\n {\n id: 'editor',\n question: 'What is your favorite code editor?',\n options: [\n { label: 'Visual Studio Code' },\n { label: 'Vim/Neovim' },\n { label: 'Emacs' },\n { label: 'Sublime Text' },\n { label: 'Atom' },\n ],\n },\n ],\n });\n\n if (typeof answers === 'object' && !Array.isArray(answers)) {\n const summary = Object.entries(answers)\n .map(([key, value]) => `${key}: ${value}`)\n .join(', ');\n return `Survey completed! Your answers: ${summary}`;\n }\n\n return 'Survey cancelled.';\n },\n};\n\nexport default surveyCommand;\n",
13
- "/**\n * Context Command\n * Display context window usage\n */\n\nimport type { Command } from '../types.js';\n\nexport const contextCommand: Command = {\n id: 'context',\n label: '/context',\n description: 'Display context window usage and token breakdown',\n execute: async (context) => {\n const { countTokens, formatTokenCount } = await import('../../../utils/token-counter.js');\n const { getSystemPrompt } = await import('../../../core/ai-sdk.js');\n const { getAISDKTools } = await import('../../../tools/index.js');\n\n const currentSession = context.getCurrentSession();\n if (!currentSession) {\n return 'No active session. Start chatting first to see context usage.';\n }\n\n const modelName = currentSession.model;\n\n // Get model-specific context limit\n const getContextLimit = (model: string): number => {\n // Default limits for common models\n if (model.includes('gpt-4')) {\n if (model.includes('32k') || model.includes('turbo')) return 128000;\n if (model.includes('vision')) return 128000;\n return 8192; // Original GPT-4\n }\n if (model.includes('gpt-3.5')) {\n if (model.includes('16k')) return 16385;\n return 4096; // Original GPT-3.5\n }\n // Claude models\n if (model.includes('claude-3')) {\n if (model.includes('opus')) return 200000;\n if (model.includes('sonnet')) return 200000;\n if (model.includes('haiku')) return 200000;\n }\n // Default fallback\n return 200000;\n };\n\n const contextLimit = getContextLimit(modelName);\n\n // Calculate token counts\n context.addLog(`[Context] Calculating token counts for ${modelName} (limit: ${formatTokenCount(contextLimit)})...`);\n\n // System prompt tokens - use the actual system prompt that gets sent\n const systemPrompt = getSystemPrompt();\n const systemPromptTokens = await countTokens(systemPrompt, modelName);\n\n // Also calculate breakdown of system prompt components for debugging\n const { getEnabledRulesContent } = await import('../../../core/rule-manager.js');\n const { getCurrentSystemPrompt } = await import('../../../core/agent-manager.js');\n const BASE_SYSTEM_PROMPT = `You are Sylphx, an AI development assistant.`;\n\n let systemPromptBreakdown: Record<string, number> = {};\n try {\n systemPromptBreakdown['Base prompt'] = await countTokens(BASE_SYSTEM_PROMPT, modelName);\n\n const rulesContent = getEnabledRulesContent();\n if (rulesContent) {\n systemPromptBreakdown['Rules'] = await countTokens(rulesContent, modelName);\n }\n\n const agentPrompt = getCurrentSystemPrompt();\n systemPromptBreakdown['Agent prompt'] = await countTokens(agentPrompt, modelName);\n } catch (error) {\n context.addLog(`[Context] Failed to calculate system prompt breakdown: ${error}`);\n }\n\n // System tools tokens (calculate individual tool tokens)\n const tools = getAISDKTools();\n const toolTokens: Record<string, number> = {};\n let toolsTokensTotal = 0;\n\n for (const [toolName, toolDef] of Object.entries(tools)) {\n // Create a more accurate representation of how tools are sent to the AI\n // Tools are typically sent as function definitions with name, description, and parameters\n const toolRepresentation = {\n name: toolName,\n description: toolDef.description || '',\n parameters: toolDef.parameters || {}\n };\n const toolJson = JSON.stringify(toolRepresentation, null, 0); // No spaces for compact representation\n const tokens = await countTokens(toolJson, modelName);\n toolTokens[toolName] = tokens;\n toolsTokensTotal += tokens;\n }\n\n // Messages tokens - include attachments and parts for accurate calculation\n let messagesTokens = 0;\n for (const msg of currentSession.messages) {\n let msgText = msg.content;\n\n // Add attachment content if present (as it would be sent to AI)\n if (msg.attachments && msg.attachments.length > 0) {\n try {\n const { readFile } = await import('node:fs/promises');\n const fileContents = await Promise.all(\n msg.attachments.map(async (att) => {\n try {\n const content = await readFile(att.path, 'utf8');\n return { path: att.relativePath, content };\n } catch {\n return { path: att.relativePath, content: '[Error reading file]' };\n }\n })\n );\n\n const fileContentsText = fileContents\n .map((f) => `\\n\\n<file path=\"${f.path}\">\\n${f.content}\\n</file>`)\n .join('');\n\n msgText += fileContentsText;\n } catch (error) {\n // If we can't read attachments, just count the content we have\n console.warn('[Context] Failed to read attachments for token count:', error);\n }\n }\n\n const msgTokens = await countTokens(msgText, modelName);\n messagesTokens += msgTokens;\n }\n\n // Calculate totals and percentages\n const usedTokens = systemPromptTokens + toolsTokensTotal + messagesTokens;\n const freeTokens = contextLimit - usedTokens;\n const autocompactBuffer = Math.floor(contextLimit * 0.225); // 22.5%\n const realFreeTokens = freeTokens - autocompactBuffer;\n\n const usedPercent = ((usedTokens / contextLimit) * 100).toFixed(1);\n const systemPromptPercent = ((systemPromptTokens / contextLimit) * 100).toFixed(1);\n const toolsPercent = ((toolsTokensTotal / contextLimit) * 100).toFixed(1);\n const messagesPercent = ((messagesTokens / contextLimit) * 100).toFixed(1);\n const freePercent = ((realFreeTokens / contextLimit) * 100).toFixed(1);\n const bufferPercent = ((autocompactBuffer / contextLimit) * 100).toFixed(1);\n\n // Create visual bar chart (30 blocks for better resolution)\n const createBarChart = (): string[] => {\n const totalBlocks = 30;\n const systemPromptBlocks = Math.floor((systemPromptTokens / contextLimit) * totalBlocks);\n const toolsBlocks = Math.floor((toolsTokensTotal / contextLimit) * totalBlocks);\n const messagesBlocks = Math.floor((messagesTokens / contextLimit) * totalBlocks);\n const usedBlocks = systemPromptBlocks + toolsBlocks + messagesBlocks;\n const freeBlocks = totalBlocks - usedBlocks;\n\n // Line 1: System prompt (blue)\n const line1 = '█'.repeat(systemPromptBlocks) + '░'.repeat(totalBlocks - systemPromptBlocks);\n\n // Line 2: Tools (green)\n const line2 = '░'.repeat(systemPromptBlocks) + '█'.repeat(toolsBlocks) + '░'.repeat(totalBlocks - systemPromptBlocks - toolsBlocks);\n\n // Line 3: Messages (yellow)\n const line3 = '░'.repeat(systemPromptBlocks + toolsBlocks) + '█'.repeat(messagesBlocks) + '░'.repeat(freeBlocks);\n\n return [line1, line2, line3];\n };\n\n const [bar1, bar2, bar3] = createBarChart();\n\n // Format tool list with tokens (sorted by size)\n const toolList = Object.entries(toolTokens)\n .sort((a, b) => b[1] - a[1])\n .map(([name, tokens]) => ` ${name}: ${formatTokenCount(tokens)} tokens`)\n .join('\\n');\n\n // Format system prompt breakdown\n const systemPromptBreakdownText = Object.entries(systemPromptBreakdown)\n .map(([name, tokens]) => ` ${name}: ${formatTokenCount(tokens)} tokens`)\n .join('\\n');\n\n // Format output with clean visual hierarchy\n const output = `\nContext Usage: ${formatTokenCount(usedTokens)}/${formatTokenCount(contextLimit)} tokens (${usedPercent}%)\nModel: ${modelName}\n\nVisual Breakdown:\n ${bar1} System prompt: ${formatTokenCount(systemPromptTokens)} (${systemPromptPercent}%)\n ${bar2} Tools: ${formatTokenCount(toolsTokensTotal)} (${toolsPercent}%)\n ${bar3} Messages: ${formatTokenCount(messagesTokens)} (${messagesPercent}%)\n\nAvailable Space:\n • Free: ${formatTokenCount(realFreeTokens)} tokens (${freePercent}%)\n • Buffer: ${formatTokenCount(autocompactBuffer)} tokens (${bufferPercent}%)\n\nSystem Prompt Breakdown:\n${systemPromptBreakdownText}\n\nSystem Tools (${Object.keys(tools).length} total):\n${toolList}\n`.trim();\n\n return output;\n },\n};\n\nexport default contextCommand;\n",
14
- "/**\n * Sessions Command\n * Switch between chat sessions\n */\n\nimport type { Command } from '../types.js';\n\nexport const sessionsCommand: Command = {\n id: 'sessions',\n label: '/sessions',\n description: 'View and switch between chat sessions',\n execute: async (context) => {\n const { formatSessionDisplay } = await import('../../../utils/session-title.js');\n const sessions = context.getSessions();\n\n if (sessions.length === 0) {\n return 'No sessions available. Start chatting to create a session.';\n }\n\n const currentSessionId = context.getCurrentSessionId();\n\n // Sort sessions by updated time (most recent first), then by created time\n const sortedSessions = [...sessions].sort((a, b) => {\n // First compare by updated time (descending)\n const updateDiff = b.updated - a.updated;\n if (updateDiff !== 0) return updateDiff;\n \n // If updated is same, compare by created time (descending)\n return b.created - a.created;\n });\n\n // Ask user to select a session\n const sessionOptions = sortedSessions.map((session) => {\n const isCurrent = session.id === currentSessionId;\n const displayText = formatSessionDisplay(session.title, session.created);\n const label = isCurrent ? `${displayText} (current)` : displayText;\n\n return {\n label,\n value: session.id,\n };\n });\n\n context.sendMessage('Select a session to switch to:');\n const answers = await context.waitForInput({\n type: 'selection',\n questions: [\n {\n id: 'session',\n question: 'Which session do you want to switch to?',\n options: sessionOptions,\n },\n ],\n });\n\n const selectedSessionId = typeof answers === 'object' && !Array.isArray(answers) ? answers['session'] : '';\n\n if (!selectedSessionId) {\n return 'Session selection cancelled.';\n }\n\n // Switch to selected session\n context.setCurrentSession(selectedSessionId);\n\n const selectedSession = sortedSessions.find((s) => s.id === selectedSessionId);\n const displayName = selectedSession\n ? formatSessionDisplay(selectedSession.title, selectedSession.created)\n : 'Unknown session';\n\n return `Switched to session: ${displayName}`;\n },\n};\n\nexport default sessionsCommand;\n",
15
- "/**\n * New Command\n * Create a new chat session\n */\n\nimport type { Command } from '../types.js';\n\nexport const newCommand: Command = {\n id: 'new',\n label: '/new',\n description: 'Create a new chat session',\n execute: async (context) => {\n const aiConfig = context.getConfig();\n\n if (!aiConfig?.defaultProvider || !aiConfig?.defaultModel) {\n return 'No AI provider configured. Use /provider to configure a provider first.';\n }\n\n // Create new session with current provider and model\n const newSessionId = context.createSession(aiConfig.defaultProvider, aiConfig.defaultModel);\n context.setCurrentSession(newSessionId);\n\n return `Created new chat session with ${aiConfig.defaultProvider} (${aiConfig.defaultModel})`;\n },\n};\n\nexport default newCommand;\n",
16
- "/**\n * Bashes Command\n * Manage background bash processes\n */\n\nimport type { Command } from '../types.js';\n\nexport const bashesCommand: Command = {\n id: 'bashes',\n label: '/bashes',\n description: 'Manage background bash processes',\n execute: async (context) => {\n const { bashManager } = await import('../../../tools/bash-manager.js');\n const processes = bashManager.list();\n\n if (processes.length === 0) {\n return 'No background bash processes found.';\n }\n\n // Format process list\n const processOptions = processes.map((proc) => {\n const status = proc.isRunning ? '[*] Running' : '[x] Completed';\n const duration = Math.floor(proc.duration / 1000);\n const durationStr = duration > 60\n ? `${Math.floor(duration / 60)}m ${duration % 60}s`\n : `${duration}s`;\n\n return {\n label: `${status} [${durationStr}] ${proc.command}`,\n value: proc.id,\n };\n });\n\n context.sendMessage(`Found ${processes.length} background bash process${processes.length !== 1 ? 'es' : ''}:`);\n const answers = await context.waitForInput({\n type: 'selection',\n questions: [\n {\n id: 'action',\n question: 'What do you want to do?',\n options: [\n { label: 'View details', value: 'view' },\n { label: 'Kill a process', value: 'kill' },\n { label: 'Cancel', value: 'cancel' },\n ],\n },\n ],\n });\n\n const action = typeof answers === 'object' && !Array.isArray(answers) ? answers['action'] : '';\n\n if (!action || action === 'cancel') {\n return 'Cancelled.';\n }\n\n // Select process\n context.sendMessage('Select a process:');\n const processAnswers = await context.waitForInput({\n type: 'selection',\n questions: [\n {\n id: 'process',\n question: 'Which process?',\n options: processOptions,\n },\n ],\n });\n\n const selectedId = typeof processAnswers === 'object' && !Array.isArray(processAnswers)\n ? processAnswers['process']\n : '';\n\n if (!selectedId) {\n return 'No process selected.';\n }\n\n if (action === 'view') {\n const output = bashManager.getOutput(selectedId);\n if (!output) {\n return 'Process not found.';\n }\n\n const status = output.isRunning ? 'Running' : `Completed (exit code: ${output.exitCode})`;\n const duration = Math.floor(output.duration / 1000);\n\n let result = `\nProcess: ${selectedId}\nCommand: ${output.command}\nStatus: ${status}\nDuration: ${duration}s\n\n=== stdout ===\n${output.stdout || '(empty)'}\n`;\n\n if (output.stderr) {\n result += `\n=== stderr ===\n${output.stderr}`;\n }\n\n return result.trim();\n }\n\n if (action === 'kill') {\n const success = bashManager.kill(selectedId);\n if (!success) {\n return 'Failed to kill process (not found).';\n }\n\n return `Sent termination signal to process ${selectedId}`;\n }\n\n return 'Unknown action.';\n },\n};\n\nexport default bashesCommand;\n",
17
- "/**\n * Agent Command\n * Switch between agents\n */\n\nimport type { Command } from '../types.js';\n\nexport const agentCommand: Command = {\n id: 'agent',\n label: '/agent',\n description: 'Switch between AI agents with different system prompts',\n args: [\n {\n name: 'agent-name',\n description: 'Agent to switch to (coder, planner, etc.)',\n required: false,\n loadOptions: async (previousArgs) => {\n const { getAllAgents } = await import('../../../core/agent-manager.js');\n const agents = getAllAgents();\n return agents.map((agent) => ({\n id: agent.id,\n label: `${agent.metadata.name} - ${agent.metadata.description}`,\n value: agent.id,\n }));\n },\n },\n ],\n execute: async (context) => {\n const { getAllAgents, getCurrentAgent, switchAgent } = await import('../../../core/agent-manager.js');\n\n let agentId: string;\n\n // If no args provided, ask user to select\n if (context.args.length === 0) {\n const agents = getAllAgents();\n const currentAgent = getCurrentAgent();\n\n if (agents.length === 0) {\n return 'No agents available.';\n }\n\n // Create options with current agent indicator\n const agentOptions = agents.map((agent) => {\n const isCurrent = agent.id === currentAgent.id;\n const label = isCurrent\n ? `${agent.metadata.name} (current) - ${agent.metadata.description}`\n : `${agent.metadata.name} - ${agent.metadata.description}`;\n\n return {\n label,\n value: agent.id,\n };\n });\n\n context.sendMessage('Which agent do you want to use?');\n const answers = await context.waitForInput({\n type: 'selection',\n questions: [\n {\n id: 'agent',\n question: 'Select agent:',\n options: agentOptions,\n },\n ],\n });\n\n agentId = typeof answers === 'object' && !Array.isArray(answers) ? answers['agent'] : '';\n\n if (!agentId) {\n return 'Agent selection cancelled.';\n }\n } else {\n agentId = context.args[0];\n }\n\n // Switch to selected agent\n const success = switchAgent(agentId);\n\n if (!success) {\n return `Agent not found: ${agentId}. Use /agent to see available agents.`;\n }\n\n const { getAgentById } = await import('../../../core/agent-manager.js');\n const selectedAgent = getAgentById(agentId);\n\n if (!selectedAgent) {\n return 'Failed to get agent details.';\n }\n\n return `Switched to agent: ${selectedAgent.metadata.name}\\n${selectedAgent.metadata.description}`;\n },\n};\n\nexport default agentCommand;\n",
18
- "/**\n * Rules Command\n * Select enabled shared system prompt rules\n */\n\nimport type { Command } from '../types.js';\n\nexport const rulesCommand: Command = {\n id: 'rules',\n label: '/rules',\n description: 'Select enabled shared system prompt rules',\n execute: async (context) => {\n const { getAllRules, getEnabledRuleIds, setEnabledRules } = await import('../../../core/rule-manager.js');\n\n const allRules = getAllRules();\n const enabledIds = getEnabledRuleIds();\n\n if (allRules.length === 0) {\n return 'No rules available.';\n }\n\n // Create options without status indicators (checkboxes will show selection)\n const ruleOptions = allRules.map((rule) => ({\n label: `${rule.metadata.name} - ${rule.metadata.description}`,\n value: rule.id,\n }));\n\n context.sendMessage(`Select rules to enable (currently ${enabledIds.length} enabled):`);\n const answers = await context.waitForInput({\n type: 'selection',\n questions: [\n {\n id: 'rules',\n question: 'Select all rules you want to enable:',\n options: ruleOptions,\n multiSelect: true,\n preSelected: enabledIds, // Pre-select currently enabled rules\n },\n ],\n });\n\n // Extract selected rule IDs\n const selectedRuleIds = typeof answers === 'object' && !Array.isArray(answers)\n ? (Array.isArray(answers['rules']) ? answers['rules'] : [])\n : [];\n\n if (!Array.isArray(selectedRuleIds)) {\n return 'Rule selection cancelled.';\n }\n\n // Update enabled rules\n const success = setEnabledRules(selectedRuleIds);\n\n if (!success) {\n return 'Failed to update rules.';\n }\n\n // Build summary message\n const enabledCount = selectedRuleIds.length;\n const disabledCount = allRules.length - enabledCount;\n\n const enabledRules = allRules.filter((r) => selectedRuleIds.includes(r.id));\n const enabledNames = enabledRules.map((r) => ` • ${r.metadata.name}`).join('\\n');\n\n return `Updated rules configuration:\n${enabledCount} enabled, ${disabledCount} disabled\n\nEnabled rules:\n${enabledNames || ' (none)'}`;\n },\n};\n\nexport default rulesCommand;\n",
19
- "/**\n * Compact Command\n * Summarize current session and start fresh\n */\n\nimport type { Command } from '../types.js';\n\nexport const compactCommand: Command = {\n id: 'compact',\n label: '/compact',\n description: 'Summarize current session and create a new session with the summary',\n execute: async (context) => {\n const currentSession = context.getCurrentSession();\n\n if (!currentSession) {\n return 'No active session to compact.';\n }\n\n if (currentSession.messages.length === 0) {\n return 'Current session has no messages to compact.';\n }\n\n const aiConfig = context.getConfig();\n if (!aiConfig?.defaultProvider || !aiConfig?.defaultModel) {\n return 'No AI provider configured. Use /provider to configure a provider first.';\n }\n\n context.sendMessage('Analyzing conversation and creating detailed summary...');\n\n try {\n // Import necessary modules\n const { getProvider } = await import('../../../providers/index.js');\n const { streamText } = await import('ai');\n const { getSystemPrompt } = await import('../../../core/ai-sdk.js');\n\n // Get provider and model\n const provider = getProvider(currentSession.provider);\n const providerConfig = aiConfig.providers?.[currentSession.provider];\n\n if (!providerConfig || !provider.isConfigured(providerConfig)) {\n return `Provider ${currentSession.provider} is not properly configured.`;\n }\n\n const model = provider.createClient(providerConfig, currentSession.model);\n\n // Build conversation history for summarization\n const conversationHistory = currentSession.messages.map((msg) => {\n // Extract text content from MessagePart array\n const textParts = msg.content\n .filter((part) => part.type === 'text')\n .map((part: any) => part.content);\n let content = textParts.join('\\n');\n\n // Include attachments info\n if (msg.attachments && msg.attachments.length > 0) {\n const attachmentsList = msg.attachments\n .map((att) => `[Attached: ${att.relativePath}]`)\n .join('\\n');\n content += `\\n${attachmentsList}`;\n }\n\n return `${msg.role === 'user' ? 'User' : 'Assistant'}: ${content}`;\n }).join('\\n\\n---\\n\\n');\n\n // Create summarization prompt\n const summaryPrompt = `You are a conversation summarizer. Your task is to create a comprehensive, detailed summary of the following conversation that preserves ALL important information.\n\nCRITICAL REQUIREMENTS:\n1. DO NOT omit any important details, decisions, code snippets, file paths, commands, or configurations\n2. Preserve technical accuracy - include exact function names, variable names, file paths, and command syntax\n3. Maintain chronological flow of the conversation\n4. Highlight key decisions, problems solved, and solutions implemented\n5. Include all context that would be needed to continue this conversation naturally\n6. Use clear markdown formatting with sections and bullet points\n7. If code was discussed or written, include the essential parts or describe what was implemented\n8. **CRITICAL**: If there is ongoing work or tasks in progress, create a section called \"## Current Work\" that describes:\n - What was being worked on when the conversation was compacted\n - What the next steps should be\n - Any pending tasks or unfinished work\n - The current state of the implementation\n\nThe summary will be used to start a fresh conversation while maintaining full context.\n\nCONVERSATION TO SUMMARIZE:\n${conversationHistory}\n\nPlease provide a detailed, structured summary now:`;\n\n // Call AI to generate summary\n const result = await streamText({\n model,\n messages: [\n {\n role: 'user',\n content: summaryPrompt,\n },\n ],\n maxTokens: 4096, // Allow longer summary\n });\n\n // Collect the full summary\n let summary = '';\n for await (const chunk of result.textStream) {\n summary += chunk;\n }\n\n if (!summary || summary.trim().length === 0) {\n return 'Failed to generate summary. Please try again.';\n }\n\n // Create new session with same provider/model\n const newSessionId = context.createSession(\n currentSession.provider,\n currentSession.model\n );\n\n // Switch to new session\n context.setCurrentSession(newSessionId);\n\n const messageCount = currentSession.messages.length;\n const sessionTitle = currentSession.title || 'Untitled session';\n\n // Format summary as a user message and trigger AI response\n const summaryMessage = `This session is being continued from a previous conversation that ran out of context. The conversation is summarized below:\n${summary}`;\n\n // Send summary and automatically trigger AI response\n // This allows the LLM to acknowledge the summary and continue working\n await context.triggerAIResponse(summaryMessage);\n\n return `✓ Compacted session \"${sessionTitle}\" (${messageCount} messages)\\n✓ Created new session with detailed summary\\n✓ Switched to new session\\n✓ AI is processing the summary and will continue working...`;\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n context.addLog(`[Compact] Error: ${errorMsg}`);\n return `Failed to compact session: ${errorMsg}`;\n }\n },\n};\n\nexport default compactCommand;\n",
20
- "/**\n * Notifications Command\n * Manage notification settings\n */\n\nimport type { Command, CommandContext } from '../types.js';\n\nexport default {\n id: 'notifications',\n label: '/notifications',\n description: 'Manage notification settings for AI responses',\n args: [\n {\n name: 'action',\n description: 'Action to perform (show, enable, disable)',\n required: true,\n suggestions: ['show', 'enable', 'disable']\n },\n {\n name: 'type',\n description: 'Notification type to configure (os, terminal, sound, all)',\n required: false,\n suggestions: ['os', 'terminal', 'sound', 'all']\n }\n ],\n \n async execute(args: string[], context: CommandContext): Promise<void> {\n const { updateNotificationSettings, notificationSettings } = context;\n \n if (args.length === 0) {\n context.updateOutput('\\n❌ Please specify an action: show, enable, or disable\\n');\n return;\n }\n\n const action = args[0].toLowerCase();\n \n switch (action) {\n case 'show':\n context.updateOutput('\\n🔔 Notification Settings:\\n');\n context.updateOutput(` OS Notifications: ${notificationSettings.osNotifications ? '✅ Enabled' : '❌ Disabled'}\\n`);\n context.updateOutput(` Terminal Notifications: ${notificationSettings.terminalNotifications ? '✅ Enabled' : '❌ Disabled'}\\n`);\n context.updateOutput(` Sound Effects: ${notificationSettings.sound ? '✅ Enabled' : '❌ Disabled'}\\n`);\n context.updateOutput('\\nUse /notifications enable/disable [type] to change settings.\\n');\n break;\n \n case 'enable':\n case 'disable': {\n const isEnabled = action === 'enable';\n \n if (args.length === 1 || args[1] === 'all') {\n // Enable/disable all notifications\n updateNotificationSettings({\n osNotifications: isEnabled,\n terminalNotifications: isEnabled,\n sound: isEnabled\n });\n context.updateOutput(`\\n${isEnabled ? '✅' : '❌'} All notifications ${isEnabled ? 'enabled' : 'disabled'}\\n`);\n } else {\n const type = args[1].toLowerCase();\n const updates: any = {};\n \n switch (type) {\n case 'os':\n updates.osNotifications = isEnabled;\n break;\n case 'terminal':\n updates.terminalNotifications = isEnabled;\n break;\n case 'sound':\n updates.sound = isEnabled;\n break;\n default:\n context.updateOutput(`\\n❌ Unknown notification type: ${type}\\n`);\n context.updateOutput('Valid types: os, terminal, sound, all\\n');\n return;\n }\n \n updateNotificationSettings(updates);\n context.updateOutput(`\\n${isEnabled ? '✅' : '❌'} ${type} notifications ${isEnabled ? 'enabled' : 'disabled'}\\n`);\n }\n break;\n }\n \n default:\n context.updateOutput(`\\n❌ Unknown action: ${action}\\n`);\n context.updateOutput('Valid actions: show, enable, disable\\n');\n }\n }\n} as Command;",
21
- "/**\n * Dashboard Command\n * Open the full-screen control panel\n */\n\nimport type { Command } from '../types.js';\n\nexport const dashboardCommand: Command = {\n id: 'dashboard',\n label: '/dashboard',\n description: 'Open control panel - central hub for all features',\n execute: async (context) => {\n context.navigateTo('dashboard');\n return 'Opening control panel...';\n },\n};\n",
22
- "/**\n * Command Registry\n * All available commands with their definitions and implementations\n */\n\nimport type { Command } from './types.js';\n\n// Import all command definitions\nimport providerCommand from './definitions/provider.command.js';\nimport modelCommand from './definitions/model.command.js';\nimport logsCommand from './definitions/logs.command.js';\nimport helpCommand from './definitions/help.command.js';\nimport surveyCommand from './definitions/survey.command.js';\nimport contextCommand from './definitions/context.command.js';\nimport sessionsCommand from './definitions/sessions.command.js';\nimport newCommand from './definitions/new.command.js';\nimport bashesCommand from './definitions/bashes.command.js';\nimport agentCommand from './definitions/agent.command.js';\nimport rulesCommand from './definitions/rules.command.js';\nimport compactCommand from './definitions/compact.command.js';\nimport notificationsCommand from './definitions/notifications.command.js';\nimport { dashboardCommand } from './definitions/dashboard.command.js';\n\n/**\n * All registered commands\n */\nexport const commands: Command[] = [\n dashboardCommand,\n providerCommand,\n modelCommand,\n agentCommand,\n rulesCommand,\n compactCommand,\n notificationsCommand,\n logsCommand,\n helpCommand,\n surveyCommand,\n contextCommand,\n sessionsCommand,\n newCommand,\n bashesCommand,\n];\n\n/**\n * Get command by ID\n */\nexport function getCommand(id: string): Command | undefined {\n return commands.find(cmd => cmd.id === id);\n}\n\n/**\n * Get command by label (e.g., '/model')\n */\nexport function getCommandByLabel(label: string): Command | undefined {\n return commands.find(cmd => cmd.label === label);\n}\n"
23
- ],
24
- "mappings": "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",
25
- "debugId": "905D113790986B1164756E2164756E21",
26
- "names": []
27
- }
@@ -1,4 +0,0 @@
1
- import"./chunk-3m9whg4q.js";import{AutoTokenizer as j}from"@huggingface/transformers";class R{tokenizer;initialized=!1;modelPath;constructor(B={}){this.modelPath=B.modelPath||"./models/starcoder2"}async initialize(){if(this.initialized)return;try{this.tokenizer=await j.from_pretrained(this.modelPath),this.initialized=!0}catch(B){throw Error(`Tokenizer initialization failed: ${B.message}`)}}async tokenize(B){if(!this.initialized)await this.initialize();let H=Date.now();if(!B||B.trim().length===0)return{tokens:[],metadata:{totalTokens:0,vocabSize:49152,processingTime:Date.now()-H,averageConfidence:0},raw:{inputIds:[],decodedText:""}};try{let J=(await this.tokenizer(B)).input_ids.tolist()[0],O=await this.tokenizer.decode(J),U=await this.createDirectTokens(O,J),K=Date.now()-H;return{tokens:U,metadata:{totalTokens:U.length,vocabSize:49152,processingTime:K,averageConfidence:0.95},raw:{inputIds:J,decodedText:O}}}catch(G){throw Error(`Tokenization failed: ${G.message}`)}}async createDirectTokens(B,H){let G=[];for(let J=0;J<H.length;J++){let O=H[J];try{let K=(await this.tokenizer.decode([O],{skip_special_tokens:!0})).trim().toLowerCase();if(K.length>0)G.push({text:K,id:O,score:1,confidence:1,relevance:"high"})}catch(U){}}return G}async getTopTokens(B,H=20){return(await this.tokenize(B)).tokens.slice(0,H)}async getTechnicalTokens(B){return(await this.tokenize(B)).tokens}async decode(B){if(!this.initialized)throw Error("Tokenizer not initialized. Call initialize() first.");return await this.tokenizer.decode(B)}async encode(B){if(!this.initialized)throw Error("Tokenizer not initialized. Call initialize() first.");return(await this.tokenizer(B)).input_ids.tolist()[0]}}async function k(B,H){try{let G=await B.getAllCodebaseFiles();if(H){if(H.file_extensions&&H.file_extensions.length>0)G=G.filter((K)=>H.file_extensions?.some((W)=>K.path.endsWith(W)));if(H.path_filter)G=G.filter((K)=>K.path.includes(H.path_filter));if(H.exclude_paths&&H.exclude_paths.length>0)G=G.filter((K)=>!H.exclude_paths?.some((W)=>K.path.includes(W)))}if(G.length===0)return null;let J=[];for(let K of G){let W=await B.getTFIDFDocument(K.path);if(W){let _=await B.getTFIDFTerms(K.path),X=new Map,$=new Map;for(let[E,Y]of Object.entries(_))X.set(E,Y);let Z=W.rawTerms||{};for(let[E,Y]of Object.entries(Z))$.set(E,Y);J.push({uri:`file://${K.path}`,terms:X,rawTerms:$,magnitude:W.magnitude})}}if(J.length===0)return null;let O=await B.getIDFValues(),U=new Map;for(let[K,W]of Object.entries(O))U.set(K,W);return{documents:J,idf:U,totalDocuments:J.length,metadata:{generatedAt:new Date().toISOString(),version:"1.0.0"}}}catch(G){return console.error("[ERROR] Failed to build search index from database:",G),null}}function M(B){let H=Array.from(B.values()).reduce((J,O)=>J+O,0),G=new Map;for(let[J,O]of B.entries())G.set(J,O/H);return G}function z(B,H){let G=new Map;for(let O of B){let U=new Set(O.keys());for(let K of U)G.set(K,(G.get(K)||0)+1)}let J=new Map;for(let[O,U]of G.entries())J.set(O,Math.log(H/U));return J}function V(B,H){let G=new Map;for(let[J,O]of B.entries()){let U=H.get(J)||0;G.set(J,O*U)}return G}function w(B){let H=0;for(let G of B.values())H+=G*G;return Math.sqrt(H)}var Q=null,v=!1;async function D(){if(!Q)Q=new R({modelPath:"./models/starcoder2"});if(!v){let{log:B,error:H}=console;console.log=()=>{},console.error=()=>{};try{await Q.initialize(),v=!0}finally{console.log=B,console.error=H}}return Q}async function S(B){let G=await(await D()).tokenize(B),J=new Map;for(let O of G.tokens){let U=O.text.toLowerCase(),K=J.get(U)||0;J.set(U,K+O.score)}return J}async function P(B){let G=await(await D()).tokenize(B),J=new Map;for(let O of G.tokens){let U=O.text.toLowerCase();if(!J.has(U)||O.score>0.8)J.set(U,O.text)}return Array.from(J.values())}async function q(B,H){let J=[];for(let K=0;K<B.length;K+=1){let W=B.slice(K,K+1),_=[];for(let X=0;X<W.length;X++){let $=W[X],Z=$.uri.split("/").pop()||$.uri;H?.({current:K+X+1,total:B.length,fileName:Z,status:"processing"});try{let E=await S($.content);_.push({uri:$.uri,terms:E}),H?.({current:K+X+1,total:B.length,fileName:Z,status:"completed"})}catch(E){_.push({uri:$.uri,terms:new Map}),H?.({current:K+X+1,total:B.length,fileName:Z,status:"skipped"})}}J.push(..._)}let O=z(J.map((K)=>K.terms),B.length);return{documents:J.map((K)=>{let W=M(K.terms),_=V(W,O),X=w(_);return{uri:K.uri,terms:_,rawTerms:K.terms,magnitude:X}}),idf:O,totalDocuments:B.length,metadata:{generatedAt:new Date().toISOString(),version:"5.0.0",tokenizer:"AdvancedCodeTokenizer",features:["Industry-leading code understanding","Advanced technical term recognition","Optimized for code search","Simple and effective approach","No unnecessary complexity"]}}}function h(B,H){let G=0;for(let[O,U]of B.entries()){let K=H.terms.get(O)||0;G+=U*K}let J=w(B);if(J===0||H.magnitude===0)return 0;return G/(J*H.magnitude)}async function I(B,H){let G=await P(B),J=new Map;for(let O of G){let U=O.toLowerCase(),K=H.get(U)||0;if(K>0)J.set(U,K)}return J}async function y(B,H,G={}){let{limit:J=10,minScore:O=0,boostFactors:U={}}=G,{exactMatch:K=1.5,phraseMatch:W=2,technicalMatch:_=1.8,identifierMatch:X=1.3}=U,$=await I(B,H.idf),Z=(await P(B)).map((Y)=>Y.toLowerCase());return H.documents.map((Y)=>{let L=h($,Y),C=[];for(let N of Z)if(Y.rawTerms.has(N)){let A=K;if(b(N))A=Math.max(A,_);if(p(N))A=Math.max(A,X);L*=A,C.push(N)}if(C.length===Z.length&&Z.length>1)L*=W;if(Z.length>3&&C.length>=Z.length*0.7)L*=1.2;return{uri:Y.uri,score:L,matchedTerms:C}}).filter((Y)=>Y.score>=O).sort((Y,L)=>L.score-Y.score).slice(0,J)}function b(B){return[/\b[A-Z]{2,}\b/,/\b[A-Z][a-z]+(?:[A-Z][a-z]+)+\b/,/\b[a-z]+[A-Z][a-z]*\b/,/\b\w+(?:Dir|Config|File|Path|Data|Service|Manager|Handler)\b/,/\b(?:get|set|is|has|can|should|will|do)[A-Z]\w*\b/,/\b(?:http|https|json|xml|yaml|sql|api|url|uri)\b/].some((G)=>G.test(B))}function p(B){return/^[a-zA-Z][a-zA-Z0-9_]*$/.test(B)&&B.length>1}function T(B){let H={documents:B.documents.map((G)=>({uri:G.uri,terms:Array.from(G.terms.entries()),rawTerms:Array.from(G.rawTerms.entries()),magnitude:G.magnitude})),idf:Array.from(B.idf.entries()),totalDocuments:B.totalDocuments,metadata:B.metadata};return JSON.stringify(H,null,2)}function f(B){let H=JSON.parse(B);return{documents:H.documents.map((G)=>({uri:G.uri,terms:new Map(G.terms),rawTerms:new Map(G.rawTerms),magnitude:G.magnitude})),idf:new Map(H.idf),totalDocuments:H.totalDocuments,metadata:H.metadata}}export{T as serializeIndex,y as searchDocuments,I as processQuery,f as deserializeIndex,h as calculateCosineSimilarity,k as buildSearchIndexFromDB,q as buildSearchIndex};
2
- export{q as d,y as e};
3
-
4
- //# debugId=F6CC4F566F5A987064756E2164756E21
@@ -1,11 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/utils/advanced-tokenizer.ts", "../src/services/search/tfidf.ts"],
4
- "sourcesContent": [
5
- "/**\n * Advanced Code Tokenizer - 純粹 StarCoder2,無任何多餘處理\n * 完全信任 StarCoder2 嘅世界級 tokenization 能力\n */\n\nimport { AutoTokenizer } from '@huggingface/transformers';\n\nexport interface AdvancedToken {\n text: string;\n id: number;\n score: number;\n confidence: number;\n relevance: 'high' | 'medium' | 'low';\n}\n\nexport interface AdvancedTokenizerResult {\n tokens: AdvancedToken[];\n metadata: {\n totalTokens: number;\n vocabSize: number;\n processingTime: number;\n averageConfidence: number;\n };\n raw: {\n inputIds: number[];\n decodedText: string;\n };\n}\n\n/**\n * Advanced Code Tokenizer - 純粹 StarCoder2\n */\nexport class AdvancedCodeTokenizer {\n private tokenizer: any;\n private initialized = false;\n private modelPath: string;\n\n constructor(\n options: {\n modelPath?: string;\n } = {}\n ) {\n this.modelPath = options.modelPath || './models/starcoder2';\n }\n\n /**\n * 初始化 tokenizer\n */\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n try {\n this.tokenizer = await AutoTokenizer.from_pretrained(this.modelPath);\n this.initialized = true;\n } catch (error) {\n throw new Error(`Tokenizer initialization failed: ${error.message}`);\n }\n }\n\n /**\n * 純粹 StarCoder2 tokenization - 無任何安全限制或多餘分析\n */\n async tokenize(content: string): Promise<AdvancedTokenizerResult> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const startTime = Date.now();\n\n // Handle empty content\n if (!content || content.trim().length === 0) {\n return {\n tokens: [],\n metadata: {\n totalTokens: 0,\n vocabSize: 49152,\n processingTime: Date.now() - startTime,\n averageConfidence: 0,\n },\n raw: {\n inputIds: [],\n decodedText: '',\n },\n };\n }\n\n try {\n // 完全信任 StarCoder2,直接處理所有內容\n const encoded = await this.tokenizer(content);\n const inputIds = encoded.input_ids.tolist()[0];\n\n // 解碼獲得原文\n const decodedText = await this.tokenizer.decode(inputIds);\n\n // 直接用 StarCoder2 嘅輸出,唔做多餘分析\n const tokens = await this.createDirectTokens(decodedText, inputIds);\n\n const processingTime = Date.now() - startTime;\n\n return {\n tokens,\n metadata: {\n totalTokens: tokens.length,\n vocabSize: 49152,\n processingTime,\n averageConfidence: 0.95, // StarCoder2 本身就係高質量\n },\n raw: {\n inputIds,\n decodedText,\n },\n };\n } catch (error) {\n throw new Error(`Tokenization failed: ${error.message}`);\n }\n }\n\n /**\n * 純粹 StarCoder2 tokenization - 完全信任,無任何額外處理\n * 直接使用 StarCoder2 嘅 token IDs,逐個解碼成文字\n */\n private async createDirectTokens(\n _decodedText: string,\n inputIds: number[]\n ): Promise<AdvancedToken[]> {\n const tokens: AdvancedToken[] = [];\n\n // 完全信任 StarCoder2,直接使用佢嘅 tokenization\n // 逐個 token ID 解碼,得到 StarCoder2 認為嘅最佳分割\n for (let i = 0; i < inputIds.length; i++) {\n const tokenId = inputIds[i];\n try {\n // 直接使用 StarCoder2 嘅解碼結果\n const tokenText = await this.tokenizer.decode([tokenId], { skip_special_tokens: true });\n const cleaned = tokenText.trim().toLowerCase();\n\n // 只過濾空白 token,其他全部保留(完全信任 StarCoder2)\n if (cleaned.length > 0) {\n tokens.push({\n text: cleaned,\n id: tokenId,\n score: 1.0, // StarCoder2 嘅所有 token 都係高質量\n confidence: 1.0, // 完全信任 StarCoder2\n relevance: 'high' as const,\n });\n }\n } catch (_error) {}\n }\n\n return tokens;\n }\n\n /**\n * 便利方法:只返回高質量 tokens\n */\n async getTopTokens(content: string, limit = 20): Promise<AdvancedToken[]> {\n const result = await this.tokenize(content);\n return result.tokens.slice(0, limit);\n }\n\n /**\n * 便利方法:返回所有 tokens (StarCoder2 嘅輸出全部都係高質量)\n */\n async getTechnicalTokens(content: string): Promise<AdvancedToken[]> {\n const result = await this.tokenize(content);\n return result.tokens; // StarCoder2 嘅所有輸出都係技術相關\n }\n\n /**\n * 解碼 token IDs 回文本\n */\n async decode(tokenIds: number[]): Promise<string> {\n if (!this.initialized) {\n throw new Error('Tokenizer not initialized. Call initialize() first.');\n }\n return await this.tokenizer.decode(tokenIds);\n }\n\n /**\n * 編碼文本為 token IDs\n */\n async encode(text: string): Promise<number[]> {\n if (!this.initialized) {\n throw new Error('Tokenizer not initialized. Call initialize() first.');\n }\n const result = await this.tokenizer(text);\n return result.input_ids.tolist()[0];\n }\n}\n",
6
- "/**\n * TF-IDF (Term Frequency-Inverse Document Frequency) implementation\n * Used for ranking document relevance in semantic search\n */\n\nimport { AdvancedCodeTokenizer } from '../../utils/advanced-tokenizer.js';\nimport type { SeparatedMemoryStorage } from './separated-storage.js';\n\nexport interface DocumentVector {\n uri: string;\n terms: Map<string, number>; // term → TF-IDF score\n rawTerms: Map<string, number>; // term → raw frequency\n magnitude: number; // Vector magnitude for cosine similarity\n}\n\nexport interface SearchIndex {\n documents: DocumentVector[];\n idf: Map<string, number>; // term → IDF score\n totalDocuments: number;\n metadata: {\n generatedAt: string;\n version: string;\n };\n}\n\n/**\n * Build search index from database (shared between CLI and MCP)\n */\nexport async function buildSearchIndexFromDB(\n memoryStorage: SeparatedMemoryStorage,\n filters?: {\n file_extensions?: string[];\n path_filter?: string;\n exclude_paths?: string[];\n }\n): Promise<SearchIndex | null> {\n try {\n // Get all files from database\n let files = await memoryStorage.getAllCodebaseFiles();\n\n // Apply filters\n if (filters) {\n if (filters.file_extensions && filters.file_extensions.length > 0) {\n files = files.filter((file) =>\n filters.file_extensions?.some((ext: string) => file.path.endsWith(ext))\n );\n }\n\n if (filters.path_filter) {\n files = files.filter((file) => file.path.includes(filters.path_filter!));\n }\n\n if (filters.exclude_paths && filters.exclude_paths.length > 0) {\n files = files.filter(\n (file) => !filters.exclude_paths?.some((exclude: string) => file.path.includes(exclude))\n );\n }\n }\n\n if (files.length === 0) {\n return null;\n }\n\n // Build search documents - read TF-IDF terms directly from database\n const documents = [];\n for (const file of files) {\n const tfidfDoc = await memoryStorage.getTFIDFDocument(file.path);\n if (tfidfDoc) {\n // Get TF-IDF terms from database (already calculated)\n const tfidfTerms = await memoryStorage.getTFIDFTerms(file.path);\n const terms = new Map<string, number>();\n const rawTermsMap = new Map<string, number>();\n\n // Use TF-IDF terms for search scoring\n for (const [term, tfidfScore] of Object.entries(tfidfTerms)) {\n terms.set(term, tfidfScore as number);\n }\n\n // Use rawTerms for reference\n const rawTerms = tfidfDoc.rawTerms || {};\n for (const [term, freq] of Object.entries(rawTerms)) {\n rawTermsMap.set(term, freq as number);\n }\n\n documents.push({\n uri: `file://${file.path}`,\n terms,\n rawTerms: rawTermsMap,\n magnitude: tfidfDoc.magnitude,\n });\n }\n }\n\n if (documents.length === 0) {\n return null;\n }\n\n // Get IDF values from database\n const idfRecords = await memoryStorage.getIDFValues();\n const idf = new Map<string, number>();\n for (const [term, value] of Object.entries(idfRecords)) {\n idf.set(term, value as number);\n }\n\n return {\n documents,\n idf,\n totalDocuments: documents.length,\n metadata: {\n generatedAt: new Date().toISOString(),\n version: '1.0.0',\n },\n };\n } catch (error) {\n console.error('[ERROR] Failed to build search index from database:', error);\n return null;\n }\n}\n\n/**\n * Calculate Term Frequency (TF)\n * TF = (number of times term appears in document) / (total terms in document)\n */\nfunction calculateTF(termFrequency: Map<string, number>): Map<string, number> {\n const totalTerms = Array.from(termFrequency.values()).reduce((sum, freq) => sum + freq, 0);\n const tf = new Map<string, number>();\n\n for (const [term, freq] of termFrequency.entries()) {\n tf.set(term, freq / totalTerms);\n }\n\n return tf;\n}\n\n/**\n * Calculate Inverse Document Frequency (IDF)\n * IDF = log(total documents / documents containing term)\n */\nfunction calculateIDF(\n documents: Map<string, number>[],\n totalDocuments: number\n): Map<string, number> {\n const documentFrequency = new Map<string, number>();\n\n // Count how many documents contain each term\n for (const doc of documents) {\n const uniqueTerms = new Set(doc.keys());\n for (const term of uniqueTerms) {\n documentFrequency.set(term, (documentFrequency.get(term) || 0) + 1);\n }\n }\n\n // Calculate IDF for each term\n const idf = new Map<string, number>();\n for (const [term, docFreq] of documentFrequency.entries()) {\n idf.set(term, Math.log(totalDocuments / docFreq));\n }\n\n return idf;\n}\n\n/**\n * Calculate TF-IDF scores for a document\n */\nfunction calculateTFIDF(tf: Map<string, number>, idf: Map<string, number>): Map<string, number> {\n const tfidf = new Map<string, number>();\n\n for (const [term, tfScore] of tf.entries()) {\n const idfScore = idf.get(term) || 0;\n tfidf.set(term, tfScore * idfScore);\n }\n\n return tfidf;\n}\n\n/**\n * Calculate vector magnitude for cosine similarity\n */\nfunction calculateMagnitude(vector: Map<string, number>): number {\n let sum = 0;\n for (const value of vector.values()) {\n sum += value * value;\n }\n return Math.sqrt(sum);\n}\n\n// Global tokenizer instance for performance\nlet globalTokenizer: AdvancedCodeTokenizer | null = null;\nlet tokenizerInitialized = false;\n\n/**\n * Get or create the global tokenizer\n */\nasync function getTokenizer(): Promise<AdvancedCodeTokenizer> {\n if (!globalTokenizer) {\n globalTokenizer = new AdvancedCodeTokenizer({\n modelPath: './models/starcoder2',\n });\n }\n\n if (!tokenizerInitialized) {\n // Silently initialize - no console output\n const originalLog = console.log;\n const originalError = console.error;\n console.log = () => {}; // Temporarily silence console.log\n console.error = () => {}; // Temporarily silence console.error\n try {\n await globalTokenizer.initialize();\n tokenizerInitialized = true;\n } finally {\n console.log = originalLog; // Restore console.log\n console.error = originalError; // Restore console.error\n }\n }\n\n return globalTokenizer;\n}\n\n/**\n * Extract terms using our advanced tokenizer\n */\nasync function extractTerms(content: string): Promise<Map<string, number>> {\n const tokenizer = await getTokenizer();\n const result = await tokenizer.tokenize(content);\n const terms = new Map<string, number>();\n\n // Use token scores as TF weights\n for (const token of result.tokens) {\n const term = token.text.toLowerCase();\n const currentScore = terms.get(term) || 0;\n terms.set(term, currentScore + token.score);\n }\n\n return terms;\n}\n\n/**\n * Extract simple tokens for query processing\n */\nasync function extractQueryTokens(query: string): Promise<string[]> {\n const tokenizer = await getTokenizer();\n const result = await tokenizer.tokenize(query);\n\n // Return unique tokens, sorted by score (highest first)\n const uniqueTokens = new Map<string, string>();\n for (const token of result.tokens) {\n const lowerText = token.text.toLowerCase();\n if (!uniqueTokens.has(lowerText) || token.score > 0.8) {\n uniqueTokens.set(lowerText, token.text);\n }\n }\n\n return Array.from(uniqueTokens.values());\n}\n\nexport interface BuildIndexProgress {\n current: number;\n total: number;\n fileName: string;\n status: 'processing' | 'completed' | 'skipped';\n}\n\n/**\n * Build TF-IDF search index from documents using our advanced tokenizer\n */\nexport async function buildSearchIndex(\n documents: Array<{ uri: string; content: string }>,\n onProgress?: (progress: BuildIndexProgress) => void\n): Promise<SearchIndex> {\n // Process documents one by one to avoid hanging\n const batchSize = 1; // Process 1 document at a time to avoid hanging\n const documentTerms: Array<{ uri: string; terms: Map<string, number> }> = [];\n\n for (let i = 0; i < documents.length; i += batchSize) {\n const batch = documents.slice(i, i + batchSize);\n\n // Process sequentially to avoid hanging\n const batchResults = [];\n for (let j = 0; j < batch.length; j++) {\n const doc = batch[j];\n const fileName = doc.uri.split('/').pop() || doc.uri;\n\n // Report progress\n onProgress?.({\n current: i + j + 1,\n total: documents.length,\n fileName,\n status: 'processing',\n });\n\n try {\n const result = await extractTerms(doc.content);\n\n batchResults.push({\n uri: doc.uri,\n terms: result,\n });\n\n // Report completion\n onProgress?.({\n current: i + j + 1,\n total: documents.length,\n fileName,\n status: 'completed',\n });\n } catch (_error) {\n batchResults.push({\n uri: doc.uri,\n terms: new Map<string, number>(),\n });\n\n // Report skip\n onProgress?.({\n current: i + j + 1,\n total: documents.length,\n fileName,\n status: 'skipped',\n });\n }\n }\n\n documentTerms.push(...batchResults);\n }\n\n // Calculate IDF scores\n const idf = calculateIDF(\n documentTerms.map((d) => d.terms),\n documents.length\n );\n\n // Calculate TF-IDF for each document\n const documentVectors: DocumentVector[] = documentTerms.map((doc) => {\n const tf = calculateTF(doc.terms);\n const tfidf = calculateTFIDF(tf, idf);\n const magnitude = calculateMagnitude(tfidf);\n\n return {\n uri: doc.uri,\n terms: tfidf,\n rawTerms: doc.terms,\n magnitude,\n };\n });\n\n return {\n documents: documentVectors,\n idf,\n totalDocuments: documents.length,\n metadata: {\n generatedAt: new Date().toISOString(),\n version: '5.0.0',\n tokenizer: 'AdvancedCodeTokenizer',\n features: [\n 'Industry-leading code understanding',\n 'Advanced technical term recognition',\n 'Optimized for code search',\n 'Simple and effective approach',\n 'No unnecessary complexity',\n ],\n },\n };\n}\n\n/**\n * Calculate cosine similarity between query and document\n */\nexport function calculateCosineSimilarity(\n queryVector: Map<string, number>,\n docVector: DocumentVector\n): number {\n let dotProduct = 0;\n\n // Calculate dot product\n for (const [term, queryScore] of queryVector.entries()) {\n const docScore = docVector.terms.get(term) || 0;\n dotProduct += queryScore * docScore;\n }\n\n // Calculate query magnitude\n const queryMagnitude = calculateMagnitude(queryVector);\n\n if (queryMagnitude === 0 || docVector.magnitude === 0) {\n return 0;\n }\n\n return dotProduct / (queryMagnitude * docVector.magnitude);\n}\n\n/**\n * Process query into TF-IDF vector using database values\n */\nexport async function processQuery(\n query: string,\n idf: Map<string, number>\n): Promise<Map<string, number>> {\n const terms = await extractQueryTokens(query);\n const queryVector = new Map<string, number>();\n\n // 為每個查詢詞使用 IDF 值(查詢本身無 TF-IDF,直接用 IDF)\n for (const term of terms) {\n const lowerTerm = term.toLowerCase();\n const idfValue = idf.get(lowerTerm) || 0;\n\n // 純粹用 IDF 值,完全信任 StarCoder2 嘅 tokenization\n if (idfValue > 0) {\n queryVector.set(lowerTerm, idfValue);\n }\n }\n\n return queryVector;\n}\n\n/**\n * Search documents using TF-IDF and cosine similarity with Advanced Code Tokenizer\n */\nexport async function searchDocuments(\n query: string,\n index: SearchIndex,\n options: {\n limit?: number;\n minScore?: number;\n boostFactors?: {\n exactMatch?: number; // Boost for exact term matches\n phraseMatch?: number; // Boost for phrase matches\n technicalMatch?: number; // Boost for technical term matches\n identifierMatch?: number; // Boost for identifier matches\n };\n } = {}\n): Promise<Array<{ uri: string; score: number; matchedTerms: string[] }>> {\n const { limit = 10, minScore = 0, boostFactors = {} } = options;\n const {\n exactMatch = 1.5,\n phraseMatch = 2.0,\n technicalMatch = 1.8,\n identifierMatch = 1.3,\n } = boostFactors;\n\n // Process query using Advanced Code Tokenizer\n const queryVector = await processQuery(query, index.idf);\n const queryTokens = (await extractQueryTokens(query)).map((t) => t.toLowerCase());\n\n // Calculate similarity for each document\n const results = index.documents.map((doc) => {\n let score = calculateCosineSimilarity(queryVector, doc);\n\n // Boost for exact term matches with enhanced scoring\n const matchedTerms: string[] = [];\n for (const token of queryTokens) {\n if (doc.rawTerms.has(token)) {\n // Apply different boost factors based on term characteristics\n let boostFactor = exactMatch;\n\n // Additional boost for technical terms\n if (isTechnicalTerm(token)) {\n boostFactor = Math.max(boostFactor, technicalMatch);\n }\n\n // Additional boost for identifiers\n if (isIdentifier(token)) {\n boostFactor = Math.max(boostFactor, identifierMatch);\n }\n\n score *= boostFactor;\n matchedTerms.push(token);\n }\n }\n\n // Enhanced phrase match detection (all query terms appear in document)\n if (matchedTerms.length === queryTokens.length && queryTokens.length > 1) {\n score *= phraseMatch;\n }\n\n // Contextual relevance boost for longer queries\n if (queryTokens.length > 3 && matchedTerms.length >= queryTokens.length * 0.7) {\n score *= 1.2; // Boost for partial matches on complex queries\n }\n\n return {\n uri: doc.uri,\n score,\n matchedTerms,\n };\n });\n\n // Filter and sort\n return results\n .filter((result) => result.score >= minScore)\n .sort((a, b) => b.score - a.score)\n .slice(0, limit);\n}\n\n/**\n * Check if a term is likely a technical term\n */\nfunction isTechnicalTerm(term: string): boolean {\n const technicalPatterns = [\n /\\b[A-Z]{2,}\\b/, // Acronyms like HTTP, API, JSON\n /\\b[A-Z][a-z]+(?:[A-Z][a-z]+)+\\b/, // PascalCase like ComponentName\n /\\b[a-z]+[A-Z][a-z]*\\b/, // camelCase like functionName\n /\\b\\w+(?:Dir|Config|File|Path|Data|Service|Manager|Handler)\\b/, // Common suffixes\n /\\b(?:get|set|is|has|can|should|will|do)[A-Z]\\w*\\b/, // Common prefixes\n /\\b(?:http|https|json|xml|yaml|sql|api|url|uri)\\b/, // Technical keywords\n ];\n\n return technicalPatterns.some((pattern) => pattern.test(term));\n}\n\n/**\n * Check if a term is likely an identifier\n */\nfunction isIdentifier(term: string): boolean {\n // Identifiers typically contain letters and numbers, maybe underscores\n return /^[a-zA-Z][a-zA-Z0-9_]*$/.test(term) && term.length > 1;\n}\n\n/**\n * Serialize search index to JSON\n */\nexport function serializeIndex(index: SearchIndex): string {\n const serializable = {\n documents: index.documents.map((doc) => ({\n uri: doc.uri,\n terms: Array.from(doc.terms.entries()),\n rawTerms: Array.from(doc.rawTerms.entries()),\n magnitude: doc.magnitude,\n })),\n idf: Array.from(index.idf.entries()),\n totalDocuments: index.totalDocuments,\n metadata: index.metadata,\n };\n\n return JSON.stringify(serializable, null, 2);\n}\n\n/**\n * Deserialize search index from JSON\n */\nexport function deserializeIndex(json: string): SearchIndex {\n const data = JSON.parse(json);\n\n return {\n documents: data.documents.map(\n (doc: {\n uri: string;\n terms: [string, number][];\n rawTerms: [string, number][];\n magnitude: number;\n }) => ({\n uri: doc.uri,\n terms: new Map(doc.terms),\n rawTerms: new Map(doc.rawTerms),\n magnitude: doc.magnitude,\n })\n ),\n idf: new Map(data.idf),\n totalDocuments: data.totalDocuments,\n metadata: data.metadata,\n };\n}\n"
7
- ],
8
- "mappings": "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",
9
- "debugId": "F6CC4F566F5A987064756E2164756E21",
10
- "names": []
11
- }