aitable-workflow-cli 0.1.17 → 0.1.18-beta.1786440467350
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/bin/aitable-workflow.mjs
CHANGED
|
@@ -9,13 +9,21 @@ const srcEntry = resolve(dir, "../src/cli.ts");
|
|
|
9
9
|
// config/setup/run 都会动态加载用户项目中的 .recipe.ts。发布物没有 src/,也必须
|
|
10
10
|
// 在载入 dist/cli.js 前注册 tsx,不能只依赖源码开发分支或外部 NODE_OPTIONS。
|
|
11
11
|
const tsxApi = await import("tsx/esm/api");
|
|
12
|
-
tsxApi.register?.();
|
|
13
12
|
|
|
14
13
|
if (existsSync(srcEntry)) {
|
|
15
14
|
// 本地开发:core/server 的 exports 在开发态指向各自 src,
|
|
16
15
|
// 故改任意包的源码都即时生效,无需构建。
|
|
16
|
+
//
|
|
17
|
+
// 必须显式把 tsconfig 指到仓库根那份:server 是 Midway component(legacy 装饰器),
|
|
18
|
+
// tsx 默认按 cwd 就近找 tsconfig,从任意目录跑本 bin 时很可能找到一份 include
|
|
19
|
+
// 匹配不到 packages/server/src 的 tsconfig(或找不到),于是按 TC39 语义编译装饰器,
|
|
20
|
+
// 运行期 Reflect.getMetadata 报错。显式指定会绕过 include 匹配,详见根 tsconfig.json。
|
|
21
|
+
tsxApi.register?.({ tsconfig: resolve(dir, "../../../tsconfig.json") });
|
|
17
22
|
await import(pathToFileURL(srcEntry).href);
|
|
18
23
|
} else {
|
|
24
|
+
// 发布物只有 dist(装饰器已由 tsup 按 server 自己的 tsconfig 正确编译),
|
|
25
|
+
// 这里注册 tsx 只为加载用户项目的 .recipe.ts,无需指定 tsconfig。
|
|
26
|
+
tsxApi.register?.();
|
|
19
27
|
// 发布物不含 src/ → 跑构建产物(依赖的 core/server 也被 publishConfig 切到 dist)。
|
|
20
28
|
await import(pathToFileURL(resolve(dir, "../dist/cli.js")).href);
|
|
21
29
|
}
|
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{a as Pe}from"./chunk-IG7PZYXN.js";import{b as z,d as B,e as fe,f as Le,g as X}from"./chunk-W3EUICMH.js";import{a as c}from"./chunk-EI7MMDWY.js";import{config as Dt}from"dotenv";import{Command as Zo}from"commander";import{logger as Mt,activateGlobalDwsOnPath as er}from"aitable-workflow-core";import{createRequire as Wt}from"module";var _e="aitable-workflow-",Nt=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;function Me(){try{return Wt(import.meta.url)("../package.json")}catch{return{}}}c(Me,"loadCliPackageManifest");function he(r){return r.version??"0.0.0"}c(he,"resolveCliVersion");function De(r){let e=he(r),t={};r.name?.startsWith(_e)&&(t[r.name]=e);for(let[n,o]of Object.entries(r.dependencies??{}))n.startsWith(_e)&&(t[n]=Nt.test(o)?o:e);return t}c(De,"resolveMonorepoPackageVersions");import Ot from"path";import{fileURLToPath as tr}from"url";var Oe="./aitable-workflow.config.yml";import{runInit as Gt,logger as Ht}from"aitable-workflow-core";import Kt from"path";function Ue(r,e){r.command("init").description("\u4EA4\u4E92\u5F0F\u521D\u59CB\u5316 \u2014 \u9009\u62E9 Coding Agent\u3001\u914D\u7F6E\u5DE5\u4F5C\u76EE\u5F55\u3001\u63CF\u8FF0\u4E1A\u52A1\u573A\u666F\uFF1B\u6216\u7528 --template \u4ECE\u5185\u7F6E\u6A21\u677F\u811A\u624B\u67B6").option("-c, --config <path>","\u76EE\u6807\u76EE\u5F55\u6216\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\uFF08\u9ED8\u8BA4\u5F53\u524D\u76EE\u5F55\uFF09").option("-f, --force","\u8986\u76D6\u5DF2\u6709\u914D\u7F6E\u6587\u4EF6").option("-y, --yes","\u4F7F\u7528\u9ED8\u8BA4\u503C\u8DF3\u8FC7\u4EA4\u4E92\u5F0F\u5411\u5BFC").option("-t, --template <name>","\u4ECE\u5185\u7F6E\u6A21\u677F\u811A\u624B\u67B6(\u5F53\u524D\u63A8\u8350 support-qa),\u62F7\u8D1D\u5B8C\u6574\u53EF\u8FD0\u884C\u9879\u76EE\u5230\u76EE\u6807\u76EE\u5F55").option("--profile <name>","\u9009\u5B9A\u6A21\u677F\u4E0B\u7684 profile \u4E1A\u52A1\u5305(\u5982 support-qa \u7684 aitable),\u8986\u76D6\u5F0F\u53E0\u52A0\u5230\u5B9E\u4F8B").action(async t=>{try{await Gt({config:t.config,force:!!t.force,yes:!!t.yes,template:t.template,profile:t.profile,templatesDir:Kt.resolve(e.cliDir,"..","templates"),templatePackageVersions:e.packageVersions,cliVersion:e.version})}catch(n){n instanceof Error&&n.message.includes("cancelled")&&process.exit(0),Ht.error("cli","\u521D\u59CB\u5316\u5931\u8D25",{error:n instanceof Error?n.message:String(n)}),process.exit(1)}})}c(Ue,"registerInitCommand");import{runMigrate as qt,logger as Yt}from"aitable-workflow-core";import Vt from"path";function Fe(r,e){r.command("migrate").description("\u5347\u7EA7\u9879\u76EE\u76EE\u5F55\u5230\u6700\u65B0\u6A21\u677F\u7248\u672C\uFF0C\u81EA\u52A8\u4FDD\u7559\u7528\u6237\u914D\u7F6E\uFF1B\u6216\u7528 --from/--to \u5728\u4E24\u4E2A\u76EE\u5F55\u95F4\u505A\u5408\u5E76\u8FC1\u79FB").option("-c, --config <path>","\u9879\u76EE\u76EE\u5F55\u8DEF\u5F84",e.defaultConfig).option("--from <dir>","\u6E90\u76EE\u5F55\uFF1A\u4EE5\u8BE5\u76EE\u5F55\u4E3A\u8FC1\u79FB\u57FA\u51C6\uFF08\u4E0D\u6309\u540D scaffold \u6A21\u677F\uFF09\uFF0C\u4E0E --template/--profile \u4E92\u65A5").option("--to <dir>","\u76EE\u6807\u9879\u76EE\u76EE\u5F55\uFF08--config \u7684\u540C\u4E49\u53C2\u6570\uFF0C\u4F18\u5148\u751F\u6548\uFF09").option("--dry-run","\u4EC5\u9884\u89C8\u53D8\u66F4\uFF0C\u4E0D\u5B9E\u9645\u5199\u5165").option("--no-backup","\u8DF3\u8FC7\u81EA\u52A8\u5907\u4EFD").option("--force","\u8DF3\u8FC7\u786E\u8BA4\u63D0\u793A").option("--template <name>","\u6307\u5B9A\u76EE\u6807\u6A21\u677F").option("--profile <name>","\u6307\u5B9A\u76EE\u6807 profile").option("--rollback","\u56DE\u6EDA\u5230\u4E0A\u4E00\u6B21\u8FC1\u79FB\u524D\u7684\u72B6\u6001").option("--list","\u5217\u51FA\u6240\u6709\u5907\u4EFD").action(async t=>{try{await qt({config:t.config,from:t.from,to:t.to,dryRun:t.dryRun,noBackup:t.backup===!1,force:t.force,template:t.template,profile:t.profile,rollback:t.rollback,list:t.list,templatesDir:Vt.resolve(e.cliDir,"..","templates"),templatePackageVersions:e.packageVersions,cliVersion:e.version})}catch(n){n instanceof Error&&n.message.includes("cancelled")&&process.exit(0),Yt.error("cli","migrate \u5931\u8D25",{error:n instanceof Error?n.message:String(n)}),process.exit(1)}})}c(Fe,"registerMigrateCommand");import{runDesignCommand as Jt,logger as zt}from"aitable-workflow-core";function Be(r,e){r.command("design").description("\u8BA9 Coding Agent \u6839\u636E\u573A\u666F\u63CF\u8FF0\u751F\u6210\u5B8C\u6574\u7684 workflow \u548C recipes").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",e.defaultConfig).option("-y, --yes","\u8DF3\u8FC7\u4EA4\u4E92\u5F0F\u8865\u5145\uFF0C\u76F4\u63A5\u4F7F\u7528 config \u4E2D\u7684 scene").option("--skip-questions","\u4E0D\u56DE\u7B54 Agent \u7684\u6F84\u6E05\u63D0\u95EE\uFF08Agent \u6309\u5047\u8BBE\u751F\u6210\u5E76\u5217\u51FA\u5F85\u786E\u8BA4\u9879\uFF09").action(async t=>{try{await Jt(t)}catch(n){n instanceof Error&&n.message.includes("cancelled")&&process.exit(0),zt.error("cli","design \u5931\u8D25",{error:n instanceof Error?n.message:String(n)}),process.exit(1)}})}c(Be,"registerDesignCommand");import{runCheck as Ne,runSetupCommand as Xt,checkMigrateHint as Qt,logger as Zt}from"aitable-workflow-core";import Ge from"path";function we(r){return r.skipConfig||r.skipConfigIfValid&&r.configValid===!0}c(we,"canSkipSetupConfig");function We(r){return we(r)?"setup":r.uiEnabled&&r.webAvailable?"web":"cli"}c(We,"resolveSetupConfigRoute");function He(r,e){r.command("setup").description("\u6821\u9A8C\u5E76\u8865\u9F50\u9879\u76EE\u914D\u7F6E\uFF0C\u518D\u521D\u59CB\u5316 AI \u8868\u683C\u7ED3\u6784 + \u7F16\u8BD1\u77E5\u8BC6\u5E93 \u2014 \u4E00\u6B21\u5B8C\u6210 config + \u5EFA\u8868").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",e.defaultConfig).option("--no-clean","\u4E0D\u6E05\u7406\u7A7A\u767D\u884C").option("--no-kb","\u8DF3\u8FC7\u77E5\u8BC6\u5E93\u7F16\u8BD1").option("--kb-full","\u5F3A\u5236\u5168\u91CF\u91CD\u7F16\u8BD1\u77E5\u8BC6\u5E93").option("--skip-config","\u8DF3\u8FC7\u524D\u7F6E\u7684\u4EA4\u4E92\u5F0F\u914D\u7F6E\u6821\u9A8C\uFF08CI/\u5DF2\u786E\u8BA4\u914D\u7F6E\u65F6\u4F7F\u7528\uFF09").option("--skip-config-if-valid","\u5148\u6821\u9A8C\u914D\u7F6E\uFF1B\u65E0\u963B\u65AD\u9879\u65F6\u8DF3\u8FC7\u914D\u7F6E\u754C\u9762\u5E76\u76F4\u63A5\u5F00\u59CB\u642D\u5EFA").option("--no-ui","\u5F3A\u5236\u4F7F\u7528\u547D\u4EE4\u884C\u4EA4\u4E92\uFF08\u8DF3\u8FC7\u53EF\u89C6\u5316\u914D\u7F6E\u754C\u9762\uFF09").action(async t=>{try{if(await Qt(Ge.dirname(Ge.resolve(t.config)),e.version),!t.skipConfig){let n=t.ui!==!1,o=!1;if(t.skipConfigIfValid){console.log("\u{1F4CB} \u6B65\u9AA4 1/2\uFF1A\u6821\u9A8C\u9879\u76EE\u914D\u7F6E");let i=await Ne({configPath:t.config});if(o=we({skipConfig:!1,skipConfigIfValid:!0,configValid:i.ok}),o){let s=[];i.summary.warnings>0&&s.push(`${i.summary.warnings} \u9879\u8B66\u544A`),i.summary.suggestions>0&&s.push(`${i.summary.suggestions} \u9879\u5EFA\u8BAE`);let a=s.length>0?`\uFF08${s.join("\uFF0C")}\uFF0C\u5747\u4E0D\u963B\u65AD\uFF09`:"";console.log(`\u2713 \u914D\u7F6E\u65E0\u963B\u65AD\u9879${a}\uFF0C\u8DF3\u8FC7\u914D\u7F6E\u754C\u9762\u5E76\u7EE7\u7EED\u642D\u5EFA\u3002`)}else console.log(`\u2139 \u68C0\u6D4B\u5230 ${i.summary.errors} \u9879\u963B\u65AD\uFF0C\u8FDB\u5165\u914D\u7F6E\u73AF\u8282\u3002`)}if(!o&&n){let{hasWebRoot:i,runConfigUI:s}=await import("./config-ui-server-
|
|
2
|
+
import{a as Pe}from"./chunk-IG7PZYXN.js";import{b as z,d as B,e as fe,f as Le,g as X}from"./chunk-W3EUICMH.js";import{a as c}from"./chunk-EI7MMDWY.js";import{config as Dt}from"dotenv";import{Command as Zo}from"commander";import{logger as Mt,activateGlobalDwsOnPath as er}from"aitable-workflow-core";import{createRequire as Wt}from"module";var _e="aitable-workflow-",Nt=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;function Me(){try{return Wt(import.meta.url)("../package.json")}catch{return{}}}c(Me,"loadCliPackageManifest");function he(r){return r.version??"0.0.0"}c(he,"resolveCliVersion");function De(r){let e=he(r),t={};r.name?.startsWith(_e)&&(t[r.name]=e);for(let[n,o]of Object.entries(r.dependencies??{}))n.startsWith(_e)&&(t[n]=Nt.test(o)?o:e);return t}c(De,"resolveMonorepoPackageVersions");import Ot from"path";import{fileURLToPath as tr}from"url";var Oe="./aitable-workflow.config.yml";import{runInit as Gt,logger as Ht}from"aitable-workflow-core";import Kt from"path";function Ue(r,e){r.command("init").description("\u4EA4\u4E92\u5F0F\u521D\u59CB\u5316 \u2014 \u9009\u62E9 Coding Agent\u3001\u914D\u7F6E\u5DE5\u4F5C\u76EE\u5F55\u3001\u63CF\u8FF0\u4E1A\u52A1\u573A\u666F\uFF1B\u6216\u7528 --template \u4ECE\u5185\u7F6E\u6A21\u677F\u811A\u624B\u67B6").option("-c, --config <path>","\u76EE\u6807\u76EE\u5F55\u6216\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\uFF08\u9ED8\u8BA4\u5F53\u524D\u76EE\u5F55\uFF09").option("-f, --force","\u8986\u76D6\u5DF2\u6709\u914D\u7F6E\u6587\u4EF6").option("-y, --yes","\u4F7F\u7528\u9ED8\u8BA4\u503C\u8DF3\u8FC7\u4EA4\u4E92\u5F0F\u5411\u5BFC").option("-t, --template <name>","\u4ECE\u5185\u7F6E\u6A21\u677F\u811A\u624B\u67B6(\u5F53\u524D\u63A8\u8350 support-qa),\u62F7\u8D1D\u5B8C\u6574\u53EF\u8FD0\u884C\u9879\u76EE\u5230\u76EE\u6807\u76EE\u5F55").option("--profile <name>","\u9009\u5B9A\u6A21\u677F\u4E0B\u7684 profile \u4E1A\u52A1\u5305(\u5982 support-qa \u7684 aitable),\u8986\u76D6\u5F0F\u53E0\u52A0\u5230\u5B9E\u4F8B").action(async t=>{try{await Gt({config:t.config,force:!!t.force,yes:!!t.yes,template:t.template,profile:t.profile,templatesDir:Kt.resolve(e.cliDir,"..","templates"),templatePackageVersions:e.packageVersions,cliVersion:e.version})}catch(n){n instanceof Error&&n.message.includes("cancelled")&&process.exit(0),Ht.error("cli","\u521D\u59CB\u5316\u5931\u8D25",{error:n instanceof Error?n.message:String(n)}),process.exit(1)}})}c(Ue,"registerInitCommand");import{runMigrate as qt,logger as Yt}from"aitable-workflow-core";import Vt from"path";function Fe(r,e){r.command("migrate").description("\u5347\u7EA7\u9879\u76EE\u76EE\u5F55\u5230\u6700\u65B0\u6A21\u677F\u7248\u672C\uFF0C\u81EA\u52A8\u4FDD\u7559\u7528\u6237\u914D\u7F6E\uFF1B\u6216\u7528 --from/--to \u5728\u4E24\u4E2A\u76EE\u5F55\u95F4\u505A\u5408\u5E76\u8FC1\u79FB").option("-c, --config <path>","\u9879\u76EE\u76EE\u5F55\u8DEF\u5F84",e.defaultConfig).option("--from <dir>","\u6E90\u76EE\u5F55\uFF1A\u4EE5\u8BE5\u76EE\u5F55\u4E3A\u8FC1\u79FB\u57FA\u51C6\uFF08\u4E0D\u6309\u540D scaffold \u6A21\u677F\uFF09\uFF0C\u4E0E --template/--profile \u4E92\u65A5").option("--to <dir>","\u76EE\u6807\u9879\u76EE\u76EE\u5F55\uFF08--config \u7684\u540C\u4E49\u53C2\u6570\uFF0C\u4F18\u5148\u751F\u6548\uFF09").option("--dry-run","\u4EC5\u9884\u89C8\u53D8\u66F4\uFF0C\u4E0D\u5B9E\u9645\u5199\u5165").option("--no-backup","\u8DF3\u8FC7\u81EA\u52A8\u5907\u4EFD").option("--force","\u8DF3\u8FC7\u786E\u8BA4\u63D0\u793A").option("--template <name>","\u6307\u5B9A\u76EE\u6807\u6A21\u677F").option("--profile <name>","\u6307\u5B9A\u76EE\u6807 profile").option("--rollback","\u56DE\u6EDA\u5230\u4E0A\u4E00\u6B21\u8FC1\u79FB\u524D\u7684\u72B6\u6001").option("--list","\u5217\u51FA\u6240\u6709\u5907\u4EFD").action(async t=>{try{await qt({config:t.config,from:t.from,to:t.to,dryRun:t.dryRun,noBackup:t.backup===!1,force:t.force,template:t.template,profile:t.profile,rollback:t.rollback,list:t.list,templatesDir:Vt.resolve(e.cliDir,"..","templates"),templatePackageVersions:e.packageVersions,cliVersion:e.version})}catch(n){n instanceof Error&&n.message.includes("cancelled")&&process.exit(0),Yt.error("cli","migrate \u5931\u8D25",{error:n instanceof Error?n.message:String(n)}),process.exit(1)}})}c(Fe,"registerMigrateCommand");import{runDesignCommand as Jt,logger as zt}from"aitable-workflow-core";function Be(r,e){r.command("design").description("\u8BA9 Coding Agent \u6839\u636E\u573A\u666F\u63CF\u8FF0\u751F\u6210\u5B8C\u6574\u7684 workflow \u548C recipes").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",e.defaultConfig).option("-y, --yes","\u8DF3\u8FC7\u4EA4\u4E92\u5F0F\u8865\u5145\uFF0C\u76F4\u63A5\u4F7F\u7528 config \u4E2D\u7684 scene").option("--skip-questions","\u4E0D\u56DE\u7B54 Agent \u7684\u6F84\u6E05\u63D0\u95EE\uFF08Agent \u6309\u5047\u8BBE\u751F\u6210\u5E76\u5217\u51FA\u5F85\u786E\u8BA4\u9879\uFF09").action(async t=>{try{await Jt(t)}catch(n){n instanceof Error&&n.message.includes("cancelled")&&process.exit(0),zt.error("cli","design \u5931\u8D25",{error:n instanceof Error?n.message:String(n)}),process.exit(1)}})}c(Be,"registerDesignCommand");import{runCheck as Ne,runSetupCommand as Xt,checkMigrateHint as Qt,logger as Zt}from"aitable-workflow-core";import Ge from"path";function we(r){return r.skipConfig||r.skipConfigIfValid&&r.configValid===!0}c(we,"canSkipSetupConfig");function We(r){return we(r)?"setup":r.uiEnabled&&r.webAvailable?"web":"cli"}c(We,"resolveSetupConfigRoute");function He(r,e){r.command("setup").description("\u6821\u9A8C\u5E76\u8865\u9F50\u9879\u76EE\u914D\u7F6E\uFF0C\u518D\u521D\u59CB\u5316 AI \u8868\u683C\u7ED3\u6784 + \u7F16\u8BD1\u77E5\u8BC6\u5E93 \u2014 \u4E00\u6B21\u5B8C\u6210 config + \u5EFA\u8868").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",e.defaultConfig).option("--no-clean","\u4E0D\u6E05\u7406\u7A7A\u767D\u884C").option("--no-kb","\u8DF3\u8FC7\u77E5\u8BC6\u5E93\u7F16\u8BD1").option("--kb-full","\u5F3A\u5236\u5168\u91CF\u91CD\u7F16\u8BD1\u77E5\u8BC6\u5E93").option("--skip-config","\u8DF3\u8FC7\u524D\u7F6E\u7684\u4EA4\u4E92\u5F0F\u914D\u7F6E\u6821\u9A8C\uFF08CI/\u5DF2\u786E\u8BA4\u914D\u7F6E\u65F6\u4F7F\u7528\uFF09").option("--skip-config-if-valid","\u5148\u6821\u9A8C\u914D\u7F6E\uFF1B\u65E0\u963B\u65AD\u9879\u65F6\u8DF3\u8FC7\u914D\u7F6E\u754C\u9762\u5E76\u76F4\u63A5\u5F00\u59CB\u642D\u5EFA").option("--no-ui","\u5F3A\u5236\u4F7F\u7528\u547D\u4EE4\u884C\u4EA4\u4E92\uFF08\u8DF3\u8FC7\u53EF\u89C6\u5316\u914D\u7F6E\u754C\u9762\uFF09").action(async t=>{try{if(await Qt(Ge.dirname(Ge.resolve(t.config)),e.version),!t.skipConfig){let n=t.ui!==!1,o=!1;if(t.skipConfigIfValid){console.log("\u{1F4CB} \u6B65\u9AA4 1/2\uFF1A\u6821\u9A8C\u9879\u76EE\u914D\u7F6E");let i=await Ne({configPath:t.config});if(o=we({skipConfig:!1,skipConfigIfValid:!0,configValid:i.ok}),o){let s=[];i.summary.warnings>0&&s.push(`${i.summary.warnings} \u9879\u8B66\u544A`),i.summary.suggestions>0&&s.push(`${i.summary.suggestions} \u9879\u5EFA\u8BAE`);let a=s.length>0?`\uFF08${s.join("\uFF0C")}\uFF0C\u5747\u4E0D\u963B\u65AD\uFF09`:"";console.log(`\u2713 \u914D\u7F6E\u65E0\u963B\u65AD\u9879${a}\uFF0C\u8DF3\u8FC7\u914D\u7F6E\u754C\u9762\u5E76\u7EE7\u7EED\u642D\u5EFA\u3002`)}else console.log(`\u2139 \u68C0\u6D4B\u5230 ${i.summary.errors} \u9879\u963B\u65AD\uFF0C\u8FDB\u5165\u914D\u7F6E\u73AF\u8282\u3002`)}if(!o&&n){let{hasWebRoot:i,runConfigUI:s}=await import("./config-ui-server-IYKZDWH4.js");if(We({skipConfig:!1,skipConfigIfValid:t.skipConfigIfValid===!0,uiEnabled:n,webAvailable:i(),configValid:o})==="web"){console.log("\u{1F4CB} \u6B65\u9AA4 1/2\uFF1A\u53EF\u89C6\u5316\u914D\u7F6E\u754C\u9762");try{await s({configPath:t.config}),o=(await Ne({configPath:t.config})).ok}catch(l){console.warn(`
|
|
3
3
|
\u26A0 \u53EF\u89C6\u5316\u754C\u9762\u5F02\u5E38\uFF0C\u56DE\u9000\u5230\u547D\u4EE4\u884C\u4EA4\u4E92: ${l instanceof Error?l.message:String(l)}
|
|
4
4
|
`)}}}if(!o){console.log("\u{1F4CB} \u6B65\u9AA4 1/2\uFF1A\u6821\u9A8C\u5E76\u8865\u9F50\u9879\u76EE\u914D\u7F6E");let{runConfigCommand:i}=await import("./config-command-JNDJNEFV.js");(await i({configPath:t.config,interactive:!0,offerSkipToBuild:!0})).ok||(console.error(`
|
|
5
5
|
\u2717 \u9879\u76EE\u914D\u7F6E\u4ECD\u4E0D\u5B8C\u6574\uFF0C\u5DF2\u4E2D\u6B62 setup\u3002\u8BF7\u8865\u9F50\u5FC5\u586B\u9879\u540E\u91CD\u8BD5\uFF08\u6216\u7528 --skip-config \u8DF3\u8FC7\uFF09\u3002`),process.exit(1))}console.log(`
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{a as Y}from"./chunk-IG7PZYXN.js";import{l as U,n as
|
|
2
|
-
\u2139 \u914D\u7F6E\u754C\u9762\u8D85\u8FC7 30 \u5206\u949F\u65E0\u6D3B\u52A8\uFF0C\u5DF2\u81EA\u52A8\u5173\u95ED\u3002`),
|
|
1
|
+
import{a as Y}from"./chunk-IG7PZYXN.js";import{l as U,n as W,p as F,q as L}from"./chunk-KGQEW2IX.js";import{a as h}from"./chunk-EI7MMDWY.js";import{createServer as rt}from"http";import{stat as z,readFile as E,mkdir as M,writeFile as D,rm as st}from"fs/promises";import{createReadStream as it,existsSync as G}from"fs";import v from"path";import{fileURLToPath as at}from"url";import ct from"crypto";import lt from"os";import B from"yaml";import{runCheck as I,writeBack as K,writeJsonFile as ft,resolveConfigPath as Q,loadSettings as ut,detectCodingEngines as dt,loadWorkflowTemplate as mt,collectEnvRefs as pt,getDefaultAgentEntry as gt,resolveInsideRoot as x,assertPortableId as X}from"aitable-workflow-core";var Z=v.dirname(at(import.meta.url)),ht={".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"},wt=1800*1e3;function yt(){return process.platform==="darwin"||process.platform==="win32"||process.env.DISPLAY||process.env.WAYLAND_DISPLAY?"local-gui":"remote"}h(yt,"detectEnvironment");function q(){let n=v.join(Z,"web");if(G(v.join(n,"index.html")))return n;let e=v.resolve(Z,"..","..","..","web","dist");return G(v.join(e,"index.html"))?e:null}h(q,"resolveWebRoot");function Jt(){return q()!==null}h(Jt,"hasWebRoot");async function tt(n){let{createServer:e}=await import("net");return new Promise((t,r)=>{let i=e();i.listen(n,()=>{let p=i.address(),o=typeof p=="object"&&p?p.port:n;i.close(()=>t(o))}),i.on("error",()=>{n<8800?tt(n+1).then(t,r):r(new Error("\u65E0\u6CD5\u627E\u5230\u53EF\u7528\u7AEF\u53E3 (8788-8800)"))})})}h(tt,"getAvailablePort");var vt=1024*1024,kt=50*1024*1024;async function $(n,e=vt){return new Promise((t,r)=>{let i=[],p=0;n.on("data",o=>{if(p+=o.length,p>e){n.destroy(),r(new Error("Request body too large"));return}i.push(o)}),n.on("end",()=>{try{t(JSON.parse(Buffer.concat(i).toString("utf8")))}catch{r(new Error("Invalid JSON body"))}}),n.on("error",r)})}h($,"readJson");function k(n,e,t=200){let r=JSON.stringify(e);n.writeHead(t,{"Content-Type":"application/json; charset=utf-8","Content-Length":Buffer.byteLength(r)}),n.end(r)}h(k,"sendJson");function T(n,e,t){k(n,{ok:!1,error:t},e)}h(T,"sendError");function P(n){let e=JSON.parse(JSON.stringify(n));for(let t of e.modules){let r=t.workflows?t.workflows.flatMap(i=>i.items):t.items;for(let i of r)i.sensitive&&i.value!==void 0&&(i.value="***")}return e}h(P,"maskSensitive");function H(n){let e=[];for(let t of n.modules)if(t.workflows)for(let r of t.workflows)e.push(...r.items);else e.push(...t.items);return e}h(H,"collectAllItems");function Tt(n,e){for(let t of n){let r=H(e).find(i=>{if(!i.writeTarget)return!1;let p=i.writeTarget,o=t.writeTarget;return p.type!==o.type?!1:p.type==="yaml"&&o.type==="yaml"?p.file===o.file&&JSON.stringify(p.yamlPath)===JSON.stringify(o.yamlPath):!1});if(r&&L(r)&&t.value.trim().length>0)return t.value.trim()}return null}h(Tt,"findSavedBaseId");async function Ut(n){let e=await tt(8788),t=yt(),r=ct.randomUUID(),i=t==="remote"?"0.0.0.0":"127.0.0.1",p=q();if(!p)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 Q(n.configPath),d=v.dirname(o),f=null,m=new Promise(w=>f=w),u=null,c=h(()=>{u&&clearTimeout(u),u=setTimeout(()=>{console.log(`
|
|
2
|
+
\u2139 \u914D\u7F6E\u754C\u9762\u8D85\u8FC7 30 \u5206\u949F\u65E0\u6D3B\u52A8\uFF0C\u5DF2\u81EA\u52A8\u5173\u95ED\u3002`),f?.()},wt)},"resetTimeout"),a=rt(async(w,s)=>{let l=new URL(w.url??"/",`http://${w.headers.host??"localhost"}`),S=w.headers.origin;if(S){let _=`http://127.0.0.1:${e}`;(S===_||t==="remote")&&s.setHeader("Access-Control-Allow-Origin",S)}if(s.setHeader("Access-Control-Allow-Methods","GET, POST, OPTIONS"),s.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization"),w.method==="OPTIONS"){s.writeHead(204),s.end();return}if(l.pathname.startsWith("/dev/")){if((l.searchParams.get("token")??w.headers.authorization?.replace("Bearer ",""))!==r){T(s,401,"Unauthorized");return}c();try{await St(l,w,s,n.configPath,d,f)}catch(b){let A=b instanceof Error?b.message:String(b);T(s,500,A)}return}if(l.pathname.startsWith("/api/")){k(s,{error:{message:"\u914D\u7F6E\u754C\u9762\u4E0D\u63D0\u4F9B /api \u63A5\u53E3"}},404);return}bt(l,s,p)});await new Promise(w=>a.listen(e,i,w)),c();let g=t==="local-gui"?`http://127.0.0.1:${e}/setup?token=${r}`:`http://${lt.hostname()}:${e}/setup?token=${r}`;t==="local-gui"?(Y(g),console.log(`\u2139 \u6D4F\u89C8\u5668\u5DF2\u6253\u5F00: ${g}`)):(console.log("\u2139 \u914D\u7F6E\u754C\u9762\u5DF2\u542F\u52A8\uFF0C\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00:"),console.log(` ${g}`),console.log(`
|
|
3
3
|
\u5982\u679C\u65E0\u6CD5\u76F4\u63A5\u8BBF\u95EE\uFF0C\u53EF\u901A\u8FC7 SSH \u7AEF\u53E3\u8F6C\u53D1:
|
|
4
4
|
ssh -L ${e}:127.0.0.1:${e} <your-host>`),console.log(` \u7136\u540E\u6253\u5F00: http://127.0.0.1:${e}/setup?token=${r}`)),console.log(`
|
|
5
5
|
\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
|
|
6
|
-
`),await m,
|
|
6
|
+
`),await m,u&&clearTimeout(u),a.close()}h(Ut,"runConfigUI");async function St(n,e,t,r,i,p){if(e.method==="GET"&&n.pathname==="/dev/config/check"){let o=await I({configPath:r});k(t,P(o));return}if(e.method==="GET"&&n.pathname==="/dev/config/enriched"){let o=await I({configPath:r}),d=dt(),f=await ut(r),m={},u={},c=new Set,a=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g;try{let s=await Q(r),l=await E(s,"utf8");for(let S of pt([l]))c.add(S)}catch{}try{let s=await E(v.join(i,"profile","profile.yml"),"utf8"),l=B.parse(s),S=l?.workflows;if(S&&typeof S=="object"&&(u=S),l&&typeof l=="object"){let{workflows:_,...b}=l;for(let A of JSON.stringify(b).matchAll(a))c.add(A[1])}}catch{}for(let s of f.workflowEntries)try{let l=await mt(s.templatePath),S=l.steps.map(y=>({id:y.id,name:y.name,recipe:y.recipe,engine:y.engine,auto:y.auto})),_=l.edges.filter(y=>y.from!=="__start__"&&y.to!=="__end__").map(y=>({from:y.from,to:y.to,condition:y.condition})),b={},A=new Set,C;try{C=B.parse(await E(s.templatePath,"utf8"))}catch{}if(C){for(let R of JSON.stringify(C).matchAll(a))A.add(R[1]);let y=u[s.id];if(y&&typeof y=="object")for(let R of JSON.stringify(y).matchAll(a))A.add(R[1]);let et=Array.isArray(C.steps)?C.steps:[];for(let R=0;R<l.steps.length;R++){let j=l.steps[R],O=et[R];if(O){let N=JSON.stringify(O),J=new Set;for(let nt of N.matchAll(a))J.add(nt[1]);J.size>0&&(b[j.id]=[...J])}}let ot=Array.isArray(C.event_sources)?C.event_sources:[];for(let R of ot)if(R){let j=JSON.stringify(R),O=new Set;for(let N of j.matchAll(a))O.add(N[1]);O.size>0&&(b.__event_sources__=[...b.__event_sources__??[],...O])}}m[s.id]={steps:S,edges:_,stepEnvRefs:b,envRefs:[...A].sort()}}catch{m[s.id]={steps:[],edges:[],stepEnvRefs:{},envRefs:[]}}let g=new Set;for(let s of Object.values(m))for(let l of s.envRefs??[])g.add(l);let w=o.modules.find(s=>s.id==="env");for(let s of w?.items??[])s.writeTarget?.type==="env"&&!g.has(s.key)&&c.add(s.key);k(t,{config:P(o),engines:{available:d.available.map(s=>({engine:s.engine,cmd:s.cmd,version:s.version})),recommended:d.recommendedEngine},workflowTopology:m,projectEnvRefs:[...c].sort()});return}if(e.method==="POST"&&n.pathname==="/dev/config/save"){let o=await $(e);if(!Array.isArray(o.updates)){T(t,400,"updates must be an array");return}for(let c of o.updates){let a=[];if(c.writeTarget.type==="yamlAll")for(let g of c.writeTarget.targets)a.push(g.file);else a.push(c.writeTarget.file);for(let g of a)try{x(i,g,{allowRoot:!1})}catch{T(t,403,`\u8DEF\u5F84\u8D8A\u754C: ${g}`);return}}let d=0;for(let c of o.updates)await K(c.writeTarget,c.value,i),d++;let f=await I({configPath:r}),m=Tt(o.updates,f);if(m){let c=0;for(let a of H(f))a.writeTarget&&(a.status==="error"||a.status==="warn")&&L(a)&&F(a)==="baseId"&&(!a.value||typeof a.value=="string"&&!a.value.trim())&&(await K(a.writeTarget,m,i),c++);c>0&&(f=await I({configPath:r}),d+=c)}let u=0;for(let c of H(f))if(c.key==="coding_agent.config.enabled"&&c.status==="error"&&c.writeTarget?.type==="json"){let a=c.writeTarget.jsonPath[1];if(!a)continue;let g=gt(a),w=v.resolve(i,"coding-agents.config.json");for(let[s,l]of Object.entries(g))(typeof l=="string"||typeof l=="boolean")&&await ft(w,["agents",a,s],l);u++}u>0&&(f=await I({configPath:r}),d+=u),k(t,{ok:!0,written:d,recheck:P(f)});return}if(e.method==="POST"&&n.pathname==="/dev/kb/ingest"){let o=await $(e);if(!o.roleId||!o.source){T(t,400,"roleId and source are required");return}try{X(o.roleId,{label:"roleId"})}catch(c){T(t,400,c instanceof Error?c.message:"roleId \u4E0D\u5408\u6CD5");return}let d=v.resolve(i,"roles",`${o.roleId}.role.yml`),f=await W(d,o.roleId),m=await U({source:o.source,collectionName:f,configDir:i}),u=await I({configPath:r});k(t,{ok:m.success,message:m.message,recheck:P(u)});return}if(e.method==="POST"&&n.pathname==="/dev/kb/upload"){let o=await $(e,kt);if(!o.roleId||!Array.isArray(o.files)||o.files.length===0){T(t,400,"roleId and files are required");return}try{X(o.roleId,{label:"roleId"})}catch(u){T(t,400,u instanceof Error?u.message:"roleId \u4E0D\u5408\u6CD5");return}let d=v.resolve(i,"roles",`${o.roleId}.role.yml`),f=await W(d,o.roleId),m=v.resolve(i,".kb-upload-tmp",`upload-${Date.now()}`);try{await M(m,{recursive:!0});for(let a of o.files){let g;try{g=x(m,a.relativePath,{allowRoot:!1})}catch{T(t,400,`\u4E0A\u4F20\u6587\u4EF6\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${a.relativePath}`);return}let w=v.dirname(g);await M(w,{recursive:!0});let s=a.encoding==="base64"?Buffer.from(a.content,"base64"):Buffer.from(a.content,"utf8");await D(g,s)}let u=await U({source:m,collectionName:f,configDir:i}),c=await I({configPath:r});k(t,{ok:u.success,message:u.message,recheck:P(c)})}finally{await st(m,{recursive:!0,force:!0}).catch(()=>{})}return}if(e.method==="GET"&&n.pathname==="/dev/file/read"){let o=n.searchParams.get("path")??"",d=V(o,i);if(!d){T(t,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${o}`);return}try{let f=await E(d,"utf8");k(t,{ok:!0,path:o,content:f,exists:!0})}catch{k(t,{ok:!0,path:o,content:"",exists:!1})}return}if(e.method==="POST"&&n.pathname==="/dev/file/write"){let o=await $(e),d=typeof o.path=="string"?o.path:"",f=V(d,i);if(!f||typeof o.content!="string"){T(t,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${d}`);return}let m=Rt(d,o.content);if(m){k(t,{ok:!1,error:m},400);return}await M(v.dirname(f),{recursive:!0}),await D(f,o.content.endsWith(`
|
|
7
7
|
`)?o.content:o.content+`
|
|
8
|
-
`,"utf8");let
|
|
8
|
+
`,"utf8");let u=await I({configPath:r});k(t,{ok:!0,recheck:P(u)});return}if(e.method==="POST"&&n.pathname==="/dev/setup/complete"){k(t,{ok:!0}),p?.();return}T(t,404,"Unknown endpoint")}h(St,"handleDevApi");function V(n,e){let t=n.trim();if(!t||!/\.(ya?ml|json)$/i.test(t))return null;try{return x(e,t,{allowRoot:!1})}catch{return null}}h(V,"resolveInsideConfigDir");function Rt(n,e){try{return/\.json$/i.test(n)?JSON.parse(e):B.parse(e),null}catch(t){return`${/\.json$/i.test(n)?"JSON":"YAML"} \u8BED\u6CD5\u9519\u8BEF\uFF0C\u672A\u4FDD\u5B58: ${t instanceof Error?t.message:String(t)}`}}h(Rt,"validateStructuredText");async function bt(n,e,t){let r;try{let o=decodeURIComponent(n.pathname).replace(/^\/+/,"")||"index.html";r=x(t,o,{allowRoot:!1})}catch{e.writeHead(403),e.end("Forbidden");return}try{(await z(r)).isDirectory()&&(r=v.join(r,"index.html"))}catch{r=v.join(t,"index.html")}try{await z(r)}catch{e.writeHead(404),e.end("Not Found");return}let i=v.extname(r),p=ht[i]??"application/octet-stream";e.writeHead(200,{"Content-Type":p}),it(r).pipe(e)}h(bt,"serveStatic");export{yt as detectEnvironment,Jt as hasWebRoot,q as resolveWebRoot,Ut as runConfigUI};
|