@flowdot.ai/cli 1.1.0 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/ui/run.js CHANGED
@@ -1 +1,5 @@
1
- import{useState as c,useEffect as I,useRef as v,useCallback as g}from"react";import{render as R,Box as o,Text as r,useApp as B,useStdout as M}from"ink";import C from"ink-text-input";import{jsx as e,jsxs as l}from"react/jsx-runtime";var m=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],E=300,D=()=>{let[s,i]=c(0);return I(()=>{let d=setInterval(()=>{i(a=>(a+1)%m.length)},E);return()=>clearInterval(d)},[]),e(r,{children:m[s]})};function y(s){process.send&&process.send(s)}function N(){let[s,i]=c([]),[d,a]=c(""),[f,x]=c({active:!1,text:""}),[S,T]=c(!1),b=v(0),{exit:p}=B(),{stdout:k}=M(),h=k?.columns||80;I(()=>{let t=n=>{switch(n.type){case"display":x({active:!1,text:""}),i(u=>[...u,{id:b.current++,content:n.content,color:n.color,bold:n.bold}]);break;case"spinner:start":x({active:!0,text:n.text});break;case"spinner:succeed":case"spinner:fail":case"spinner:warn":x({active:!1,text:""}),n.text&&i(u=>[...u,{id:b.current++,content:n.text,color:n.type==="spinner:succeed"?"green":n.type==="spinner:fail"?"red":"yellow"}]);break;case"clear":i([]);break;case"prompt":break;case"exit":p(),process.exit(0);break;default:break}};return process.on("message",t),y({type:"ready"}),T(!0),()=>{process.removeListener("message",t)}},[p]);let w=g(t=>{t.trim()&&(y({type:"input",value:t}),a(""))},[]),A=g(()=>{y({type:"exit"}),p()},[p]);return S?l(o,{flexDirection:"column",width:h,children:[e(o,{borderStyle:"round",borderColor:"cyan",paddingX:1,children:e(r,{color:"cyan",bold:!0,children:"FlowDot CLI"})}),e(o,{flexDirection:"column",marginY:1,children:s.map(t=>e(r,{color:t.color||"white",bold:t.bold,children:t.content},t.id))}),f.active&&l(o,{children:[e(r,{color:"cyan",children:e(D,{})}),l(r,{children:[" ",f.text]})]}),l(o,{children:[e(r,{color:"green",bold:!0,children:"> "}),e(C,{value:d,onChange:a,onSubmit:w})]}),e(o,{marginTop:1,children:e(r,{color:"gray",children:"Press Ctrl+C to exit"})})]}):e(o,{children:e(r,{color:"cyan",children:"Initializing..."})})}process.stdin.resume();R(e(N,{}));
1
+ import{useState as B,useEffect as re,useRef as Ae,useCallback as ee}from"react";import{render as ve,Box as C,Text as x,useApp as Ee,useStdout as Ie}from"ink";import xe,{useState as Te,useEffect as ye}from"react";import{Text as Oe,useInput as Re}from"ink";var U=(t=0)=>e=>`\x1B[${e+t}m`,W=(t=0)=>e=>`\x1B[${38+t};5;${e}m`,$=(t=0)=>(e,r,o)=>`\x1B[${38+t};2;${e};${r};${o}m`,i={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},Se=Object.keys(i.modifier),oe=Object.keys(i.color),ne=Object.keys(i.bgColor),we=[...oe,...ne];function se(){let t=new Map;for(let[e,r]of Object.entries(i)){for(let[o,n]of Object.entries(r))i[o]={open:`\x1B[${n[0]}m`,close:`\x1B[${n[1]}m`},r[o]=i[o],t.set(n[0],n[1]);Object.defineProperty(i,e,{value:r,enumerable:!1})}return Object.defineProperty(i,"codes",{value:t,enumerable:!1}),i.color.close="\x1B[39m",i.bgColor.close="\x1B[49m",i.color.ansi=U(),i.color.ansi256=W(),i.color.ansi16m=$(),i.bgColor.ansi=U(10),i.bgColor.ansi256=W(10),i.bgColor.ansi16m=$(10),Object.defineProperties(i,{rgbToAnsi256:{value(e,r,o){return e===r&&r===o?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(r/255*5)+Math.round(o/255*5)},enumerable:!1},hexToRgb:{value(e){let r=/[a-f\d]{6}|[a-f\d]{3}/i.exec(e.toString(16));if(!r)return[0,0,0];let[o]=r;o.length===3&&(o=[...o].map(s=>s+s).join(""));let n=Number.parseInt(o,16);return[n>>16&255,n>>8&255,n&255]},enumerable:!1},hexToAnsi256:{value:e=>i.rgbToAnsi256(...i.hexToRgb(e)),enumerable:!1},ansi256ToAnsi:{value(e){if(e<8)return 30+e;if(e<16)return 90+(e-8);let r,o,n;if(e>=232)r=((e-232)*10+8)/255,o=r,n=r;else{e-=16;let T=e%36;r=Math.floor(e/36)/5,o=Math.floor(T/6)/5,n=T%6/5}let s=Math.max(r,o,n)*2;if(s===0)return 30;let c=30+(Math.round(n)<<2|Math.round(o)<<1|Math.round(r));return s===2&&(c+=60),c},enumerable:!1},rgbToAnsi:{value:(e,r,o)=>i.ansi256ToAnsi(i.rgbToAnsi256(e,r,o)),enumerable:!1},hexToAnsi:{value:e=>i.ansi256ToAnsi(i.hexToAnsi256(e)),enumerable:!1}}),i}var ie=se(),g=ie;import L from"node:process";import le from"node:os";import K from"node:tty";function h(t,e=globalThis.Deno?globalThis.Deno.args:L.argv){let r=t.startsWith("-")?"":t.length===1?"-":"--",o=e.indexOf(r+t),n=e.indexOf("--");return o!==-1&&(n===-1||o<n)}var{env:l}=L,S;h("no-color")||h("no-colors")||h("color=false")||h("color=never")?S=0:(h("color")||h("colors")||h("color=true")||h("color=always"))&&(S=1);function ce(){if("FORCE_COLOR"in l)return l.FORCE_COLOR==="true"?1:l.FORCE_COLOR==="false"?0:l.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(l.FORCE_COLOR,10),3)}function ae(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function ue(t,{streamIsTTY:e,sniffFlags:r=!0}={}){let o=ce();o!==void 0&&(S=o);let n=r?S:o;if(n===0)return 0;if(r){if(h("color=16m")||h("color=full")||h("color=truecolor"))return 3;if(h("color=256"))return 2}if("TF_BUILD"in l&&"AGENT_NAME"in l)return 1;if(t&&!e&&n===void 0)return 0;let s=n||0;if(l.TERM==="dumb")return s;if(L.platform==="win32"){let c=le.release().split(".");return Number(c[0])>=10&&Number(c[2])>=10586?Number(c[2])>=14931?3:2:1}if("CI"in l)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(c=>c in l)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(c=>c in l)||l.CI_NAME==="codeship"?1:s;if("TEAMCITY_VERSION"in l)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(l.TEAMCITY_VERSION)?1:0;if(l.COLORTERM==="truecolor"||l.TERM==="xterm-kitty"||l.TERM==="xterm-ghostty"||l.TERM==="wezterm")return 3;if("TERM_PROGRAM"in l){let c=Number.parseInt((l.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(l.TERM_PROGRAM){case"iTerm.app":return c>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(l.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(l.TERM)||"COLORTERM"in l?1:s}function z(t,e={}){let r=ue(t,{streamIsTTY:t&&t.isTTY,...e});return ae(r)}var fe={stdout:z({isTTY:K.isatty(1)}),stderr:z({isTTY:K.isatty(2)})},H=fe;function X(t,e,r){let o=t.indexOf(e);if(o===-1)return t;let n=e.length,s=0,c="";do c+=t.slice(s,o)+e+r,s=o+n,o=t.indexOf(e,s);while(o!==-1);return c+=t.slice(s),c}function q(t,e,r,o){let n=0,s="";do{let c=t[o-1]==="\r";s+=t.slice(n,c?o-1:o)+e+(c?`\r
2
+ `:`
3
+ `)+r,n=o+1,o=t.indexOf(`
4
+ `,n)}while(o!==-1);return s+=t.slice(n),s}var{stdout:J,stderr:Q}=H,k=Symbol("GENERATOR"),A=Symbol("STYLER"),E=Symbol("IS_EMPTY"),Z=["ansi","ansi","ansi256","ansi16m"],v=Object.create(null),pe=(t,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let r=J?J.level:0;t.level=e.level===void 0?r:e.level};var de=t=>{let e=(...r)=>r.join(" ");return pe(e,t),Object.setPrototypeOf(e,I.prototype),e};function I(t){return de(t)}Object.setPrototypeOf(I.prototype,Function.prototype);for(let[t,e]of Object.entries(g))v[t]={get(){let r=w(this,G(e.open,e.close,this[A]),this[E]);return Object.defineProperty(this,t,{value:r}),r}};v.visible={get(){let t=w(this,this[A],!0);return Object.defineProperty(this,"visible",{value:t}),t}};var j=(t,e,r,...o)=>t==="rgb"?e==="ansi16m"?g[r].ansi16m(...o):e==="ansi256"?g[r].ansi256(g.rgbToAnsi256(...o)):g[r].ansi(g.rgbToAnsi(...o)):t==="hex"?j("rgb",e,r,...g.hexToRgb(...o)):g[r][t](...o),be=["rgb","hex","ansi256"];for(let t of be){v[t]={get(){let{level:r}=this;return function(...o){let n=G(j(t,Z[r],"color",...o),g.color.close,this[A]);return w(this,n,this[E])}}};let e="bg"+t[0].toUpperCase()+t.slice(1);v[e]={get(){let{level:r}=this;return function(...o){let n=G(j(t,Z[r],"bgColor",...o),g.bgColor.close,this[A]);return w(this,n,this[E])}}}}var he=Object.defineProperties(()=>{},{...v,level:{enumerable:!0,get(){return this[k].level},set(t){this[k].level=t}}}),G=(t,e,r)=>{let o,n;return r===void 0?(o=t,n=e):(o=r.openAll+t,n=e+r.closeAll),{open:t,close:e,openAll:o,closeAll:n,parent:r}},w=(t,e,r)=>{let o=(...n)=>ge(o,n.length===1?""+n[0]:n.join(" "));return Object.setPrototypeOf(o,he),o[k]=t,o[A]=e,o[E]=r,o},ge=(t,e)=>{if(t.level<=0||!e)return t[E]?"":e;let r=t[A];if(r===void 0)return e;let{openAll:o,closeAll:n}=r;if(e.includes("\x1B"))for(;r!==void 0;)e=X(e,r.close,r.open),r=r.parent;let s=e.indexOf(`
5
+ `);return s!==-1&&(e=q(e,n,o,s)),o+e+n};Object.defineProperties(I.prototype,v);var me=I(),Ue=I({level:Q?Q.level:0});var m=me;function Ce({value:t,placeholder:e="",focus:r=!0,mask:o,highlightPastedText:n=!1,showCursor:s=!0,onChange:c,onSubmit:T}){let[N,y]=Te({cursorOffset:(t||"").length,cursorWidth:0}),{cursorOffset:d,cursorWidth:_}=N;ye(()=>{y(a=>{if(!r||!s)return a;let u=t||"";return a.cursorOffset>u.length-1?{cursorOffset:u.length,cursorWidth:0}:a})},[t,r,s]);let P=n?_:0,O=o?o.repeat(t.length):t,f=O,b=e?m.grey(e):void 0;if(s&&r){b=e.length>0?m.inverse(e[0])+m.grey(e.slice(1)):m.inverse(" "),f=O.length>0?"":m.inverse(" ");let a=0;for(let u of O)f+=a>=d-P&&a<=d?m.inverse(u):u,a++;O.length>0&&d===O.length&&(f+=m.inverse(" "))}return Re((a,u)=>{if(u.upArrow||u.downArrow||u.ctrl&&a==="c"||u.tab||u.shift&&u.tab)return;if(u.return){T&&T(t);return}let R=d,M=t,Y=0;u.leftArrow?s&&R--:u.rightArrow?s&&R++:u.backspace||u.delete?d>0&&(M=t.slice(0,d-1)+t.slice(d,t.length),R--):(M=t.slice(0,d)+a+t.slice(d,t.length),R+=a.length,a.length>1&&(Y=a.length)),d<0&&(R=0),d>t.length&&(R=t.length),y({cursorOffset:R,cursorWidth:Y}),M!==t&&c(M)},{isActive:r}),xe.createElement(Oe,null,e?O.length>0?f:b:f)}var V=Ce;import{jsx as p,jsxs as F}from"react/jsx-runtime";var te=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Be=300,Ne=()=>{let[t,e]=B(0);return re(()=>{let r=setInterval(()=>{e(o=>(o+1)%te.length)},Be);return()=>clearInterval(r)},[]),p(x,{children:te[t]})};function D(t){process.send&&process.send(t)}function Me(){let[t,e]=B([]),[r,o]=B(""),[n,s]=B({active:!1,text:""}),[c,T]=B(!1),N=Ae(0),{exit:y}=Ee(),{stdout:d}=Ie(),_=d?.columns||80;re(()=>{let f=b=>{switch(b.type){case"display":s({active:!1,text:""}),e(a=>[...a,{id:N.current++,content:b.content,color:b.color,bold:b.bold}]);break;case"spinner:start":s({active:!0,text:b.text});break;case"spinner:succeed":case"spinner:fail":case"spinner:warn":s({active:!1,text:""}),b.text&&e(a=>[...a,{id:N.current++,content:b.text,color:b.type==="spinner:succeed"?"green":b.type==="spinner:fail"?"red":"yellow"}]);break;case"clear":e([]);break;case"prompt":break;case"exit":y(),process.exit(0);break;default:break}};return process.on("message",f),D({type:"ready"}),T(!0),()=>{process.removeListener("message",f)}},[y]);let P=ee(f=>{f.trim()&&(D({type:"input",value:f}),o(""))},[]),O=ee(()=>{D({type:"exit"}),y()},[y]);return c?F(C,{flexDirection:"column",width:_,children:[p(C,{borderStyle:"round",borderColor:"cyan",paddingX:1,children:p(x,{color:"cyan",bold:!0,children:"FlowDot CLI"})}),p(C,{flexDirection:"column",marginY:1,children:t.map(f=>p(x,{color:f.color||"white",bold:f.bold,children:f.content},f.id))}),n.active&&F(C,{children:[p(x,{color:"cyan",children:p(Ne,{})}),F(x,{children:[" ",n.text]})]}),F(C,{children:[p(x,{color:"green",bold:!0,children:"> "}),p(V,{value:r,onChange:o,onSubmit:P})]}),p(C,{marginTop:1,children:p(x,{color:"gray",children:"Press Ctrl+C to exit"})})]}):p(C,{children:p(x,{color:"cyan",children:"Initializing..."})})}process.stdin.resume();ve(p(Me,{}));
package/package.json CHANGED
@@ -1,89 +1,96 @@
1
- {
2
- "name": "@flowdot.ai/cli",
3
- "version": "1.1.0",
4
- "description": "Official CLI for FlowDot - Execute workflows, send messages to the agent, and manage your account from the command line",
5
- "type": "module",
6
- "bin": {
7
- "flowdot": "./dist/cli/index.js"
8
- },
9
- "workspaces": [
10
- "packages/*"
11
- ],
12
- "scripts": {
13
- "clean": "rimraf dist coverage",
14
- "build": "node esbuild.config.js",
15
- "build:extension": "npm run build --workspace=flowdot-vscode && npm run package:all --workspace=flowdot-vscode",
16
- "build:all": "npm run build && npm run build:extension",
17
- "dev": "node esbuild.config.js --watch",
18
- "lint": "cross-env NODE_OPTIONS=--max-old-space-size=8192 eslint .",
19
- "lint:fix": "cross-env NODE_OPTIONS=--max-old-space-size=8192 eslint . --fix",
20
- "type-check": "tsc --noEmit",
21
- "test": "vitest run",
22
- "test:watch": "vitest",
23
- "verify-pack": "node scripts/verify-pack.mjs",
24
- "publish:safe": "node scripts/publish.mjs",
25
- "prepublishOnly": "npm run clean && npm run lint && npm test && npm run build && npm run verify-pack",
26
- "prepare": "husky || true"
27
- },
28
- "files": [
29
- "dist",
30
- "packages/core/assets",
31
- "LICENSE",
32
- "README.md"
33
- ],
34
- "publishConfig": {
35
- "access": "public"
36
- },
37
- "repository": {
38
- "type": "git",
39
- "url": "https://github.com/ElliotTheGreek/flowdot-cli.git"
40
- },
41
- "homepage": "https://flowdot.ai/docs/cli",
42
- "author": "FlowDot",
43
- "license": "SEE LICENSE IN LICENSE",
44
- "engines": {
45
- "node": ">=20.0.0"
46
- },
47
- "devDependencies": {
48
- "@eslint/js": "^9.24.0",
49
- "@types/js-yaml": "^4.0.9",
50
- "@types/node": "^20.11.20",
51
- "@types/react": "^19.2.0",
52
- "@types/react-dom": "^19.2.0",
53
- "@types/uuid": "^10.0.0",
54
- "@vitest/eslint-plugin": "^1.3.4",
55
- "cross-env": "^7.0.3",
56
- "esbuild": "^0.25.0",
57
- "esbuild-node-externals": "^1.20.1",
58
- "eslint": "^9.24.0",
59
- "eslint-config-prettier": "^10.1.2",
60
- "eslint-plugin-import": "^2.31.0",
61
- "eslint-plugin-license-header": "^0.8.0",
62
- "eslint-plugin-react": "^7.37.5",
63
- "eslint-plugin-react-hooks": "^5.2.0",
64
- "globals": "^16.0.0",
65
- "husky": "^9.1.7",
66
- "ink-spinner": "^5.0.0",
67
- "ink-testing-library": "^4.0.0",
68
- "ink-text-input": "^6.0.0",
69
- "jest-environment-jsdom": "^30.2.0",
70
- "lint-staged": "^15.2.10",
71
- "prettier": "^3.2.5",
72
- "rimraf": "^6.0.1",
73
- "typescript": "^5.3.3",
74
- "typescript-eslint": "^8.30.1",
75
- "uuid": "^10.0.0",
76
- "vite-tsconfig-paths": "^5.1.4",
77
- "vitest": "^3.2.4"
78
- },
79
- "dependencies": {
80
- "@flowdot.ai/api": "^1.1.0",
81
- "ink": "npm:@jrichman/ink@6.4.6",
82
- "react": "^19.2.0"
83
- },
84
- "lint-staged": {
85
- "*.{ts,tsx}": [
86
- "cross-env NODE_OPTIONS=--max-old-space-size=8192 eslint --fix"
87
- ]
88
- }
89
- }
1
+ {
2
+ "name": "@flowdot.ai/cli",
3
+ "version": "1.1.2",
4
+ "description": "Official CLI for FlowDot - Execute workflows, send messages to the agent, and manage your account from the command line",
5
+ "type": "module",
6
+ "bin": {
7
+ "flowdot": "./dist/cli/index.js"
8
+ },
9
+ "workspaces": [
10
+ "packages/*"
11
+ ],
12
+ "scripts": {
13
+ "clean": "rimraf dist coverage",
14
+ "build": "node esbuild.config.js",
15
+ "build:extension": "npm run build --workspace=flowdot-vscode && npm run package:all --workspace=flowdot-vscode",
16
+ "build:all": "npm run build && npm run build:extension",
17
+ "dev": "node esbuild.config.js --watch",
18
+ "lint": "cross-env NODE_OPTIONS=--max-old-space-size=8192 eslint .",
19
+ "lint:fix": "cross-env NODE_OPTIONS=--max-old-space-size=8192 eslint . --fix",
20
+ "type-check": "tsc --noEmit",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest",
23
+ "verify-pack": "node scripts/verify-pack.mjs",
24
+ "publish:safe": "node scripts/publish.mjs",
25
+ "prepublishOnly": "npm run clean && npm run lint && npm test && npm run build && npm run verify-pack",
26
+ "prepare": "husky || true",
27
+ "postinstall": "patch-package"
28
+ },
29
+ "files": [
30
+ "dist",
31
+ "packages/core/assets",
32
+ "LICENSE",
33
+ "README.md"
34
+ ],
35
+ "publishConfig": {
36
+ "access": "public"
37
+ },
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "https://github.com/ElliotTheGreek/flowdot-cli.git"
41
+ },
42
+ "homepage": "https://flowdot.ai/docs/cli",
43
+ "author": "FlowDot",
44
+ "license": "SEE LICENSE IN LICENSE",
45
+ "engines": {
46
+ "node": ">=20.0.0"
47
+ },
48
+ "devDependencies": {
49
+ "@eslint/js": "^9.24.0",
50
+ "@types/js-yaml": "^4.0.9",
51
+ "@types/node": "^20.11.20",
52
+ "@types/react": "^19.2.0",
53
+ "@types/react-dom": "^19.2.0",
54
+ "@types/uuid": "^10.0.0",
55
+ "@vitest/eslint-plugin": "^1.3.4",
56
+ "cross-env": "^7.0.3",
57
+ "esbuild": "^0.25.0",
58
+ "esbuild-node-externals": "^1.20.1",
59
+ "eslint": "^9.24.0",
60
+ "eslint-config-prettier": "^10.1.2",
61
+ "eslint-plugin-import": "^2.31.0",
62
+ "eslint-plugin-license-header": "^0.8.0",
63
+ "eslint-plugin-react": "^7.37.5",
64
+ "eslint-plugin-react-hooks": "^5.2.0",
65
+ "globals": "^16.0.0",
66
+ "husky": "^9.1.7",
67
+ "ink-spinner": "^5.0.0",
68
+ "ink-testing-library": "^4.0.0",
69
+ "ink-text-input": "^6.0.0",
70
+ "jest-environment-jsdom": "^30.2.0",
71
+ "lint-staged": "^15.2.10",
72
+ "patch-package": "^8.0.1",
73
+ "prettier": "^3.2.5",
74
+ "rimraf": "^6.0.1",
75
+ "typescript": "^5.3.3",
76
+ "typescript-eslint": "^8.30.1",
77
+ "uuid": "^10.0.0",
78
+ "vite-tsconfig-paths": "^5.1.4",
79
+ "vitest": "^3.2.4"
80
+ },
81
+ "dependencies": {
82
+ "@flowdot.ai/api": "file:../flowdot-api",
83
+ "@livekit/rtc-node": "^0.13.28",
84
+ "ink": "npm:@jrichman/ink@6.4.6",
85
+ "keytar": "^7.9.0",
86
+ "react": "^19.2.0"
87
+ },
88
+ "optionalDependencies": {
89
+ "naudiodon2": "^2.4.0"
90
+ },
91
+ "lint-staged": {
92
+ "*.{ts,tsx}": [
93
+ "cross-env NODE_OPTIONS=--max-old-space-size=8192 eslint --fix"
94
+ ]
95
+ }
96
+ }