fanluc 2.0.0 → 2.4.0
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 +83 -0
- package/dist/assets/{abnfDiagram-O67JEVCF-hiYMdxpV.js → abnfDiagram-O67JEVCF-Di2iDQfl.js} +1 -1
- package/dist/assets/{arc-DokRg_wy.js → arc-wXq_yD5s.js} +1 -1
- package/dist/assets/{architectureDiagram-NJMV4G6O-UzHYe9Bx.js → architectureDiagram-NJMV4G6O-CTXbg-3W.js} +1 -1
- package/dist/assets/{blockDiagram-BEXU5L5S-DqM5UILT.js → blockDiagram-BEXU5L5S-DSDoL3RP.js} +1 -1
- package/dist/assets/{c4Diagram-YGBWAQC7-Cxkdm7sV.js → c4Diagram-YGBWAQC7-3sFM3iyw.js} +1 -1
- package/dist/assets/channel-atnI5OIR.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-Nl4zmLlG.js → chunk-2Q5K7J3B-DUOKiJNI.js} +1 -1
- package/dist/assets/{chunk-3FUC2YCW-BCol78O2.js → chunk-3FUC2YCW-ablWb8_c.js} +2 -2
- package/dist/assets/{chunk-5VM5RSS4-1u4YRv2Y.js → chunk-5VM5RSS4-qmlSVZ_1.js} +1 -1
- package/dist/assets/{chunk-GTNCS2PH-BG9YIV2h.js → chunk-GTNCS2PH-PLlC7cNS.js} +1 -1
- package/dist/assets/{chunk-GWA4HPMP-BTKfkJAH.js → chunk-GWA4HPMP-DK-1a6YJ.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-DCjElfA7.js → chunk-JWPE2WC7-D9zynFKs.js} +1 -1
- package/dist/assets/{chunk-NETBCI7D-QoJORlVn.js → chunk-NETBCI7D-BvzPMYyE.js} +1 -1
- package/dist/assets/{chunk-WEXAMYUT-Da-T8ct9.js → chunk-WEXAMYUT-CzcfZFWB.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-CLu69Uei.js → chunk-XXDRQBXY-DznN-rwG.js} +1 -1
- package/dist/assets/{classDiagram-v2-NBCMYWYE-DIXavbI9.js → classDiagram-v2-NBCMYWYE-D4jem0hV.js} +1 -1
- package/dist/assets/{cose-bilkent-JH36ORCC-DuWclG8-.js → cose-bilkent-JH36ORCC-VALsUQJS.js} +1 -1
- package/dist/assets/{cynefin-OW5HDTMX-D2CG5-xd.js → cynefin-OW5HDTMX-DK77QSI8.js} +1 -1
- package/dist/assets/{cynefinDiagram-VND7K2PF-goI7_Qfg.js → cynefinDiagram-VND7K2PF-CdYXfGNR.js} +1 -1
- package/dist/assets/{dagre-6A5THRUB-BmOaZ0cm.js → dagre-6A5THRUB-DeeUQzDV.js} +1 -1
- package/dist/assets/{diagram-22UHCM2B-DjDJFMw3.js → diagram-22UHCM2B-B9shZ914.js} +1 -1
- package/dist/assets/{diagram-3UASUU5V-J6z81NH3.js → diagram-3UASUU5V-gSHvaXBI.js} +1 -1
- package/dist/assets/{diagram-ATOU4E4O-B1MPU8ai.js → diagram-ATOU4E4O-BrCI5HzS.js} +1 -1
- package/dist/assets/{diagram-CDSNMT55-X5Uss0Yv.js → diagram-CDSNMT55-XtVlMRq0.js} +1 -1
- package/dist/assets/{diagram-MLGK6HIB-CRDqfYy1.js → diagram-MLGK6HIB-BVa6KsvA.js} +1 -1
- package/dist/assets/{diagram-MPIPVDR6-bhJtyiOq.js → diagram-MPIPVDR6-C8P23P2T.js} +1 -1
- package/dist/assets/{ebnfDiagram-ZINNZB2B-Dn1mZAV8.js → ebnfDiagram-ZINNZB2B-BrooaQj5.js} +1 -1
- package/dist/assets/{elk-276RUBZZ-C93BlBEU.js → elk-276RUBZZ-B-qiKlkF.js} +1 -1
- package/dist/assets/{erDiagram-OPXOYQCR-PuzjAvhD.js → erDiagram-OPXOYQCR-CL1bp2Mf.js} +1 -1
- package/dist/assets/{flowDiagram-KWPJA3E3-oRhFgO0p.js → flowDiagram-KWPJA3E3-BMQvaQ-5.js} +1 -1
- package/dist/assets/{ganttDiagram-FUAMR5RP-DKiU1XjU.js → ganttDiagram-FUAMR5RP-PLnTGRI8.js} +1 -1
- package/dist/assets/{gitGraphDiagram-X574FWY7-CWBMI0vb.js → gitGraphDiagram-X574FWY7-CiTN3Joc.js} +1 -1
- package/dist/assets/index-BEKLwzQT.css +1 -0
- package/dist/assets/index-C8gDJtDK.js +2841 -0
- package/dist/assets/{infoDiagram-VRGFBTTK-C5Hd4Afz.js → infoDiagram-VRGFBTTK-ComkS_96.js} +1 -1
- package/dist/assets/{ishikawaDiagram-OU5B5YK6-BdD6ulRK.js → ishikawaDiagram-OU5B5YK6-D-dNoDFJ.js} +1 -1
- package/dist/assets/{journeyDiagram-ZHPQQLJL-CzT-uvks.js → journeyDiagram-ZHPQQLJL-BMm9BQM8.js} +1 -1
- package/dist/assets/{kanban-definition-PNTS6WVX-BkrazFMR.js → kanban-definition-PNTS6WVX-D5If-l_D.js} +1 -1
- package/dist/assets/{linear-B0wSM1Dr.js → linear-DXAHb0Ag.js} +1 -1
- package/dist/assets/{mindmap-definition-NLK3R4M7-Df1Acqkf.js → mindmap-definition-NLK3R4M7-CIdwCXTJ.js} +1 -1
- package/dist/assets/{pegDiagram-GJSIUBJH-DK_F7h_0.js → pegDiagram-GJSIUBJH-MY7FoVQh.js} +1 -1
- package/dist/assets/{pieDiagram-5QR66LMP-BMXyNb9R.js → pieDiagram-5QR66LMP-C7lWWAtM.js} +1 -1
- package/dist/assets/{quadrantDiagram-O4NWA36T-Dfu7Z8so.js → quadrantDiagram-O4NWA36T-jHqCwvi8.js} +1 -1
- package/dist/assets/{railroadDiagram-XR7U4H2S-CfnBD-aQ.js → railroadDiagram-XR7U4H2S-BwoIA8Ln.js} +1 -1
- package/dist/assets/{requirementDiagram-PLB6GJNP-DrvsZJPP.js → requirementDiagram-PLB6GJNP-Cw8w0Rwb.js} +1 -1
- package/dist/assets/{sankeyDiagram-IPEJSGJF-DvdVDpT1.js → sankeyDiagram-IPEJSGJF-DTRo1Yxy.js} +1 -1
- package/dist/assets/{sequenceDiagram-PO4LG4MO-D1UTrvZH.js → sequenceDiagram-PO4LG4MO-DqZddXsc.js} +1 -1
- package/dist/assets/{sizeCapture-INFHLROL-CJrOBcai.js → sizeCapture-INFHLROL-BAEQ4XP5.js} +1 -1
- package/dist/assets/{stateDiagram-v2-GCMORJYK-CX8VmtqD.js → stateDiagram-v2-GCMORJYK-CYB4CouD.js} +1 -1
- package/dist/assets/{swimlanes-2SLR337P-DUWmhiK6.js → swimlanes-2SLR337P-Dw53LU13.js} +1 -1
- package/dist/assets/swimlanesDiagram-TC7HE7FX-Dzkep6h_.js +8 -0
- package/dist/assets/{timeline-definition-EJHVYXUP-CBovVdOU.js → timeline-definition-EJHVYXUP-Chk-unGo.js} +1 -1
- package/dist/assets/{usecaseDiagram-POWQR4AR-LD5N5BAG.js → usecaseDiagram-POWQR4AR-D_JpD-4l.js} +1 -1
- package/dist/assets/{vennDiagram-UO4OBE2U-DdwfzB3A.js → vennDiagram-UO4OBE2U-BnPO8gk8.js} +1 -1
- package/dist/assets/{wardleyDiagram-VNRHLVJA-BMHK4bav.js → wardleyDiagram-VNRHLVJA-CD0z1l8R.js} +1 -1
- package/dist/assets/{xychartDiagram-PMCCYNJV-q1BNzMC-.js → xychartDiagram-PMCCYNJV-CHEqj1Pe.js} +1 -1
- package/dist/cli.js +52 -57
- package/dist/index.html +4 -4
- package/dist/server.cjs +2144 -841
- package/dist/server.cjs.map +4 -4
- package/dist/tui.js +3220 -3310
- package/docs/fanluc_ui.md +120 -40
- package/docs/guide-connect.md +233 -4
- package/docs/run-cmd-security.md +26 -0
- package/index.html +2 -2
- package/mcp.json +3 -0
- package/package.json +88 -92
- package/searxng/docker-compose.yml +3 -3
- package/vite.config.ts +2 -2
- package/dist/assets/channel-SPfNTvmj.js +0 -1
- package/dist/assets/index-BylpTP-E.css +0 -1
- package/dist/assets/index-DcpVteR3.js +0 -3237
- package/dist/assets/permissionHelper--88tJJlz.js +0 -3
- package/dist/assets/swimlanesDiagram-TC7HE7FX-DMQy1553.js +0 -8
package/README.md
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# FANLUC — self-hosted (self-host)
|
|
2
|
+
|
|
3
|
+
Runs on your own machine. The AI executes commands **directly on your
|
|
4
|
+
machine** (no sandbox), inside the folder you choose.
|
|
5
|
+
|
|
6
|
+
## Run
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
npm install
|
|
10
|
+
npm run dev # open http://localhost:3000
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Requires Node.js 18+. If you want the AI to use python/git/... those
|
|
14
|
+
tools must already be installed on the machine (see the `<environment>`
|
|
15
|
+
block the AI receives).
|
|
16
|
+
|
|
17
|
+
## What is different from the old version
|
|
18
|
+
|
|
19
|
+
1. **Workspace picker**: the `[DIR: folder-name]` button in the header
|
|
20
|
+
opens a folder browser on your machine (path input, recent folders,
|
|
21
|
+
drives, create-new-folder). The choice is remembered in
|
|
22
|
+
`~/.fanluc/config.json`. Force it at startup with `WORKSPACE_DIR`.
|
|
23
|
+
2. **No sandbox**: `run_cmd` / `run_cmd_bg` run in your real shell
|
|
24
|
+
(bash on Linux/macOS; Git Bash, then pwsh, then PowerShell on
|
|
25
|
+
Windows), with the real PATH/HOME, network access, a default 2-minute
|
|
26
|
+
timeout (max 10 minutes), and no stdin (commands that ask questions
|
|
27
|
+
fail instead of hanging). The whole process tree is killed on timeout.
|
|
28
|
+
Only a few catastrophic commands are blocked (`rm -rf /`, `mkfs`,
|
|
29
|
+
`dd` to a disk, fork bombs, disk format). Disable even that with
|
|
30
|
+
`FANLUC_UNRESTRICTED=1`.
|
|
31
|
+
3. **Better search on localhost**: Bing (machine locale) + DuckDuckGo +
|
|
32
|
+
Mojeek + Yahoo run in parallel, each engine has a timeout, engines
|
|
33
|
+
that keep failing are skipped temporarily, results are merged with
|
|
34
|
+
reciprocal-rank-fusion and cached for 10 minutes. Status:
|
|
35
|
+
`GET /api/search-status`.
|
|
36
|
+
4. **Image search without SearXNG**: Bing images + DuckDuckGo images,
|
|
37
|
+
plus Wikimedia Commons + Openverse as fallback. SearXNG is only an
|
|
38
|
+
extra source if you set `SEARXNG_URL`.
|
|
39
|
+
5. **MCP**: parallel connections, stdio runs inside the workspace (use
|
|
40
|
+
`${WORKSPACE}` in args), real machine env, stderr reported on error,
|
|
41
|
+
HTTP with SSE retry for old servers, one automatic reconnect when a
|
|
42
|
+
server dies. Quick-add buttons (Playwright, Context7, test server)
|
|
43
|
+
and stdio/http explanations in the form.
|
|
44
|
+
|
|
45
|
+
## Safety (important)
|
|
46
|
+
|
|
47
|
+
Because there is no sandbox, **anyone who can reach this port can run
|
|
48
|
+
commands on your machine**. Defaults:
|
|
49
|
+
|
|
50
|
+
- the server only listens on `127.0.0.1`;
|
|
51
|
+
- every `/api/*` only accepts requests from localhost, checks the `Host`
|
|
52
|
+
header (anti DNS-rebinding), and rejects requests coming through a
|
|
53
|
+
tunnel (ngrok/cloudflared add `x-forwarded-for`).
|
|
54
|
+
|
|
55
|
+
To open it to LAN/tunnel: `HOST=0.0.0.0` + `ALLOW_REMOTE_EXEC=1` — only
|
|
56
|
+
do this if you understand the risk.
|
|
57
|
+
|
|
58
|
+
Sub-agents work in `<workspace>/.fanluc/agents/<name>/` (hidden folder,
|
|
59
|
+
keeps your project clean).
|
|
60
|
+
|
|
61
|
+
Environment variables: see `.env.example`.
|
|
62
|
+
|
|
63
|
+
## Terminal UI (opencode-style)
|
|
64
|
+
|
|
65
|
+
The same project also ships a full-screen terminal UI:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
npm run build:all # build web + CLI + TUI into dist/
|
|
69
|
+
node dist/cli.js # or: npx tsx src/cli/index.ts
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
`fanluc` starts the local server and opens the terminal UI (like the
|
|
73
|
+
`fanluc` terminal builds). Flags: `--web` / `--no-tui` for web only,
|
|
74
|
+
`--port`, `--host`, `--permission ask|autoEdit|readOnly`, plus an
|
|
75
|
+
optional workspace folder argument. In ask mode the terminal asks
|
|
76
|
+
inline before file writes, and shell approvals requested by the server
|
|
77
|
+
are answered in the terminal too.
|
|
78
|
+
|
|
79
|
+
## Style rules
|
|
80
|
+
|
|
81
|
+
- English only.
|
|
82
|
+
- No emoji.
|
|
83
|
+
- Only two colors: black (`#000000`) and white (`#ffffff`).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as p,r as u,d as a}from"./chunk-GTNCS2PH-
|
|
1
|
+
import{g as p,r as u,d as a}from"./chunk-GTNCS2PH-PLlC7cNS.js";import{p as f}from"./chunk-JWPE2WC7-D9zynFKs.js";import{_ as n,l as o}from"./index-C8gDJtDK.js";import{M as c,b as d}from"./cynefin-OW5HDTMX-DK77QSI8.js";var v=d().RailroadAbnf.parser.LangiumParser,l=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),i=t?parseInt(t,10):0,m=s?parseInt(s,10):1/0;return{min:i,max:m}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return l(e.element);case"AbnfOptionalGroup":return{type:"optional",element:l(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:l(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},w={parser:R,db:a,renderer:u,styles:p};export{w as diagram};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a6 as ln,a7 as an,a8 as g,a9 as tn,aa as G,ab as j,ac as _,ad as un,ae as rn,af as K,ag as o,ah as z,ai as sn,aj as on,ak as fn}from"./index-
|
|
1
|
+
import{a6 as ln,a7 as an,a8 as g,a9 as tn,aa as G,ab as j,ac as _,ad as un,ae as rn,af as K,ag as o,ah as z,ai as sn,aj as on,ak as fn}from"./index-C8gDJtDK.js";function cn(l){return l.innerRadius}function gn(l){return l.outerRadius}function yn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,E,q,v,A,B,a){var I=E-l,i=q-h,n=B-v,d=a-A,u=d*I-n*i;if(!(u*u<g))return u=(n*(h-A)-d*(l-v))/u,[l+u*I,h+u*i]}function V(l,h,E,q,v,A,B){var a=l-E,I=h-q,i=(B?A:-A)/K(a*a+I*I),n=i*I,d=-i*a,u=l+n,s=h+d,f=E+n,c=q+d,C=(u+f)/2,t=(s+c)/2,m=f-u,y=c-s,R=m*m+y*y,T=v-A,P=u*c-f*s,O=(y<0?-1:1)*K(fn(0,T*T*R-P*P)),S=(P*y-m*O)/R,k=(-P*m-y*O)/R,w=(P*y+m*O)/R,p=(-P*m+y*O)/R,x=S-C,e=k-t,r=w-C,F=p-t;return x*x+e*e>r*r+F*F&&(S=w,k=p),{cx:S,cy:k,x01:-n,y01:-d,x11:S*(v/T-1),y11:k*(v/T-1)}}function hn(){var l=cn,h=gn,E=z(0),q=null,v=yn,A=dn,B=mn,a=null,I=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-an,c=A.apply(this,arguments)-an,C=un(c-f),t=c>f;if(a||(a=n=I()),s<u&&(d=s,s=u,u=d),!(s>g))a.moveTo(0,0);else if(C>tn-g)a.moveTo(s*G(f),s*j(f)),a.arc(0,0,s,f,c,!t),u>g&&(a.moveTo(u*G(c),u*j(c)),a.arc(0,0,u,c,f,t));else{var m=f,y=c,R=f,T=c,P=C,O=C,S=B.apply(this,arguments)/2,k=S>g&&(q?+q.apply(this,arguments):K(u*u+s*s)),w=_(un(s-u)/2,+E.apply(this,arguments)),p=w,x=w,e,r;if(k>g){var F=sn(k/u*j(S)),L=sn(k/s*j(S));(P-=F*2)>g?(F*=t?1:-1,R+=F,T-=F):(P=0,R=T=(f+c)/2),(O-=L*2)>g?(L*=t?1:-1,m+=L,y-=L):(O=0,m=y=(f+c)/2)}var H=s*G(m),J=s*j(m),M=u*G(T),N=u*j(T);if(w>g){var Q=s*G(y),U=s*j(y),W=u*G(R),X=u*j(R),D;if(C<rn)if(D=pn(H,J,W,X,Q,U,M,N)){var Y=H-D[0],Z=J-D[1],$=Q-D[0],b=U-D[1],nn=1/j(on((Y*$+Z*b)/(K(Y*Y+Z*Z)*K($*$+b*b)))/2),en=K(D[0]*D[0]+D[1]*D[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}O>g?x>g?(e=V(W,X,H,J,s,x,t),r=V(Q,U,M,N,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(H,J),a.arc(0,0,s,m,y,!t)):a.moveTo(H,J),!(u>g)||!(P>g)?a.lineTo(M,N):p>g?(e=V(M,N,Q,U,u,-p,t),r=V(H,J,W,X,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-rn/2;return[G(d)*n,j(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:z(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:z(+n),i):h},i.cornerRadius=function(n){return arguments.length?(E=typeof n=="function"?n:z(+n),i):E},i.padRadius=function(n){return arguments.length?(q=n==null?null:typeof n=="function"?n:z(+n),i):q},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:z(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:z(+n),i):A},i.padAngle=function(n){return arguments.length?(B=typeof n=="function"?n:z(+n),i):B},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
|