aitable-workflow-cli 0.1.23 → 0.1.24

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.
Files changed (77) hide show
  1. package/README.md +1 -6
  2. package/dist/{chunk-IGB6WDLR.js → chunk-UNPV6DTX.js} +1 -1
  3. package/dist/cli.js +47 -47
  4. package/dist/config-set-FBOQBRSJ.js +13 -0
  5. package/dist/{config-ui-server-CORDAOYI.js → config-ui-server-IUSACAOT.js} +1 -1
  6. package/package.json +3 -3
  7. package/dist/config-set-EGLLIMVJ.js +0 -13
  8. package/templates/support-qa/.env.example +0 -16
  9. package/templates/support-qa/aitable-workflow.config.yml +0 -46
  10. package/templates/support-qa/coding-agents.config.json +0 -18
  11. package/templates/support-qa/lib/__tests__/declarative-matcher.test.ts +0 -240
  12. package/templates/support-qa/lib/__tests__/dingtalk-group-membership.test.ts +0 -144
  13. package/templates/support-qa/lib/__tests__/memory-events.test.ts +0 -90
  14. package/templates/support-qa/lib/__tests__/sandbox-agent.test.ts +0 -382
  15. package/templates/support-qa/lib/__tests__/thread-adapter.test.ts +0 -242
  16. package/templates/support-qa/lib/__tests__/thread-observe-step.test.ts +0 -391
  17. package/templates/support-qa/lib/__tests__/thread-observer-handler.test.ts +0 -274
  18. package/templates/support-qa/lib/action-dispatch.ts +0 -262
  19. package/templates/support-qa/lib/contract.ts +0 -253
  20. package/templates/support-qa/lib/declarative-matcher.ts +0 -398
  21. package/templates/support-qa/lib/dingtalk-group-membership.ts +0 -158
  22. package/templates/support-qa/lib/guards.ts +0 -18
  23. package/templates/support-qa/lib/memory-events.ts +0 -113
  24. package/templates/support-qa/lib/owner-resolver.ts +0 -94
  25. package/templates/support-qa/lib/preflight.ts +0 -294
  26. package/templates/support-qa/lib/profile.ts +0 -51
  27. package/templates/support-qa/lib/sandbox-agent.ts +0 -653
  28. package/templates/support-qa/lib/thread-adapter.ts +0 -281
  29. package/templates/support-qa/lib/thread-digest.ts +0 -144
  30. package/templates/support-qa/npmrc +0 -1
  31. package/templates/support-qa/package.json +0 -27
  32. package/templates/support-qa/profiles/aitable/profile/escalation/contacts.json +0 -37
  33. package/templates/support-qa/profiles/aitable/profile/escalation/owner-map.json +0 -18
  34. package/templates/support-qa/profiles/aitable/profile/fastpath/known-answers.yml +0 -561
  35. package/templates/support-qa/profiles/aitable/profile/profile.yml +0 -219
  36. package/templates/support-qa/profiles/aitable/profile/prompts/kb-editor.md +0 -3
  37. package/templates/support-qa/profiles/aitable/profile/prompts/persona.md +0 -49
  38. package/templates/support-qa/profiles/aitable/profile/prompts/troubleshooter.md +0 -5
  39. package/templates/support-qa/profiles/aitable/profile/troubleshoot/classifiers.yml +0 -36
  40. package/templates/support-qa/profiles/aitable/skills/troubleshooting/SKILL.md +0 -58
  41. package/templates/support-qa/profiles/aitable/skills/troubleshooting/aitable-import-troubleshooter/SKILL.md +0 -485
  42. package/templates/support-qa/profiles/aitable/skills/troubleshooting/aitable-openapi-troubleshooter/SKILL.md +0 -183
  43. package/templates/support-qa/profiles/aitable/skills/troubleshooting/import-openapi-e2e-troubleshooter/SKILL.md +0 -459
  44. package/templates/support-qa/profiles/aitable/skills/troubleshooting/notable-datasource-troubleshooter/SKILL.md +0 -1286
  45. package/templates/support-qa/profiles/aitable/skills/troubleshooting/notable-field-troubleshooter/SKILL.md +0 -673
  46. package/templates/support-qa/profiles/aitable/skills/troubleshooting/spreadsheet-datasync-troubleshooter/SKILL.md +0 -322
  47. package/templates/support-qa/profiles/default/profile/fastpath/known-answers.yml +0 -32
  48. package/templates/support-qa/profiles/default/profile/profile.yml +0 -217
  49. package/templates/support-qa/profiles/default/profile/troubleshoot/classifiers.yml +0 -37
  50. package/templates/support-qa/profiles/default/wiki/support//345/270/270/350/247/201/351/227/256/351/242/230.md +0 -10
  51. package/templates/support-qa/tsconfig.json +0 -16
  52. package/templates/support-qa/vitest.config.ts +0 -9
  53. package/templates/support-qa/workflows/admin-kb-update/recipes/kb-refine.recipe.ts +0 -137
  54. package/templates/support-qa/workflows/admin-kb-update/recipes/kb_sync_handler.recipe.ts +0 -119
  55. package/templates/support-qa/workflows/admin-kb-update/workflow.yml +0 -96
  56. package/templates/support-qa/workflows/config-sync/recipes/config_sync.recipe.ts +0 -668
  57. package/templates/support-qa/workflows/config-sync/recipes/config_sync_handler.recipe.ts +0 -16
  58. package/templates/support-qa/workflows/config-sync/workflow.yml +0 -62
  59. package/templates/support-qa/workflows/daily-review/recipes/daily_review.recipe.ts +0 -602
  60. package/templates/support-qa/workflows/daily-review/recipes/daily_review_handler.recipe.ts +0 -26
  61. package/templates/support-qa/workflows/daily-review/workflow.yml +0 -65
  62. package/templates/support-qa/workflows/group-qa/recipes/answer.recipe.ts +0 -231
  63. package/templates/support-qa/workflows/group-qa/recipes/conversation_handler.recipe.ts +0 -394
  64. package/templates/support-qa/workflows/group-qa/recipes/fastpath.recipe.ts +0 -72
  65. package/templates/support-qa/workflows/group-qa/recipes/on-action.recipe.ts +0 -225
  66. package/templates/support-qa/workflows/group-qa/recipes/reply-to-group.recipe.ts +0 -202
  67. package/templates/support-qa/workflows/group-qa/recipes/troubleshoot.recipe.ts +0 -273
  68. package/templates/support-qa/workflows/group-qa/workflow.yml +0 -268
  69. package/templates/support-qa/workflows/thread-observer/README.md +0 -96
  70. package/templates/support-qa/workflows/thread-observer/recipes/thread_observe.recipe.ts +0 -415
  71. package/templates/support-qa/workflows/thread-observer/recipes/thread_observer_handler.recipe.ts +0 -213
  72. package/templates/support-qa/workflows/thread-observer/workflow.yml +0 -185
  73. package/templates/support-qa/workspaces/daily-review/AGENTS.md +0 -233
  74. package/templates/support-qa/workspaces/kb-editor/AGENTS.md +0 -32
  75. package/templates/support-qa/workspaces/support/AGENTS.md +0 -156
  76. package/templates/support-qa/workspaces/thread-observer/AGENTS.md +0 -156
  77. package/templates/support-qa/workspaces/troubleshooter/AGENTS.md +0 -71
