@openadapter/koda 1.0.0-beta.12 → 1.0.0-beta.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.js CHANGED
@@ -1 +1 @@
1
- var ue=Object.defineProperty;var l=(e,t)=>ue(e,"name",{value:t,configurable:!0});import{createInterface as pe}from"node:readline";import{modelsAreEqual as ge}from"@openadapter/koda-ai";import{ProcessTerminal as he,setKeybindings as ve,TUI as we}from"@openadapter/koda-tui";import c from"chalk";import{parseArgs as Se,printHelp as xe}from"./cli/args.js";import{processFileArguments as ye}from"./cli/file-processor.js";import{buildInitialMessage as D}from"./cli/initial-message.js";import{listModels as ke}from"./cli/list-models.js";import{handleImportCommand as Te,handleSetupCommand as Me,maybeFirstRunSetup as Pe,maybeRefreshOpenAdapterModels as Ce}from"./cli/openadapter-setup.js";import{selectSession as Ee}from"./cli/session-picker.js";import{ENV_SESSION_DIR as Ie,expandTildePath as Fe,getAgentDir as O,getPackageDir as Le,VERSION as be}from"./config.js";import{createAgentSessionRuntime as Ae}from"./core/agent-session-runtime.js";import{createAgentSessionFromServices as Oe,createAgentSessionServices as $e}from"./core/agent-session-services.js";import{formatNoModelsAvailableMessage as Re}from"./core/auth-guidance.js";import{AuthStorage as Ke}from"./core/auth-storage.js";import{exportFromFile as _e}from"./core/export-html/index.js";import{configureHttpDispatcher as Ne}from"./core/http-dispatcher.js";import{KeybindingsManager as We}from"./core/keybindings.js";import{resolveCliModel as je,resolveModelScope as De}from"./core/model-resolver.js";import{restoreStdout as He,takeOverStdout as Be}from"./core/output-guard.js";import{formatMissingSessionCwdPrompt as Ve,getMissingSessionCwdIssue as qe,MissingSessionCwdError as Ue}from"./core/session-cwd.js";import{assertValidSessionId as ze,SessionManager as f}from"./core/session-manager.js";import{SettingsManager as Ye}from"./core/settings-manager.js";import{printTimings as C,resetTimings as Qe,time as p}from"./core/timings.js";import{runMigrations as Ge,showDeprecationWarnings as Je}from"./migrations.js";import{InteractiveMode as Xe,runPrintMode as Ze,runRpcMode as eo}from"./modes/index.js";import{ExtensionSelectorComponent as oo}from"./modes/interactive/components/extension-selector.js";import{initTheme as $,stopThemeWatcher as R}from"./modes/interactive/theme/theme.js";import{handleConfigCommand as to,handlePackageCommand as no}from"./package-manager-cli.js";import{isLocalPath as io,normalizePath as so,resolvePath as H}from"./utils/paths.js";import{cleanupWindowsSelfUpdateQuarantine as ro}from"./utils/windows-self-update.js";async function ao(){if(!process.stdin.isTTY)return new Promise(e=>{let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",n=>{t+=n}),process.stdin.on("end",()=>{e(t.trim()||void 0)}),process.stdin.resume()})}l(ao,"readPipedStdin");function B(e,t){return e.drainErrors().map(({scope:n,error:o})=>({type:"warning",message:`(${t}, ${n} settings) ${o.message}`}))}l(B,"collectSettingsDiagnostics");function V(e){for(const t of e){const n=t.type==="error"?c.red:t.type==="warning"?c.yellow:c.dim,o=t.type==="error"?"Error: ":t.type==="warning"?"Warning: ":"";console.error(n(`${o}${t.message}`))}}l(V,"reportDiagnostics");function q(e){return e?e==="1"||e.toLowerCase()==="true"||e.toLowerCase()==="yes":!1}l(q,"isTruthyEnvFlag");function lo(e,t){return e.mode==="rpc"?"rpc":e.mode==="json"?"json":e.print||!t?"print":"interactive"}l(lo,"resolveAppMode");function co(e){return e==="json"?"json":"text"}l(co,"toPrintOutputMode");async function mo(e,t,n){if(e.fileArgs.length===0)return D({parsed:e,stdinContent:n});const{text:o,images:i}=await ye(e.fileArgs,{autoResizeImages:t});return D({parsed:e,fileText:o,fileImages:i,stdinContent:n})}l(mo,"prepareInitialMessage");async function U(e,t,n){const i=(await f.list(t,n)).find(s=>s.id===e);return i?{type:"local",path:i.path}:void 0}l(U,"findLocalSessionByExactId");async function z(e,t,n){if(e.includes("/")||e.includes("\\")||e.endsWith(".jsonl"))return{type:"path",path:H(e,t)};const o=await f.list(t,n),i=o.find(d=>d.id===e)??o.find(d=>d.id.startsWith(e));if(i)return{type:"local",path:i.path};const s=await f.listAll(n),u=s.find(d=>d.id===e)??s.find(d=>d.id.startsWith(e));return u?{type:"global",path:u.path,cwd:u.cwd}:{type:"not_found",arg:e}}l(z,"resolveSessionPath");async function fo(e){return new Promise(t=>{const n=pe({input:process.stdin,output:process.stdout});n.question(`${e} [y/N] `,o=>{n.close(),t(o.toLowerCase()==="y"||o.toLowerCase()==="yes")})})}l(fo,"promptConfirm");function uo(e){if(!e.fork)return;const t=[e.session?"--session":void 0,e.continue?"--continue":void 0,e.resume?"--resume":void 0,e.noSession?"--no-session":void 0].filter(n=>n!==void 0);t.length>0&&(console.error(c.red(`Error: --fork cannot be combined with ${t.join(", ")}`)),process.exit(1))}l(uo,"validateForkFlags");function po(e){if(e.sessionId===void 0)return;const t=[e.session?"--session":void 0,e.continue?"--continue":void 0,e.resume?"--resume":void 0,e.noSession?"--no-session":void 0].filter(n=>n!==void 0);t.length>0&&(console.error(c.red(`Error: --session-id cannot be combined with ${t.join(", ")}`)),process.exit(1));try{ze(e.sessionId)}catch(n){const o=n instanceof Error?n.message:String(n);console.error(c.red(`Error: ${o}`)),process.exit(1)}}l(po,"validateSessionIdFlags");function Y(e,t,n,o){try{return f.forkFrom(e,t,n,{id:o})}catch(i){const s=i instanceof Error?i.message:String(i);console.error(c.red(`Error: ${s}`)),process.exit(1)}}l(Y,"forkSessionOrExit");async function go(e,t,n,o){if(e.noSession||e.help||e.listModels!==void 0)return f.inMemory(t);if(e.fork){e.sessionId&&await U(e.sessionId,t,n)&&(console.error(c.red(`Session already exists with id '${e.sessionId}'`)),process.exit(1));const i=await z(e.fork,t,n);switch(i.type){case"path":case"local":case"global":return Y(i.path,t,n,e.sessionId);case"not_found":console.error(c.red(`No session found matching '${i.arg}'`)),process.exit(1)}}if(e.session){const i=await z(e.session,t,n);switch(i.type){case"path":case"local":return f.open(i.path,n);case"global":return console.log(c.yellow(`Session found in different project: ${i.cwd}`)),await fo("Fork this session into current directory?")||(console.log(c.dim("Aborted.")),process.exit(0)),Y(i.path,t,n);case"not_found":console.error(c.red(`No session found matching '${i.arg}'`)),process.exit(1)}}if(e.resume){$(o.getTheme(),!0);try{const i=await Ee(s=>f.list(t,n,s),s=>f.listAll(n,s));return i||(console.log(c.dim("No session selected")),process.exit(0)),f.open(i,n)}finally{R()}}if(e.continue)return f.continueRecent(t,n);if(e.sessionId){const i=await U(e.sessionId,t,n);if(i)return f.open(i.path,n)}return f.create(t,n,{id:e.sessionId})}l(go,"createSessionManager");function ho(e,t,n,o,i){const s={},u=[];let d=!1;if(e.model){const a=je({cliProvider:e.provider,cliModel:e.model,modelRegistry:o});a.warning&&u.push({type:"warning",message:a.warning}),a.error&&u.push({type:"error",message:a.error}),a.model&&(s.model=a.model,!e.thinking&&a.thinkingLevel&&(s.thinkingLevel=a.thinkingLevel,d=!0))}if(!s.model&&t.length>0&&!n){const a=i.getDefaultProvider(),S=i.getDefaultModel(),h=a&&S?o.find(a,S):void 0,v=h?t.find(y=>ge(y.model,h)):void 0;v?(s.model=v.model,!e.thinking&&v.thinkingLevel&&(s.thinkingLevel=v.thinkingLevel)):(s.model=t[0].model,!e.thinking&&t[0].thinkingLevel&&(s.thinkingLevel=t[0].thinkingLevel))}return e.thinking&&(s.thinkingLevel=e.thinking),t.length>0&&(s.scopedModels=t.map(a=>({model:a.model,thinkingLevel:a.thinkingLevel}))),e.noTools?s.noTools="all":e.noBuiltinTools&&(s.noTools="builtin"),e.tools&&(s.tools=[...e.tools]),e.excludeTools&&(s.excludeTools=[...e.excludeTools]),{options:s,cliThinkingFromModel:d,diagnostics:u}}l(ho,"buildSessionOptions");function E(e,t){return t?.map(n=>io(n)?H(n,e):n)}l(E,"resolveCliPaths");async function vo(e,t){return $(t.getTheme()),ve(We.create()),new Promise(n=>{const o=new we(new he,t.getShowHardwareCursor());o.setClearOnShrink(t.getClearOnShrink());let i=!1;const s=l(d=>{i||(i=!0,o.stop(),n(d))},"finish"),u=new oo(Ve(e),["Continue","Cancel"],d=>s(d==="Continue"?e.fallbackCwd:void 0),()=>s(void 0),{tui:o});o.addChild(u),o.setFocus(u),o.start()})}l(vo,"promptForMissingSessionCwd");async function Go(e,t){if(Qe(),(e.includes("--offline")||q(process.env.KODA_OFFLINE))&&(process.env.KODA_OFFLINE="1",process.env.KODA_SKIP_VERSION_CHECK="1"),process.platform==="win32"&&ro(Le()),await no(e)||await to(e)||await Me(e)||await Te(e))return;const o=Se(e);if(o.diagnostics.length>0){for(const r of o.diagnostics){const m=r.type==="error"?c.red:c.yellow;console.error(m(`${r.type==="error"?"Error":"Warning"}: ${r.message}`))}o.diagnostics.some(r=>r.type==="error")&&process.exit(1)}p("parseArgs");let i=lo(o,process.stdin.isTTY);if(i!=="interactive"&&Be(),o.version&&(console.log(be),process.exit(0)),o.export){let r;try{const m=o.messages.length>0?o.messages[0]:void 0;r=await _e(o.export,m)}catch(m){const T=m instanceof Error?m.message:"Failed to export session";console.error(c.red(`Error: ${T}`)),process.exit(1)}console.log(`Exported to: ${r}`),process.exit(0)}o.mode==="rpc"&&o.fileArgs.length>0&&(console.error(c.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),uo(o),po(o),i==="interactive"&&(await Pe(O()),await Ce(O()));const{migratedAuthProviders:u,deprecationWarnings:d}=Ge(process.cwd());p("runMigrations");const a=process.cwd(),S=O(),h=Ye.create(a,S);V(B(h,"startup session lookup"));const v=process.env[Ie],y=(o.sessionDir?so(o.sessionDir):void 0)??(v?Fe(v):void 0)??h.getSessionDir();let x=await go(o,a,y,h);const k=qe(x,a);if(k)if(i==="interactive"){const r=await vo(k,h);r||process.exit(0),x=f.open(k.sessionFile,y,r)}else console.error(c.red(new Ue(k).message)),process.exit(1);if(o.name!==void 0){const r=o.name.trim();r||(console.error(c.red("Error: --name requires a non-empty value")),process.exit(1)),x.appendSessionInfo(r)}p("createSessionManager");const Q=E(a,o.extensions),G=E(a,o.skills),J=E(a,o.promptTemplates),X=E(a,o.themes),K=Ke.create(),Z=l(async({cwd:r,agentDir:m,sessionManager:T,sessionStartEvent:se})=>{const M=await $e({cwd:r,agentDir:m,authStorage:K,extensionFlagValues:o.unknownFlags,resourceLoaderOptions:{additionalExtensionPaths:Q,additionalSkillPaths:G,additionalPromptTemplatePaths:J,additionalThemePaths:X,noExtensions:o.noExtensions,noSkills:o.noSkills,noPromptTemplates:o.noPromptTemplates,noThemes:o.noThemes,noContextFiles:o.noContextFiles,systemPrompt:o.systemPrompt,appendSystemPrompt:o.appendSystemPrompt,extensionFactories:t?.extensionFactories}}),{settingsManager:L,modelRegistry:j,resourceLoader:re}=M,b=[...M.diagnostics,...B(L,"runtime creation"),...re.getExtensions().errors.map(({path:me,error:fe})=>({type:"error",message:`Failed to load extension "${me}": ${fe}`}))],A=o.models??L.getEnabledModels(),ae=A&&A.length>0?await De(A,j):[],{options:g,cliThinkingFromModel:le,diagnostics:ce}=ho(o,ae,T.buildSessionContext().messages.length>0,j,L);b.push(...ce),o.apiKey&&(g.model?K.setRuntimeApiKey(g.model.provider,o.apiKey):b.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"}));const P=await Oe({services:M,sessionManager:T,sessionStartEvent:se,model:g.model,thinkingLevel:g.thinkingLevel,scopedModels:g.scopedModels,tools:g.tools,excludeTools:g.excludeTools,noTools:g.noTools,customTools:g.customTools}),de=o.thinking!==void 0||le;return P.session.model&&de&&P.session.setThinkingLevel(P.session.thinkingLevel),{...P,services:M,diagnostics:b}},"createRuntime");p("createRuntime");const w=await Ae(Z,{cwd:x.getCwd(),agentDir:S,sessionManager:x});p("createAgentSessionRuntime");const{services:ee,session:oe,modelFallbackMessage:te}=w,{settingsManager:I,modelRegistry:ne,resourceLoader:ie}=ee;if(Ne(I.getHttpIdleTimeoutMs()),o.help){const r=ie.getExtensions().extensions.flatMap(m=>Array.from(m.flags.values()));xe(r),process.exit(0)}if(o.listModels!==void 0){const r=typeof o.listModels=="string"?o.listModels:void 0;await ke(ne,r),process.exit(0)}let F;i!=="rpc"&&(F=await ao(),F!==void 0&&i==="interactive"&&(i="print")),p("readPipedStdin");const{initialMessage:_,initialImages:N}=await mo(o,I.getImageAutoResize(),F);p("prepareInitialMessage"),$(I.getTheme(),i==="interactive"),p("initTheme"),i==="interactive"&&d.length>0&&await Je(d),p("resolveModelScope"),V(w.diagnostics),w.diagnostics.some(r=>r.type==="error")&&process.exit(1),p("createAgentSession"),i!=="interactive"&&!oe.model&&(console.error(c.red(Re())),process.exit(1));const W=q(process.env.KODA_STARTUP_BENCHMARK);if(W&&i!=="interactive"&&(console.error(c.red("Error: KODA_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),i==="rpc")C(),await eo(w);else if(i==="interactive"){const r=new Xe(w,{migratedProviders:u,modelFallbackMessage:te,initialMessage:_,initialImages:N,initialMessages:o.messages,verbose:o.verbose});if(W){await r.init(),p("interactiveMode.init"),C(),r.stop(),R(),process.stdout.writableLength>0&&await new Promise(m=>process.stdout.once("drain",m)),process.stderr.writableLength>0&&await new Promise(m=>process.stderr.once("drain",m));return}C(),await r.run()}else{C();const r=await Ze(w,{mode:co(i),messages:o.messages,initialMessage:_,initialImages:N});R(),He(),r!==0&&(process.exitCode=r);return}}l(Go,"main");export{Go as main};
1
+ var ue=Object.defineProperty;var l=(e,t)=>ue(e,"name",{value:t,configurable:!0});import{createInterface as pe}from"node:readline";import{modelsAreEqual as ge}from"@openadapter/koda-ai";import{ProcessTerminal as he,setKeybindings as ve,TUI as we}from"@openadapter/koda-tui";import c from"chalk";import{parseArgs as Se,printHelp as ye}from"./cli/args.js";import{processFileArguments as xe}from"./cli/file-processor.js";import{buildInitialMessage as D}from"./cli/initial-message.js";import{listModels as ke}from"./cli/list-models.js";import{handleImportCommand as Te,handleSetupCommand as Me,maybeFirstRunSetup as Pe,maybeRefreshOpenAdapterModels as Ce}from"./cli/openadapter-setup.js";import{selectSession as Ee}from"./cli/session-picker.js";import{handleTaskCommand as Ie}from"./cli/task-command.js";import{ENV_SESSION_DIR as Fe,expandTildePath as Le,getAgentDir as C,getPackageDir as be,VERSION as Ae}from"./config.js";import{createAgentSessionRuntime as Oe}from"./core/agent-session-runtime.js";import{createAgentSessionFromServices as $e,createAgentSessionServices as Re}from"./core/agent-session-services.js";import{formatNoModelsAvailableMessage as Ke}from"./core/auth-guidance.js";import{AuthStorage as _e}from"./core/auth-storage.js";import{exportFromFile as Ne}from"./core/export-html/index.js";import{configureHttpDispatcher as We}from"./core/http-dispatcher.js";import{KeybindingsManager as je}from"./core/keybindings.js";import{resolveCliModel as De,resolveModelScope as He}from"./core/model-resolver.js";import{restoreStdout as Be,takeOverStdout as Ve}from"./core/output-guard.js";import{formatMissingSessionCwdPrompt as qe,getMissingSessionCwdIssue as Ue,MissingSessionCwdError as ze}from"./core/session-cwd.js";import{assertValidSessionId as Ye,SessionManager as f}from"./core/session-manager.js";import{SettingsManager as Qe}from"./core/settings-manager.js";import{printTimings as E,resetTimings as Ge,time as p}from"./core/timings.js";import{runMigrations as Je,showDeprecationWarnings as Xe}from"./migrations.js";import{InteractiveMode as Ze,runPrintMode as eo,runRpcMode as oo}from"./modes/index.js";import{ExtensionSelectorComponent as to}from"./modes/interactive/components/extension-selector.js";import{initTheme as $,stopThemeWatcher as R}from"./modes/interactive/theme/theme.js";import{handleConfigCommand as no,handlePackageCommand as io}from"./package-manager-cli.js";import{maybePingSession as so}from"./utils/koda-telemetry.js";import{isLocalPath as ro,normalizePath as ao,resolvePath as H}from"./utils/paths.js";import{cleanupWindowsSelfUpdateQuarantine as lo}from"./utils/windows-self-update.js";async function co(){if(!process.stdin.isTTY)return new Promise(e=>{let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",n=>{t+=n}),process.stdin.on("end",()=>{e(t.trim()||void 0)}),process.stdin.resume()})}l(co,"readPipedStdin");function B(e,t){return e.drainErrors().map(({scope:n,error:o})=>({type:"warning",message:`(${t}, ${n} settings) ${o.message}`}))}l(B,"collectSettingsDiagnostics");function V(e){for(const t of e){const n=t.type==="error"?c.red:t.type==="warning"?c.yellow:c.dim,o=t.type==="error"?"Error: ":t.type==="warning"?"Warning: ":"";console.error(n(`${o}${t.message}`))}}l(V,"reportDiagnostics");function q(e){return e?e==="1"||e.toLowerCase()==="true"||e.toLowerCase()==="yes":!1}l(q,"isTruthyEnvFlag");function mo(e,t){return e.mode==="rpc"?"rpc":e.mode==="json"?"json":e.print||!t?"print":"interactive"}l(mo,"resolveAppMode");function fo(e){return e==="json"?"json":"text"}l(fo,"toPrintOutputMode");async function uo(e,t,n){if(e.fileArgs.length===0)return D({parsed:e,stdinContent:n});const{text:o,images:i}=await xe(e.fileArgs,{autoResizeImages:t});return D({parsed:e,fileText:o,fileImages:i,stdinContent:n})}l(uo,"prepareInitialMessage");async function U(e,t,n){const i=(await f.list(t,n)).find(s=>s.id===e);return i?{type:"local",path:i.path}:void 0}l(U,"findLocalSessionByExactId");async function z(e,t,n){if(e.includes("/")||e.includes("\\")||e.endsWith(".jsonl"))return{type:"path",path:H(e,t)};const o=await f.list(t,n),i=o.find(d=>d.id===e)??o.find(d=>d.id.startsWith(e));if(i)return{type:"local",path:i.path};const s=await f.listAll(n),u=s.find(d=>d.id===e)??s.find(d=>d.id.startsWith(e));return u?{type:"global",path:u.path,cwd:u.cwd}:{type:"not_found",arg:e}}l(z,"resolveSessionPath");async function po(e){return new Promise(t=>{const n=pe({input:process.stdin,output:process.stdout});n.question(`${e} [y/N] `,o=>{n.close(),t(o.toLowerCase()==="y"||o.toLowerCase()==="yes")})})}l(po,"promptConfirm");function go(e){if(!e.fork)return;const t=[e.session?"--session":void 0,e.continue?"--continue":void 0,e.resume?"--resume":void 0,e.noSession?"--no-session":void 0].filter(n=>n!==void 0);t.length>0&&(console.error(c.red(`Error: --fork cannot be combined with ${t.join(", ")}`)),process.exit(1))}l(go,"validateForkFlags");function ho(e){if(e.sessionId===void 0)return;const t=[e.session?"--session":void 0,e.continue?"--continue":void 0,e.resume?"--resume":void 0,e.noSession?"--no-session":void 0].filter(n=>n!==void 0);t.length>0&&(console.error(c.red(`Error: --session-id cannot be combined with ${t.join(", ")}`)),process.exit(1));try{Ye(e.sessionId)}catch(n){const o=n instanceof Error?n.message:String(n);console.error(c.red(`Error: ${o}`)),process.exit(1)}}l(ho,"validateSessionIdFlags");function Y(e,t,n,o){try{return f.forkFrom(e,t,n,{id:o})}catch(i){const s=i instanceof Error?i.message:String(i);console.error(c.red(`Error: ${s}`)),process.exit(1)}}l(Y,"forkSessionOrExit");async function vo(e,t,n,o){if(e.noSession||e.help||e.listModels!==void 0)return f.inMemory(t);if(e.fork){e.sessionId&&await U(e.sessionId,t,n)&&(console.error(c.red(`Session already exists with id '${e.sessionId}'`)),process.exit(1));const i=await z(e.fork,t,n);switch(i.type){case"path":case"local":case"global":return Y(i.path,t,n,e.sessionId);case"not_found":console.error(c.red(`No session found matching '${i.arg}'`)),process.exit(1)}}if(e.session){const i=await z(e.session,t,n);switch(i.type){case"path":case"local":return f.open(i.path,n);case"global":return console.log(c.yellow(`Session found in different project: ${i.cwd}`)),await po("Fork this session into current directory?")||(console.log(c.dim("Aborted.")),process.exit(0)),Y(i.path,t,n);case"not_found":console.error(c.red(`No session found matching '${i.arg}'`)),process.exit(1)}}if(e.resume){$(o.getTheme(),!0);try{const i=await Ee(s=>f.list(t,n,s),s=>f.listAll(n,s));return i||(console.log(c.dim("No session selected")),process.exit(0)),f.open(i,n)}finally{R()}}if(e.continue)return f.continueRecent(t,n);if(e.sessionId){const i=await U(e.sessionId,t,n);if(i)return f.open(i.path,n)}return f.create(t,n,{id:e.sessionId})}l(vo,"createSessionManager");function wo(e,t,n,o,i){const s={},u=[];let d=!1;if(e.model){const a=De({cliProvider:e.provider,cliModel:e.model,modelRegistry:o});a.warning&&u.push({type:"warning",message:a.warning}),a.error&&u.push({type:"error",message:a.error}),a.model&&(s.model=a.model,!e.thinking&&a.thinkingLevel&&(s.thinkingLevel=a.thinkingLevel,d=!0))}if(!s.model&&t.length>0&&!n){const a=i.getDefaultProvider(),S=i.getDefaultModel(),h=a&&S?o.find(a,S):void 0,v=h?t.find(x=>ge(x.model,h)):void 0;v?(s.model=v.model,!e.thinking&&v.thinkingLevel&&(s.thinkingLevel=v.thinkingLevel)):(s.model=t[0].model,!e.thinking&&t[0].thinkingLevel&&(s.thinkingLevel=t[0].thinkingLevel))}return e.thinking&&(s.thinkingLevel=e.thinking),t.length>0&&(s.scopedModels=t.map(a=>({model:a.model,thinkingLevel:a.thinkingLevel}))),e.noTools?s.noTools="all":e.noBuiltinTools&&(s.noTools="builtin"),e.tools&&(s.tools=[...e.tools]),e.excludeTools&&(s.excludeTools=[...e.excludeTools]),{options:s,cliThinkingFromModel:d,diagnostics:u}}l(wo,"buildSessionOptions");function I(e,t){return t?.map(n=>ro(n)?H(n,e):n)}l(I,"resolveCliPaths");async function So(e,t){return $(t.getTheme()),ve(je.create()),new Promise(n=>{const o=new we(new he,t.getShowHardwareCursor());o.setClearOnShrink(t.getClearOnShrink());let i=!1;const s=l(d=>{i||(i=!0,o.stop(),n(d))},"finish"),u=new to(qe(e),["Continue","Cancel"],d=>s(d==="Continue"?e.fallbackCwd:void 0),()=>s(void 0),{tui:o});o.addChild(u),o.setFocus(u),o.start()})}l(So,"promptForMissingSessionCwd");async function et(e,t){if(Ge(),(e.includes("--offline")||q(process.env.KODA_OFFLINE))&&(process.env.KODA_OFFLINE="1",process.env.KODA_SKIP_VERSION_CHECK="1"),process.platform==="win32"&&lo(be()),await io(e)||await no(e)||await Me(e)||await Te(e)||await Ie(e))return;const o=Se(e);if(o.diagnostics.length>0){for(const r of o.diagnostics){const m=r.type==="error"?c.red:c.yellow;console.error(m(`${r.type==="error"?"Error":"Warning"}: ${r.message}`))}o.diagnostics.some(r=>r.type==="error")&&process.exit(1)}p("parseArgs");let i=mo(o,process.stdin.isTTY);if(i!=="interactive"&&Ve(),o.version&&(console.log(Ae),process.exit(0)),o.export){let r;try{const m=o.messages.length>0?o.messages[0]:void 0;r=await Ne(o.export,m)}catch(m){const T=m instanceof Error?m.message:"Failed to export session";console.error(c.red(`Error: ${T}`)),process.exit(1)}console.log(`Exported to: ${r}`),process.exit(0)}o.mode==="rpc"&&o.fileArgs.length>0&&(console.error(c.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),go(o),ho(o),i==="interactive"&&(await Pe(C()),await Ce(C()),so(C()));const{migratedAuthProviders:u,deprecationWarnings:d}=Je(process.cwd());p("runMigrations");const a=process.cwd(),S=C(),h=Qe.create(a,S);V(B(h,"startup session lookup"));const v=process.env[Fe],x=(o.sessionDir?ao(o.sessionDir):void 0)??(v?Le(v):void 0)??h.getSessionDir();let y=await vo(o,a,x,h);const k=Ue(y,a);if(k)if(i==="interactive"){const r=await So(k,h);r||process.exit(0),y=f.open(k.sessionFile,x,r)}else console.error(c.red(new ze(k).message)),process.exit(1);if(o.name!==void 0){const r=o.name.trim();r||(console.error(c.red("Error: --name requires a non-empty value")),process.exit(1)),y.appendSessionInfo(r)}p("createSessionManager");const Q=I(a,o.extensions),G=I(a,o.skills),J=I(a,o.promptTemplates),X=I(a,o.themes),K=_e.create(),Z=l(async({cwd:r,agentDir:m,sessionManager:T,sessionStartEvent:se})=>{const M=await Re({cwd:r,agentDir:m,authStorage:K,extensionFlagValues:o.unknownFlags,resourceLoaderOptions:{additionalExtensionPaths:Q,additionalSkillPaths:G,additionalPromptTemplatePaths:J,additionalThemePaths:X,noExtensions:o.noExtensions,noSkills:o.noSkills,noPromptTemplates:o.noPromptTemplates,noThemes:o.noThemes,noContextFiles:o.noContextFiles,systemPrompt:o.systemPrompt,appendSystemPrompt:o.appendSystemPrompt,extensionFactories:t?.extensionFactories}}),{settingsManager:b,modelRegistry:j,resourceLoader:re}=M,A=[...M.diagnostics,...B(b,"runtime creation"),...re.getExtensions().errors.map(({path:me,error:fe})=>({type:"error",message:`Failed to load extension "${me}": ${fe}`}))],O=o.models??b.getEnabledModels(),ae=O&&O.length>0?await He(O,j):[],{options:g,cliThinkingFromModel:le,diagnostics:ce}=wo(o,ae,T.buildSessionContext().messages.length>0,j,b);A.push(...ce),o.apiKey&&(g.model?K.setRuntimeApiKey(g.model.provider,o.apiKey):A.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"}));const P=await $e({services:M,sessionManager:T,sessionStartEvent:se,model:g.model,thinkingLevel:g.thinkingLevel,scopedModels:g.scopedModels,tools:g.tools,excludeTools:g.excludeTools,noTools:g.noTools,customTools:g.customTools}),de=o.thinking!==void 0||le;return P.session.model&&de&&P.session.setThinkingLevel(P.session.thinkingLevel),{...P,services:M,diagnostics:A}},"createRuntime");p("createRuntime");const w=await Oe(Z,{cwd:y.getCwd(),agentDir:S,sessionManager:y});p("createAgentSessionRuntime");const{services:ee,session:oe,modelFallbackMessage:te}=w,{settingsManager:F,modelRegistry:ne,resourceLoader:ie}=ee;if(We(F.getHttpIdleTimeoutMs()),o.help){const r=ie.getExtensions().extensions.flatMap(m=>Array.from(m.flags.values()));ye(r),process.exit(0)}if(o.listModels!==void 0){const r=typeof o.listModels=="string"?o.listModels:void 0;await ke(ne,r),process.exit(0)}let L;i!=="rpc"&&(L=await co(),L!==void 0&&i==="interactive"&&(i="print")),p("readPipedStdin");const{initialMessage:_,initialImages:N}=await uo(o,F.getImageAutoResize(),L);p("prepareInitialMessage"),$(F.getTheme(),i==="interactive"),p("initTheme"),i==="interactive"&&d.length>0&&await Xe(d),p("resolveModelScope"),V(w.diagnostics),w.diagnostics.some(r=>r.type==="error")&&process.exit(1),p("createAgentSession"),i!=="interactive"&&!oe.model&&(console.error(c.red(Ke())),process.exit(1));const W=q(process.env.KODA_STARTUP_BENCHMARK);if(W&&i!=="interactive"&&(console.error(c.red("Error: KODA_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),i==="rpc")E(),await oo(w);else if(i==="interactive"){const r=new Ze(w,{migratedProviders:u,modelFallbackMessage:te,initialMessage:_,initialImages:N,initialMessages:o.messages,verbose:o.verbose});if(W){await r.init(),p("interactiveMode.init"),E(),r.stop(),R(),process.stdout.writableLength>0&&await new Promise(m=>process.stdout.once("drain",m)),process.stderr.writableLength>0&&await new Promise(m=>process.stderr.once("drain",m));return}E(),await r.run()}else{E();const r=await eo(w,{mode:fo(i),messages:o.messages,initialMessage:_,initialImages:N});R(),Be(),r!==0&&(process.exitCode=r);return}}l(et,"main");export{et as main};
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Anonymous Koda telemetry → OpenAdapter (powers the admin Koda page).
3
+ *
4
+ * Sends a tiny event to POST /api/koda/telemetry, authenticated with the user's own
5
+ * sk-cv key, carrying only: event type, Koda version, OS, arch (+ a truncated error
6
+ * message for error events). No content, no paths, no identifiers beyond the key the
7
+ * gateway already has for billing. Fire-and-forget; never blocks or throws.
8
+ *
9
+ * Disable with KODA_TELEMETRY=0 (or KODA_OFFLINE). Session pings are throttled to
10
+ * once per day per install.
11
+ */
12
+ export declare function sendKodaTelemetry(event: {
13
+ type: "session" | "error";
14
+ error?: string;
15
+ }): void;
16
+ /** Send a session ping at most once per day per install. */
17
+ export declare function maybePingSession(agentDir?: string): void;
@@ -0,0 +1 @@
1
+ var p=Object.defineProperty;var t=(r,e)=>p(r,"name",{value:e,configurable:!0});import{existsSync as c,readFileSync as s,writeFileSync as l}from"node:fs";import{homedir as m}from"node:os";import{join as n}from"node:path";import{getAgentDir as f,VERSION as u}from"../config.js";function a(){return process.env.KODA_TELEMETRY==="0"||!!process.env.KODA_OFFLINE}t(a,"disabled");function y(){let r=process.env.OPENADAPTER_BASE_URL||"",e=process.env.OPENADAPTER_API_KEY||"";if(!r||!e)try{const o=process.env.KODA_CODING_AGENT_DIR||n(m(),".koda","agent"),i=JSON.parse(s(n(o,"models.json"),"utf-8"));r=r||i?.providers?.openadapter?.baseUrl||"",e=e||i?.providers?.openadapter?.apiKey||""}catch{}return e?{root:(r||"https://api.openadapter.in/v1").replace(/\/v1\/?$/,"").replace(/\/$/,""),key:e}:null}t(y,"getGateway");function d(r){if(a())return;const e=y();e&&fetch(`${e.root}/api/koda/telemetry`,{method:"POST",headers:{Authorization:`Bearer ${e.key}`,"Content-Type":"application/json"},body:JSON.stringify({type:r.type,version:u,os:process.platform,arch:process.arch,...r.error?{error:r.error.slice(0,300)}:{}}),signal:AbortSignal.timeout(4e3)}).catch(()=>{})}t(d,"sendKodaTelemetry");function O(r=f()){if(a())return;const e=n(r,".telemetry-last");try{const o=c(e)&&Number(s(e,"utf-8").trim())||0;if(Date.now()-o<1440*60*1e3)return;l(e,String(Date.now()),"utf-8")}catch{return}d({type:"session"})}t(O,"maybePingSession");export{O as maybePingSession,d as sendKodaTelemetry};