@openadapter/koda 1.0.0-beta.5 → 1.0.0-beta.6
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/cli/openadapter-setup.d.ts +6 -0
- package/dist/cli/openadapter-setup.js +3 -2
- package/dist/main.js +1 -1
- package/npm-shrinkwrap.json +12 -12
- package/openadapter/setup.mjs +2 -0
- package/package.json +4 -4
|
@@ -17,6 +17,12 @@
|
|
|
17
17
|
export declare function runInteractiveImport(opts?: {
|
|
18
18
|
auto?: boolean;
|
|
19
19
|
}): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Once a day, refresh the OpenAdapter model list from the gateway so users
|
|
22
|
+
* automatically get newly-added models without re-running setup. Best-effort and
|
|
23
|
+
* throttled (24h); KODA_NO_MODEL_REFRESH=1 or KODA_OFFLINE disables.
|
|
24
|
+
*/
|
|
25
|
+
export declare function maybeRefreshOpenAdapterModels(agentDir: string): Promise<void>;
|
|
20
26
|
/** `koda import` — import sessions from other CLIs any time. */
|
|
21
27
|
export declare function handleImportCommand(args: string[]): Promise<boolean>;
|
|
22
28
|
/** Run the bundled wizard interactively. Returns true on success. */
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
var
|
|
1
|
+
var y=Object.defineProperty;var n=(t,e)=>y(t,"name",{value:e,configurable:!0});import{spawnSync as h}from"node:child_process";import{existsSync as S,readFileSync as p,writeFileSync as g}from"node:fs";import{dirname as w,join as i}from"node:path";import{createInterface as O}from"node:readline/promises";import{fileURLToPath as $}from"node:url";import u from"chalk";import{getPackageDir as x}from"../config.js";import{detectImportable as A,importExternalSessions as C}from"./import-sessions.js";async function b(t,e=!0){const r=O({input:process.stdin,output:process.stdout});try{const o=(await r.question(`${t} ${e?"[Y/n]":"[y/N]"} `)).trim().toLowerCase();return o?o==="y"||o==="yes":e}finally{r.close()}}n(b,"askYesNo");async function f(t){let e;try{e=await A()}catch{return}if(e.claude+e.opencode===0){t?.auto||console.log("No new sessions to import from Claude Code or OpenCode.");return}const o=[e.claude?`${e.claude} from Claude Code`:"",e.opencode?`${e.opencode} from OpenCode`:""].filter(Boolean).join(" and ");if(!await b(u.bold(`Import ${o} into Koda so all your history is here?`)))return;process.stdout.write("Importing\u2026 ");const s=await C({onProgress:n((l,c)=>{process.stdout.write(`\rImporting\u2026 ${l}/${c} `)},"onProgress")});process.stdout.write("\r"),console.log(`\u2713 Imported ${s.imported} session(s) (${s.perSource.claude} Claude Code, ${s.perSource.opencode} OpenCode)${s.errors?`, ${s.errors} skipped`:""}. Find them with \`koda --resume\`.`)}n(f,"runInteractiveImport");async function E(t){if(process.env.KODA_NO_MODEL_REFRESH==="1"||process.env.KODA_OFFLINE)return;const e=i(t,"models.json");let r;try{r=JSON.parse(p(e,"utf-8"))}catch{return}const o=r?.providers?.openadapter;if(!o?.apiKey||!o?.baseUrl)return;const d=typeof o.modelsRefreshedAt=="number"?o.modelsRefreshedAt:0;if(!(Date.now()-d<1440*60*1e3))try{const s=await fetch(`${String(o.baseUrl).replace(/\/$/,"")}/models`,{headers:{Authorization:`Bearer ${o.apiKey}`},signal:AbortSignal.timeout(5e3)});if(!s.ok)return;const c=((await s.json()).data??[]).filter(a=>(a.endpoint_format||a.model_type)==="chat");if(c.length===0)return;o.models=c.map(a=>({id:a.id,name:a.id,input:a.supports_vision?["text","image"]:["text"],maxTokens:16e3})),o.modelsRefreshedAt=Date.now(),g(e,`${JSON.stringify(r,null,2)}
|
|
2
|
+
`,"utf-8")}catch{}}n(E,"maybeRefreshOpenAdapterModels");async function J(t){return t[0]!=="import"?!1:(await f(),!0)}n(J,"handleImportCommand");function I(){const t=w($(import.meta.url)),e=[i(x(),"openadapter","setup.mjs"),i(t,"..","..","openadapter","setup.mjs"),i(t,"..","..","..","..","scripts","setup-openadapter.mjs")];for(const r of e)if(S(r))return r;return null}n(I,"findSetupScript");function m(t=[]){const e=I();return e?h(process.execPath,[e,...t],{stdio:"inherit"}).status===0:(console.error(u.red("Koda setup script not found in this install.")),!1)}n(m,"runOpenAdapterSetup");async function L(t){if(t[0]!=="setup")return!1;const e=t.slice(1).find(r=>r.startsWith("sk-"));return m(e?[e]:[]),!0}n(L,"handleSetupCommand");function K(t){try{if(JSON.parse(p(i(t,"settings.json"),"utf-8"))?.defaultProvider==="openadapter")return!1}catch{}try{if(JSON.parse(p(i(t,"models.json"),"utf-8"))?.providers?.openadapter?.apiKey)return!1}catch{}return!0}n(K,"needsOpenAdapterSetup");async function U(t){if(process.env.KODA_SKIP_SETUP!=="1"&&K(t)){console.log(u.bold(`
|
|
2
3
|
Welcome to Koda \u2014 let's connect it to OpenAdapter (one-time).
|
|
3
|
-
`)),
|
|
4
|
+
`)),m([]),console.log("");try{await f({auto:!0})}catch{}}}n(U,"maybeFirstRunSetup");export{J as handleImportCommand,L as handleSetupCommand,U as maybeFirstRunSetup,E as maybeRefreshOpenAdapterModels,K as needsOpenAdapterSetup,f as runInteractiveImport,m as runOpenAdapterSetup};
|
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 Se}from"@openadapter/koda-tui";import c from"chalk";import{parseArgs as we,printHelp as xe}from"./cli/args.js";import{processFileArguments as ye}from"./cli/file-processor.js";import{buildInitialMessage as j}from"./cli/initial-message.js";import{listModels as ke}from"./cli/list-models.js";import{handleImportCommand as Te,handleSetupCommand as Me,maybeFirstRunSetup as Pe}from"./cli/openadapter-setup.js";import{selectSession as Ce}from"./cli/session-picker.js";import{ENV_SESSION_DIR as Ee,expandTildePath as Ie,getAgentDir as D,getPackageDir as Fe,VERSION as Le}from"./config.js";import{createAgentSessionRuntime as be}from"./core/agent-session-runtime.js";import{createAgentSessionFromServices as Ae,createAgentSessionServices as Oe}from"./core/agent-session-services.js";import{formatNoModelsAvailableMessage as $e}from"./core/auth-guidance.js";import{AuthStorage as Re}from"./core/auth-storage.js";import{exportFromFile as Ke}from"./core/export-html/index.js";import{configureHttpDispatcher as _e}from"./core/http-dispatcher.js";import{KeybindingsManager as Ne}from"./core/keybindings.js";import{resolveCliModel as We,resolveModelScope as je}from"./core/model-resolver.js";import{restoreStdout as De,takeOverStdout as He}from"./core/output-guard.js";import{formatMissingSessionCwdPrompt as Be,getMissingSessionCwdIssue as Ve,MissingSessionCwdError as qe}from"./core/session-cwd.js";import{assertValidSessionId as Ue,SessionManager as f}from"./core/session-manager.js";import{SettingsManager as ze}from"./core/settings-manager.js";import{printTimings as C,resetTimings as Ye,time as p}from"./core/timings.js";import{runMigrations as Qe,showDeprecationWarnings as Ge}from"./migrations.js";import{InteractiveMode as Je,runPrintMode as Xe,runRpcMode as Ze}from"./modes/index.js";import{ExtensionSelectorComponent as eo}from"./modes/interactive/components/extension-selector.js";import{initTheme as O,stopThemeWatcher as $}from"./modes/interactive/theme/theme.js";import{handleConfigCommand as oo,handlePackageCommand as to}from"./package-manager-cli.js";import{isLocalPath as no,normalizePath as io,resolvePath as H}from"./utils/paths.js";import{cleanupWindowsSelfUpdateQuarantine as so}from"./utils/windows-self-update.js";async function ro(){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(ro,"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 ao(e,t){return e.mode==="rpc"?"rpc":e.mode==="json"?"json":e.print||!t?"print":"interactive"}l(ao,"resolveAppMode");function lo(e){return e==="json"?"json":"text"}l(lo,"toPrintOutputMode");async function co(e,t,n){if(e.fileArgs.length===0)return j({parsed:e,stdinContent:n});const{text:o,images:i}=await ye(e.fileArgs,{autoResizeImages:t});return j({parsed:e,fileText:o,fileImages:i,stdinContent:n})}l(co,"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 mo(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(mo,"promptConfirm");function fo(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(fo,"validateForkFlags");function uo(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{Ue(e.sessionId)}catch(n){const o=n instanceof Error?n.message:String(n);console.error(c.red(`Error: ${o}`)),process.exit(1)}}l(uo,"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 po(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 mo("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(o.getTheme(),!0);try{const i=await Ce(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{$()}}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(po,"createSessionManager");function go(e,t,n,o,i){const s={},u=[];let d=!1;if(e.model){const a=We({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(),w=i.getDefaultModel(),h=a&&w?o.find(a,w):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(go,"buildSessionOptions");function E(e,t){return t?.map(n=>no(n)?H(n,e):n)}l(E,"resolveCliPaths");async function ho(e,t){return O(t.getTheme()),ve(Ne.create()),new Promise(n=>{const o=new Se(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 eo(Be(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(ho,"promptForMissingSessionCwd");async function Qo(e,t){if(Ye(),(e.includes("--offline")||q(process.env.KODA_OFFLINE))&&(process.env.KODA_OFFLINE="1",process.env.KODA_SKIP_VERSION_CHECK="1"),process.platform==="win32"&&so(Fe()),await to(e)||await oo(e)||await Me(e)||await Te(e))return;const o=we(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=ao(o,process.stdin.isTTY);if(i!=="interactive"&&He(),o.version&&(console.log(Le),process.exit(0)),o.export){let r;try{const m=o.messages.length>0?o.messages[0]:void 0;r=await Ke(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)),fo(o),uo(o),i==="interactive"&&await Pe(D());const{migratedAuthProviders:u,deprecationWarnings:d}=Qe(process.cwd());p("runMigrations");const a=process.cwd(),w=D(),h=ze.create(a,w);V(B(h,"startup session lookup"));const v=process.env[Ee],y=(o.sessionDir?io(o.sessionDir):void 0)??(v?Ie(v):void 0)??h.getSessionDir();let x=await po(o,a,y,h);const k=Ve(x,a);if(k)if(i==="interactive"){const r=await ho(k,h);r||process.exit(0),x=f.open(k.sessionFile,y,r)}else console.error(c.red(new qe(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),R=Re.create(),Z=l(async({cwd:r,agentDir:m,sessionManager:T,sessionStartEvent:se})=>{const M=await Oe({cwd:r,agentDir:m,authStorage:R,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:W,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 je(A,W):[],{options:g,cliThinkingFromModel:le,diagnostics:ce}=go(o,ae,T.buildSessionContext().messages.length>0,W,L);b.push(...ce),o.apiKey&&(g.model?R.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 Ae({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 S=await be(Z,{cwd:x.getCwd(),agentDir:w,sessionManager:x});p("createAgentSessionRuntime");const{services:ee,session:oe,modelFallbackMessage:te}=S,{settingsManager:I,modelRegistry:ne,resourceLoader:ie}=ee;if(_e(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 ro(),F!==void 0&&i==="interactive"&&(i="print")),p("readPipedStdin");const{initialMessage:K,initialImages:_}=await co(o,I.getImageAutoResize(),F);p("prepareInitialMessage"),O(I.getTheme(),i==="interactive"),p("initTheme"),i==="interactive"&&d.length>0&&await Ge(d),p("resolveModelScope"),V(S.diagnostics),S.diagnostics.some(r=>r.type==="error")&&process.exit(1),p("createAgentSession"),i!=="interactive"&&!oe.model&&(console.error(c.red($e())),process.exit(1));const N=q(process.env.KODA_STARTUP_BENCHMARK);if(N&&i!=="interactive"&&(console.error(c.red("Error: KODA_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),i==="rpc")C(),await Ze(S);else if(i==="interactive"){const r=new Je(S,{migratedProviders:u,modelFallbackMessage:te,initialMessage:K,initialImages:_,initialMessages:o.messages,verbose:o.verbose});if(N){await r.init(),p("interactiveMode.init"),C(),r.stop(),$(),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 Xe(S,{mode:lo(i),messages:o.messages,initialMessage:K,initialImages:_});$(),De(),r!==0&&(process.exitCode=r);return}}l(Qo,"main");export{Qo 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 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};
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openadapter/koda",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.6",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@openadapter/koda",
|
|
9
|
-
"version": "1.0.0-beta.
|
|
9
|
+
"version": "1.0.0-beta.6",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@openadapter/koda-agent-core": "1.0.0-beta.
|
|
13
|
-
"@openadapter/koda-ai": "1.0.0-beta.
|
|
14
|
-
"@openadapter/koda-tui": "1.0.0-beta.
|
|
12
|
+
"@openadapter/koda-agent-core": "1.0.0-beta.6",
|
|
13
|
+
"@openadapter/koda-ai": "1.0.0-beta.6",
|
|
14
|
+
"@openadapter/koda-tui": "1.0.0-beta.6",
|
|
15
15
|
"@silvia-odwyer/photon-node": "0.3.4",
|
|
16
16
|
"chalk": "5.6.2",
|
|
17
17
|
"cross-spawn": "7.0.6",
|
|
@@ -699,11 +699,11 @@
|
|
|
699
699
|
]
|
|
700
700
|
},
|
|
701
701
|
"node_modules/@openadapter/koda-agent-core": {
|
|
702
|
-
"version": "1.0.0-beta.
|
|
703
|
-
"resolved": "https://registry.npmjs.org/@openadapter/koda-agent-core/-/koda-agent-core-1.0.0-beta.
|
|
702
|
+
"version": "1.0.0-beta.6",
|
|
703
|
+
"resolved": "https://registry.npmjs.org/@openadapter/koda-agent-core/-/koda-agent-core-1.0.0-beta.6.tgz",
|
|
704
704
|
"license": "MIT",
|
|
705
705
|
"dependencies": {
|
|
706
|
-
"@openadapter/koda-ai": "1.0.0-beta.
|
|
706
|
+
"@openadapter/koda-ai": "1.0.0-beta.6",
|
|
707
707
|
"ignore": "7.0.5",
|
|
708
708
|
"typebox": "1.1.38",
|
|
709
709
|
"yaml": "2.9.0"
|
|
@@ -713,8 +713,8 @@
|
|
|
713
713
|
}
|
|
714
714
|
},
|
|
715
715
|
"node_modules/@openadapter/koda-ai": {
|
|
716
|
-
"version": "1.0.0-beta.
|
|
717
|
-
"resolved": "https://registry.npmjs.org/@openadapter/koda-ai/-/koda-ai-1.0.0-beta.
|
|
716
|
+
"version": "1.0.0-beta.6",
|
|
717
|
+
"resolved": "https://registry.npmjs.org/@openadapter/koda-ai/-/koda-ai-1.0.0-beta.6.tgz",
|
|
718
718
|
"license": "MIT",
|
|
719
719
|
"dependencies": {
|
|
720
720
|
"@anthropic-ai/sdk": "0.91.1",
|
|
@@ -736,8 +736,8 @@
|
|
|
736
736
|
}
|
|
737
737
|
},
|
|
738
738
|
"node_modules/@openadapter/koda-tui": {
|
|
739
|
-
"version": "1.0.0-beta.
|
|
740
|
-
"resolved": "https://registry.npmjs.org/@openadapter/koda-tui/-/koda-tui-1.0.0-beta.
|
|
739
|
+
"version": "1.0.0-beta.6",
|
|
740
|
+
"resolved": "https://registry.npmjs.org/@openadapter/koda-tui/-/koda-tui-1.0.0-beta.6.tgz",
|
|
741
741
|
"license": "MIT",
|
|
742
742
|
"dependencies": {
|
|
743
743
|
"get-east-asian-width": "1.6.0",
|
package/openadapter/setup.mjs
CHANGED
|
@@ -105,6 +105,8 @@ mergeJson(join(AGENT_DIR, "models.json"), (cfg) => {
|
|
|
105
105
|
apiKey: key,
|
|
106
106
|
api: "openai-completions",
|
|
107
107
|
models,
|
|
108
|
+
// Stamp so the daily auto-refresh doesn't immediately re-fetch right after setup.
|
|
109
|
+
modelsRefreshedAt: Date.now(),
|
|
108
110
|
};
|
|
109
111
|
});
|
|
110
112
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openadapter/koda",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.6",
|
|
4
4
|
"description": "Coding agent CLI with read, bash, edit, write tools and session management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"piConfig": {
|
|
@@ -42,9 +42,9 @@
|
|
|
42
42
|
"postbuild": "node ../../scripts/minify-pkg-dist.mjs"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@openadapter/koda-agent-core": "1.0.0-beta.
|
|
46
|
-
"@openadapter/koda-ai": "1.0.0-beta.
|
|
47
|
-
"@openadapter/koda-tui": "1.0.0-beta.
|
|
45
|
+
"@openadapter/koda-agent-core": "1.0.0-beta.6",
|
|
46
|
+
"@openadapter/koda-ai": "1.0.0-beta.6",
|
|
47
|
+
"@openadapter/koda-tui": "1.0.0-beta.6",
|
|
48
48
|
"@silvia-odwyer/photon-node": "0.3.4",
|
|
49
49
|
"chalk": "5.6.2",
|
|
50
50
|
"cross-spawn": "7.0.6",
|