aitable-workflow-cli 0.1.16 → 0.1.17-beta.1786087167343
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/chunk-IG7PZYXN.js +1 -0
- package/dist/chunk-W3EUICMH.js +1 -0
- package/dist/cli.js +19 -19
- package/dist/config-ui-server-4BCW6GOE.js +8 -0
- package/dist/{pid-file-HPTFI54H.js → pid-file-3JTHFPFF.js} +1 -1
- package/dist/web/assets/{index-lH_EMWyt.js → index-CSpRiIyB.js} +29 -29
- package/dist/web/index.html +1 -1
- package/package.json +3 -3
- package/dist/chunk-U773UWB7.js +0 -1
- package/dist/config-ui-server-7H5HRTRE.js +0 -9
package/dist/web/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<link rel="icon" type="image/svg+xml" href="/icon.svg" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>aitable-workflow · AI 工作流编排</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-CSpRiIyB.js"></script>
|
|
9
9
|
<link rel="stylesheet" crossorigin href="/assets/index-Dk4AmuGi.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aitable-workflow-cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.17-beta.1786087167343",
|
|
4
4
|
"description": "aitable-workflow 命令行工具(cli):init/design/setup/run/serve 等命令;含 relay 本地反连客户端与 daemon 进程管理。bin: aitable-workflow。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"access": "public"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"aitable-workflow-core": "0.1.
|
|
23
|
-
"aitable-workflow-server": "0.1.
|
|
22
|
+
"aitable-workflow-core": "0.1.17-beta.1786087167343",
|
|
23
|
+
"aitable-workflow-server": "0.1.17-beta.1786087167343",
|
|
24
24
|
"@inquirer/prompts": "^8.5.2",
|
|
25
25
|
"commander": "^14.0.2",
|
|
26
26
|
"dotenv": "^17.4.2",
|
package/dist/chunk-U773UWB7.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as t}from"./chunk-EI7MMDWY.js";import{readFile as a,writeFile as c,mkdir as u,rm as l}from"fs/promises";import n from"path";import m from"os";var p=n.join(m.homedir(),".aitable-workflow","daemons");function s(r){return n.join(p,r)}t(s,"daemonDir");function o(r){return n.join(s(r),"daemon.pid")}t(o,"pidFilePath");function f(r){try{return process.kill(r,0),!0}catch{return!1}}t(f,"isProcessAlive");async function d(r){try{let e=await a(o(r),"utf8"),i=parseInt(e.trim(),10);return Number.isFinite(i)&&i>0?i:null}catch{return null}}t(d,"readPidFile");async function g(r){let e=s(r);await u(e,{recursive:!0});let i=await d(r);if(i!==null&&f(i))throw new Error(`Agent "${r}" \u5DF2\u5728\u8FD0\u884C (PID: ${i})\u3002\u5148\u6267\u884C \`aitable-workflow stop --agent ${r}\` \u518D\u542F\u52A8\u3002`);await c(o(r),String(process.pid),"utf8")}t(g,"writePidFile");async function h(r){try{await l(o(r),{force:!0})}catch{}}t(h,"removePidFile");export{p as a,s as b,o as c,f as d,d as e,g as f,h as g};
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import{l as W,n as J,p as B,q as L}from"./chunk-FW6MXYUM.js";import{a as w}from"./chunk-EI7MMDWY.js";import{createServer as et}from"http";import{stat as H,readFile as $,mkdir as M,writeFile as F,rm as ot}from"fs/promises";import{createReadStream as nt,existsSync as Y}from"fs";import c from"path";import{fileURLToPath as rt}from"url";import st from"crypto";import it from"os";import U from"yaml";import{runCheck as I,writeBack as z,resolveConfigPath as K,loadSettings as at,detectCodingEngines as ct,loadWorkflowTemplate as lt,collectEnvRefs as ft}from"aitable-workflow-core";var G=c.dirname(rt(import.meta.url)),ut={".html":"text/html; charset=utf-8",".js":"application/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".json":"application/json; charset=utf-8",".svg":"image/svg+xml",".png":"image/png",".ico":"image/x-icon"},dt=1800*1e3;function mt(){return process.platform==="darwin"||process.platform==="win32"||process.env.DISPLAY||process.env.WAYLAND_DISPLAY?"local-gui":"remote"}w(mt,"detectEnvironment");function X(){let r=c.join(G,"web");if(Y(c.join(r,"index.html")))return r;let e=c.resolve(G,"..","..","..","web","dist");return Y(c.join(e,"index.html"))?e:null}w(X,"resolveWebRoot");function _t(){return X()!==null}w(_t,"hasWebRoot");async function Z(r){let{createServer:e}=await import("net");return new Promise((t,n)=>{let i=e();i.listen(r,()=>{let g=i.address(),o=typeof g=="object"&&g?g.port:r;i.close(()=>t(o))}),i.on("error",()=>{r<8800?Z(r+1).then(t,n):n(new Error("\u65E0\u6CD5\u627E\u5230\u53EF\u7528\u7AEF\u53E3 (8788-8800)"))})})}w(Z,"getAvailablePort");var pt=1024*1024,gt=50*1024*1024;async function x(r,e=pt){return new Promise((t,n)=>{let i=[],g=0;r.on("data",o=>{if(g+=o.length,g>e){r.destroy(),n(new Error("Request body too large"));return}i.push(o)}),r.on("end",()=>{try{t(JSON.parse(Buffer.concat(i).toString("utf8")))}catch{n(new Error("Invalid JSON body"))}}),r.on("error",n)})}w(x,"readJson");function T(r,e,t=200){let n=JSON.stringify(e);r.writeHead(t,{"Content-Type":"application/json; charset=utf-8","Content-Length":Buffer.byteLength(n)}),r.end(n)}w(T,"sendJson");function b(r,e,t){T(r,{ok:!1,error:t},e)}w(b,"sendError");function P(r){let e=JSON.parse(JSON.stringify(r));for(let t of e.modules){let n=t.workflows?t.workflows.flatMap(i=>i.items):t.items;for(let i of n)i.sensitive&&i.value!==void 0&&(i.value="***")}return e}w(P,"maskSensitive");function V(r){let e=[];for(let t of r.modules)if(t.workflows)for(let n of t.workflows)e.push(...n.items);else e.push(...t.items);return e}w(V,"collectAllItems");function ht(r,e){for(let t of r){let n=V(e).find(i=>{if(!i.writeTarget)return!1;let g=i.writeTarget,o=t.writeTarget;return g.type!==o.type?!1:g.type==="yaml"&&o.type==="yaml"?g.file===o.file&&JSON.stringify(g.yamlPath)===JSON.stringify(o.yamlPath):!1});if(n&&L(n)&&t.value.trim().length>0)return t.value.trim()}return null}w(ht,"findSavedBaseId");async function $t(r){let e=await Z(8788),t=mt(),n=st.randomUUID(),i=t==="remote"?"0.0.0.0":"127.0.0.1",g=X();if(!g)throw new Error("Web \u8D44\u6E90\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u542F\u52A8\u53EF\u89C6\u5316\u914D\u7F6E\u754C\u9762");let o=await K(r.configPath),m=c.dirname(o),u=null,f=new Promise(p=>u=p),a=null,l=w(()=>{a&&clearTimeout(a),a=setTimeout(()=>{console.log(`
|
|
2
|
-
\u2139 \u914D\u7F6E\u754C\u9762\u8D85\u8FC7 30 \u5206\u949F\u65E0\u6D3B\u52A8\uFF0C\u5DF2\u81EA\u52A8\u5173\u95ED\u3002`),u?.()},dt)},"resetTimeout"),h=et(async(p,s)=>{let d=new URL(p.url??"/",`http://${p.headers.host??"localhost"}`),k=p.headers.origin;if(k){let _=`http://127.0.0.1:${e}`;(k===_||t==="remote")&&s.setHeader("Access-Control-Allow-Origin",k)}if(s.setHeader("Access-Control-Allow-Methods","GET, POST, OPTIONS"),s.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization"),p.method==="OPTIONS"){s.writeHead(204),s.end();return}if(d.pathname.startsWith("/dev/")){if((d.searchParams.get("token")??p.headers.authorization?.replace("Bearer ",""))!==n){b(s,401,"Unauthorized");return}l();try{await wt(d,p,s,r.configPath,m,u)}catch(R){let A=R instanceof Error?R.message:String(R);b(s,500,A)}return}yt(d,s,g)});await new Promise(p=>h.listen(e,i,p)),l();let y=t==="local-gui"?`http://127.0.0.1:${e}/setup?token=${n}`:`http://${it.hostname()}:${e}/setup?token=${n}`;if(t==="local-gui")try{let{exec:p}=await import("child_process"),s=process.platform==="darwin"?`open "${y}"`:`xdg-open "${y}"`;p(s),console.log(`\u2139 \u6D4F\u89C8\u5668\u5DF2\u6253\u5F00: ${y}`)}catch{console.log(`\u2139 \u914D\u7F6E\u754C\u9762\u5DF2\u542F\u52A8\uFF0C\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00:
|
|
3
|
-
${y}`)}else console.log("\u2139 \u914D\u7F6E\u754C\u9762\u5DF2\u542F\u52A8\uFF0C\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00:"),console.log(` ${y}`),console.log(`
|
|
4
|
-
\u5982\u679C\u65E0\u6CD5\u76F4\u63A5\u8BBF\u95EE\uFF0C\u53EF\u901A\u8FC7 SSH \u7AEF\u53E3\u8F6C\u53D1:
|
|
5
|
-
ssh -L ${e}:127.0.0.1:${e} <your-host>`),console.log(` \u7136\u540E\u6253\u5F00: http://127.0.0.1:${e}/setup?token=${n}`);console.log(`
|
|
6
|
-
\uFF08\u7B49\u5F85\u914D\u7F6E\u5B8C\u6210\u540E\u81EA\u52A8\u7EE7\u7EED setup \u6D41\u7A0B\uFF09`),console.log(` \uFF08\u6309 Ctrl+C \u9000\u51FA | --no-ui \u56DE\u9000\u547D\u4EE4\u884C\u4EA4\u4E92\uFF09
|
|
7
|
-
`),await f,a&&clearTimeout(a),h.close()}w($t,"runConfigUI");async function wt(r,e,t,n,i,g){if(e.method==="GET"&&r.pathname==="/dev/config/check"){let o=await I({configPath:n});T(t,P(o));return}if(e.method==="GET"&&r.pathname==="/dev/config/enriched"){let o=await I({configPath:n}),m=ct(),u=await at(n),f={},a={},l=new Set,h=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g;try{let s=await K(n),d=await $(s,"utf8");for(let k of ft([d]))l.add(k)}catch{}try{let s=await $(c.join(i,"profile","profile.yml"),"utf8"),d=U.parse(s),k=d?.workflows;if(k&&typeof k=="object"&&(a=k),d&&typeof d=="object"){let{workflows:_,...R}=d;for(let A of JSON.stringify(R).matchAll(h))l.add(A[1])}}catch{}for(let s of u.workflowEntries)try{let d=await lt(s.templatePath),k=d.steps.map(v=>({id:v.id,name:v.name,recipe:v.recipe,engine:v.engine,auto:v.auto})),_=d.edges.filter(v=>v.from!=="__start__"&&v.to!=="__end__").map(v=>({from:v.from,to:v.to,condition:v.condition})),R={},A=new Set,C;try{C=U.parse(await $(s.templatePath,"utf8"))}catch{}if(C){for(let S of JSON.stringify(C).matchAll(h))A.add(S[1]);let v=a[s.id];if(v&&typeof v=="object")for(let S of JSON.stringify(v).matchAll(h))A.add(S[1]);let Q=Array.isArray(C.steps)?C.steps:[];for(let S=0;S<d.steps.length;S++){let E=d.steps[S],O=Q[S];if(O){let N=JSON.stringify(O),j=new Set;for(let tt of N.matchAll(h))j.add(tt[1]);j.size>0&&(R[E.id]=[...j])}}let q=Array.isArray(C.event_sources)?C.event_sources:[];for(let S of q)if(S){let E=JSON.stringify(S),O=new Set;for(let N of E.matchAll(h))O.add(N[1]);O.size>0&&(R.__event_sources__=[...R.__event_sources__??[],...O])}}f[s.id]={steps:k,edges:_,stepEnvRefs:R,envRefs:[...A].sort()}}catch{f[s.id]={steps:[],edges:[],stepEnvRefs:{},envRefs:[]}}let y=new Set;for(let s of Object.values(f))for(let d of s.envRefs??[])y.add(d);let p=o.modules.find(s=>s.id==="env");for(let s of p?.items??[])s.writeTarget?.type==="env"&&!y.has(s.key)&&l.add(s.key);T(t,{config:P(o),engines:{available:m.available.map(s=>({engine:s.engine,cmd:s.cmd,version:s.version})),recommended:m.recommendedEngine},workflowTopology:f,projectEnvRefs:[...l].sort()});return}if(e.method==="POST"&&r.pathname==="/dev/config/save"){let o=await x(e);if(!Array.isArray(o.updates)){b(t,400,"updates must be an array");return}for(let a of o.updates){let l=[];if(a.writeTarget.type==="yamlAll")for(let h of a.writeTarget.targets)l.push(h.file);else l.push(a.writeTarget.file);for(let h of l){let y=c.resolve(i,h);if(!y.startsWith(i+c.sep)&&y!==i){b(t,403,`\u8DEF\u5F84\u8D8A\u754C: ${h}`);return}}}let m=0;for(let a of o.updates)await z(a.writeTarget,a.value,i),m++;let u=await I({configPath:n}),f=ht(o.updates,u);if(f){let a=0;for(let l of V(u))l.writeTarget&&(l.status==="error"||l.status==="warn")&&L(l)&&B(l)==="baseId"&&(!l.value||typeof l.value=="string"&&!l.value.trim())&&(await z(l.writeTarget,f,i),a++);a>0&&(u=await I({configPath:n}),m+=a)}T(t,{ok:!0,written:m,recheck:P(u)});return}if(e.method==="POST"&&r.pathname==="/dev/kb/ingest"){let o=await x(e);if(!o.roleId||!o.source){b(t,400,"roleId and source are required");return}let m=c.resolve(i,"roles",`${o.roleId}.role.yml`),u=await J(m,o.roleId),f=await W({source:o.source,collectionName:u,configDir:i}),a=await I({configPath:n});T(t,{ok:f.success,message:f.message,recheck:P(a)});return}if(e.method==="POST"&&r.pathname==="/dev/kb/upload"){let o=await x(e,gt);if(!o.roleId||!Array.isArray(o.files)||o.files.length===0){b(t,400,"roleId and files are required");return}let m=c.resolve(i,"roles",`${o.roleId}.role.yml`),u=await J(m,o.roleId),f=c.resolve(i,".kb-upload-tmp",`upload-${Date.now()}`);try{await M(f,{recursive:!0});for(let h of o.files){let y=h.relativePath.replace(/\.\./g,"_"),p=c.resolve(f,y),s=c.dirname(p);if(!p.startsWith(f+c.sep)&&p!==f)continue;await M(s,{recursive:!0});let d=h.encoding==="base64"?Buffer.from(h.content,"base64"):Buffer.from(h.content,"utf8");await F(p,d)}let a=await W({source:f,collectionName:u,configDir:i}),l=await I({configPath:n});T(t,{ok:a.success,message:a.message,recheck:P(l)})}finally{await ot(f,{recursive:!0,force:!0}).catch(()=>{})}return}if(e.method==="GET"&&r.pathname==="/dev/file/read"){let o=r.searchParams.get("path")??"",m=D(o,i);if(!m){b(t,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${o}`);return}try{let u=await $(m,"utf8");T(t,{ok:!0,path:o,content:u,exists:!0})}catch{T(t,{ok:!0,path:o,content:"",exists:!1})}return}if(e.method==="POST"&&r.pathname==="/dev/file/write"){let o=await x(e),m=typeof o.path=="string"?o.path:"",u=D(m,i);if(!u||typeof o.content!="string"){b(t,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${m}`);return}let f=vt(m,o.content);if(f){T(t,{ok:!1,error:f},400);return}await M(c.dirname(u),{recursive:!0}),await F(u,o.content.endsWith(`
|
|
8
|
-
`)?o.content:o.content+`
|
|
9
|
-
`,"utf8");let a=await I({configPath:n});T(t,{ok:!0,recheck:P(a)});return}if(e.method==="POST"&&r.pathname==="/dev/setup/complete"){T(t,{ok:!0}),g?.();return}b(t,404,"Unknown endpoint")}w(wt,"handleDevApi");function D(r,e){let t=r.trim();if(!t||c.isAbsolute(t)||!/\.(ya?ml|json)$/i.test(t))return null;let n=c.resolve(e,t);return n.startsWith(e+c.sep)?n:null}w(D,"resolveInsideConfigDir");function vt(r,e){try{return/\.json$/i.test(r)?JSON.parse(e):U.parse(e),null}catch(t){return`${/\.json$/i.test(r)?"JSON":"YAML"} \u8BED\u6CD5\u9519\u8BEF\uFF0C\u672A\u4FDD\u5B58: ${t instanceof Error?t.message:String(t)}`}}w(vt,"validateStructuredText");async function yt(r,e,t){let n=c.join(t,r.pathname==="/"?"index.html":r.pathname);try{(await H(n)).isDirectory()&&(n=c.join(n,"index.html"))}catch{n=c.join(t,"index.html")}if(!n.startsWith(t+c.sep)&&n!==t){e.writeHead(403),e.end("Forbidden");return}try{await H(n)}catch{e.writeHead(404),e.end("Not Found");return}let i=c.extname(n),g=ut[i]??"application/octet-stream";e.writeHead(200,{"Content-Type":g}),nt(n).pipe(e)}w(yt,"serveStatic");export{mt as detectEnvironment,_t as hasWebRoot,X as resolveWebRoot,$t as runConfigUI};
|