langtrain 0.1.17 → 0.1.19

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/README.md CHANGED
@@ -21,7 +21,6 @@
21
21
  <p><strong>Langtrain CLI</strong> is a unified AI engineering platform that runs locally on your computer and connects to the Langtrain Cloud.</p>
22
22
 
23
23
  <p>
24
- If you want Langtrain in your code editor, <a href="https://langtrain.xyz/docs/vscode">install the VS Code Extension.</a><br/>
25
24
  If you are looking for the <em>web-based platform</em>, <strong>Langtrain Web</strong>, go to <a href="https://langtrain.xyz">langtrain.xyz</a>.
26
25
  </p>
27
26
  </div>
@@ -39,7 +38,7 @@ npm install -g langtrain
39
38
  Then run `langtrain` to start the interactive AI engineering studio:
40
39
 
41
40
  ```shell
42
- langtrain
41
+ lt
43
42
  ```
44
43
 
45
44
  <details>
@@ -53,11 +52,11 @@ sudo npm install -g langtrain
53
52
 
54
53
  ### Using Langtrain with your Cloud Plan
55
54
 
56
- Run `langtrain login` and enter your API Key from the dashboard to authenticate. We recommend signing into your Langtrain account to use **Cloud Finetuning**, **Agent Persistence**, and **Model Hosting** as part of your Pro or Enterprise plan. [Learn more about Langtrain Plans](https://langtrain.xyz/pricing).
55
+ Run `lt login` and enter your API Key from the dashboard to authenticate. We recommend signing into your Langtrain account to use **Cloud Finetuning**, **Agent Persistence**, and **Model Hosting** as part of your Pro or Enterprise plan. [Learn more about Langtrain Plans](https://langtrain.xyz/pricing).
57
56
 
58
57
  Check your subscription status and limits:
59
58
  ```shell
60
- langtrain status
59
+ lt status
61
60
  ```
62
61
  *Free plans allow local fine-tuning. Upgrade to Pro for cloud-based GPU training.*
63
62
 
@@ -103,7 +102,7 @@ async function analyzeAndTune() {
103
102
 
104
103
  ## Configuration
105
104
 
106
- The SDK and CLI can be configured using environment variables `(dotenv supported)` or via `langtrain login`.
105
+ The SDK and CLI can be configured using environment variables `(dotenv supported)` or via `lt login`.
107
106
 
108
107
  | Variable | Description |
109
108
  | :--- | :--- |
package/dist/cli.js CHANGED
@@ -1,13 +1,15 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var chunkPAHGEWDE_js=require('./chunk-PAHGEWDE.js'),commander=require('commander'),prompts=require('@clack/prompts'),colors=require('kleur/colors'),k=require('gradient-string'),M=require('fs'),z=require('path'),se=require('os');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var k__default=/*#__PURE__*/_interopDefault(k);var M__default=/*#__PURE__*/_interopDefault(M);var z__default=/*#__PURE__*/_interopDefault(z);var se__default=/*#__PURE__*/_interopDefault(se);function W(a){console.clear(),console.log(k__default.default(["#00DC82","#36E4DA","#0047E1"])(`
2
+ 'use strict';var chunkPAHGEWDE_js=require('./chunk-PAHGEWDE.js'),commander=require('commander'),prompts=require('@clack/prompts'),colors=require('kleur/colors'),L=require('gradient-string'),M=require('fs'),B=require('path'),we=require('os');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var L__default=/*#__PURE__*/_interopDefault(L);var M__default=/*#__PURE__*/_interopDefault(M);var B__default=/*#__PURE__*/_interopDefault(B);var we__default=/*#__PURE__*/_interopDefault(we);function te(n){console.clear(),console.log(L__default.default(["#00DC82","#36E4DA","#0047E1"])(`
3
3
  \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2557
4
4
  \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551
5
5
  \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551
6
6
  \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551
7
7
  \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551
8
8
  \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D
9
- `)),console.log(`${colors.bgCyan(colors.black(` Langtrain SDK v${a} `))}
10
- `);}function h(a){console.log(colors.cyan(`\u25C6 ${a}`));}function D(a){console.log(colors.gray(`\u2514 ${a}`));}function p(){return {start:a=>process.stdout.write(`${colors.cyan("\u25CF")} ${a}\r`),stop:a=>{console.log(a?`${colors.green("\u2714")} ${a}`:"");},message:a=>process.stdout.write(`${colors.cyan("\u25CF")} ${a}\r`)}}var N=z__default.default.join(se__default.default.homedir(),".langtrain"),G=z__default.default.join(N,"config.json");function C(){if(!M__default.default.existsSync(G))return {};try{return JSON.parse(M__default.default.readFileSync(G,"utf-8"))}catch{return {}}}function H(a){M__default.default.existsSync(N)||M__default.default.mkdirSync(N,{recursive:true}),M__default.default.writeFileSync(G,JSON.stringify(a,null,2));}async function J(){for(;;){let a=await prompts.password({message:"Enter your Langtrain API Key:",validate(i){if(!i||i.length===0)return "API Key is required"}});prompts.isCancel(a)&&(prompts.cancel("Operation cancelled"),process.exit(0));let s=p();s.start("Verifying API Key...");try{let e=await new chunkPAHGEWDE_js.i({apiKey:a}).getStatus();s.stop(colors.green(`Authenticated as ${e.plan==="pro"?"PRO":e.plan.toUpperCase()}`));let t=C();H({...t,apiKey:a});return}catch{s.stop(colors.red("Invalid API Key. Please try again."));}}}async function q(a){let s=new chunkPAHGEWDE_js.i({apiKey:a}),i=p();i.start("Verifying subscription plan...");try{let e=await s.getStatus(),t=e.plan==="pro"?colors.bgCyan(" PRO "):e.plan.toUpperCase();return i.stop(colors.green(`Authenticated as ${t}`)),e.is_active===!1&&console.log(colors.yellow("Warning: Your subscription is not active. Some features may be limited.")),e}catch(e){return i.stop(colors.red("Failed to verify subscription.")),e.response&&e.response.status===401&&console.log(colors.red("Invalid API Key. Please run login again.")),null}}function Q(a,s,i){s?.plan==="pro"||s?.plan==="enterprise";switch(a){case "main":let t=[{value:"nav-agents",label:"Agents",hint:"Manage & Chat with AI Agents"},{value:"nav-text",label:"Langtune (Text)",hint:"Fine-tuning & Generation"},{value:"nav-vision",label:"Langvision (Vision)",hint:"Vision Analysis & Tuning"},{value:"nav-settings",label:"Settings",hint:"Subscription & Auth"}];return i||t.unshift({value:"login",label:"Login to Langtrain",hint:"Required for most features"}),t.push({value:"exit",label:"Exit"}),t;case "agents":return [{value:"agent-list",label:"List & Run Agents",hint:"View active agents"},{value:"agent-create",label:"Create New Agent",hint:"Deploy a new agent"},{value:"agent-delete",label:"Delete Agent",hint:"Remove an agent"},{value:"back",label:"\u2190 Back to Main Menu"}];case "text":return [{value:"tune-finetune",label:"Fine-tune Text Model",hint:"Create custom LLM"},{value:"tune-generate",label:"Generate Text",hint:"Test your models"},{value:"back",label:"\u2190 Back to Main Menu"}];case "vision":return [{value:"vision-finetune",label:"Fine-tune Vision Model",hint:"Create custom VLM"},{value:"vision-generate",label:"Generate Vision Response",hint:"Test vision models"},{value:"back",label:"\u2190 Back to Main Menu"}];case "settings":return [{value:"status",label:i?`Subscription Status (${s?.plan||"Free"})`:"Check Status (Login required)"},{value:"login",label:i?"Update API Key":"Login"},{value:"back",label:"\u2190 Back to Main Menu"}];default:return []}}async function X(){let a=C();if(!a.apiKey){h(colors.red('Not logged in. Run "login" first.'));return}let s=new chunkPAHGEWDE_js.i({apiKey:a.apiKey}),i=p();i.start("Fetching subscription status...");try{let e=await s.getStatus();i.stop(colors.green("Subscription Status:")),console.log(colors.gray("Plan: ")+(e.plan==="pro"?colors.bgCyan(" PRO "):e.plan.toUpperCase())),console.log(colors.gray("Active: ")+(e.is_active?colors.green("Yes"):colors.red("No"))),e.expires_at&&console.log(colors.gray("Expires: ")+new Date(e.expires_at).toLocaleDateString()),console.log(colors.gray(`
11
- Limits:`)),console.log(` Models: ${e.limits.max_models===-1?"Unlimited":e.limits.max_models}`),console.log(` Training Jobs: ${e.limits.max_training_jobs}`);}catch(e){i.stop(colors.red("Failed to fetch status.")),console.error(e.message);}}async function Z(a,s){let i="",e=p();e.start("Fetching available text models...");try{let n=await s.list("text");e.stop(`Found ${n.length} text models`),n.length>0&&(i=await prompts.select({message:"Select base model:",options:n.map(o=>({value:o.id,label:o.id,hint:o.owned_by}))}));}catch{e.stop(colors.yellow("Failed to fetch models. Using manual input.")),i=await prompts.text({message:"Enter base model (e.g., gpt-3.5-turbo):",placeholder:"gpt-3.5-turbo",validate(o){if(!o||o.length===0)return "Value is required!"}});}prompts.isCancel(i)&&(prompts.cancel("Operation cancelled."),process.exit(0));let t=await prompts.text({message:"Enter path to training file:",placeholder:"./data.jsonl",validate(n){if(!n||n.length===0)return "Value is required!"}});prompts.isCancel(t)&&prompts.cancel("Operation cancelled.");let g=await prompts.text({message:"Num Epochs:",placeholder:"3",initialValue:"3"});prompts.isCancel(g)&&prompts.cancel("Operation cancelled.");let r=await prompts.select({message:"Track this job on Langtrain Cloud?",options:[{value:"yes",label:"Yes",hint:"Upload dataset and log job"},{value:"no",label:"No",hint:"Local only"}]});if(prompts.isCancel(r)&&prompts.cancel("Operation cancelled."),r==="yes"){let n=p();n.start("Connecting to Cloud...");try{let o=C();if(!o.apiKey)throw new Error('API Key required. Run "login" first.');if(!(await new chunkPAHGEWDE_js.i({apiKey:o.apiKey}).getStatus()).features.includes("cloud_finetuning")){n.stop(colors.red('Feature "cloud_finetuning" is not available on your plan.'));let I=await prompts.confirm({message:"Upgrade to Pro for cloud tracking?"});I&&!prompts.isCancel(I)&&console.log(colors.bgCyan(colors.black(" Visit https://langtrain.ai/dashboard/billing to upgrade. ")));return}let L=new chunkPAHGEWDE_js.g({apiKey:o.apiKey}),O=new chunkPAHGEWDE_js.h({apiKey:o.apiKey});n.message("Uploading dataset...");let T=await L.upload(t);n.message("Creating Job...");let _=await O.createJob({name:`cli-sft-${Date.now()}`,base_model:i,dataset_id:T.id,task:"text",hyperparameters:{n_epochs:parseInt(g)}});n.stop(colors.green(`Job tracked: ${_.id}`));}catch(o){n.stop(colors.red(`Tracking failed: ${o.message}`));let b=await prompts.confirm({message:"Continue with local training anyway?"});if(!b||prompts.isCancel(b))return}}let u=p();u.start("Starting local fine-tuning...");try{let n={model:i,trainFile:t,preset:"default",epochs:parseInt(g),batchSize:1,learningRate:2e-5,loraRank:16,outputDir:"./output"};await a.finetune(n),u.stop(colors.green("Fine-tuning job started successfully!"));}catch(n){throw u.stop(colors.red("Failed to start job.")),n}}async function ee(a){let s=await prompts.text({message:"Enter model path:",placeholder:"./output/model",initialValue:"./output/model"});prompts.isCancel(s)&&prompts.cancel("Operation cancelled");let i=await prompts.text({message:"Enter prompt:",placeholder:"Hello world"});prompts.isCancel(i)&&prompts.cancel("Operation cancelled");let e=p();e.start("Connecting to Langtrain Inference API...");try{let t=await a.generate(s,{prompt:i});e.stop("Generation complete"),h("Response:"),console.log(k__default.default.pastel(t));}catch(t){throw e.stop(colors.red("Generation failed.")),t}}async function te(a,s){let i="",e=p();e.start("Fetching available vision models...");try{let n=await s.list("vision");e.stop(`Found ${n.length} vision models`),n.length>0?i=await prompts.select({message:"Select base vision model:",options:n.map(o=>({value:o.id,label:o.id,hint:o.owned_by}))}):i=await prompts.text({message:"Enter base vision model:",placeholder:"llava-v1.5-7b",initialValue:"llava-v1.5-7b"});}catch{e.stop(colors.yellow("Failed to fetch models. Using manual input.")),i=await prompts.text({message:"Enter base vision model:",placeholder:"llava-v1.5-7b",initialValue:"llava-v1.5-7b"});}prompts.isCancel(i)&&(prompts.cancel("Operation cancelled"),process.exit(0));let t=await prompts.text({message:"Enter dataset path:",placeholder:"./dataset"});prompts.isCancel(t)&&prompts.cancel("Operation cancelled");let g=await prompts.text({message:"Num Epochs:",placeholder:"3",initialValue:"3"});prompts.isCancel(g)&&prompts.cancel("Operation cancelled");let r=await prompts.select({message:"Track this job on Langtrain Cloud?",options:[{value:"yes",label:"Yes",hint:"Upload dataset and log job"},{value:"no",label:"No",hint:"Local only"}]});if(prompts.isCancel(r)&&prompts.cancel("Operation cancelled"),r==="yes"){let n=p();n.start("Connecting to Cloud...");try{let o=C();if(!o.apiKey)throw new Error('API Key required. Run "login" first.');if(!(await new chunkPAHGEWDE_js.i({apiKey:o.apiKey}).getStatus()).features.includes("cloud_finetuning")){n.stop(colors.red('Feature "cloud_finetuning" is not available on your plan.'));let I=await prompts.confirm({message:"Upgrade to Pro for cloud tracking?"});I&&!prompts.isCancel(I)&&console.log(colors.bgCyan(colors.black(" Visit https://langtrain.ai/dashboard/billing to upgrade. ")));return}let L=new chunkPAHGEWDE_js.g({apiKey:o.apiKey}),O=new chunkPAHGEWDE_js.h({apiKey:o.apiKey});n.message("Uploading dataset...");let T=await L.upload(t,void 0,"fine-tune-vision");n.message("Creating Job...");let _=await O.createJob({name:`cli-vision-${Date.now()}`,base_model:i,dataset_id:T.id,task:"vision",training_method:"lora",hyperparameters:{n_epochs:parseInt(g)}});n.stop(colors.green(`Job tracked: ${_.id}`));}catch(o){n.stop(colors.red(`Tracking failed: ${o.message}`));let b=await prompts.confirm({message:"Continue with local training anyway?"});if(!b||prompts.isCancel(b))return}}let u=p();u.start("Analyzing dataset structure..."),await new Promise(n=>setTimeout(n,800)),u.message("Starting vision fine-tuning on Langtrain Cloud...");try{let n={model:i,dataset:t,epochs:parseInt(g),batchSize:1,learningRate:2e-5,loraRank:16,outputDir:"./vision-output"};await a.finetune(n),u.stop(colors.green("Vision fine-tuning started successfully!"));}catch(n){throw u.stop(colors.red("Failed to start vision job.")),n}}async function ne(a){let s=await prompts.text({message:"Enter model path:",placeholder:"./vision-output/model",initialValue:"./vision-output/model"});prompts.isCancel(s)&&prompts.cancel("Operation cancelled");let i=await prompts.text({message:"Enter prompt/image path:",placeholder:"Describe this image..."});prompts.isCancel(i)&&prompts.cancel("Operation cancelled");let e=p();e.start("Uploading image and context..."),await new Promise(t=>setTimeout(t,600)),e.message("Generating vision response...");try{let t=await a.generate(s,{prompt:i});e.stop("Generation complete"),h("Response:"),console.log(k__default.default.pastel(t));}catch(t){throw e.stop(colors.red("Generation failed.")),t}}async function ae(a,s){let i=await prompts.text({message:"Agent Name:",placeholder:"e.g. Support Bot",validate(n){if(!n||n.length===0)return "API Key is required"}});if(prompts.isCancel(i)){prompts.cancel("Operation cancelled");return}let e=await prompts.text({message:"Description:",placeholder:"e.g. A helpful support assistant"});if(prompts.isCancel(e))return;let t=await prompts.text({message:"System Prompt:",placeholder:"e.g. You are a helpful assistant.",initialValue:"You are a helpful assistant."});if(prompts.isCancel(t))return;let g="gpt-4o",r=p();r.start("Fetching agent models...");try{let n=await s.list("agent");r.stop(`Found ${n.length} models`),n.length>0&&(g=await prompts.select({message:"Select Agent Model:",options:n.map(o=>({value:o.id,label:o.id}))}));}catch{r.stop(colors.yellow("Could not fetch models, using default."));}if(prompts.isCancel(g))return;let u=p();u.start("Creating agent...");try{let n=await a.list(),o="";if(n.length>0)o=n[0].workspace_id;else {u.stop(colors.yellow("Workspace ID needed (no existing agents found)."));let K=await prompts.text({message:"Enter Workspace ID (UUID):",validate(L){if(!L||L.length===0)return "Required"}});if(prompts.isCancel(K))return;o=K,u.start("Creating agent...");}let b=await a.create({workspace_id:o,name:i,description:e,config:{system_prompt:t,model:g}});u.stop(colors.green(`Agent "${b.name}" created successfully! ID: ${b.id}`));}catch(n){throw u.stop(colors.red("Failed to create agent.")),n}}async function ie(a){let s=p();s.start("Fetching agents...");let i=await a.list();if(s.stop(`Found ${i.length} agents`),i.length===0){h(colors.yellow("No agents to delete."));return}let e=await prompts.select({message:"Select an agent to DELETE:",options:i.map(r=>({value:r.id,label:r.name,hint:r.description||"No description"}))});if(prompts.isCancel(e))return;if(await prompts.select({message:"Are you sure you want to delete this agent?",options:[{value:"yes",label:"Yes, delete it",hint:"Cannot be undone"},{value:"no",label:"No, keep it"}]})!=="yes"){h(colors.gray("Deletion cancelled."));return}let g=p();g.start("Deleting agent...");try{await a.delete(e),g.stop(colors.green("Agent deleted successfully."));}catch(r){throw g.stop(colors.red("Failed to delete agent.")),r}}async function oe(a){let s=p();s.start("Fetching agents...");let i=await a.list();if(s.stop(`Found ${i.length} agents`),i.length===0){h(colors.yellow("No agents found in your workspace."));return}let e=await prompts.select({message:"Select an agent to run:",options:i.map(t=>({value:t.id,label:t.name,hint:t.description||"No description"}))});prompts.isCancel(e)||await re(a,e,i.find(t=>t.id===e)?.name||"Agent");}async function re(a,s,i){h(colors.bgCyan(colors.black(` Chatting with ${i} `))),console.log(colors.gray('Type "exit" to quit conversation.'));let e;for(;;){let t=await prompts.text({message:"You:",placeholder:"Type a message..."});if(prompts.isCancel(t)||t==="exit")break;let g=p();g.start("Agent is thinking...");try{let r=await a.execute(s,{prompt:t},[],e);g.stop(),r.output&&r.output.response?console.log(k__default.default.pastel(`Agent: ${r.output.response}`)):console.log(k__default.default.pastel(`Agent: ${JSON.stringify(r.output)}`)),e=r.conversation_id;}catch(r){g.stop(colors.red("Error running agent.")),console.error(r);}}}var Y={version:"0.1.15",description:"Unified JavaScript SDK for Langtrain Ecosystem"};async function ge(){let a=new commander.Command,s=Y.version;a.name("langtrain").description(Y.description).version(s),a.action(async()=>{W(s),process.argv.includes("--first-run")&&(process.stdin.isTTY?(h("Welcome to Langtrain! Let's get you set up."),await J()):(console.log('Langtrain installed! Run "npx langtrain login" to authenticate.'),process.exit(0)));let e=C(),t=e.apiKey||"",g=null;if(t)try{g=await q(t);}catch{}let r={vision:new chunkPAHGEWDE_js.a({apiKey:t}),tune:new chunkPAHGEWDE_js.c({apiKey:t}),agent:new chunkPAHGEWDE_js.e({apiKey:t,baseUrl:e.baseUrl}),model:new chunkPAHGEWDE_js.j({apiKey:t,baseUrl:e.baseUrl})},u="main";for(;;){let n=await prompts.select({message:pe(u),options:Q(u,g,!!t)});if(prompts.isCancel(n))if(u==="main")D("Goodbye!"),process.exit(0);else {u="main";continue}let o=n;if(o==="exit"&&(D("Goodbye!"),process.exit(0)),o==="back"){u="main";continue}if(o.startsWith("nav-")){u=o.replace("nav-","");continue}try{switch(o){case "login":await J(),e=C(),t=e.apiKey||"",r={vision:new chunkPAHGEWDE_js.a({apiKey:t}),tune:new chunkPAHGEWDE_js.c({apiKey:t}),agent:new chunkPAHGEWDE_js.e({apiKey:t,baseUrl:e.baseUrl}),model:new chunkPAHGEWDE_js.j({apiKey:t,baseUrl:e.baseUrl})};try{g=await q(t);}catch{}break;case "status":await X();break;case "tune-finetune":await Z(r.tune,r.model);break;case "tune-generate":await ee(r.tune);break;case "vision-finetune":await te(r.vision,r.model);break;case "vision-generate":await ne(r.vision);break;case "agent-list":await oe(r.agent);break;case "agent-create":await ae(r.agent,r.model);break;case "agent-delete":await ie(r.agent);break}}catch(b){D(colors.red(`Error: ${b.message}`));}}}),a.parse(process.argv);}ge().catch(console.error);function pe(a){switch(a){case "main":return "Main Menu:";case "agents":return "Agents & Tools:";case "text":return "Langtune (Text Operations):";case "vision":return "Langvision (Vision Operations):";case "settings":return "Settings:";default:return "Select an option:"}}
12
- exports.main=ge;//# sourceMappingURL=cli.js.map
9
+ `)),console.log(`${colors.bgCyan(colors.black(` Langtrain SDK v${n} `))}
10
+ `);}function m(n){console.log(colors.cyan(`\u25C6 ${n}`));}function A(n){console.log(colors.gray(`\u2514 ${n}`));}function p(){return {start:n=>process.stdout.write(`${colors.cyan("\u25CF")} ${n}\r`),stop:n=>{console.log(n?`${colors.green("\u2714")} ${n}`:"");},message:n=>process.stdout.write(`${colors.cyan("\u25CF")} ${n}\r`)}}function D(n){console.log(colors.green(`\u2714 ${n}`));}function ne(n){console.log(colors.yellow(`\u26A0 Warning: ${n}`));}function ae(n){console.log(colors.blue(`\u2139 ${n}`));}var k={bgCyan:colors.bgCyan,black:colors.black,red:colors.red,green:colors.green,yellow:colors.yellow,gray:colors.gray,cyan:colors.cyan,bold:colors.bold,dim:colors.dim,blue:colors.blue};var Y=B__default.default.join(we__default.default.homedir(),".langtrain"),z=B__default.default.join(Y,"config.json");function h(){if(!M__default.default.existsSync(z))return {};try{return JSON.parse(M__default.default.readFileSync(z,"utf-8"))}catch{return {}}}function oe(n){M__default.default.existsSync(Y)||M__default.default.mkdirSync(Y,{recursive:true}),M__default.default.writeFileSync(z,JSON.stringify(n,null,2));}async function E(){for(;;){console.log(colors.gray(`
11
+ Get your API Key at: https://langtrain.xyz/settings/keys
12
+ `));let n=await prompts.password({message:"Enter your Langtrain API Key:",validate(a){if(!a||a.length===0)return "API Key is required"}});prompts.isCancel(n)&&(prompts.cancel("Operation cancelled"),process.exit(0));let o=p();o.start("Verifying API Key...");try{let e=await new chunkPAHGEWDE_js.i({apiKey:n}).getStatus();o.stop(colors.green(`Authenticated as ${e.plan==="pro"?"PRO":e.plan.toUpperCase()}`));let t=h();oe({...t,apiKey:n});return}catch{o.stop(colors.red("Invalid API Key. Please try again."));}}}async function T(n){let o=new chunkPAHGEWDE_js.i({apiKey:n}),a=p();a.start("Verifying subscription plan...");try{let e=await o.getStatus(),t=e.plan==="pro"?colors.bgCyan(" PRO "):e.plan.toUpperCase();return a.stop(colors.green(`Authenticated as ${t}`)),e.is_active===!1&&console.log(colors.yellow("Warning: Your subscription is not active. Some features may be limited.")),e}catch(e){return a.stop(colors.red("Failed to verify subscription.")),e.response&&e.response.status===401&&console.log(colors.red("Invalid API Key. Please run login again.")),null}}function se(n,o,a){o?.plan==="pro"||o?.plan==="enterprise";switch(n){case "main":let t=[{value:"nav-agents",label:"Agents",hint:"Manage & Chat with AI Agents"},{value:"nav-text",label:"Langtune (Text)",hint:"Fine-tuning & Generation"},{value:"nav-vision",label:"Langvision (Vision)",hint:"Vision Analysis & Tuning"},{value:"init",label:"Initialize Project",hint:"Scaffold new Langtrain app"},{value:"deploy",label:"Deploy",hint:"Push config to Cloud"},{value:"dev",label:"Start Dev Server",hint:"Watch mode"},{value:"doctor",label:"Doctor",hint:"Check environment health"},{value:"nav-settings",label:"Settings",hint:"Subscription & Auth"}];return a||t.unshift({value:"login",label:"Login to Langtrain",hint:"Required for most features"}),t.push({value:"exit",label:"Exit"}),t;case "agents":return [{value:"agent-list",label:"List & Run Agents",hint:"Chat with active agents"},{value:"agent-create",label:"Create New Agent",hint:"Deploy a new agent"},{value:"agent-delete",label:"Delete Agent",hint:"Remove an agent"},{value:"back",label:"\u2190 Back to Main Menu"}];case "text":return [{value:"tune-finetune",label:"Fine-tune Text Model",hint:"Create custom LLM"},{value:"tune-list",label:"List Jobs",hint:"Check training status"},{value:"tune-generate",label:"Generate Text",hint:"Test your models"},{value:"data-upload",label:"Upload Dataset",hint:"Upload JSONL for training"},{value:"back",label:"\u2190 Back to Main Menu"}];case "vision":return [{value:"vision-finetune",label:"Fine-tune Vision Model",hint:"Create custom VLM"},{value:"vision-generate",label:"Generate Vision Response",hint:"Test vision models"},{value:"back",label:"\u2190 Back to Main Menu"}];case "settings":return [{value:"status",label:a?`Subscription Status (${o?.plan||"Free"})`:"Check Status (Login required)"},{value:"login",label:a?"Update API Key":"Login"},{value:"back",label:"\u2190 Back to Main Menu"}];default:return []}}async function re(){let n=h();if(!n.apiKey){m(colors.red('Not logged in. Run "login" first.'));return}let o=new chunkPAHGEWDE_js.i({apiKey:n.apiKey}),a=p();a.start("Fetching subscription status...");try{let e=await o.getStatus();a.stop(colors.green("Subscription Status:")),console.log(colors.gray("Plan: ")+(e.plan==="pro"?colors.bgCyan(" PRO "):e.plan.toUpperCase())),console.log(colors.gray("Active: ")+(e.is_active?colors.green("Yes"):colors.red("No"))),e.expires_at&&console.log(colors.gray("Expires: ")+new Date(e.expires_at).toLocaleDateString()),console.log(colors.gray(`
13
+ Limits:`)),console.log(` Models: ${e.limits.max_models===-1?"Unlimited":e.limits.max_models}`),console.log(` Training Jobs: ${e.limits.max_training_jobs}`);}catch(e){a.stop(colors.red("Failed to fetch status.")),console.error(e.message);}}async function le(n,o){let a="",e=p();e.start("Fetching available text models...");try{let s=await o.list("text");e.stop(`Found ${s.length} text models`),s.length>0&&(a=await prompts.select({message:"Select base model:",options:s.map(c=>({value:c.id,label:c.id,hint:c.owned_by}))}));}catch{e.stop(colors.yellow("Failed to fetch models. Using manual input.")),a=await prompts.text({message:"Enter base model (e.g., gpt-3.5-turbo):",placeholder:"gpt-3.5-turbo",validate(c){if(!c||c.length===0)return "Value is required!"}});}prompts.isCancel(a)&&(prompts.cancel("Operation cancelled."),process.exit(0));let t=await prompts.text({message:"Enter path to training file:",placeholder:"./data.jsonl",validate(s){if(!s||s.length===0)return "Value is required!"}});prompts.isCancel(t)&&prompts.cancel("Operation cancelled.");let r=await prompts.text({message:"Num Epochs:",placeholder:"3",initialValue:"3"});prompts.isCancel(r)&&prompts.cancel("Operation cancelled.");let i=await prompts.select({message:"Track this job on Langtrain Cloud?",options:[{value:"yes",label:"Yes",hint:"Upload dataset and log job"},{value:"no",label:"No",hint:"Local only"}]});if(prompts.isCancel(i)&&prompts.cancel("Operation cancelled."),i==="yes"){let s=p();s.start("Connecting to Cloud...");try{let c=h();if(!c.apiKey)throw new Error('API Key required. Run "login" first.');if(!(await new chunkPAHGEWDE_js.i({apiKey:c.apiKey}).getStatus()).features.includes("cloud_finetuning")){s.stop(colors.red('Feature "cloud_finetuning" is not available on your plan.'));let _=await prompts.confirm({message:"Upgrade to Pro for cloud tracking?"});_&&!prompts.isCancel(_)&&console.log(colors.bgCyan(colors.black(" Visit https://langtrain.ai/dashboard/billing to upgrade. ")));return}let K=new chunkPAHGEWDE_js.g({apiKey:c.apiKey}),O=new chunkPAHGEWDE_js.h({apiKey:c.apiKey});s.message("Uploading dataset...");let V=await K.upload(t);s.message("Creating Job...");let J=await O.createJob({name:`cli-sft-${Date.now()}`,base_model:a,dataset_id:V.id,task:"text",hyperparameters:{n_epochs:parseInt(r)}});s.stop(colors.green(`Job tracked: ${J.id}`));}catch(c){s.stop(colors.red(`Tracking failed: ${c.message}`));let x=await prompts.confirm({message:"Continue with local training anyway?"});if(!x||prompts.isCancel(x))return}}let u=p();u.start("Starting local fine-tuning...");try{let s={model:a,trainFile:t,preset:"default",epochs:parseInt(r),batchSize:1,learningRate:2e-5,loraRank:16,outputDir:"./output"};await n.finetune(s),u.stop(colors.green("Fine-tuning job started successfully!"));}catch(s){throw u.stop(colors.red("Failed to start job.")),s}}async function ce(n){let o=await prompts.text({message:"Enter model path:",placeholder:"./output/model",initialValue:"./output/model"});prompts.isCancel(o)&&prompts.cancel("Operation cancelled");let a=await prompts.text({message:"Enter prompt:",placeholder:"Hello world"});prompts.isCancel(a)&&prompts.cancel("Operation cancelled");let e=p();e.start("Connecting to Langtrain Inference API...");try{let t=await n.generate(o,{prompt:a});e.stop("Generation complete"),m("Response:"),console.log(L__default.default.pastel(t));}catch(t){throw e.stop(colors.red("Generation failed.")),t}}async function ge(n){let o=p();o.start("Fetching fine-tuning jobs...");let e=h().workspace_id;if(!(!e&&(o.stop(colors.yellow("Workspace ID required to list jobs.")),e=await prompts.text({message:"Enter Workspace ID:"}),prompts.isCancel(e))))try{let t=await n.listJobs(e);if(o.stop(`Found ${t.data.length} jobs`),t.data.length===0){console.log(colors.yellow("No jobs found."));return}let r=await prompts.select({message:"Select a job to view details:",options:t.data.map(i=>({value:i.id,label:`${i.name||i.id} (${i.status})`,hint:`Created: ${new Date(i.created_at).toLocaleDateString()}`}))});if(prompts.isCancel(r))return;await pe(n,r);}catch(t){o.stop(colors.red(`Failed to list jobs: ${t.message}`));}}async function pe(n,o){let a=o;if(!a&&(a=await prompts.text({message:"Enter Job ID:"}),prompts.isCancel(a)))return;let e=p();e.start(`Fetching status for ${a}...`);try{let t=await n.getJob(a);if(e.stop(`Job Status: ${t.status.toUpperCase()}`),console.log(colors.gray("------------------------------------------------")),console.log(`${colors.bgCyan(colors.black(" Job Details "))}`),console.log(`ID: ${t.id}`),console.log(`Name: ${t.name}`),console.log(`Status: ${t.status==="succeeded"?colors.green(t.status):t.status}`),console.log(`Model: ${t.base_model}`),console.log(`Progress: ${t.progress||0}%`),t.error_message&&console.log(colors.red(`Error: ${t.error_message}`)),console.log(colors.gray("------------------------------------------------")),t.status==="running"||t.status==="queued"){let r=await prompts.select({message:"Action:",options:[{value:"refresh",label:"Refresh Status"},{value:"cancel",label:"Cancel Job"},{value:"back",label:"Back"}]});r==="refresh"&&await pe(n,a),r==="cancel"&&await $e(n,a);}}catch(t){e.stop(colors.red(`Failed to get job status: ${t.message}`));}}async function $e(n,o){let a=await prompts.confirm({message:"Are you sure you want to cancel this job?"});if(!a||prompts.isCancel(a))return;let e=p();e.start("Canceling job...");try{await n.cancelJob(o),e.stop(colors.green("Job canceled successfully."));}catch(t){e.stop(colors.red(`Failed to cancel job: ${t.message}`));}}async function ue(n,o){let a="",e=p();e.start("Fetching available vision models...");try{let s=await o.list("vision");e.stop(`Found ${s.length} vision models`),s.length>0?a=await prompts.select({message:"Select base vision model:",options:s.map(c=>({value:c.id,label:c.id,hint:c.owned_by}))}):a=await prompts.text({message:"Enter base vision model:",placeholder:"llava-v1.5-7b",initialValue:"llava-v1.5-7b"});}catch{e.stop(colors.yellow("Failed to fetch models. Using manual input.")),a=await prompts.text({message:"Enter base vision model:",placeholder:"llava-v1.5-7b",initialValue:"llava-v1.5-7b"});}prompts.isCancel(a)&&(prompts.cancel("Operation cancelled"),process.exit(0));let t=await prompts.text({message:"Enter dataset path:",placeholder:"./dataset"});prompts.isCancel(t)&&prompts.cancel("Operation cancelled");let r=await prompts.text({message:"Num Epochs:",placeholder:"3",initialValue:"3"});prompts.isCancel(r)&&prompts.cancel("Operation cancelled");let i=await prompts.select({message:"Track this job on Langtrain Cloud?",options:[{value:"yes",label:"Yes",hint:"Upload dataset and log job"},{value:"no",label:"No",hint:"Local only"}]});if(prompts.isCancel(i)&&prompts.cancel("Operation cancelled"),i==="yes"){let s=p();s.start("Connecting to Cloud...");try{let c=h();if(!c.apiKey)throw new Error('API Key required. Run "login" first.');if(!(await new chunkPAHGEWDE_js.i({apiKey:c.apiKey}).getStatus()).features.includes("cloud_finetuning")){s.stop(colors.red('Feature "cloud_finetuning" is not available on your plan.'));let _=await prompts.confirm({message:"Upgrade to Pro for cloud tracking?"});_&&!prompts.isCancel(_)&&console.log(colors.bgCyan(colors.black(" Visit https://langtrain.ai/dashboard/billing to upgrade. ")));return}let K=new chunkPAHGEWDE_js.g({apiKey:c.apiKey}),O=new chunkPAHGEWDE_js.h({apiKey:c.apiKey});s.message("Uploading dataset...");let V=await K.upload(t,void 0,"fine-tune-vision");s.message("Creating Job...");let J=await O.createJob({name:`cli-vision-${Date.now()}`,base_model:a,dataset_id:V.id,task:"vision",training_method:"lora",hyperparameters:{n_epochs:parseInt(r)}});s.stop(colors.green(`Job tracked: ${J.id}`));}catch(c){s.stop(colors.red(`Tracking failed: ${c.message}`));let x=await prompts.confirm({message:"Continue with local training anyway?"});if(!x||prompts.isCancel(x))return}}let u=p();u.start("Analyzing dataset structure..."),await new Promise(s=>setTimeout(s,800)),u.message("Starting vision fine-tuning on Langtrain Cloud...");try{let s={model:a,dataset:t,epochs:parseInt(r),batchSize:1,learningRate:2e-5,loraRank:16,outputDir:"./vision-output"};await n.finetune(s),u.stop(colors.green("Vision fine-tuning started successfully!"));}catch(s){throw u.stop(colors.red("Failed to start vision job.")),s}}async function de(n){let o=await prompts.text({message:"Enter model path:",placeholder:"./vision-output/model",initialValue:"./vision-output/model"});prompts.isCancel(o)&&prompts.cancel("Operation cancelled");let a=await prompts.text({message:"Enter prompt/image path:",placeholder:"Describe this image..."});prompts.isCancel(a)&&prompts.cancel("Operation cancelled");let e=p();e.start("Uploading image and context..."),await new Promise(t=>setTimeout(t,600)),e.message("Generating vision response...");try{let t=await n.generate(o,{prompt:a});e.stop("Generation complete"),m("Response:"),console.log(L__default.default.pastel(t));}catch(t){throw e.stop(colors.red("Generation failed.")),t}}async function fe(n,o){let a=await prompts.text({message:"Agent Name:",placeholder:"e.g. Support Bot",validate(s){if(!s||s.length===0)return "API Key is required"}});if(prompts.isCancel(a)){prompts.cancel("Operation cancelled");return}let e=await prompts.text({message:"Description:",placeholder:"e.g. A helpful support assistant"});if(prompts.isCancel(e))return;let t=await prompts.text({message:"System Prompt:",placeholder:"e.g. You are a helpful assistant.",initialValue:"You are a helpful assistant."});if(prompts.isCancel(t))return;let r="gpt-4o",i=p();i.start("Fetching agent models...");try{let s=await o.list("agent");i.stop(`Found ${s.length} models`),s.length>0&&(r=await prompts.select({message:"Select Agent Model:",options:s.map(c=>({value:c.id,label:c.id}))}));}catch{i.stop(colors.yellow("Could not fetch models, using default."));}if(prompts.isCancel(r))return;let u=p();u.start("Creating agent...");try{let s=await n.list(),c="";if(s.length>0)c=s[0].workspace_id;else {u.stop(colors.yellow("Workspace ID needed (no existing agents found)."));let R=await prompts.text({message:"Enter Workspace ID (UUID):",validate(K){if(!K||K.length===0)return "Required"}});if(prompts.isCancel(R))return;c=R,u.start("Creating agent...");}let x=await n.create({workspace_id:c,name:a,description:e,config:{system_prompt:t,model:r}});u.stop(colors.green(`Agent "${x.name}" created successfully! ID: ${x.id}`));}catch(s){throw u.stop(colors.red("Failed to create agent.")),s}}async function me(n){let o=p();o.start("Fetching agents...");let a=await n.list();if(o.stop(`Found ${a.length} agents`),a.length===0){m(colors.yellow("No agents to delete."));return}let e=await prompts.select({message:"Select an agent to DELETE:",options:a.map(i=>({value:i.id,label:i.name,hint:i.description||"No description"}))});if(prompts.isCancel(e))return;if(await prompts.select({message:"Are you sure you want to delete this agent?",options:[{value:"yes",label:"Yes, delete it",hint:"Cannot be undone"},{value:"no",label:"No, keep it"}]})!=="yes"){m(colors.gray("Deletion cancelled."));return}let r=p();r.start("Deleting agent...");try{await n.delete(e),r.stop(colors.green("Agent deleted successfully."));}catch(i){throw r.stop(colors.red("Failed to delete agent.")),i}}async function he(n){let o=p();o.start("Fetching agents...");let a=await n.list();if(o.stop(`Found ${a.length} agents`),a.length===0){m(colors.yellow("No agents found in your workspace."));return}let e=await prompts.select({message:"Select an agent to run:",options:a.map(t=>({value:t.id,label:t.name,hint:t.description||"No description"}))});prompts.isCancel(e)||await Ie(n,e,a.find(t=>t.id===e)?.name||"Agent");}async function Ie(n,o,a){m(colors.bgCyan(colors.black(` Chatting with ${a} `))),console.log(colors.gray('Type "exit" to quit conversation.'));let e;for(;;){let t=await prompts.text({message:"You:",placeholder:"Type a message..."});if(prompts.isCancel(t)||t==="exit")break;let r=p();r.start("Agent is thinking...");try{let i=await n.execute(o,{prompt:t},[],e);r.stop(),i.output?.response?console.log(L__default.default.pastel(`Agent: ${i.output.response}`)):console.log(L__default.default.pastel(`Agent: ${JSON.stringify(i.output)}`)),e=i.conversation_id;}catch(i){r.stop(colors.red("Error running agent.")),console.error(i);}}}async function H(){m("Initializing new Langtrain project...");let n=process.cwd();if(M__default.default.existsSync(B__default.default.join(n,"langtrain.config.json"))){ae("langtrain.config.json already exists in this directory.");let i=await prompts.confirm({message:"Do you want to re-initialize and overwrite the config?",initialValue:false});if(prompts.isCancel(i)||!i){A("Initialization cancelled.");return}}let o=await prompts.text({message:"What is the name of your project?",placeholder:"my-ai-app",initialValue:B__default.default.basename(n),validate(i){if(!i||i.length===0)return "Project name is required!"}});if(prompts.isCancel(o)){prompts.cancel("Operation cancelled.");return}let a=h(),e=a.apiKey;if(e)D("Found existing Langtrain credentials.");else {let i=await prompts.confirm({message:"You are not logged in. Do you want to log in now?",initialValue:true});if(prompts.isCancel(i)){prompts.cancel("Operation cancelled.");return}if(i)await E(),a=h(),e=a.apiKey;else if(e=await prompts.text({message:"Enter your Langtrain API Key (optional for local dev):",placeholder:"lt_sk_...",initialValue:""}),prompts.isCancel(e)){prompts.cancel("Operation cancelled.");return}}p().start("Creating configuration...");let r={name:o,apiKey:e||void 0,environment:"development",agents:[{name:"support-bot",description:"A helpful customer support assistant",config:{model:"llama-3-8b",system_prompt:"You are a helpful customer support assistant.",temperature:.7}}]};M__default.default.writeFileSync(B__default.default.join(n,"langtrain.config.json"),JSON.stringify(r,null,2)),D("Project initialized successfully!"),console.log(k.dim(`
14
+ Next steps:`)),console.log(` 1. Run ${k.cyan("lt deploy")} to push your agent to the cloud.`),console.log(` 2. Run ${k.cyan("lt dev")} to start the local development loop.`),A("Happy coding!");}async function be(){m("Running Langtrain Doctor...");let n=p(),o=0;n.start("Checking Node.js environment...");let a=process.version,e=we__default.default.platform(),t=we__default.default.arch();parseInt(a.replace("v","").split(".")[0])<18?(n.stop(k.red(`Node.js version ${a} is outdated. Please upgrade to v18+.`)),o++):n.stop(`Node.js ${a} (${e} ${t})`),n.start("Checking configuration...");let r=h();if(!r.apiKey)n.stop(k.yellow("API Key is missing. Run `langtrain login` or set LANGTRAIN_API_KEY.")),o++;else {n.stop("Configuration found."),n.start("Checking API connectivity...");try{let i=await T(r.apiKey);n.stop(`Connected to Langtrain Cloud (Plan: ${k.green(i?.plan||"unknown")})`);}catch(i){n.stop(k.red(`Failed to connect to Langtrain Cloud: ${i.message}`)),o++;}}console.log(""),o===0?D("Your Langtrain environment is healthy! Ready to build."):ne(`Found ${o} issue(s). Please resolve them for the best experience.`),A("Doctor check complete.");}async function ve(n){let a=h().workspace_id,e=await prompts.text({message:"Path to file:",placeholder:"./dataset.jsonl",validate(i){if(!i)return "Required";if(!M__default.default.existsSync(i))return "File not found"}});if(prompts.isCancel(e))return;let t=await prompts.select({message:"File Purpose:",options:[{value:"fine-tune",label:"Fine-tuning (JSONL)"},{value:"vision-tune",label:"Vision Tuning (Image/Zip)"},{value:"agent-knowledge",label:"Agent Knowledge"}]});if(prompts.isCancel(t))return;let r=p();r.start("Uploading file...");try{let i=await n.upload(e,a,t);r.stop(colors.green("File uploaded successfully!")),console.log(colors.gray(`ID: ${i.id}`)),console.log(colors.gray(`Name: ${i.filename}`)),console.log(colors.gray(`Bytes: ${i.bytes}`));}catch(i){r.stop(colors.red(`Upload failed: ${i.message}`));}}async function P(n){m("Deploying configuration to Langtrain Cloud...");let o=h(),a=o.agents||[];if(a.length===0){m(colors.yellow("No agents found in langtrain.config.json"));return}for(let e of a){let t=p();t.start(`Deploying agent: ${e.name}...`);try{let r=await n.list(),i=r.find(u=>u.name===e.name);if(i)t.stop(colors.yellow(`Agent ${e.name} already exists (ID: ${i.id}). Skipping update (not supported yet).`));else {let u={workspace_id:o.workspace_id||r[0]?.workspace_id||"",name:e.name,description:e.description,config:e.config};if(!u.workspace_id){t.stop(colors.red(`Failed: Workspace ID missing in config for ${e.name}`));continue}await n.create(u),t.stop(colors.green(`Agent ${e.name} deployed successfully!`));}}catch(r){t.stop(colors.red(`Failed to deploy ${e.name}: ${r.message}`));}}D("Deployment complete.");}async function Z(n){m("Starting Langtrain Development Server...");let o=B__default.default.join(process.cwd(),"langtrain.config.json");if(!M__default.default.existsSync(o)){m(colors.red('langtrain.config.json not found. Run "lt init" first.'));return}console.log(colors.gray(`Watching ${o} for changes...`));let a=false;await P(n),M__default.default.watch(o,async e=>{if(e==="change"&&!a){a=true,console.log(colors.yellow("Configuration changed. Redeploying...")),await new Promise(t=>setTimeout(t,500));try{await P(n);}catch(t){console.error(colors.red(`Deploy failed: ${t.message}`));}finally{a=false,console.log(colors.gray(`Watching ${o}...`));}}}),await new Promise(()=>{});}var Q={version:"0.1.19",description:"Unified JavaScript SDK for Langtrain Ecosystem"};async function Ke(){let n=new commander.Command,o=Q.version;n.name("langtrain").description(Q.description).version(o),n.command("init").description("Initialize a new Langtrain project").action(H),n.command("deploy").description("Deploy configuration to Langtrain Cloud").action(async()=>{let a=h(),e=a.apiKey||"",t=new chunkPAHGEWDE_js.e({apiKey:e,baseUrl:a.baseUrl});await P(t);}),n.command("dev").description("Start local development server (Watch Mode)").action(async()=>{let a=h(),e=a.apiKey||"",t=new chunkPAHGEWDE_js.e({apiKey:e,baseUrl:a.baseUrl});await Z(t);}),n.action(async()=>{te(o),process.argv.includes("--first-run")&&(process.stdin.isTTY?(m("Welcome to Langtrain! Let's get you set up."),await E()):(console.log('Langtrain installed! Run "npx langtrain login" to authenticate.'),process.exit(0)));let e=h(),t=e.apiKey||"",r=null;if(t)try{r=await T(t);}catch{}let i={vision:new chunkPAHGEWDE_js.a({apiKey:t}),tune:new chunkPAHGEWDE_js.c({apiKey:t}),agent:new chunkPAHGEWDE_js.e({apiKey:t,baseUrl:e.baseUrl}),model:new chunkPAHGEWDE_js.j({apiKey:t,baseUrl:e.baseUrl}),train:new chunkPAHGEWDE_js.h({apiKey:t,baseUrl:e.baseUrl})},u="main";for(;;){let s=await prompts.select({message:je(u),options:se(u,r,!!t)});if(prompts.isCancel(s))if(u==="main")A("Goodbye!"),process.exit(0);else {u="main";continue}let c=s;if(c==="exit"&&(A("Goodbye!"),process.exit(0)),c==="back"){u="main";continue}if(c.startsWith("nav-")){u=c.replace("nav-","");continue}try{switch(c){case "login":await E(),e=h(),t=e.apiKey||"",i={vision:new chunkPAHGEWDE_js.a({apiKey:t}),tune:new chunkPAHGEWDE_js.c({apiKey:t}),agent:new chunkPAHGEWDE_js.e({apiKey:t,baseUrl:e.baseUrl}),model:new chunkPAHGEWDE_js.j({apiKey:t,baseUrl:e.baseUrl}),train:new chunkPAHGEWDE_js.h({apiKey:t,baseUrl:e.baseUrl})};try{r=await T(t);}catch{}break;case "status":await re();break;case "init":await H();break;case "deploy":await P(i.agent);break;case "dev":await Z(i.agent);break;case "doctor":await be();break;case "tune-finetune":await le(i.tune,i.model);break;case "tune-list":await ge(i.train);break;case "tune-generate":await ce(i.tune);break;case "vision-finetune":await ue(i.vision,i.model);break;case "vision-generate":await de(i.vision);break;case "agent-list":await he(i.agent);break;case "agent-create":await fe(i.agent,i.model);break;case "agent-delete":await me(i.agent);break;case "data-upload":await ve(new chunkPAHGEWDE_js.g({apiKey:t}));break}}catch(x){A(k.red(`Error: ${x.message}`));}}}),n.parse(process.argv);}Ke().catch(console.error);function je(n){switch(n){case "main":return "Main Menu:";case "agents":return "Agents & Tools:";case "text":return "Langtune (Text Operations):";case "vision":return "Langvision (Vision Operations):";case "settings":return "Settings:";default:return "Select an option:"}}exports.main=Ke;//# sourceMappingURL=cli.js.map
13
15
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/ui.ts","../src/cli/config.ts","../src/cli/auth.ts","../src/cli/menu.ts","../src/cli/handlers/subscription.ts","../src/cli/handlers/tune.ts","../src/cli/handlers/vision.ts","../src/cli/handlers/agent.ts","../package.json","../src/cli/index.ts"],"names":["showBanner","version","gradient","bgCyan","black","intro","message","cyan","outro","gray","spinner","msg","green","CONFIG_DIR","path","os","CONFIG_FILE","getConfig","fs","saveConfig","config","handleLogin","apiKey","password","value","isCancel","cancel","info","SubscriptionClient","red","getSubscription","client","s","planLabel","yellow","getMenu","state","plan","isAuthenticated","menu","handleSubscriptionStatus","handleTuneFinetune","tune","modelClient","model","models","select","m","text","trainFile","epochs","track","upgrade","confirm","fileClient","FileClient","trainingClient","TrainingClient","fileResp","job","e","cont","s2","handleTuneGenerate","prompt","response","handleVisionFinetune","vision","dataset","r","handleVisionGenerate","handleAgentCreate","name","description","systemPrompt","agents","workspaceId","wid","agent","handleAgentDelete","agentId","a","d","handleAgentList","handleAgentRun","agentName","conversationId","input","result","package_default","main","program","Command","clients","Langvision","Langtune","AgentClient","ModelClient","currentState","operation","getMessageForState","op","error"],"mappings":"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","file":"cli.js","sourcesContent":["import { text, select, confirm, password, isCancel, cancel } from '@clack/prompts';\nimport { bgCyan, black, red, green, yellow, gray, cyan, bold } from 'kleur/colors';\n\n// Gradient removed for cleaner look, or keep if user likes it but wants no emojis?\n// User said \"remove emojis\", didn't explicitly say \"remove colors/gradients\", but \"clean UI\" usually implies less noise.\n// I will keep the banner gradient as it is a brand element, but remove emojis from intro/outro.\nimport gradient from 'gradient-string';\n\nexport function showBanner(version: string) {\n console.clear();\n const banner = `\n ██╗ █████╗ ███╗ ██╗ ██████╗████████╗██████╗ █████╗ ██╗███╗ ██╗\n ██║ ██╔══██╗████╗ ██║██╔════╝╚══██╔══╝██╔══██╗██╔══██╗██║████╗ ██║\n ██║ ███████║██╔██╗ ██║██║ ███╗ ██║ ██████╔╝███████║██║██╔██╗ ██║\n ██║ ██╔══██║██║╚██╗██║██║ ██║ ██║ ██╔══██╗██╔══██║██║██║╚██╗██║\n ███████╗██║ ██║██║ ╚████║╚██████╔╝ ██║ ██║ ██║██║ ██║██║██║ ╚████║\n ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝\n `;\n console.log(gradient(['#00DC82', '#36E4DA', '#0047E1'])(banner));\n console.log(`${bgCyan(black(` Langtrain SDK v${version} `))}\\n`);\n}\n\nexport function intro(message: string) {\n console.log(cyan(`◆ ${message}`));\n}\n\nexport function outro(message: string) {\n console.log(gray(`└ ${message}`));\n}\n\nexport function spinner() {\n return {\n start: (msg: string) => process.stdout.write(`${cyan('●')} ${msg}\\r`),\n stop: (msg?: string) => {\n if (msg) console.log(`${green('✔')} ${msg}`);\n else console.log(''); // Newline\n },\n message: (msg: string) => process.stdout.write(`${cyan('●')} ${msg}\\r`)\n };\n}\n\nexport function showError(message: string) {\n console.log(red(`✖ Error: ${message}`));\n}\n\nexport function showSuccess(message: string) {\n console.log(green(`✔ ${message}`));\n}\n\nexport { text, select, confirm, password, isCancel, cancel, bgCyan, black, red, green, yellow, gray, cyan, bold, gradient };\n","import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\n\nconst CONFIG_DIR = path.join(os.homedir(), '.langtrain');\nconst CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');\n\nexport interface CLIConfig {\n apiKey?: string;\n baseUrl?: string;\n [key: string]: any;\n}\n\nexport function getConfig(): CLIConfig {\n if (!fs.existsSync(CONFIG_FILE)) return {};\n try {\n return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nexport function saveConfig(config: CLIConfig) {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n }\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));\n}\n","import { password, isCancel, cancel, intro, green, yellow, red, bgCyan, black, spinner, gray } from './ui';\nimport { getConfig, saveConfig } from './config';\nimport { SubscriptionClient, SubscriptionInfo } from '../index';\n\nexport async function ensureAuth(): Promise<string> {\n let config = getConfig();\n\n if (!config.apiKey) {\n intro(yellow('Authentication required to verify plan & features.'));\n await handleLogin();\n config = getConfig();\n }\n\n return config.apiKey as string;\n}\n\nexport async function handleLogin() {\n while (true) {\n const apiKey = await password({\n message: 'Enter your Langtrain API Key:',\n validate(value) {\n if (!value || value.length === 0) return 'API Key is required';\n },\n });\n\n if (isCancel(apiKey)) {\n cancel('Operation cancelled');\n process.exit(0);\n }\n\n const s = spinner();\n s.start('Verifying API Key...');\n\n // Verify key immediately\n try {\n const client = new SubscriptionClient({ apiKey: apiKey as string });\n const info = await client.getStatus();\n\n s.stop(green(`Authenticated as ${info.plan === 'pro' ? 'PRO' : info.plan.toUpperCase()}`));\n\n const config = getConfig();\n saveConfig({ ...config, apiKey: apiKey as string });\n // intro(green('API Key saved successfully!')); // success message above is enough\n return; // Exit loop on success\n } catch (e: any) {\n s.stop(red('Invalid API Key. Please try again.'));\n // Loop continues\n }\n }\n}\n\nexport async function getSubscription(apiKey: string): Promise<SubscriptionInfo | null> {\n const client = new SubscriptionClient({ apiKey });\n const s = spinner();\n s.start('Verifying subscription plan...');\n try {\n const info = await client.getStatus();\n\n // Enhance: Show plan details immediately on auth check\n const planLabel = info.plan === 'pro' ? bgCyan(' PRO ') : info.plan.toUpperCase();\n s.stop(green(`Authenticated as ${planLabel}`));\n\n if (info.is_active === false) {\n console.log(yellow('Warning: Your subscription is not active. Some features may be limited.'));\n }\n\n return info;\n } catch (e: any) {\n s.stop(red('Failed to verify subscription.'));\n if (e.response && e.response.status === 401) {\n console.log(red('Invalid API Key. Please run login again.'));\n // Optionally clear key?\n }\n return null;\n }\n}\n","import { SubscriptionInfo } from '../index';\n\nexport interface MenuOption {\n value: string;\n label: string;\n hint?: string;\n}\n\nexport type MenuState = 'main' | 'agents' | 'text' | 'vision' | 'settings';\n\nexport function getMenu(state: MenuState, plan: SubscriptionInfo | null, isAuthenticated: boolean): MenuOption[] {\n const isPro = plan?.plan === 'pro' || plan?.plan === 'enterprise';\n\n // If not authenticated, force login or limited menu?\n // User requested \"lazy auth\", so we should show menu but maybe highlight login or allow navigation and prompt later.\n // Let's add a visual cue.\n\n switch (state) {\n case 'main':\n const menu: MenuOption[] = [\n { value: 'nav-agents', label: 'Agents', hint: 'Manage & Chat with AI Agents' },\n { value: 'nav-text', label: 'Langtune (Text)', hint: 'Fine-tuning & Generation' },\n { value: 'nav-vision', label: 'Langvision (Vision)', hint: 'Vision Analysis & Tuning' },\n { value: 'nav-settings', label: 'Settings', hint: 'Subscription & Auth' }\n ];\n\n if (!isAuthenticated) {\n // menu.unshift({ value: 'login', label: 'Login to Langtrain', hint: 'Required for most features' });\n // Actually, let's make Login the first option if not authenticated\n // But keep the others so user can see what's available (and get prompted)\n menu.unshift({ value: 'login', label: 'Login to Langtrain', hint: 'Required for most features' });\n }\n\n // Always add Exit\n menu.push({ value: 'exit', label: 'Exit' });\n return menu;\n\n case 'agents':\n return [\n { value: 'agent-list', label: 'List & Run Agents', hint: 'View active agents' },\n { value: 'agent-create', label: 'Create New Agent', hint: 'Deploy a new agent' },\n { value: 'agent-delete', label: 'Delete Agent', hint: 'Remove an agent' },\n { value: 'back', label: '← Back to Main Menu' }\n ];\n\n case 'text':\n return [\n { value: 'tune-finetune', label: 'Fine-tune Text Model', hint: 'Create custom LLM' },\n { value: 'tune-generate', label: 'Generate Text', hint: 'Test your models' },\n { value: 'back', label: '← Back to Main Menu' }\n ];\n\n case 'vision':\n return [\n { value: 'vision-finetune', label: 'Fine-tune Vision Model', hint: 'Create custom VLM' },\n { value: 'vision-generate', label: 'Generate Vision Response', hint: 'Test vision models' },\n { value: 'back', label: '← Back to Main Menu' }\n ];\n\n case 'settings':\n return [\n { value: 'status', label: isAuthenticated ? `Subscription Status (${plan?.plan || 'Free'})` : 'Check Status (Login required)' },\n { value: 'login', label: isAuthenticated ? 'Update API Key' : 'Login' },\n { value: 'back', label: '← Back to Main Menu' }\n ];\n\n default:\n return [];\n }\n}\n","import { spinner, intro, red, green, gray, bgCyan } from '../ui';\nimport { getConfig } from '../config';\nimport { SubscriptionClient } from '../../index';\n\nexport async function handleSubscriptionStatus() {\n const config = getConfig();\n if (!config.apiKey) {\n intro(red('Not logged in. Run \"login\" first.'));\n return;\n }\n const client = new SubscriptionClient({ apiKey: config.apiKey });\n const s = spinner();\n s.start('Fetching subscription status...');\n try {\n const info = await client.getStatus();\n s.stop(green('Subscription Status:'));\n\n console.log(gray('Plan: ') + (info.plan === 'pro' ? bgCyan(' PRO ') : info.plan.toUpperCase()));\n console.log(gray('Active: ') + (info.is_active ? green('Yes') : red('No')));\n if (info.expires_at) console.log(gray('Expires: ') + new Date(info.expires_at).toLocaleDateString());\n\n console.log(gray('\\nLimits:'));\n console.log(` Models: ${info.limits.max_models === -1 ? 'Unlimited' : info.limits.max_models}`);\n console.log(` Training Jobs: ${info.limits.max_training_jobs}`);\n\n } catch (e: any) {\n s.stop(red('Failed to fetch status.'));\n console.error(e.message);\n }\n}\n","import { text, select, confirm, isCancel, cancel, spinner, intro, red, green, yellow, bgCyan, black, gradient } from '../ui';\nimport { getConfig } from '../config';\nimport { Langtune, ModelClient, SubscriptionClient, FileClient, TrainingClient } from '../../index';\n\n// Handler for Langtune Fine-tuning\nexport async function handleTuneFinetune(tune: Langtune, modelClient: ModelClient) {\n let model: string | symbol = '';\n\n const s = spinner();\n s.start('Fetching available text models...');\n try {\n const models = await modelClient.list('text');\n s.stop(`Found ${models.length} text models`);\n\n if (models.length > 0) {\n model = await select({\n message: 'Select base model:',\n options: models.map(m => ({ value: m.id, label: m.id, hint: m.owned_by }))\n });\n }\n } catch (e) {\n s.stop(yellow('Failed to fetch models. Using manual input.'));\n model = await text({\n message: 'Enter base model (e.g., gpt-3.5-turbo):',\n placeholder: 'gpt-3.5-turbo',\n validate(value) {\n if (!value || value.length === 0) return 'Value is required!';\n },\n });\n }\n\n if (isCancel(model)) {\n cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const trainFile = await text({\n message: 'Enter path to training file:',\n placeholder: './data.jsonl',\n validate(value) {\n if (!value || value.length === 0) return 'Value is required!';\n },\n });\n if (isCancel(trainFile)) cancel('Operation cancelled.');\n\n const epochs = await text({\n message: 'Num Epochs:',\n placeholder: '3',\n initialValue: '3'\n });\n if (isCancel(epochs)) cancel('Operation cancelled.');\n\n const track = await select({\n message: 'Track this job on Langtrain Cloud?',\n options: [\n { value: 'yes', label: 'Yes', hint: 'Upload dataset and log job' },\n { value: 'no', label: 'No', hint: 'Local only' }\n ]\n });\n if (isCancel(track)) cancel('Operation cancelled.');\n\n if (track === 'yes') {\n const s = spinner();\n s.start('Connecting to Cloud...');\n try {\n const config = getConfig();\n if (!config.apiKey) throw new Error('API Key required. Run \"login\" first.');\n\n // Check Subscription\n const subClient = new SubscriptionClient({ apiKey: config.apiKey });\n const sub = await subClient.getStatus();\n if (!sub.features.includes('cloud_finetuning')) {\n s.stop(red('Feature \"cloud_finetuning\" is not available on your plan.'));\n const upgrade = await confirm({ message: 'Upgrade to Pro for cloud tracking?' });\n if (upgrade && !isCancel(upgrade)) {\n console.log(bgCyan(black(' Visit https://langtrain.ai/dashboard/billing to upgrade. ')));\n }\n return;\n }\n\n const fileClient = new FileClient({ apiKey: config.apiKey });\n const trainingClient = new TrainingClient({ apiKey: config.apiKey });\n\n s.message('Uploading dataset...');\n const fileResp = await fileClient.upload(trainFile as string);\n\n s.message('Creating Job...');\n const job = await trainingClient.createJob({\n name: `cli-sft-${Date.now()}`,\n base_model: model as string,\n dataset_id: fileResp.id,\n task: 'text',\n hyperparameters: {\n n_epochs: parseInt(epochs as string)\n }\n });\n s.stop(green(`Job tracked: ${job.id}`));\n } catch (e: any) {\n s.stop(red(`Tracking failed: ${e.message}`));\n const cont = await confirm({ message: 'Continue with local training anyway?' });\n if (!cont || isCancel(cont)) return;\n }\n }\n\n const s2 = spinner();\n s2.start('Starting local fine-tuning...');\n\n try {\n const config: any = {\n model: model as string,\n trainFile: trainFile as string,\n preset: 'default', // simplified\n epochs: parseInt(epochs as string),\n batchSize: 1,\n learningRate: 2e-5,\n loraRank: 16,\n outputDir: './output'\n };\n\n await tune.finetune(config);\n s2.stop(green('Fine-tuning job started successfully!'));\n } catch (e: any) {\n s2.stop(red('Failed to start job.'));\n throw e;\n }\n}\n\n// Handler for Langtune Generation\nexport async function handleTuneGenerate(tune: Langtune) {\n const model = await text({\n message: 'Enter model path:',\n placeholder: './output/model',\n initialValue: './output/model'\n });\n if (isCancel(model)) cancel('Operation cancelled');\n\n const prompt = await text({\n message: 'Enter prompt:',\n placeholder: 'Hello world',\n });\n if (isCancel(prompt)) cancel('Operation cancelled');\n\n const s = spinner();\n s.start('Connecting to Langtrain Inference API...');\n\n try {\n const response = await tune.generate(model as string, { prompt: prompt as string });\n s.stop('Generation complete');\n intro('Response:');\n console.log(gradient.pastel(response));\n } catch (e: any) {\n s.stop(red('Generation failed.'));\n throw e;\n }\n}\n","import { text, select, confirm, isCancel, cancel, spinner, intro, red, green, yellow, bgCyan, black, gradient } from '../ui';\nimport { getConfig } from '../config';\nimport { Langvision, ModelClient, SubscriptionClient, FileClient, TrainingClient } from '../../index';\n\n// Handler for Langvision Fine-tuning\nexport async function handleVisionFinetune(vision: Langvision, modelClient: ModelClient) {\n let model: string | symbol = '';\n\n const s = spinner();\n s.start('Fetching available vision models...');\n try {\n const models = await modelClient.list('vision');\n s.stop(`Found ${models.length} vision models`);\n\n if (models.length > 0) {\n model = await select({\n message: 'Select base vision model:',\n options: models.map(m => ({ value: m.id, label: m.id, hint: m.owned_by }))\n });\n } else {\n model = await text({\n message: 'Enter base vision model:',\n placeholder: 'llava-v1.5-7b',\n initialValue: 'llava-v1.5-7b'\n });\n }\n } catch (e) {\n s.stop(yellow('Failed to fetch models. Using manual input.'));\n model = await text({\n message: 'Enter base vision model:',\n placeholder: 'llava-v1.5-7b',\n initialValue: 'llava-v1.5-7b'\n });\n }\n\n if (isCancel(model)) {\n cancel('Operation cancelled');\n process.exit(0);\n }\n\n const dataset = await text({\n message: 'Enter dataset path:',\n placeholder: './dataset',\n });\n if (isCancel(dataset)) cancel('Operation cancelled');\n\n const epochs = await text({\n message: 'Num Epochs:',\n placeholder: '3',\n initialValue: '3'\n });\n if (isCancel(epochs)) cancel('Operation cancelled');\n\n const track = await select({\n message: 'Track this job on Langtrain Cloud?',\n options: [\n { value: 'yes', label: 'Yes', hint: 'Upload dataset and log job' },\n { value: 'no', label: 'No', hint: 'Local only' }\n ]\n });\n if (isCancel(track)) cancel('Operation cancelled');\n\n if (track === 'yes') {\n const s = spinner();\n s.start('Connecting to Cloud...');\n try {\n const config = getConfig();\n if (!config.apiKey) throw new Error('API Key required. Run \"login\" first.');\n\n // Check Subscription\n const subClient = new SubscriptionClient({ apiKey: config.apiKey });\n const sub = await subClient.getStatus();\n if (!sub.features.includes('cloud_finetuning')) {\n s.stop(red('Feature \"cloud_finetuning\" is not available on your plan.'));\n const upgrade = await confirm({ message: 'Upgrade to Pro for cloud tracking?' });\n if (upgrade && !isCancel(upgrade)) {\n console.log(bgCyan(black(' Visit https://langtrain.ai/dashboard/billing to upgrade. ')));\n }\n return;\n }\n\n const fileClient = new FileClient({ apiKey: config.apiKey });\n const trainingClient = new TrainingClient({ apiKey: config.apiKey });\n\n s.message('Uploading dataset...');\n const fileResp = await fileClient.upload(dataset as string, undefined, 'fine-tune-vision');\n\n s.message('Creating Job...');\n const job = await trainingClient.createJob({\n name: `cli-vision-${Date.now()}`,\n base_model: model as string,\n dataset_id: fileResp.id,\n task: 'vision',\n training_method: 'lora',\n hyperparameters: {\n n_epochs: parseInt(epochs as string)\n }\n });\n s.stop(green(`Job tracked: ${job.id}`));\n } catch (e: any) {\n s.stop(red(`Tracking failed: ${e.message}`));\n const cont = await confirm({ message: 'Continue with local training anyway?' });\n if (!cont || isCancel(cont)) return;\n }\n }\n\n const s2 = spinner();\n s2.start('Analyzing dataset structure...');\n await new Promise(r => setTimeout(r, 800));\n s2.message('Starting vision fine-tuning on Langtrain Cloud...');\n\n try {\n const config: any = {\n model: model as string,\n dataset: dataset as string,\n epochs: parseInt(epochs as string),\n batchSize: 1,\n learningRate: 2e-5,\n loraRank: 16,\n outputDir: './vision-output'\n };\n await vision.finetune(config);\n s2.stop(green('Vision fine-tuning started successfully!'));\n } catch (e: any) {\n s2.stop(red('Failed to start vision job.'));\n throw e;\n }\n}\n\n// Handler for Langvision Generation\nexport async function handleVisionGenerate(vision: Langvision) {\n const model = await text({\n message: 'Enter model path:',\n placeholder: './vision-output/model',\n initialValue: './vision-output/model'\n });\n if (isCancel(model)) cancel('Operation cancelled');\n\n const prompt = await text({\n message: 'Enter prompt/image path:', // Simplified for CLI\n placeholder: 'Describe this image...',\n });\n if (isCancel(prompt)) cancel('Operation cancelled');\n\n const s = spinner();\n s.start('Uploading image and context...');\n await new Promise(r => setTimeout(r, 600));\n s.message('Generating vision response...');\n\n try {\n const response = await vision.generate(model as string, { prompt: prompt as string });\n s.stop('Generation complete');\n intro('Response:');\n console.log(gradient.pastel(response));\n } catch (e: any) {\n s.stop(red('Generation failed.'));\n throw e;\n }\n}\n","import { text, select, confirm, isCancel, cancel, spinner, intro, red, green, yellow, gray, bgCyan, black, gradient } from '../ui';\nimport { AgentClient, ModelClient } from '../../index';\n\nexport async function handleAgentCreate(client: AgentClient, modelClient: ModelClient) {\n const name = await text({\n message: 'Agent Name:',\n placeholder: 'e.g. Support Bot',\n validate(value) {\n if (!value || value.length === 0) return 'API Key is required';\n },\n });\n if (isCancel(name)) {\n cancel('Operation cancelled');\n return;\n }\n\n const description = await text({\n message: 'Description:',\n placeholder: 'e.g. A helpful support assistant',\n });\n if (isCancel(description)) return;\n\n const systemPrompt = await text({\n message: 'System Prompt:',\n placeholder: 'e.g. You are a helpful assistant.',\n initialValue: 'You are a helpful assistant.'\n });\n if (isCancel(systemPrompt)) return;\n\n // Select model\n let model: string | symbol = 'gpt-4o';\n const s = spinner();\n s.start('Fetching agent models...');\n try {\n const models = await modelClient.list('agent');\n s.stop(`Found ${models.length} models`);\n if (models.length > 0) {\n model = await select({\n message: 'Select Agent Model:',\n options: models.map(m => ({ value: m.id, label: m.id }))\n });\n }\n } catch (e) {\n s.stop(yellow('Could not fetch models, using default.'));\n }\n\n if (isCancel(model)) return;\n\n const s2 = spinner();\n s2.start('Creating agent...');\n\n try {\n const agents = await client.list();\n let workspaceId = \"\";\n if (agents.length > 0) {\n workspaceId = agents[0].workspace_id;\n } else {\n s2.stop(yellow('Workspace ID needed (no existing agents found).'));\n const wid = await text({\n message: 'Enter Workspace ID (UUID):',\n validate(value) {\n if (!value || value.length === 0) return 'Required';\n },\n });\n if (isCancel(wid)) return;\n workspaceId = wid as string;\n s2.start('Creating agent...');\n }\n\n const agent = await client.create({\n workspace_id: workspaceId,\n name: name as string,\n description: description as string,\n config: {\n system_prompt: systemPrompt as string,\n model: model as string\n }\n });\n s2.stop(green(`Agent \"${agent.name}\" created successfully! ID: ${agent.id}`));\n } catch (e: any) {\n s2.stop(red('Failed to create agent.'));\n throw e;\n }\n}\n\nexport async function handleAgentDelete(client: AgentClient) {\n const s = spinner();\n s.start('Fetching agents...');\n const agents = await client.list();\n s.stop(`Found ${agents.length} agents`);\n\n if (agents.length === 0) {\n intro(yellow('No agents to delete.'));\n return;\n }\n\n const agentId = await select({\n message: 'Select an agent to DELETE:',\n options: agents.map(a => ({ value: a.id, label: a.name, hint: a.description || 'No description' }))\n });\n\n if (isCancel(agentId)) return;\n\n const confirmDel = await select({\n message: `Are you sure you want to delete this agent?`,\n options: [\n { value: 'yes', label: 'Yes, delete it', hint: 'Cannot be undone' },\n { value: 'no', label: 'No, keep it' }\n ]\n });\n\n if (confirmDel !== 'yes') {\n intro(gray('Deletion cancelled.'));\n return;\n }\n\n const d = spinner();\n d.start('Deleting agent...');\n try {\n await client.delete(agentId as string);\n d.stop(green('Agent deleted successfully.'));\n } catch (e: any) {\n d.stop(red('Failed to delete agent.'));\n throw e;\n }\n}\n\nexport async function handleAgentList(client: AgentClient) {\n const s = spinner();\n s.start('Fetching agents...');\n const agents = await client.list();\n s.stop(`Found ${agents.length} agents`);\n\n if (agents.length === 0) {\n intro(yellow('No agents found in your workspace.'));\n return;\n }\n\n const agentId = await select({\n message: 'Select an agent to run:',\n options: agents.map(a => ({ value: a.id, label: a.name, hint: a.description || 'No description' }))\n });\n\n if (isCancel(agentId)) return;\n\n await handleAgentRun(client, agentId as string, agents.find(a => a.id === agentId)?.name || 'Agent');\n}\n\nasync function handleAgentRun(client: AgentClient, agentId: string, agentName: string) {\n intro(bgCyan(black(` Chatting with ${agentName} `)));\n console.log(gray('Type \"exit\" to quit conversation.'));\n\n let conversationId: string | undefined = undefined;\n\n while (true) {\n const input = await text({\n message: 'You:',\n placeholder: 'Type a message...',\n });\n\n if (isCancel(input) || input === 'exit') {\n break;\n }\n\n const s = spinner();\n s.start('Agent is thinking...');\n try {\n const result = await client.execute(agentId, { prompt: input }, [], conversationId);\n s.stop();\n\n if (result.output && result.output.response) {\n console.log(gradient.pastel(`Agent: ${result.output.response}`));\n } else {\n console.log(gradient.pastel(`Agent: ${JSON.stringify(result.output)}`));\n }\n\n conversationId = result.conversation_id;\n } catch (e: any) {\n s.stop(red('Error running agent.'));\n console.error(e);\n }\n }\n}\n","{\n \"name\": \"langtrain\",\n \"version\": \"0.1.15\",\n \"description\": \"Unified JavaScript SDK for Langtrain Ecosystem\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"langtrain\": \"./dist/cli.js\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n \"postinstall\": \"node dist/cli.js --first-run || true\"\n },\n \"keywords\": [\n \"langtrain\",\n \"langvision\",\n \"langtune\",\n \"sdk\",\n \"ai\",\n \"llm\",\n \"finetuning\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/langtrain-ai/langtrain-sdk.git\"\n },\n \"author\": \"Langtrain AI\",\n \"license\": \"MIT\",\n \"devDependencies\": {\n \"@types/gradient-string\": \"^1.1.6\",\n \"@types/node\": \"^25.2.3\",\n \"langtune\": \"file:../langtune/js\",\n \"langvision\": \"file:../langvision/js\",\n \"tsup\": \"^8.0.2\",\n \"typescript\": \"^5.4.2\"\n },\n \"dependencies\": {\n \"@clack/prompts\": \"^1.0.1\",\n \"axios\": \"^1.13.5\",\n \"commander\": \"^14.0.3\",\n \"gradient-string\": \"^3.0.0\",\n \"kleur\": \"^4.1.5\"\n }\n}\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport path from 'path';\nimport { bgCyan, black, red, select, isCancel, outro, intro, gray } from './ui'; // Ensure clear is exported if added, otherwise use console.clear()\nimport { showBanner } from './ui';\nimport { ensureAuth, handleLogin, getSubscription } from './auth';\nimport { getMenu, MenuState } from './menu';\nimport { getConfig } from './config';\n\n// Handlers\nimport { handleSubscriptionStatus } from './handlers/subscription';\nimport { handleTuneFinetune, handleTuneGenerate } from './handlers/tune';\nimport { handleVisionFinetune, handleVisionGenerate } from './handlers/vision';\nimport { handleAgentCreate, handleAgentDelete, handleAgentList } from './handlers/agent';\n\n// Clients\nimport { SubscriptionInfo, Langvision, Langtune, AgentClient, ModelClient } from '../index';\nimport packageJson from '../../package.json';\n\nexport async function main() {\n const program = new Command();\n const version = packageJson.version;\n\n program\n .name('langtrain')\n .description(packageJson.description || 'Langtrain CLI for AI Model Fine-tuning and Generation')\n .version(version);\n\n program.action(async () => {\n showBanner(version);\n\n // 1. Auth & Plan Check Force\n // 1. Auth & Plan Check (Lazy)\n // 0. First Run Check\n const isFirstRun = process.argv.includes('--first-run');\n if (isFirstRun) {\n // Check if interactive\n if (process.stdin.isTTY) {\n intro('Welcome to Langtrain! Let\\'s get you set up.');\n await handleLogin();\n // Reload config after login\n } else {\n console.log('Langtrain installed! Run \"npx langtrain login\" to authenticate.');\n process.exit(0);\n }\n }\n\n // 1. Auth & Plan Check (Lazy)\n let config = getConfig();\n let apiKey = config.apiKey || '';\n let plan: SubscriptionInfo | null = null;\n\n // Try to fetch plan if key exists? \n if (apiKey) {\n try { plan = await getSubscription(apiKey); } catch { }\n }\n\n // 2. Global Client Init\n let clients = {\n vision: new Langvision({ apiKey }),\n tune: new Langtune({ apiKey }),\n agent: new AgentClient({ apiKey, baseUrl: config.baseUrl }),\n model: new ModelClient({ apiKey, baseUrl: config.baseUrl })\n };\n\n // 3. Navigation Loop\n let currentState: MenuState = 'main';\n\n while (true) {\n // Clear screen for clean sub-menu navigation?\n // Maybe not full clear to keep banner, but at least separate visual blocks.\n // showBanner(version); // Re-showing banner might be too much flickering.\n // console.log(''); // simple spacer\n\n const operation = await select({\n message: getMessageForState(currentState),\n options: getMenu(currentState, plan, !!apiKey)\n });\n\n if (isCancel(operation)) {\n if (currentState === 'main') {\n outro('Goodbye!');\n process.exit(0);\n } else {\n currentState = 'main';\n continue;\n }\n }\n\n const op = operation as string;\n\n // Navigation Logic\n if (op === 'exit') {\n outro('Goodbye!');\n process.exit(0);\n }\n if (op === 'back') {\n currentState = 'main';\n continue;\n }\n if (op.startsWith('nav-')) {\n currentState = op.replace('nav-', '') as MenuState;\n continue;\n }\n\n // Action Logic\n try {\n switch (op) {\n case 'login':\n await handleLogin();\n config = getConfig();\n apiKey = config.apiKey || '';\n clients = {\n vision: new Langvision({ apiKey }),\n tune: new Langtune({ apiKey }),\n agent: new AgentClient({ apiKey, baseUrl: config.baseUrl }),\n model: new ModelClient({ apiKey, baseUrl: config.baseUrl })\n };\n try { plan = await getSubscription(apiKey); } catch { }\n break;\n case 'status': await handleSubscriptionStatus(); break;\n case 'tune-finetune': await handleTuneFinetune(clients.tune, clients.model); break;\n case 'tune-generate': await handleTuneGenerate(clients.tune); break;\n case 'vision-finetune': await handleVisionFinetune(clients.vision, clients.model); break;\n case 'vision-generate': await handleVisionGenerate(clients.vision); break;\n case 'agent-list': await handleAgentList(clients.agent); break;\n case 'agent-create': await handleAgentCreate(clients.agent, clients.model); break;\n case 'agent-delete': await handleAgentDelete(clients.agent); break;\n }\n\n // After action, where do we go? \n // Stay in current state (sub-menu) is usually preferred.\n\n } catch (error: any) {\n outro(red(`Error: ${error.message}`));\n }\n }\n });\n\n program.parse(process.argv);\n}\n\nmain().catch(console.error);\n\nfunction getMessageForState(state: MenuState): string {\n switch (state) {\n case 'main': return 'Main Menu:';\n case 'agents': return 'Agents & Tools:';\n case 'text': return 'Langtune (Text Operations):';\n case 'vision': return 'Langvision (Vision Operations):';\n case 'settings': return 'Settings:';\n default: return 'Select an option:';\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/cli/ui.ts","../src/cli/config.ts","../src/cli/auth.ts","../src/cli/menu.ts","../src/cli/handlers/subscription.ts","../src/cli/handlers/tune.ts","../src/cli/handlers/vision.ts","../src/cli/handlers/agent.ts","../src/cli/handlers/init.ts","../src/cli/handlers/doctor.ts","../src/cli/handlers/data.ts","../src/cli/handlers/deploy.ts","../src/cli/handlers/dev.ts","../package.json","../src/cli/index.ts"],"names":["showBanner","version","gradient","bgCyan","black","intro","message","cyan","outro","gray","spinner","msg","green","showSuccess","showWarning","yellow","showInfo","blue","colors","red","bold","dim","CONFIG_DIR","path","os","CONFIG_FILE","getConfig","fs","saveConfig","config","handleLogin","apiKey","password","value","isCancel","cancel","s","info","SubscriptionClient","getSubscription","client","planLabel","getMenu","state","plan","isAuthenticated","menu","handleSubscriptionStatus","handleTuneFinetune","tune","modelClient","model","models","select","m","text","trainFile","epochs","track","upgrade","confirm","fileClient","FileClient","trainingClient","TrainingClient","fileResp","job","e","cont","s2","handleTuneGenerate","prompt","response","handleTuneList","workspaceId","jobs","selectedJob","j","handleTuneStatus","jobId","id","action","handleTuneCancel","confirmCancel","handleVisionFinetune","vision","dataset","r","handleVisionGenerate","handleAgentCreate","name","description","systemPrompt","agents","wid","agent","handleAgentDelete","agentId","a","d","handleAgentList","handleAgentRun","agentName","conversationId","input","result","handleInit","cwd","overwrite","projectName","shouldLogin","configContent","handleDoctor","issues","nodeVersion","platform","arch","handleDataUpload","filePath","purpose","handleDeploy","agentConfig","existingAgents","existing","payload","handleDev","configPath","isDeploying","eventType","package_default","main","program","Command","AgentClient","clients","Langvision","Langtune","ModelClient","currentState","operation","getMessageForState","op","error"],"mappings":"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","file":"cli.js","sourcesContent":["import { text, select, confirm, password, isCancel, cancel, note } from '@clack/prompts';\nimport { bgCyan, black, red, green, yellow, gray, cyan, bold, dim, blue } from 'kleur/colors';\nimport gradient from 'gradient-string';\n\n// Re-export specific prompts to keep imports clean in other files\nexport { text, select, confirm, password, isCancel, cancel, note };\n\nexport function showBanner(version: string) {\n console.clear();\n const banner = `\n ██╗ █████╗ ███╗ ██╗ ██████╗████████╗██████╗ █████╗ ██╗███╗ ██╗\n ██║ ██╔══██╗████╗ ██║██╔════╝╚══██╔══╝██╔══██╗██╔══██╗██║████╗ ██║\n ██║ ███████║██╔██╗ ██║██║ ███╗ ██║ ██████╔╝███████║██║██╔██╗ ██║\n ██║ ██╔══██║██║╚██╗██║██║ ██║ ██║ ██╔══██╗██╔══██║██║██║╚██╗██║\n ███████╗██║ ██║██║ ╚████║╚██████╔╝ ██║ ██║ ██║██║ ██║██║██║ ╚████║\n ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝\n `;\n console.log(gradient(['#00DC82', '#36E4DA', '#0047E1'])(banner));\n console.log(`${bgCyan(black(` Langtrain SDK v${version} `))}\\n`);\n}\n\nexport function intro(message: string) {\n console.log(cyan(`◆ ${message}`));\n}\n\nexport function outro(message: string) {\n console.log(gray(`└ ${message}`));\n}\n\nexport function spinner() {\n return {\n start: (msg: string) => process.stdout.write(`${cyan('●')} ${msg}\\r`),\n stop: (msg?: string) => {\n if (msg) console.log(`${green('✔')} ${msg}`);\n else console.log(''); // Newline\n },\n message: (msg: string) => process.stdout.write(`${cyan('●')} ${msg}\\r`)\n };\n}\n\nexport function showError(message: string) {\n console.log(red(`✖ Error: ${message}`));\n}\n\nexport function showSuccess(message: string) {\n console.log(green(`✔ ${message}`));\n}\n\nexport function showWarning(message: string) {\n console.log(yellow(`⚠ Warning: ${message}`));\n}\n\nexport function showInfo(message: string) {\n console.log(blue(`ℹ ${message}`));\n}\n\nexport function showDim(message: string) {\n console.log(dim(message));\n}\n\n// Re-export for backward compatibility\nexport { bgCyan, black, red, green, yellow, gray, cyan, bold, dim, blue, gradient };\n\nexport const colors = {\n bgCyan, black, red, green, yellow, gray, cyan, bold, dim, blue\n};\n\n","import fs from 'fs';\nimport path from 'path';\nimport os from 'os';\n\nconst CONFIG_DIR = path.join(os.homedir(), '.langtrain');\nconst CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');\n\nexport interface CLIConfig {\n apiKey?: string;\n baseUrl?: string;\n [key: string]: any;\n}\n\nexport function getConfig(): CLIConfig {\n if (!fs.existsSync(CONFIG_FILE)) return {};\n try {\n return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nexport function saveConfig(config: CLIConfig) {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n }\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));\n}\n","import { password, isCancel, cancel, intro, green, yellow, red, bgCyan, black, spinner, gray } from './ui';\nimport { getConfig, saveConfig } from './config';\nimport { SubscriptionClient, SubscriptionInfo } from '../index';\n\nexport async function ensureAuth(): Promise<string> {\n let config = getConfig();\n\n if (!config.apiKey) {\n intro(yellow('Authentication required to verify plan & features.'));\n await handleLogin();\n config = getConfig();\n }\n\n return config.apiKey as string;\n}\n\nexport async function handleLogin() {\n while (true) {\n console.log(gray('\\nGet your API Key at: https://langtrain.xyz/settings/keys\\n'));\n const apiKey = await password({\n message: 'Enter your Langtrain API Key:',\n validate(value) {\n if (!value || value.length === 0) return 'API Key is required';\n },\n });\n\n if (isCancel(apiKey)) {\n cancel('Operation cancelled');\n process.exit(0);\n }\n\n const s = spinner();\n s.start('Verifying API Key...');\n\n // Verify key immediately\n try {\n const client = new SubscriptionClient({ apiKey: apiKey as string });\n const info = await client.getStatus();\n\n s.stop(green(`Authenticated as ${info.plan === 'pro' ? 'PRO' : info.plan.toUpperCase()}`));\n\n const config = getConfig();\n saveConfig({ ...config, apiKey: apiKey as string });\n // intro(green('API Key saved successfully!')); // success message above is enough\n return; // Exit loop on success\n } catch (e: any) {\n s.stop(red('Invalid API Key. Please try again.'));\n // Loop continues\n }\n }\n}\n\nexport async function getSubscription(apiKey: string): Promise<SubscriptionInfo | null> {\n const client = new SubscriptionClient({ apiKey });\n const s = spinner();\n s.start('Verifying subscription plan...');\n try {\n const info = await client.getStatus();\n\n // Enhance: Show plan details immediately on auth check\n const planLabel = info.plan === 'pro' ? bgCyan(' PRO ') : info.plan.toUpperCase();\n s.stop(green(`Authenticated as ${planLabel}`));\n\n if (info.is_active === false) {\n console.log(yellow('Warning: Your subscription is not active. Some features may be limited.'));\n }\n\n return info;\n } catch (e: any) {\n s.stop(red('Failed to verify subscription.'));\n if (e.response && e.response.status === 401) {\n console.log(red('Invalid API Key. Please run login again.'));\n // Optionally clear key?\n }\n return null;\n }\n}\n","import { SubscriptionInfo } from '../index';\n\nexport interface MenuOption {\n value: string;\n label: string;\n hint?: string;\n}\n\nexport type MenuState = 'main' | 'agents' | 'text' | 'vision' | 'settings';\n\nexport function getMenu(state: MenuState, plan: SubscriptionInfo | null, isAuthenticated: boolean): MenuOption[] {\n const isPro = plan?.plan === 'pro' || plan?.plan === 'enterprise';\n\n // If not authenticated, force login or limited menu?\n // User requested \"lazy auth\", so we should show menu but maybe highlight login or allow navigation and prompt later.\n // Let's add a visual cue.\n\n switch (state) {\n case 'main':\n const menu: MenuOption[] = [\n { value: 'nav-agents', label: 'Agents', hint: 'Manage & Chat with AI Agents' },\n { value: 'nav-text', label: 'Langtune (Text)', hint: 'Fine-tuning & Generation' },\n { value: 'nav-vision', label: 'Langvision (Vision)', hint: 'Vision Analysis & Tuning' },\n { value: 'init', label: 'Initialize Project', hint: 'Scaffold new Langtrain app' },\n { value: 'deploy', label: 'Deploy', hint: 'Push config to Cloud' },\n { value: 'dev', label: 'Start Dev Server', hint: 'Watch mode' },\n { value: 'doctor', label: 'Doctor', hint: 'Check environment health' },\n { value: 'nav-settings', label: 'Settings', hint: 'Subscription & Auth' }\n ];\n\n if (!isAuthenticated) {\n // menu.unshift({ value: 'login', label: 'Login to Langtrain', hint: 'Required for most features' });\n // Actually, let's make Login the first option if not authenticated\n // But keep the others so user can see what's available (and get prompted)\n menu.unshift({ value: 'login', label: 'Login to Langtrain', hint: 'Required for most features' });\n }\n\n // Always add Exit\n menu.push({ value: 'exit', label: 'Exit' });\n return menu;\n\n case 'agents':\n return [\n { value: 'agent-list', label: 'List & Run Agents', hint: 'Chat with active agents' },\n { value: 'agent-create', label: 'Create New Agent', hint: 'Deploy a new agent' },\n { value: 'agent-delete', label: 'Delete Agent', hint: 'Remove an agent' },\n { value: 'back', label: '← Back to Main Menu' }\n ];\n\n case 'text':\n return [\n { value: 'tune-finetune', label: 'Fine-tune Text Model', hint: 'Create custom LLM' },\n { value: 'tune-list', label: 'List Jobs', hint: 'Check training status' },\n { value: 'tune-generate', label: 'Generate Text', hint: 'Test your models' },\n { value: 'data-upload', label: 'Upload Dataset', hint: 'Upload JSONL for training' },\n { value: 'back', label: '← Back to Main Menu' }\n ];\n\n case 'vision':\n return [\n { value: 'vision-finetune', label: 'Fine-tune Vision Model', hint: 'Create custom VLM' },\n { value: 'vision-generate', label: 'Generate Vision Response', hint: 'Test vision models' },\n { value: 'back', label: '← Back to Main Menu' }\n ];\n\n case 'settings':\n return [\n { value: 'status', label: isAuthenticated ? `Subscription Status (${plan?.plan || 'Free'})` : 'Check Status (Login required)' },\n { value: 'login', label: isAuthenticated ? 'Update API Key' : 'Login' },\n { value: 'back', label: '← Back to Main Menu' }\n ];\n\n default:\n return [];\n }\n}\n","import { spinner, intro, red, green, gray, bgCyan } from '../ui';\nimport { getConfig } from '../config';\nimport { SubscriptionClient } from '../../index';\n\nexport async function handleSubscriptionStatus() {\n const config = getConfig();\n if (!config.apiKey) {\n intro(red('Not logged in. Run \"login\" first.'));\n return;\n }\n const client = new SubscriptionClient({ apiKey: config.apiKey });\n const s = spinner();\n s.start('Fetching subscription status...');\n try {\n const info = await client.getStatus();\n s.stop(green('Subscription Status:'));\n\n console.log(gray('Plan: ') + (info.plan === 'pro' ? bgCyan(' PRO ') : info.plan.toUpperCase()));\n console.log(gray('Active: ') + (info.is_active ? green('Yes') : red('No')));\n if (info.expires_at) console.log(gray('Expires: ') + new Date(info.expires_at).toLocaleDateString());\n\n console.log(gray('\\nLimits:'));\n console.log(` Models: ${info.limits.max_models === -1 ? 'Unlimited' : info.limits.max_models}`);\n console.log(` Training Jobs: ${info.limits.max_training_jobs}`);\n\n } catch (e: any) {\n s.stop(red('Failed to fetch status.'));\n console.error(e.message);\n }\n}\n","import { text, select, confirm, isCancel, cancel, spinner, intro, red, green, yellow, bgCyan, black, gradient, gray } from '../ui';\nimport { getConfig } from '../config';\nimport { Langtune, ModelClient, SubscriptionClient, FileClient, TrainingClient } from '../../index';\n\n// Handler for Langtune Fine-tuning\nexport async function handleTuneFinetune(tune: Langtune, modelClient: ModelClient) {\n let model: string | symbol = '';\n\n const s = spinner();\n s.start('Fetching available text models...');\n try {\n const models = await modelClient.list('text');\n s.stop(`Found ${models.length} text models`);\n\n if (models.length > 0) {\n model = await select({\n message: 'Select base model:',\n options: models.map(m => ({ value: m.id, label: m.id, hint: m.owned_by }))\n });\n }\n } catch (e) {\n s.stop(yellow('Failed to fetch models. Using manual input.'));\n model = await text({\n message: 'Enter base model (e.g., gpt-3.5-turbo):',\n placeholder: 'gpt-3.5-turbo',\n validate(value) {\n if (!value || value.length === 0) return 'Value is required!';\n },\n });\n }\n\n if (isCancel(model)) {\n cancel('Operation cancelled.');\n process.exit(0);\n }\n\n const trainFile = await text({\n message: 'Enter path to training file:',\n placeholder: './data.jsonl',\n validate(value) {\n if (!value || value.length === 0) return 'Value is required!';\n },\n });\n if (isCancel(trainFile)) cancel('Operation cancelled.');\n\n const epochs = await text({\n message: 'Num Epochs:',\n placeholder: '3',\n initialValue: '3'\n });\n if (isCancel(epochs)) cancel('Operation cancelled.');\n\n const track = await select({\n message: 'Track this job on Langtrain Cloud?',\n options: [\n { value: 'yes', label: 'Yes', hint: 'Upload dataset and log job' },\n { value: 'no', label: 'No', hint: 'Local only' }\n ]\n });\n if (isCancel(track)) cancel('Operation cancelled.');\n\n if (track === 'yes') {\n const s = spinner();\n s.start('Connecting to Cloud...');\n try {\n const config = getConfig();\n if (!config.apiKey) throw new Error('API Key required. Run \"login\" first.');\n\n // Check Subscription\n const subClient = new SubscriptionClient({ apiKey: config.apiKey });\n const sub = await subClient.getStatus();\n if (!sub.features.includes('cloud_finetuning')) {\n s.stop(red('Feature \"cloud_finetuning\" is not available on your plan.'));\n const upgrade = await confirm({ message: 'Upgrade to Pro for cloud tracking?' });\n if (upgrade && !isCancel(upgrade)) {\n console.log(bgCyan(black(' Visit https://langtrain.ai/dashboard/billing to upgrade. ')));\n }\n return;\n }\n\n const fileClient = new FileClient({ apiKey: config.apiKey });\n const trainingClient = new TrainingClient({ apiKey: config.apiKey });\n\n s.message('Uploading dataset...');\n const fileResp = await fileClient.upload(trainFile as string);\n\n s.message('Creating Job...');\n const job = await trainingClient.createJob({\n name: `cli-sft-${Date.now()}`,\n base_model: model as string,\n dataset_id: fileResp.id,\n task: 'text',\n hyperparameters: {\n n_epochs: parseInt(epochs as string)\n }\n });\n s.stop(green(`Job tracked: ${job.id}`));\n } catch (e: any) {\n s.stop(red(`Tracking failed: ${e.message}`));\n const cont = await confirm({ message: 'Continue with local training anyway?' });\n if (!cont || isCancel(cont)) return;\n }\n }\n\n const s2 = spinner();\n s2.start('Starting local fine-tuning...');\n\n try {\n const config: any = {\n model: model as string,\n trainFile: trainFile as string,\n preset: 'default', // simplified\n epochs: parseInt(epochs as string),\n batchSize: 1,\n learningRate: 2e-5,\n loraRank: 16,\n outputDir: './output'\n };\n\n await tune.finetune(config);\n s2.stop(green('Fine-tuning job started successfully!'));\n } catch (e: any) {\n s2.stop(red('Failed to start job.'));\n throw e;\n }\n}\n\n// Handler for Langtune Generation\nexport async function handleTuneGenerate(tune: Langtune) {\n const model = await text({\n message: 'Enter model path:',\n placeholder: './output/model',\n initialValue: './output/model'\n });\n if (isCancel(model)) cancel('Operation cancelled');\n\n const prompt = await text({\n message: 'Enter prompt:',\n placeholder: 'Hello world',\n });\n if (isCancel(prompt)) cancel('Operation cancelled');\n\n const s = spinner();\n s.start('Connecting to Langtrain Inference API...');\n\n try {\n const response = await tune.generate(model as string, { prompt: prompt as string });\n s.stop('Generation complete');\n intro('Response:');\n console.log(gradient.pastel(response));\n } catch (e: any) {\n s.stop(red('Generation failed.'));\n throw e;\n }\n}\n\nexport async function handleTuneList(trainingClient: TrainingClient) {\n const s = spinner();\n s.start('Fetching fine-tuning jobs...');\n\n // We need workspace ID, usually from config or first agent?\n // For now, let's just ask or list from all available if API supports it (it requires workspace_id)\n // Let's assume user knows it or we can find it.\n // Simplified: Just ask for Workspace ID if not in config (we don't save it yet)\n // BETTER: Get it from an existing agent or config.\n const config = getConfig();\n let workspaceId = config.workspace_id;\n\n if (!workspaceId) {\n s.stop(yellow('Workspace ID required to list jobs.'));\n workspaceId = await text({ message: 'Enter Workspace ID:' });\n if (isCancel(workspaceId)) return;\n }\n\n try {\n const jobs = await trainingClient.listJobs(workspaceId as string);\n s.stop(`Found ${jobs.data.length} jobs`);\n\n if (jobs.data.length === 0) {\n console.log(yellow('No jobs found.'));\n return;\n }\n\n const selectedJob = await select({\n message: 'Select a job to view details:',\n options: jobs.data.map(j => ({\n value: j.id,\n label: `${j.name || j.id} (${j.status})`,\n hint: `Created: ${new Date(j.created_at).toLocaleDateString()}`\n }))\n });\n\n if (isCancel(selectedJob)) return;\n\n await handleTuneStatus(trainingClient, selectedJob as string);\n\n } catch (e: any) {\n s.stop(red(`Failed to list jobs: ${e.message}`));\n }\n}\n\nexport async function handleTuneStatus(trainingClient: TrainingClient, jobId?: string) {\n let id = jobId;\n if (!id) {\n id = await text({ message: 'Enter Job ID:' }) as string;\n if (isCancel(id)) return;\n }\n\n const s = spinner();\n s.start(`Fetching status for ${id}...`);\n\n try {\n const job = await trainingClient.getJob(id);\n s.stop(`Job Status: ${job.status.toUpperCase()}`);\n\n console.log(gray('------------------------------------------------'));\n console.log(`${bgCyan(black(' Job Details '))}`);\n console.log(`ID: ${job.id}`);\n console.log(`Name: ${job.name}`);\n console.log(`Status: ${job.status === 'succeeded' ? green(job.status) : job.status}`);\n console.log(`Model: ${job.base_model}`);\n console.log(`Progress: ${job.progress || 0}%`);\n if (job.error_message) console.log(red(`Error: ${job.error_message}`));\n console.log(gray('------------------------------------------------'));\n\n if (job.status === 'running' || job.status === 'queued') {\n const action = await select({\n message: 'Action:',\n options: [\n { value: 'refresh', label: 'Refresh Status' },\n { value: 'cancel', label: 'Cancel Job' },\n { value: 'back', label: 'Back' }\n ]\n });\n\n if (action === 'refresh') await handleTuneStatus(trainingClient, id);\n if (action === 'cancel') await handleTuneCancel(trainingClient, id);\n }\n\n } catch (e: any) {\n s.stop(red(`Failed to get job status: ${e.message}`));\n }\n}\n\nexport async function handleTuneCancel(trainingClient: TrainingClient, jobId: string) {\n const confirmCancel = await confirm({ message: 'Are you sure you want to cancel this job?' });\n if (!confirmCancel || isCancel(confirmCancel)) return;\n\n const s = spinner();\n s.start('Canceling job...');\n try {\n await trainingClient.cancelJob(jobId);\n s.stop(green('Job canceled successfully.'));\n } catch (e: any) {\n s.stop(red(`Failed to cancel job: ${e.message}`));\n }\n}\n","import { text, select, confirm, isCancel, cancel, spinner, intro, red, green, yellow, bgCyan, black, gradient } from '../ui';\nimport { getConfig } from '../config';\nimport { Langvision, ModelClient, SubscriptionClient, FileClient, TrainingClient } from '../../index';\n\n// Handler for Langvision Fine-tuning\nexport async function handleVisionFinetune(vision: Langvision, modelClient: ModelClient) {\n let model: string | symbol = '';\n\n const s = spinner();\n s.start('Fetching available vision models...');\n try {\n const models = await modelClient.list('vision');\n s.stop(`Found ${models.length} vision models`);\n\n if (models.length > 0) {\n model = await select({\n message: 'Select base vision model:',\n options: models.map(m => ({ value: m.id, label: m.id, hint: m.owned_by }))\n });\n } else {\n model = await text({\n message: 'Enter base vision model:',\n placeholder: 'llava-v1.5-7b',\n initialValue: 'llava-v1.5-7b'\n });\n }\n } catch (e) {\n s.stop(yellow('Failed to fetch models. Using manual input.'));\n model = await text({\n message: 'Enter base vision model:',\n placeholder: 'llava-v1.5-7b',\n initialValue: 'llava-v1.5-7b'\n });\n }\n\n if (isCancel(model)) {\n cancel('Operation cancelled');\n process.exit(0);\n }\n\n const dataset = await text({\n message: 'Enter dataset path:',\n placeholder: './dataset',\n });\n if (isCancel(dataset)) cancel('Operation cancelled');\n\n const epochs = await text({\n message: 'Num Epochs:',\n placeholder: '3',\n initialValue: '3'\n });\n if (isCancel(epochs)) cancel('Operation cancelled');\n\n const track = await select({\n message: 'Track this job on Langtrain Cloud?',\n options: [\n { value: 'yes', label: 'Yes', hint: 'Upload dataset and log job' },\n { value: 'no', label: 'No', hint: 'Local only' }\n ]\n });\n if (isCancel(track)) cancel('Operation cancelled');\n\n if (track === 'yes') {\n const s = spinner();\n s.start('Connecting to Cloud...');\n try {\n const config = getConfig();\n if (!config.apiKey) throw new Error('API Key required. Run \"login\" first.');\n\n // Check Subscription\n const subClient = new SubscriptionClient({ apiKey: config.apiKey });\n const sub = await subClient.getStatus();\n if (!sub.features.includes('cloud_finetuning')) {\n s.stop(red('Feature \"cloud_finetuning\" is not available on your plan.'));\n const upgrade = await confirm({ message: 'Upgrade to Pro for cloud tracking?' });\n if (upgrade && !isCancel(upgrade)) {\n console.log(bgCyan(black(' Visit https://langtrain.ai/dashboard/billing to upgrade. ')));\n }\n return;\n }\n\n const fileClient = new FileClient({ apiKey: config.apiKey });\n const trainingClient = new TrainingClient({ apiKey: config.apiKey });\n\n s.message('Uploading dataset...');\n const fileResp = await fileClient.upload(dataset as string, undefined, 'fine-tune-vision');\n\n s.message('Creating Job...');\n const job = await trainingClient.createJob({\n name: `cli-vision-${Date.now()}`,\n base_model: model as string,\n dataset_id: fileResp.id,\n task: 'vision',\n training_method: 'lora',\n hyperparameters: {\n n_epochs: parseInt(epochs as string)\n }\n });\n s.stop(green(`Job tracked: ${job.id}`));\n } catch (e: any) {\n s.stop(red(`Tracking failed: ${e.message}`));\n const cont = await confirm({ message: 'Continue with local training anyway?' });\n if (!cont || isCancel(cont)) return;\n }\n }\n\n const s2 = spinner();\n s2.start('Analyzing dataset structure...');\n await new Promise(r => setTimeout(r, 800));\n s2.message('Starting vision fine-tuning on Langtrain Cloud...');\n\n try {\n const config: any = {\n model: model as string,\n dataset: dataset as string,\n epochs: parseInt(epochs as string),\n batchSize: 1,\n learningRate: 2e-5,\n loraRank: 16,\n outputDir: './vision-output'\n };\n await vision.finetune(config);\n s2.stop(green('Vision fine-tuning started successfully!'));\n } catch (e: any) {\n s2.stop(red('Failed to start vision job.'));\n throw e;\n }\n}\n\n// Handler for Langvision Generation\nexport async function handleVisionGenerate(vision: Langvision) {\n const model = await text({\n message: 'Enter model path:',\n placeholder: './vision-output/model',\n initialValue: './vision-output/model'\n });\n if (isCancel(model)) cancel('Operation cancelled');\n\n const prompt = await text({\n message: 'Enter prompt/image path:', // Simplified for CLI\n placeholder: 'Describe this image...',\n });\n if (isCancel(prompt)) cancel('Operation cancelled');\n\n const s = spinner();\n s.start('Uploading image and context...');\n await new Promise(r => setTimeout(r, 600));\n s.message('Generating vision response...');\n\n try {\n const response = await vision.generate(model as string, { prompt: prompt as string });\n s.stop('Generation complete');\n intro('Response:');\n console.log(gradient.pastel(response));\n } catch (e: any) {\n s.stop(red('Generation failed.'));\n throw e;\n }\n}\n","import { text, select, confirm, isCancel, cancel, spinner, intro, red, green, yellow, gray, bgCyan, black, gradient } from '../ui';\nimport { AgentClient, ModelClient } from '../../index';\n\nexport async function handleAgentCreate(client: AgentClient, modelClient: ModelClient) {\n const name = await text({\n message: 'Agent Name:',\n placeholder: 'e.g. Support Bot',\n validate(value) {\n if (!value || value.length === 0) return 'API Key is required';\n },\n });\n if (isCancel(name)) {\n cancel('Operation cancelled');\n return;\n }\n\n const description = await text({\n message: 'Description:',\n placeholder: 'e.g. A helpful support assistant',\n });\n if (isCancel(description)) return;\n\n const systemPrompt = await text({\n message: 'System Prompt:',\n placeholder: 'e.g. You are a helpful assistant.',\n initialValue: 'You are a helpful assistant.'\n });\n if (isCancel(systemPrompt)) return;\n\n // Select model\n let model: string | symbol = 'gpt-4o';\n const s = spinner();\n s.start('Fetching agent models...');\n try {\n const models = await modelClient.list('agent');\n s.stop(`Found ${models.length} models`);\n if (models.length > 0) {\n model = await select({\n message: 'Select Agent Model:',\n options: models.map(m => ({ value: m.id, label: m.id }))\n });\n }\n } catch (e) {\n s.stop(yellow('Could not fetch models, using default.'));\n }\n\n if (isCancel(model)) return;\n\n const s2 = spinner();\n s2.start('Creating agent...');\n\n try {\n const agents = await client.list();\n let workspaceId = \"\";\n if (agents.length > 0) {\n workspaceId = agents[0].workspace_id;\n } else {\n s2.stop(yellow('Workspace ID needed (no existing agents found).'));\n const wid = await text({\n message: 'Enter Workspace ID (UUID):',\n validate(value) {\n if (!value || value.length === 0) return 'Required';\n },\n });\n if (isCancel(wid)) return;\n workspaceId = wid as string;\n s2.start('Creating agent...');\n }\n\n const agent = await client.create({\n workspace_id: workspaceId,\n name: name as string,\n description: description as string,\n config: {\n system_prompt: systemPrompt as string,\n model: model as string\n }\n });\n s2.stop(green(`Agent \"${agent.name}\" created successfully! ID: ${agent.id}`));\n } catch (e: any) {\n s2.stop(red('Failed to create agent.'));\n throw e;\n }\n}\n\nexport async function handleAgentDelete(client: AgentClient) {\n const s = spinner();\n s.start('Fetching agents...');\n const agents = await client.list();\n s.stop(`Found ${agents.length} agents`);\n\n if (agents.length === 0) {\n intro(yellow('No agents to delete.'));\n return;\n }\n\n const agentId = await select({\n message: 'Select an agent to DELETE:',\n options: agents.map(a => ({ value: a.id, label: a.name, hint: a.description || 'No description' }))\n });\n\n if (isCancel(agentId)) return;\n\n const confirmDel = await select({\n message: `Are you sure you want to delete this agent?`,\n options: [\n { value: 'yes', label: 'Yes, delete it', hint: 'Cannot be undone' },\n { value: 'no', label: 'No, keep it' }\n ]\n });\n\n if (confirmDel !== 'yes') {\n intro(gray('Deletion cancelled.'));\n return;\n }\n\n const d = spinner();\n d.start('Deleting agent...');\n try {\n await client.delete(agentId as string);\n d.stop(green('Agent deleted successfully.'));\n } catch (e: any) {\n d.stop(red('Failed to delete agent.'));\n throw e;\n }\n}\n\nexport async function handleAgentList(client: AgentClient) {\n const s = spinner();\n s.start('Fetching agents...');\n const agents = await client.list();\n s.stop(`Found ${agents.length} agents`);\n\n if (agents.length === 0) {\n intro(yellow('No agents found in your workspace.'));\n return;\n }\n\n const agentId = await select({\n message: 'Select an agent to run:',\n options: agents.map(a => ({ value: a.id, label: a.name, hint: a.description || 'No description' }))\n });\n\n if (isCancel(agentId)) return;\n\n await handleAgentRun(client, agentId as string, agents.find(a => a.id === agentId)?.name || 'Agent');\n}\n\nexport async function handleAgentRun(client: AgentClient, agentId: string, agentName: string) {\n intro(bgCyan(black(` Chatting with ${agentName} `)));\n console.log(gray('Type \"exit\" to quit conversation.'));\n\n let conversationId: string | undefined = undefined;\n\n while (true) {\n const input = await text({\n message: 'You:',\n placeholder: 'Type a message...',\n });\n\n if (isCancel(input) || input === 'exit') {\n break;\n }\n\n const s = spinner();\n s.start('Agent is thinking...');\n try {\n const result = await client.execute(agentId, { prompt: input }, [], conversationId);\n s.stop();\n\n if ((result.output as any)?.response) {\n console.log(gradient.pastel(`Agent: ${(result.output as any).response}`));\n } else {\n console.log(gradient.pastel(`Agent: ${JSON.stringify(result.output)}`));\n }\n\n conversationId = result.conversation_id;\n } catch (e: any) {\n s.stop(red('Error running agent.'));\n console.error(e);\n }\n }\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { text, confirm, select, isCancel, cancel, intro, outro, showSuccess, showInfo, spinner, colors } from '../ui';\nimport { getConfig } from '../config';\nimport { handleLogin } from '../auth';\n\nexport async function handleInit() {\n intro('Initializing new Langtrain project...');\n\n const cwd = process.cwd();\n\n // 1. Check if already initialized\n if (fs.existsSync(path.join(cwd, 'langtrain.config.json'))) {\n showInfo('langtrain.config.json already exists in this directory.');\n const overwrite = await confirm({\n message: 'Do you want to re-initialize and overwrite the config?',\n initialValue: false\n });\n\n if (isCancel(overwrite) || !overwrite) {\n outro('Initialization cancelled.');\n return;\n }\n }\n\n // 2. Ask for Project Details\n const projectName = await text({\n message: 'What is the name of your project?',\n placeholder: 'my-ai-app',\n initialValue: path.basename(cwd),\n validate(value) {\n if (!value || value.length === 0) return 'Project name is required!';\n }\n });\n\n if (isCancel(projectName)) {\n cancel('Operation cancelled.');\n return;\n }\n\n let config = getConfig();\n let apiKey = config.apiKey;\n\n if (apiKey) {\n showSuccess('Found existing Langtrain credentials.');\n } else {\n const shouldLogin = await confirm({\n message: 'You are not logged in. Do you want to log in now?',\n initialValue: true\n });\n\n if (isCancel(shouldLogin)) {\n cancel('Operation cancelled.');\n return;\n }\n\n if (shouldLogin) {\n await handleLogin();\n config = getConfig(); // Reload config\n apiKey = config.apiKey;\n } else {\n apiKey = await text({\n message: 'Enter your Langtrain API Key (optional for local dev):',\n placeholder: 'lt_sk_...',\n initialValue: ''\n }) as string;\n\n if (isCancel(apiKey)) {\n cancel('Operation cancelled.');\n return;\n }\n }\n }\n\n // 3. Create Config File\n const s = spinner();\n s.start('Creating configuration...');\n\n const configContent = {\n name: projectName,\n apiKey: apiKey || undefined,\n environment: 'development',\n agents: [\n {\n name: 'support-bot',\n description: 'A helpful customer support assistant',\n config: {\n model: 'llama-3-8b',\n system_prompt: 'You are a helpful customer support assistant.',\n temperature: 0.7\n }\n }\n ]\n };\n\n fs.writeFileSync(path.join(cwd, 'langtrain.config.json'), JSON.stringify(configContent, null, 2));\n\n showSuccess('Project initialized successfully!');\n console.log(colors.dim('\\nNext steps:'));\n console.log(` 1. Run ${colors.cyan('lt deploy')} to push your agent to the cloud.`);\n console.log(` 2. Run ${colors.cyan('lt dev')} to start the local development loop.`);\n\n outro('Happy coding!');\n}\n","import { intro, outro, showSuccess, showError, showWarning, showInfo, spinner, colors } from '../ui';\nimport { getConfig } from '../config';\nimport { getSubscription } from '../auth';\nimport os from 'os';\n\nexport async function handleDoctor() {\n intro('Running Langtrain Doctor...');\n\n const s = spinner();\n let issues = 0;\n\n // 1. Check Node Environment\n s.start('Checking Node.js environment...');\n const nodeVersion = process.version;\n const platform = os.platform();\n const arch = os.arch();\n\n if (parseInt(nodeVersion.replace('v', '').split('.')[0]) < 18) {\n s.stop(colors.red(`Node.js version ${nodeVersion} is outdated. Please upgrade to v18+.`));\n issues++;\n } else {\n s.stop(`Node.js ${nodeVersion} (${platform} ${arch})`);\n }\n\n // 2. Check Configuration\n s.start('Checking configuration...');\n const config = getConfig();\n if (!config.apiKey) {\n s.stop(colors.yellow('API Key is missing. Run `langtrain login` or set LANGTRAIN_API_KEY.'));\n issues++;\n } else {\n s.stop('Configuration found.');\n\n // 3. Check API Connectivity\n s.start('Checking API connectivity...');\n try {\n const plan = await getSubscription(config.apiKey);\n s.stop(`Connected to Langtrain Cloud (Plan: ${colors.green(plan?.plan || 'unknown')})`);\n } catch (e: any) {\n s.stop(colors.red(`Failed to connect to Langtrain Cloud: ${e.message}`));\n issues++;\n }\n }\n\n console.log(''); // Spacer\n\n if (issues === 0) {\n showSuccess('Your Langtrain environment is healthy! Ready to build.');\n } else {\n showWarning(`Found ${issues} issue(s). Please resolve them for the best experience.`);\n }\n\n outro('Doctor check complete.');\n}\n","import { text, select, confirm, isCancel, cancel, spinner, intro, red, green, yellow, gray } from '../ui';\nimport { getConfig } from '../config';\nimport { FileClient } from '../../index';\nimport path from 'path';\nimport fs from 'fs';\n\nexport async function handleDataUpload(client: FileClient) {\n const config = getConfig();\n let workspaceId = config.workspace_id;\n\n if (!workspaceId) {\n // Optional: ask for workspace ID or try to infer? \n // For upload, workspace_id is often optional (inferred from API key's default workspace)\n // But let's ask if user wants to specify.\n }\n\n const filePath = await text({\n message: 'Path to file:',\n placeholder: './dataset.jsonl',\n validate(value) {\n if (!value) return 'Required';\n if (!fs.existsSync(value)) return 'File not found';\n }\n });\n\n if (isCancel(filePath)) return;\n\n const purpose = await select({\n message: 'File Purpose:',\n options: [\n { value: 'fine-tune', label: 'Fine-tuning (JSONL)' },\n { value: 'vision-tune', label: 'Vision Tuning (Image/Zip)' },\n { value: 'agent-knowledge', label: 'Agent Knowledge' }\n ]\n });\n\n if (isCancel(purpose)) return;\n\n const s = spinner();\n s.start('Uploading file...');\n\n try {\n const result = await client.upload(filePath as string, workspaceId, purpose as string);\n s.stop(green('File uploaded successfully!'));\n console.log(gray(`ID: ${result.id}`));\n console.log(gray(`Name: ${result.filename}`));\n console.log(gray(`Bytes: ${result.bytes}`));\n } catch (e: any) {\n s.stop(red(`Upload failed: ${e.message}`));\n }\n}\n\nexport async function handleDataList(client: FileClient) {\n const config = getConfig();\n let workspaceId = config.workspace_id;\n\n if (!workspaceId) {\n // Try without workspace ID (some APIs return user's files)\n // or ask\n workspaceId = await text({ message: 'Enter Workspace ID (optional):', initialValue: '' });\n if (isCancel(workspaceId)) return;\n }\n\n const s = spinner();\n s.start('Fetching files...');\n\n try {\n const files = await client.list(workspaceId as string);\n s.stop(`Found ${files.length} files`);\n\n if (files.length === 0) {\n console.log(yellow('No files found.'));\n return;\n }\n\n // Just list them for now, maybe select to delete later?\n files.forEach(f => {\n console.log(`${f.id.padEnd(30)} ${f.filename.padEnd(20)} ${f.purpose} (${f.bytes}b)`);\n });\n\n } catch (e: any) {\n s.stop(red(`Failed to list files: ${e.message}`));\n }\n}\n","import { intro, outro, spinner, green, red, yellow, showSuccess } from '../ui';\nimport { getConfig } from '../config';\nimport { AgentClient, AgentCreate } from '../../index';\n\nexport async function handleDeploy(client: AgentClient) {\n intro('Deploying configuration to Langtrain Cloud...');\n\n const config = getConfig();\n const agents = config.agents || [];\n\n if (agents.length === 0) {\n intro(yellow('No agents found in langtrain.config.json'));\n return;\n }\n\n // Iterate and deploy\n for (const agentConfig of agents) {\n const s = spinner();\n s.start(`Deploying agent: ${agentConfig.name}...`);\n\n try {\n // Check if agent exists (by name? logic needed)\n // Ideally we store ID in config after create, but for now let's just create new or try to find by name.\n // Listing all agents is expensive if many, but safe for now.\n const existingAgents = await client.list();\n const existing = existingAgents.find(a => a.name === agentConfig.name);\n\n if (existing) {\n // Update (Note: SDK didn't expose update in my view_file, assuming create or need to add update)\n // If update not available, we skip or warn.\n // Let's assume we can't update yet as per SDK view.\n // So we just skip if exists.\n s.stop(yellow(`Agent ${agentConfig.name} already exists (ID: ${existing.id}). Skipping update (not supported yet).`));\n } else {\n // Create\n const payload: AgentCreate = {\n workspace_id: config.workspace_id || (existingAgents[0]?.workspace_id) || '', // Need a way to get workspace!\n name: agentConfig.name,\n description: agentConfig.description,\n config: agentConfig.config\n };\n\n // Fallback for workspace_id\n if (!payload.workspace_id) {\n // Try to get from first agent or error\n // Realistically, user needs to set workspace_id in config or we infer from API key scope.\n // Let's warn.\n s.stop(red(`Failed: Workspace ID missing in config for ${agentConfig.name}`));\n continue;\n }\n\n await client.create(payload);\n s.stop(green(`Agent ${agentConfig.name} deployed successfully!`));\n }\n\n } catch (e: any) {\n s.stop(red(`Failed to deploy ${agentConfig.name}: ${e.message}`));\n }\n }\n\n showSuccess('Deployment complete.');\n}\n","import { intro, outro, spinner, green, red, yellow, showInfo, gray } from '../ui';\nimport { AgentClient } from '../../index';\nimport { handleDeploy } from './deploy';\nimport fs from 'fs';\nimport path from 'path';\n\nexport async function handleDev(client: AgentClient) {\n intro('Starting Langtrain Development Server...');\n\n const configPath = path.join(process.cwd(), 'langtrain.config.json');\n if (!fs.existsSync(configPath)) {\n intro(red('langtrain.config.json not found. Run \"lt init\" first.'));\n return;\n }\n\n console.log(gray(`Watching ${configPath} for changes...`));\n\n let isDeploying = false;\n\n // Initial Deploy\n await handleDeploy(client);\n\n fs.watch(configPath, async (eventType) => {\n if (eventType === 'change' && !isDeploying) {\n isDeploying = true;\n console.log(yellow('Configuration changed. Redeploying...'));\n // Wait a bit for file write to complete\n await new Promise(r => setTimeout(r, 500));\n try {\n await handleDeploy(client);\n } catch (e: any) {\n console.error(red(`Deploy failed: ${e.message}`));\n } finally {\n isDeploying = false;\n console.log(gray(`Watching ${configPath}...`));\n }\n }\n });\n\n // Keep process alive\n await new Promise(() => { });\n}\n","{\n \"name\": \"langtrain\",\n \"version\": \"0.1.19\",\n \"description\": \"Unified JavaScript SDK for Langtrain Ecosystem\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"langtrain\": \"./dist/cli.js\",\n \"lt\": \"./dist/cli.js\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n \"postinstall\": \"node dist/cli.js --first-run || true\"\n },\n \"keywords\": [\n \"langtrain\",\n \"langvision\",\n \"langtune\",\n \"sdk\",\n \"ai\",\n \"llm\",\n \"finetuning\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/langtrain-ai/langtrain-sdk.git\"\n },\n \"author\": \"Langtrain AI\",\n \"license\": \"MIT\",\n \"devDependencies\": {\n \"@types/gradient-string\": \"^1.1.6\",\n \"@types/node\": \"^25.2.3\",\n \"langtune\": \"file:../langtune/js\",\n \"langvision\": \"file:../langvision/js\",\n \"tsup\": \"^8.0.2\",\n \"typescript\": \"^5.4.2\"\n },\n \"dependencies\": {\n \"@clack/prompts\": \"^1.0.1\",\n \"axios\": \"^1.13.5\",\n \"commander\": \"^14.0.3\",\n \"gradient-string\": \"^3.0.0\",\n \"kleur\": \"^4.1.5\",\n \"langtrain\": \"^0.1.15\"\n }\n}\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport path from 'path';\nimport { select, isCancel, outro, intro, colors } from './ui'; // Ensure clear is exported if added, otherwise use console.clear()\nimport { showBanner } from './ui';\nimport { ensureAuth, handleLogin, getSubscription } from './auth';\nimport { getMenu, MenuState } from './menu';\nimport { getConfig } from './config';\n\n// Handlers\nimport { handleSubscriptionStatus } from './handlers/subscription';\nimport { handleTuneFinetune, handleTuneGenerate, handleTuneList } from './handlers/tune';\nimport { handleVisionFinetune, handleVisionGenerate } from './handlers/vision';\nimport { handleAgentCreate, handleAgentDelete, handleAgentList } from './handlers/agent';\nimport { handleInit } from './handlers/init';\nimport { handleDoctor } from './handlers/doctor';\nimport { handleDataUpload } from './handlers/data';\nimport { handleDeploy } from './handlers/deploy';\nimport { handleDev } from './handlers/dev';\n\n// Clients\nimport { SubscriptionInfo, Langvision, Langtune, AgentClient, ModelClient, FileClient, TrainingClient } from '../index';\nimport packageJson from '../../package.json';\n\nexport async function main() {\n const program = new Command();\n const version = packageJson.version;\n\n program\n .name('langtrain')\n .description(packageJson.description || 'Langtrain CLI for AI Model Fine-tuning and Generation')\n .version(version);\n\n // Register standalone commands\n program.command('init')\n .description('Initialize a new Langtrain project')\n .action(handleInit);\n\n program.command('deploy')\n .description('Deploy configuration to Langtrain Cloud')\n .action(async () => {\n const config = getConfig();\n const apiKey = config.apiKey || '';\n const client = new AgentClient({ apiKey, baseUrl: config.baseUrl });\n await handleDeploy(client);\n });\n\n program.command('dev')\n .description('Start local development server (Watch Mode)')\n .action(async () => {\n const config = getConfig();\n const apiKey = config.apiKey || '';\n const client = new AgentClient({ apiKey, baseUrl: config.baseUrl });\n await handleDev(client);\n });\n\n program.action(async () => {\n showBanner(version);\n\n // 1. Auth & Plan Check Force\n // 1. Auth & Plan Check (Lazy)\n // 0. First Run Check\n const isFirstRun = process.argv.includes('--first-run');\n if (isFirstRun) {\n // Check if interactive\n if (process.stdin.isTTY) {\n intro('Welcome to Langtrain! Let\\'s get you set up.');\n await handleLogin();\n // Reload config after login\n } else {\n console.log('Langtrain installed! Run \"npx langtrain login\" to authenticate.');\n process.exit(0);\n }\n }\n\n // 1. Auth & Plan Check (Lazy)\n let config = getConfig();\n let apiKey = config.apiKey || '';\n let plan: SubscriptionInfo | null = null;\n\n // Try to fetch plan if key exists? \n if (apiKey) {\n try { plan = await getSubscription(apiKey); } catch { }\n }\n\n // 2. Global Client Init\n let clients = {\n vision: new Langvision({ apiKey }),\n tune: new Langtune({ apiKey }),\n agent: new AgentClient({ apiKey, baseUrl: config.baseUrl }),\n model: new ModelClient({ apiKey, baseUrl: config.baseUrl }),\n train: new TrainingClient({ apiKey, baseUrl: config.baseUrl })\n };\n\n // 3. Navigation Loop\n let currentState: MenuState = 'main';\n\n while (true) {\n // Clear screen for clean sub-menu navigation?\n // Maybe not full clear to keep banner, but at least separate visual blocks.\n // showBanner(version); // Re-showing banner might be too much flickering.\n // console.log(''); // simple spacer\n\n const operation = await select({\n message: getMessageForState(currentState),\n options: getMenu(currentState, plan, !!apiKey)\n });\n\n if (isCancel(operation)) {\n if (currentState === 'main') {\n outro('Goodbye!');\n process.exit(0);\n } else {\n currentState = 'main';\n continue;\n }\n }\n\n const op = operation as string;\n\n // Navigation Logic\n if (op === 'exit') {\n outro('Goodbye!');\n process.exit(0);\n }\n if (op === 'back') {\n currentState = 'main';\n continue;\n }\n if (op.startsWith('nav-')) {\n currentState = op.replace('nav-', '') as MenuState;\n continue;\n }\n\n // Action Logic\n try {\n switch (op) {\n case 'login':\n await handleLogin();\n config = getConfig();\n apiKey = config.apiKey || '';\n clients = {\n vision: new Langvision({ apiKey }),\n tune: new Langtune({ apiKey }),\n agent: new AgentClient({ apiKey, baseUrl: config.baseUrl }),\n model: new ModelClient({ apiKey, baseUrl: config.baseUrl }),\n train: new TrainingClient({ apiKey, baseUrl: config.baseUrl })\n };\n try { plan = await getSubscription(apiKey); } catch { }\n break;\n case 'status': await handleSubscriptionStatus(); break;\n case 'init': await handleInit(); break;\n case 'deploy': await handleDeploy(clients.agent); break;\n case 'dev': await handleDev(clients.agent); break;\n case 'doctor': await handleDoctor(); break;\n case 'tune-finetune': await handleTuneFinetune(clients.tune, clients.model); break;\n case 'tune-list': await handleTuneList(clients.train); break;\n case 'tune-generate': await handleTuneGenerate(clients.tune); break;\n case 'vision-finetune': await handleVisionFinetune(clients.vision, clients.model); break;\n case 'vision-generate': await handleVisionGenerate(clients.vision); break;\n case 'agent-list': await handleAgentList(clients.agent); break;\n case 'agent-create': await handleAgentCreate(clients.agent, clients.model); break;\n case 'agent-delete': await handleAgentDelete(clients.agent); break;\n case 'data-upload': await handleDataUpload(new FileClient({ apiKey })); break;\n }\n\n // After action, where do we go? \n // Stay in current state (sub-menu) is usually preferred.\n\n } catch (error: any) {\n outro(colors.red(`Error: ${error.message}`));\n }\n }\n });\n\n program.parse(process.argv);\n}\n\nmain().catch(console.error);\n\nfunction getMessageForState(state: MenuState): string {\n switch (state) {\n case 'main': return 'Main Menu:';\n case 'agents': return 'Agents & Tools:';\n case 'text': return 'Langtune (Text Operations):';\n case 'vision': return 'Langvision (Vision Operations):';\n case 'settings': return 'Settings:';\n default: return 'Select an option:';\n }\n}\n"]}