package/README.md CHANGED
@@ -48,12 +48,7 @@ aitable-workflow setup
48
48
  aitable-workflow run
49
49
  ```
50
50
 
51
- `init` 生成的是**配置骨架**(`aitable-workflow.config.yml`、`coding-agents.config.json`、空 `recipes/`);`workflow.yml` 由 `design` 生成。也可以用内置模板直接脚手架一个可运行项目:
52
-
53
- ```bash
54
- aitable-workflow init --template support-qa --profile aitable
55
- ```
56
-
51
+ `init` 生成的是**配置骨架**(`aitable-workflow.config.yml`、`coding-agents.config.json`、空 `recipes/`);`workflow.yml` 由 `design` 生成。内部发行包如提供场景模板,也可通过 `init --template <name> --profile <name>` 脚手架可运行项目。
57
52
 
58
53
  ## 命令总览
59
54
 
@@ -1,4 +1,4 @@
1
- import{o as pe,q as ge}from"./chunk-4B6V7VHM.js";import{a}from"./chunk-EI7MMDWY.js";import{createServer as eo}from"http";import{stat as Xe,readFile as ie,mkdir as ae,writeFile as Ie,rm as to}from"fs/promises";import{createReadStream as oo,existsSync as et,unlinkSync as no}from"fs";import I from"path";import{fileURLToPath as ro}from"url";import ct from"crypto";import so from"os";import Re from"yaml";import{runCheck as V,resolveConfigPath as lt,loadSettings as io,detectCodingEngines as ao,loadWorkflowTemplate as co,collectEnvRefs as lo,applyConfigSave as uo,ConfigSaveError as po,runSetupCommand as go,resolveInsideRoot as Te,assertPortableId as tt}from"aitable-workflow-core";import{mkdir as Tt,readFile as q,writeFile as Ct}from"fs/promises";import B from"path";import F from"yaml";import{BotProvisioner as Pt,BotProvisionError as Oe,DwsClient as ke,DwsDevRunner as Ae,fetchFields as Se,loadSettings as _e,loadWorkflowTemplate as Et,listDwsConversations as xt,readState as Ot,resetProfileCache as Ne,runDwsCommand as At,runCommand as _t,setupKnowledgeBases as Nt,writeBack as ye,assertPortableId as Gt}from"aitable-workflow-core";import fe from"path";import{closeSync as wt,existsSync as Pe,openSync as ht}from"fs";import{createExecShellToolkit as yt,createStandaloneExecShellToolkit as bt,loadSettings as kt,logger as St,resolveConfigPath as vt,spawnManagedProcess as It}from"aitable-workflow-core";async function Rt(e,n){let t=await vt(e);if(!Pe(t))return{shell:bt(n,{configDir:fe.dirname(t)}),mode:"standalone",bins:{},configPath:t};let o=await kt(e),r=o.raw?.toolkit_config?.shell??{};return{shell:yt(o,n),mode:"project",bins:r.bins??{},configPath:t}}a(Rt,"createToolkitForExec");async function me(e,n,t){let o=fe.resolve(t.logFile),r=fe.dirname(o);if(!Pe(r))throw new Error(`\u65E5\u5FD7\u6587\u4EF6\u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A${r}`);let s=t.bins?.[e]??e,i=ht(o,"w"),c;try{return c=It({command:s,args:n,stdio:["ignore",i,i]}),await new Promise((p,g)=>{let d=c.child,y=a(S=>g(S),"onError");d.once("error",y),d.once("spawn",()=>{d.removeListener("error",y),p()})}),c.unref(),{pid:c.child.pid,logFile:o}}finally{wt(i)}}a(me,"runDetached");function No(e,n){e.command("exec").description("\u9003\u751F\u8231\uFF1A\u5728\u5B9E\u4F8B\u4E0A\u4E0B\u6587\u4E0B\u8BD5\u8DD1\u4E00\u6761\u547D\u4EE4\uFF08\u590D\u7528 shell toolkit \u7684 bins \u89E3\u6790/\u8D85\u65F6/\u8131\u654F\uFF09\uFF0C\u7528\u4E8E dws/git \u547D\u4EE4\u9762 smoke\u3002\u914D\u7F6E\u4E0D\u5B58\u5728\u65F6\u81EA\u52A8\u56DE\u9000\u65E0\u9879\u76EE\u6A21\u5F0F\u3002\u7528\u6CD5\uFF1Aaitable-workflow exec [-c <path>] [--json | --detach <file>] -- <bin> <args...>").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",n.defaultConfig).option("--timeout <ms>","\u5355\u6B21\u6267\u884C\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09").option("--json","\u4EE5 runJson \u65B9\u5F0F\u6267\u884C\uFF1A\u8981\u6C42 exit=0 \u4E14 stdout \u4E3A\u5408\u6CD5 JSON\uFF0C\u6253\u5370\u89E3\u6790\u540E\u7684\u5BF9\u8C61").option("--detach <file>","\u540E\u53F0\u5206\u79BB\u8FD0\u884C\uFF1A\u547D\u4EE4\u8F93\u51FA\u5B9E\u65F6\u5199\u5165\u8BE5\u6587\u4EF6\u5E76\u7ACB\u5373\u8FD4\u56DE\uFF08\u65E0\u8D85\u65F6/\u91CD\u8BD5\uFF09\u3002\u9002\u5408 dws auth login --device \u7B49\u9700\u5728\u8FD0\u884C\u4E2D\u8BFB\u53D6\u8F93\u51FA\u7684\u6D41\u7A0B").allowUnknownOption().argument("<command...>","\u8981\u6267\u884C\u7684\u547D\u4EE4\u53CA\u53C2\u6570\uFF08\u5EFA\u8BAE\u7528 -- \u5206\u9694\uFF09\uFF0C\u5982\uFF1Adws chat group create --name x --format json").action(async(t,o)=>{try{let[r,...s]=t;r||(console.error("\u2717 \u672A\u63D0\u4F9B\u8981\u6267\u884C\u7684\u547D\u4EE4\uFF1B\u7528\u6CD5\uFF1Aaitable-workflow exec [-c <path>] -- <bin> <args...>"),process.exit(1));let i=o.timeout?Number.parseInt(o.timeout,10):void 0;i!==void 0&&(Number.isNaN(i)||i<=0)&&(console.error("\u2717 --timeout \u5FC5\u987B\u662F\u6B63\u6574\u6570\uFF08\u6BEB\u79D2\uFF09"),process.exit(1)),o.detach&&(o.json||i!==void 0)&&(console.error("\u2717 --detach \u4E0E --json / --timeout \u4E92\u65A5\uFF08\u5206\u79BB\u8FD0\u884C\u65E0\u8D85\u65F6\u4E0E JSON \u8BED\u4E49\uFF09"),process.exit(1)),o.json&&St.setLevel("warn");let c=await Rt(o.config,r);if(o.detach){let{pid:g,logFile:d}=await me(r,s,{bins:c.bins,logFile:o.detach});console.log(`\u2713 \u5DF2\u540E\u53F0\u542F\u52A8\uFF08pid ${g}\uFF09\uFF0C\u8F93\u51FA\u5B9E\u65F6\u5199\u5165\uFF1A${d}`),console.error("\u63D0\u793A\uFF1A\u5206\u79BB\u8FD0\u884C\u65E0\u8D85\u65F6\u4E0E\u91CD\u8BD5\u63A7\u5236\uFF0C\u7ED3\u679C\u4EE5\u65E5\u5FD7\u6587\u4EF6\u5185\u5BB9\u4E0E\u5B9E\u9645\u6548\u679C\u4E3A\u51C6\u3002");return}if(o.json){let g=await c.shell.run(r,s,{timeoutMs:i}),d=g.stdout.trim(),y={};if(d!=="")try{y=JSON.parse(d)}catch{console.error("\u2717 exec --json \u5931\u8D25: \u547D\u4EE4\u672A\u8FD4\u56DE\u5408\u6CD5 JSON"),g.stderr&&process.stderr.write(g.stderr),process.exit(1)}console.log(JSON.stringify(y,null,2));return}let p=await c.shell.run(r,s,{timeoutMs:i});p.stdout&&process.stdout.write(p.stdout),p.stderr&&process.stderr.write(p.stderr),p.truncated&&console.error(`
1
+ import{o as pe,q as ge}from"./chunk-4B6V7VHM.js";import{a}from"./chunk-EI7MMDWY.js";import{createServer as eo}from"http";import{stat as Xe,readFile as ie,mkdir as ae,writeFile as Ie,rm as to}from"fs/promises";import{createReadStream as oo,existsSync as et,unlinkSync as no}from"fs";import I from"path";import{fileURLToPath as ro}from"url";import ct from"crypto";import so from"os";import Re from"yaml";import{runCheck as V,resolveConfigPath as lt,loadSettings as io,detectCodingEngines as ao,loadWorkflowTemplate as co,collectEnvRefs as lo,applyConfigSave as uo,ConfigSaveError as po,runSetupCommand as go,resolveInsideRoot as Te,assertPortableId as tt}from"aitable-workflow-core";import{mkdir as Tt,readFile as q,writeFile as Ct}from"fs/promises";import B from"path";import F from"yaml";import{BotProvisioner as Pt,BotProvisionError as Oe,DwsClient as ke,DwsDevRunner as Ae,fetchFields as Se,loadSettings as _e,loadWorkflowTemplate as Et,listDwsConversations as xt,readState as Ot,resetProfileCache as Ne,runDwsCommand as At,runCommand as _t,setupKnowledgeBases as Nt,writeBack as ye,assertPortableId as Gt}from"aitable-workflow-core";import fe from"path";import{closeSync as wt,existsSync as Pe,openSync as ht}from"fs";import{createExecShellToolkit as yt,createStandaloneExecShellToolkit as bt,loadSettings as kt,logger as St,resolveConfigPath as vt,spawnManagedProcess as It}from"aitable-workflow-core";async function Rt(e,n,t={}){let o=await vt(e);if(t.standalone||!Pe(o))return{shell:bt(n,{configDir:fe.dirname(o)}),mode:"standalone",bins:{},configPath:o};let r=await kt(e),s=r.raw?.toolkit_config?.shell??{};return{shell:yt(r,n),mode:"project",bins:s.bins??{},configPath:o}}a(Rt,"createToolkitForExec");async function me(e,n,t){let o=fe.resolve(t.logFile),r=fe.dirname(o);if(!Pe(r))throw new Error(`\u65E5\u5FD7\u6587\u4EF6\u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A${r}`);let s=t.bins?.[e]??e,i=ht(o,"w"),c;try{return c=It({command:s,args:n,stdio:["ignore",i,i]}),await new Promise((p,g)=>{let d=c.child,y=a(S=>g(S),"onError");d.once("error",y),d.once("spawn",()=>{d.removeListener("error",y),p()})}),c.unref(),{pid:c.child.pid,logFile:o}}finally{wt(i)}}a(me,"runDetached");function No(e,n){e.command("exec").description("\u9003\u751F\u8231\uFF1A\u8BD5\u8DD1\u4E00\u6761\u547D\u4EE4\uFF08\u590D\u7528 shell toolkit \u7684 bins \u89E3\u6790/\u8D85\u65F6/\u8131\u654F\uFF09\uFF0C\u7528\u4E8E dws/git \u547D\u4EE4\u9762 smoke\u3002\u914D\u7F6E\u4E0D\u5B58\u5728\u6216\u4F20 --standalone \u65F6\u8FDB\u5165\u65E0\u9879\u76EE\u6A21\u5F0F\u3002\u7528\u6CD5\uFF1Aaitable-workflow exec [-c <path>] [--standalone] [--json | --detach <file>] -- <bin> <args...>").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",n.defaultConfig).option("--standalone","\u663E\u5F0F\u65E0\u9879\u76EE\u6A21\u5F0F\uFF1A\u4E0D\u8BFB\u53D6\u9879\u76EE\u914D\u7F6E\uFF0C\u9002\u5408 bootstrap / design \u4EA7\u7269\u751F\u6210\u524D\u63A2\u6D4B dws").option("--timeout <ms>","\u5355\u6B21\u6267\u884C\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09").option("--json","\u4EE5 runJson \u65B9\u5F0F\u6267\u884C\uFF1A\u8981\u6C42 exit=0 \u4E14 stdout \u4E3A\u5408\u6CD5 JSON\uFF0C\u6253\u5370\u89E3\u6790\u540E\u7684\u5BF9\u8C61").option("--detach <file>","\u540E\u53F0\u5206\u79BB\u8FD0\u884C\uFF1A\u547D\u4EE4\u8F93\u51FA\u5B9E\u65F6\u5199\u5165\u8BE5\u6587\u4EF6\u5E76\u7ACB\u5373\u8FD4\u56DE\uFF08\u65E0\u8D85\u65F6/\u91CD\u8BD5\uFF09\u3002\u9002\u5408 dws auth login --device \u7B49\u9700\u5728\u8FD0\u884C\u4E2D\u8BFB\u53D6\u8F93\u51FA\u7684\u6D41\u7A0B").allowUnknownOption().argument("<command...>","\u8981\u6267\u884C\u7684\u547D\u4EE4\u53CA\u53C2\u6570\uFF08\u5EFA\u8BAE\u7528 -- \u5206\u9694\uFF09\uFF0C\u5982\uFF1Adws chat group create --name x --format json").action(async(t,o)=>{try{let[r,...s]=t;r||(console.error("\u2717 \u672A\u63D0\u4F9B\u8981\u6267\u884C\u7684\u547D\u4EE4\uFF1B\u7528\u6CD5\uFF1Aaitable-workflow exec [-c <path>] -- <bin> <args...>"),process.exit(1));let i=o.timeout?Number.parseInt(o.timeout,10):void 0;i!==void 0&&(Number.isNaN(i)||i<=0)&&(console.error("\u2717 --timeout \u5FC5\u987B\u662F\u6B63\u6574\u6570\uFF08\u6BEB\u79D2\uFF09"),process.exit(1)),o.detach&&(o.json||i!==void 0)&&(console.error("\u2717 --detach \u4E0E --json / --timeout \u4E92\u65A5\uFF08\u5206\u79BB\u8FD0\u884C\u65E0\u8D85\u65F6\u4E0E JSON \u8BED\u4E49\uFF09"),process.exit(1)),o.json&&St.setLevel("warn");let c=await Rt(o.config,r,{standalone:o.standalone===!0});if(o.detach){let{pid:g,logFile:d}=await me(r,s,{bins:c.bins,logFile:o.detach});console.log(`\u2713 \u5DF2\u540E\u53F0\u542F\u52A8\uFF08pid ${g}\uFF09\uFF0C\u8F93\u51FA\u5B9E\u65F6\u5199\u5165\uFF1A${d}`),console.error("\u63D0\u793A\uFF1A\u5206\u79BB\u8FD0\u884C\u65E0\u8D85\u65F6\u4E0E\u91CD\u8BD5\u63A7\u5236\uFF0C\u7ED3\u679C\u4EE5\u65E5\u5FD7\u6587\u4EF6\u5185\u5BB9\u4E0E\u5B9E\u9645\u6548\u679C\u4E3A\u51C6\u3002");return}if(o.json){let g=await c.shell.run(r,s,{timeoutMs:i}),d=g.stdout.trim(),y={};if(d!=="")try{y=JSON.parse(d)}catch{console.error("\u2717 exec --json \u5931\u8D25: \u547D\u4EE4\u672A\u8FD4\u56DE\u5408\u6CD5 JSON"),g.stderr&&process.stderr.write(g.stderr),process.exit(1)}console.log(JSON.stringify(y,null,2));return}let p=await c.shell.run(r,s,{timeoutMs:i});p.stdout&&process.stdout.write(p.stdout),p.stderr&&process.stderr.write(p.stderr),p.truncated&&console.error(`
2
2
  \u26A0\uFE0F \u8F93\u51FA\u56E0\u8D85\u8FC7\u4E0A\u9650\u88AB\u622A\u65AD`),process.exit(p.exitCode??0)}catch(r){console.error(`\u2717 exec \u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),process.exit(1)}})}a(No,"registerExecCommand");async function Ge(e={}){let n=e.list??xt;try{let{conversations:t}=await n({role:"admin"});return{ok:!0,groups:t}}catch(t){return{ok:!1,message:t instanceof Error?t.message:String(t)}}}a(Ge,"listAdminGroups");async function z(e,n){let t={};try{let c=await _e(e,{lenientEnv:!0});for(let p of c.workflowEntries)try{let d=(await Et(p.templatePath,{envSource:c.envSource})).tracker;if(!d)continue;t[p.id]={baseId:String(d.base_id??"").trim(),tableId:String(d.table_id??"").trim(),...d.label?{label:String(d.label)}:{}}}catch{}}catch{}let o=await Be(n),r=Object.values(t),s=Object.values(o);return{ok:!0,ready:r.length>0?r.every(c=>c.baseId&&c.tableId)&&s.every(c=>c.baseId&&c.tableId):r.some(c=>c.baseId&&c.tableId),trackers:t,configTables:o}}a(z,"readSetupArtifacts");async function Be(e){let n={},t=B.resolve(e,"profile","profile.yml"),o;try{o=F.parse(await q(t,"utf8"))}catch{return n}let r=R(o)?o.workflows:void 0;if(!R(r))return n;for(let s of Object.values(r)){let i=R(s)?s.steps:void 0;if(R(i)){for(let c of Object.values(i))if(R(c))for(let[p,g]of Object.entries(c)){if(!R(g))continue;let d="baseId"in g||"base_id"in g,y="tableId"in g||"table_id"in g;!d||!y||(n[p]={baseId:String(g.baseId??g.base_id??"").trim(),tableId:String(g.tableId??g.table_id??"").trim()})}}}return n}a(Be,"readProfileConfigTables");var M="wiki/official-aitable-faq";async function Bt(e,n){let t=B.resolve(e,"profile","profile.yml"),o;try{o=F.parse(await q(t,"utf8"))}catch{return[]}let r=R(o)?o.roles:void 0,s=R(r)?r[n]:void 0,i=R(s)?s.knowledge_scope:void 0,c=R(i)?i.kb_collections:void 0;return Array.isArray(c)?c.map(p=>typeof p=="string"?p:R(p)&&typeof p.collection=="string"?p.collection:null).filter(p=>p!==null):[]}a(Bt,"readRoleCollections");function Ee(e){if(F.isScalar(e))return typeof e.value=="string"?e.value:null;if(F.isMap(e)){let n=e.get("collection",!0);return F.isScalar(n)&&typeof n.value=="string"?n.value:null}return null}a(Ee,"kbEntryValue");async function $t(e,n,t){let o=B.resolve(e,"profile","profile.yml"),r;try{r=await q(o,"utf8")}catch{return{ok:!1,code:"KB_PROFILE_MISSING",message:"profile.yml \u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u5207\u6362\u5B98\u65B9\u77E5\u8BC6\u5E93",collections:[],changed:!1}}let s=F.parseDocument(r),i=s.getIn(["roles",n,"knowledge_scope","kb_collections"],!0);if(!F.isSeq(i))return{ok:!1,code:"KB_ROLE_NOT_FOUND",message:`profile.yml \u4E2D\u672A\u627E\u5230 roles.${n}.knowledge_scope.kb_collections\uFF0C\u65E0\u6CD5\u5207\u6362`,collections:[],changed:!1};let c=i.items.map(Ee).filter(d=>d!==null),p=c.includes(M),g=c.find(d=>d!==M)??null;if(t===p)return{ok:!0,message:t?"\u5B98\u65B9\u77E5\u8BC6\u5E93\u5DF2\u5904\u4E8E\u542F\u7528\u72B6\u6001":"\u5B98\u65B9\u77E5\u8BC6\u5E93\u5DF2\u5904\u4E8E\u5173\u95ED\u72B6\u6001",collections:c,changed:!1};if(!t&&!g)return{ok:!1,code:"KB_LAST_SOURCE",message:"\u5F53\u524D profile \u672A\u58F0\u660E\u7528\u6237\u5E93\uFF0C\u5173\u95ED\u5B98\u65B9\u5E93\u5C06\u5BFC\u81F4\u52A9\u624B\u65E0\u4EFB\u4F55\u77E5\u8BC6\u6765\u6E90",collections:c,changed:!1};if(t)i.add(M);else{let d=i.items.findIndex(y=>Ee(y)===M);d>=0&&i.delete(d)}return await Ct(o,s.toString(),"utf8"),{ok:!0,message:t?"\u5DF2\u542F\u7528\u5B98\u65B9\u77E5\u8BC6\u5E93":"\u5DF2\u5173\u95ED\u5B98\u65B9\u77E5\u8BC6\u5E93",changed:!0,collections:t?[...c,M]:c.filter(d=>d!==M)}}a($t,"writeOfficialToggle");async function $e(e,n,t,o){Gt(t,{label:"roleId"});let r=await $t(n,t,o);if(!r.ok)return{...r,compile:void 0};Ne();let s=o&&r.changed?Ue(e):void 0;return{...r,compile:s}}a($e,"setOfficialKbEnabled");function De(e){return{ok:!0,...Ue(e)}}a(De,"recompileKnowledgeBases");var we=null;function Ue(e){return we?{started:!1}:(we=Ut(e).finally(()=>{we=null}),{started:!0})}a(Ue,"triggerCompile");async function Dt(e,n){let t={};for(let o of n){let r=await Ot(e,o);t[o]=r?{status:r.status,...typeof r.fileCount=="number"?{sourceCount:r.fileCount}:{},...typeof r.compiledCount=="number"?{articleCount:r.compiledCount}:{},...typeof r.finishedAt=="string"?{finishedAt:r.finishedAt}:{}}:{status:"unknown"}}return t}a(Dt,"readKbStats");async function Ut(e){try{let n=await _e(e,{lenientEnv:!0}),t=await Nt({settings:n});return{ok:!t.results.some(r=>r.action==="failed"),collections:t.collections,...t.skippedReason?{skippedReason:t.skippedReason}:{}}}catch(n){return{ok:!1,collections:[],skippedReason:n instanceof Error?n.message:String(n)}}}a(Ut,"recompileKb");async function oe(e){let n=await Vt(e),t={ok:!0,scenario:null,workflowId:null,eventSourceName:null,kbRoleId:null,kb:{userCollection:null,officialOn:!1,stats:{}},groups:[],groupBotsStaging:[],groupTableRef:null};if(!n)return t;let o=jt(n),r=Lt(n),s=o&&r?"group-qa":null,i=r?await Bt(e,r):[],c=o?G(G(n.workflows)?.[o.workflowId]):void 0,p=o?G(G(c?.event_sources)?.[o.eventSourceName]):void 0,d=(await Be(e)).group_table??null;return{ok:!0,scenario:s,workflowId:o?.workflowId??null,eventSourceName:o?.eventSourceName??null,kbRoleId:r,kb:{userCollection:i.find(y=>y!==M)??null,officialOn:i.includes(M),stats:await Dt(e,i)},groups:Qt(p?.conversation_ids),groupBotsStaging:await Ft(e,o?.workflowId??"group-qa"),groupTableRef:d}}a(oe,"readConsoleState");function jt(e){let n=G(e.workflows);if(!n)return null;for(let[t,o]of Object.entries(n)){let r=G(G(o)?.event_sources);if(r){for(let[s,i]of Object.entries(r))if(G(i)&&"conversation_ids"in i)return{workflowId:t,eventSourceName:s}}}return null}a(jt,"locateGroupQa");function Lt(e){let n=G(e.roles);if(!n)return null;for(let[t,o]of Object.entries(n)){let r=G(G(o)?.knowledge_scope);if(Array.isArray(r?.kb_collections)&&r.kb_collections.length>0)return t}return null}a(Lt,"locateKbRole");async function je(e,n,t,o){let r=[...new Set(o.map(p=>p.trim()).filter(Boolean))],s=r.join(`
3
3
  `),i=["workflows",n,"event_sources",t],c=B.join("profile","profile.yml");return await ye({type:"yaml",file:c,yamlPath:[...i,"conversation_ids"],valueType:"string[]"},s,e),await ye({type:"yaml",file:c,yamlPath:[...i,"handler_config","conversation_ids"],valueType:"string[]"},s,e),Ne(),{ok:!0,message:r.length>0?`\u5DF2\u4FDD\u5B58 ${r.length} \u4E2A\u7FA4`:"\u5DF2\u6E05\u7A7A\u7FA4\u5217\u8868"}}a(je,"writeGroupList");var Le="GROUP_BOTS_STAGING";async function re(e){let n=await zt(e,Le);if(!n)return[];try{let t=JSON.parse(n);return Array.isArray(t)?t:[]}catch{return[]}}a(re,"readGroupBotStagingRaw");async function Me(e,n){await ye({type:"env",file:".env",envKey:Le},JSON.stringify(n),e)}a(Me,"writeGroupBotStagingRaw");function Mt(e){return e?e.type==="enterprise"?{type:"enterprise",appKey:e.appKey,...e.name?{name:e.name}:{}}:{type:"custom",name:e.name,webhookUrl:e.webhookUrl}:null}a(Mt,"maskBot");async function ve(e,n,t){let o=t.conversationId.trim();if(!o)return{ok:!1,message:"conversationId \u5FC5\u586B"};let r=await re(e),s=r.findIndex(p=>p.conversationId===o),i=r[s]??{conversationId:o,title:"",enabled:!0,bot:null},c={conversationId:o,title:t.title!==void 0?t.title:i.title,...t.groupType??i.groupType?{groupType:t.groupType??i.groupType}:{},...t.corpId??i.corpId?{corpId:t.corpId??i.corpId}:{},enabled:t.enabled!==void 0?t.enabled:i.enabled,bot:t.bot!==void 0?t.bot:i.bot};return s>=0?r[s]=c:r.push(c),await Me(e,r),{ok:!0,message:"\u5DF2\u4FDD\u5B58"}}a(ve,"saveGroupBotStaging");async function Ft(e,n){return(await re(e)).map(o=>({...o,bot:Mt(o.bot)}))}a(Ft,"readGroupBotStaging");var he="ai\u8868\u683C\u7FA4\u7B54\u7591\u52A9\u624B";function xe(e){return e instanceof Oe?`${e.guidance}
4
4
  \uFF08\u539F\u59CB\u9519\u8BEF\uFF1A${e.message}\uFF09`:e instanceof Error?e.message:String(e)}a(xe,"provisionErrorMessage");async function Fe(){try{return await new Ae().getCurrentCorpId()}catch{return}}a(Fe,"resolveCurrentCorpId");async function Ke(e,n,t,o={}){let r=o.provision??new Pt({runner:new Ae}),s=B.join(e,".env"),i;try{i=await r.resolveEnterpriseRobot({name:he,desc:`${he} - aitable-workflow`,envFile:s})}catch(p){return{ok:!1,message:xe(p)}}let c=!1;try{await r.addBotToGroup(i.appKey,t.conversationId)}catch(p){if(p instanceof Oe&&p.kind==="bot_already_installed")c=!0;else return{ok:!1,message:xe(p)}}return await ve(e,n,{conversationId:t.conversationId,title:t.title,...t.groupType?{groupType:t.groupType}:{},corpId:i.corpId,enabled:!0,bot:{type:"enterprise",appKey:i.appKey,appSecret:i.appSecret,name:he}}),{ok:!0,message:c?"\u8BE5\u7FA4\u5DF2\u5B89\u88C5\u8FC7\u6B64\u673A\u5668\u4EBA\uFF0C\u5DF2\u76F4\u63A5\u8BB0\u5F55\u914D\u7F6E":"\u673A\u5668\u4EBA\u5DF2\u52A0\u5165\u7FA4\u804A"}}a(Ke,"addEnterpriseBotToGroup");function Kt(e){let n=[];for(let t of e){if(!t.enabled||!t.bot)continue;let o={\u7FA4ID:t.conversationId,\u7FA4\u540D\u79F0:t.title,...t.groupType?{\u7FA4\u7C7B\u578B:t.groupType==="internal"?"\u5185\u90E8\u7FA4":"\u5916\u90E8\u7FA4"}:{},...t.corpId?{\u7FA4\u5F52\u5C5E\u4F01\u4E1AcorpId:t.corpId}:{},...t.bot.name?{\u673A\u5668\u4EBA\u6635\u79F0:t.bot.name}:{}};t.bot.type==="enterprise"?n.push({...o,\u5165\u7AD9\u65B9\u5F0F:"stream",\u51FA\u7AD9\u65B9\u5F0F:"session",appKey:t.bot.appKey,...t.bot.appSecret?{appSecret:t.bot.appSecret}:{}}):n.push({...o,\u5165\u7AD9\u65B9\u5F0F:"dws",\u51FA\u7AD9\u65B9\u5F0F:"webhook",webhookUrl:t.bot.webhookUrl,...t.bot.webhookSecret?{webhookSecret:t.bot.webhookSecret}:{}})}return n}a(Kt,"stagingToGroupTableRecords");async function se(e,n,t={}){let o=t.artifacts??await z(e,n),r=o.configTables.group_table,s=r?.baseId?.trim()??"",i=r?.tableId?.trim()??"";if(!s||!i)return{ok:!1,created:0,message:"\u7FA4\u914D\u7F6E\u8868\u5C1A\u672A\u5C31\u7EEA\uFF08\u7F3A baseId/tableId\uFF09\uFF0C\u6682\u5B58\u4FDD\u7559"};let c=a(async()=>{o.ready&&await Me(n,[])},"clearStaging"),p=await re(n),g=Kt(p);if(g.length===0)return await c(),{ok:!0,created:0,message:"\u65E0\u53EF\u5199\u5165\u7684\u7FA4\u673A\u5668\u4EBA\u914D\u7F6E"};let d=t.dws??new ke({bin:"dws",timeoutMs:9e4}),y=t.existingGroupIds??(await be(s,i,{dws:d,fields:t.fields})).groups.map(C=>C.groupId),S=g.filter(C=>!y.includes(C.\u7FA4ID??""));if(S.length===0)return await c(),{ok:!0,created:0,message:"\u6682\u5B58\u5DF2\u5168\u90E8\u5728\u7FA4\u914D\u7F6E\u8868\u4E2D"};let $=t.fields??await Se(d,s,i),j=new Map($.map(C=>[C.fieldName,C.fieldId])),X=S.map(C=>{let l={};for(let[u,m]of Object.entries(C)){let f=j.get(u);f&&(l[f]=m)}return{cells:l}});return await d.runJson(["aitable","record","create","--base-id",s,"--table-id",i,"--records",JSON.stringify(X),"--yes"]),await c(),{ok:!0,created:S.length,message:`\u5DF2\u5199\u5165 ${S.length} \u6761\u7FA4\u914D\u7F6E`}}a(se,"writeStagingToGroupTable");var A={groupId:"\u7FA4ID",groupName:"\u7FA4\u540D\u79F0",groupType:"\u7FA4\u7C7B\u578B",corpId:"\u7FA4\u5F52\u5C5E\u4F01\u4E1AcorpId",inbound:"\u5165\u7AD9\u65B9\u5F0F",outbound:"\u51FA\u7AD9\u65B9\u5F0F",webhookUrl:"webhookUrl",webhookSecret:"webhookSecret",appKey:"appKey",appSecret:"appSecret",botNick:"\u673A\u5668\u4EBA\u6635\u79F0",enabled:"\u662F\u5426\u542F\u7528"};function _(e){if(e==null)return"";if(typeof e=="string")return e.trim();if(typeof e=="number")return String(e);if(typeof e=="boolean")return e?"true":"";if(Array.isArray(e))return e.map(_).filter(Boolean).join(",");if(R(e)){if(typeof e.name=="string")return e.name.trim();if(typeof e.value=="string")return e.value.trim();if(typeof e.text=="string")return e.text.trim()}return""}a(_,"cellToText");function Jt(e){if(e==null||e==="")return!0;let n=_(e).toLowerCase();return["true","1","yes","on","\u662F","\u5F00\u542F","\u542F\u7528","\u5DF2\u52FE\u9009"].includes(n)||(typeof e=="boolean"?e:!1)}a(Jt,"cellToEnabled");function Wt(e){let n=_(e);if(n.includes("\u5185\u90E8"))return"internal";if(n.includes("\u5916\u90E8"))return"external"}a(Wt,"cellToGroupType");function Ht(e){if(!R(e))return[];let t=(R(e.data)?e.data:e).records;return Array.isArray(t)?t:[]}a(Ht,"extractConsoleRecords");async function be(e,n,t={}){if(!e||!n)return{ok:!1,baseId:e,tableId:n,groups:[]};let o=t.dws??new ke({bin:"dws",timeoutMs:9e4}),[r,s]=await Promise.all([t.fields?Promise.resolve(t.fields):Se(o,e,n),o.runJson(["aitable","record","query","--base-id",e,"--table-id",n,"--all","--format","json"])]),i=new Map(r.map(g=>[g.fieldName,g.fieldId])),c=a((g,d)=>{if(d in g)return g[d];let y=i.get(d);return y?g[y]:void 0},"readCol"),p=[];for(let g of Ht(s)){let d=R(g.cells)?g.cells:{},y=_(c(d,A.groupId));if(!y)continue;let S=_(c(d,A.appSecret)),$=_(c(d,A.webhookSecret)),j=Wt(c(d,A.groupType));p.push({recordId:String(g.recordId??g.id??""),groupId:y,groupName:_(c(d,A.groupName)),...j?{groupType:j}:{},corpId:_(c(d,A.corpId)),inbound:_(c(d,A.inbound)),outbound:_(c(d,A.outbound)),webhookUrl:_(c(d,A.webhookUrl)),webhookSecret:$?"***":"",appKey:_(c(d,A.appKey)),appSecret:S?"***":"",botNick:_(c(d,A.botNick)),enabled:Jt(c(d,A.enabled))})}return{ok:!0,baseId:e,tableId:n,groups:p}}a(be,"readGroupConfigTable");async function Je(e,n,t={}){let o=t.artifacts??await z(e,n),r=o.configTables.group_table,s=r?.baseId?.trim()??"",i=r?.tableId?.trim()??"";if(!s||!i)return{ok:!1,baseId:s,tableId:i,groups:[]};let c=await be(s,i,t);if(c.ok&&c.groups.length===0&&(await re(n)).length>0){let g=await se(e,n,{...t,artifacts:o,existingGroupIds:[]});g.ok&&g.created>0&&(c=await be(s,i,t))}return c}a(Je,"readGroupConfigTableForConsole");async function We(e,n,t,o,r={}){if(!e||!n||!t)return{ok:!1,message:"baseId / tableId / recordId \u5FC5\u586B"};let s=r.dws??new ke({bin:"dws",timeoutMs:9e4}),i=r.fields??await Se(s,e,n),c=new Map(i.map(g=>[g.fieldName,g.fieldId])),p={};for(let[g,d]of Object.entries(o)){if(d===void 0)continue;let y=A[g];if(!y)continue;let S=c.get(y)??y;p[S]=d}return Object.keys(p).length===0?{ok:!1,message:"\u65E0\u53EF\u66F4\u65B0\u5B57\u6BB5"}:(await s.runJson(["aitable","record","update","--base-id",e,"--table-id",n,"--records",JSON.stringify([{recordId:t,cells:p}]),"--yes"]),{ok:!0,message:"\u8BB0\u5F55\u5DF2\u66F4\u65B0"})}a(We,"updateGroupConfigRecord");var Yt=["loggedIn","isLoggedIn","isLogin","authenticated","tokenValid","isValid"];function He(e){if(!e||typeof e!="object")return null;let n=e;for(let t of Yt)if(typeof n[t]=="boolean")return n[t];for(let t of Object.values(n)){let o=He(t);if(o!==null)return o}return null}a(He,"findAuthBoolean");async function Ye(e={}){let n=e.bin??"dws",t=e.runner??((o,r)=>_t(o,r,{timeoutMs:15e3}));try{let o=await At(n,["auth","status","--format","json"],{runner:t}),r=`${o.stdout}