bazilion 0.6.0 → 0.8.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.
Files changed (136) hide show
  1. package/README.md +4 -4
  2. package/dist/cli.js +104 -35
  3. package/dist/cli.js.map +1 -1
  4. package/dist/daemon.js +349 -29
  5. package/dist/daemon.js.map +1 -1
  6. package/dist/web/client/assets/AgentAvatar-JYijLvZ2.js +1 -0
  7. package/dist/web/client/assets/AgentTabs-DioGqUVR.js +1 -0
  8. package/dist/web/client/assets/Button-ByiV6fpd.js +1 -0
  9. package/dist/web/client/assets/ChatPane-DzEgOEqS.js +74 -0
  10. package/dist/web/client/assets/ConfigTabs-pY-V0Rie.js +1 -0
  11. package/dist/web/client/assets/FieldRow-CNKma5LE.js +1 -0
  12. package/dist/web/client/assets/MembersEditor-C6UpqDdV.js +1 -0
  13. package/dist/web/client/assets/SpawnTeamModal-BEkNCKXm.js +1 -0
  14. package/dist/web/client/assets/TemplatesTabs-UM04RMO9.js +1 -0
  15. package/dist/web/client/assets/_id-BNJapCT4.js +1 -0
  16. package/dist/web/client/assets/_id-CjGoV8Mr.js +1 -0
  17. package/dist/web/client/assets/_id-DehuCHUw.js +1 -0
  18. package/dist/web/client/assets/_id-Dz9fjcCM.js +1 -0
  19. package/dist/web/client/assets/agents-M6omAXcZ.js +1 -0
  20. package/dist/web/client/assets/config-DIuEc5bm.js +3 -0
  21. package/dist/web/client/assets/groups-DpE2d2zZ.js +1 -0
  22. package/dist/web/client/assets/inbox-BPnLsRNf.js +1 -0
  23. package/dist/web/client/assets/index-MAJuXnie.js +12 -0
  24. package/dist/web/client/assets/jsx-runtime-DGeXAQPT.js +1 -0
  25. package/dist/web/client/assets/login-CawJX16E.js +1 -0
  26. package/dist/web/client/assets/mcp-DIrh9-v_.js +1 -0
  27. package/dist/web/client/assets/memory-BpHbdKsd.js +1 -0
  28. package/dist/web/client/assets/preload-helper-CvnapA2_.js +1 -0
  29. package/dist/web/client/assets/profile-groups-ByoKak0c.js +1 -0
  30. package/dist/web/client/assets/profiles-BEjv8LGo.js +1 -0
  31. package/dist/web/client/assets/routes-D2COHy7v.js +1 -0
  32. package/dist/web/client/assets/services-D212jSK_.js +1 -0
  33. package/dist/web/client/assets/skills-Da0MURjY.js +1 -0
  34. package/dist/web/client/assets/styles-BgE5bCHA.css +2 -0
  35. package/dist/web/client/assets/telegram-Czh2MdVm.js +1 -0
  36. package/dist/web/client/assets/tokens-E_JvO5JN.js +1 -0
  37. package/dist/web/client/assets/triggers-BBRZQOm7.js +1 -0
  38. package/dist/web/client/assets/welcome-Dn-zvmBE.js +1 -0
  39. package/dist/web/server/assets/{_id-C78M9_j9.js → _id-BKev9H1p.js} +2 -2
  40. package/dist/web/server/assets/{_id-Dc8P9sy2.js → _id-BNwlbWHP.js} +1 -1
  41. package/dist/web/server/assets/{_id-GJk3EYTT.js → _id-BdRiQb2H.js} +42 -5
  42. package/dist/web/server/assets/{_id-CrQbC5L8.js → _id-BqnDy_Ca.js} +2 -2
  43. package/dist/web/server/assets/{_id-CHNm7EAd.js → _id-CRqqi8IE.js} +1 -1
  44. package/dist/web/server/assets/{_id-Bm4-_AP-.js → _id-CXg-Blec.js} +1 -1
  45. package/dist/web/server/assets/{_id-BZ-YCWSw.js → _id-CnQflrRv.js} +2 -2
  46. package/dist/web/server/assets/{_id-DF3pfi9M.js → _id-D8duqgd5.js} +1 -1
  47. package/dist/web/server/assets/{_id-pd4S7LTi.js → _id-DDixKEud.js} +1 -1
  48. package/dist/web/server/assets/{_id-CvIGhq4U.js → _id-DUIrFV3G.js} +2 -2
  49. package/dist/web/server/assets/{_id-CGZbudCl.js → _id-D_Ew11ED.js} +1 -1
  50. package/dist/web/server/assets/{_id-Crcw2HhT.js → _id-Sjw0zhA6.js} +1 -1
  51. package/dist/web/server/assets/{_tanstack-start-manifest_v-CPyKYMJg.js → _tanstack-start-manifest_v-D9FLKShQ.js} +45 -41
  52. package/dist/web/server/assets/{agents-70EwQJR6.js → agents-C7SBPN0M.js} +1 -1
  53. package/dist/web/server/assets/{agents-K4Smhnq3.js → agents-ChcAJUI5.js} +2 -2
  54. package/dist/web/server/assets/{agents-Ds4lcREv.js → agents-k5QURC4I.js} +1 -1
  55. package/dist/web/server/assets/{auth-DpAGLHpA.js → auth-DzRAMwVt.js} +1 -1
  56. package/dist/web/server/assets/{config-DxCGYgR9.js → config-Bq3o924J.js} +2 -2
  57. package/dist/web/server/assets/{config-CMXUx_IF.js → config-CHaCv89D.js} +1 -1
  58. package/dist/web/server/assets/{config-DQbCsY_l.js → config-CdVjqjin.js} +18 -9
  59. package/dist/web/server/assets/{createServerRpc-CBTntoKx.js → createServerRpc-CeKECg65.js} +1 -1
  60. package/dist/web/server/assets/{createSsrRpc-DHBVUN8O.js → createSsrRpc-ZBGxhl8t.js} +1 -1
  61. package/dist/web/server/assets/{empty-plugin-adapters-Bos_V2s-.js → empty-plugin-adapters-DKUlnwwl.js} +1 -1
  62. package/dist/web/server/assets/{groups-Cms8cvH5.js → groups-CbSwND2r.js} +2 -2
  63. package/dist/web/server/assets/{groups-CXVew7BP.js → groups-CeRRlZaZ.js} +1 -1
  64. package/dist/web/server/assets/{groups-Dmcvw5ya.js → groups-pk4CYSuf.js} +1 -1
  65. package/dist/web/server/assets/{inbox-0QfwsrGo.js → inbox-Bxb3W04M.js} +2 -2
  66. package/dist/web/server/assets/{inbox-B7UWoICA.js → inbox-CkiSvD14.js} +1 -1
  67. package/dist/web/server/assets/{inbox-8HybA2Ws.js → inbox-DU27iHv_.js} +1 -1
  68. package/dist/web/server/assets/{mcp-DIa0kIOf.js → mcp-BU_kKENi.js} +1 -1
  69. package/dist/web/server/assets/{mcp-DsTjY3uz.js → mcp-BsFKEoXt.js} +1 -1
  70. package/dist/web/server/assets/{mcp-42BrkI1I.js → mcp-CKqwG4mt.js} +2 -2
  71. package/dist/web/server/assets/{memory-Dr0lOM2y.js → memory-BaYnfm7K.js} +1 -1
  72. package/dist/web/server/assets/{memory-BfrMp8iY.js → memory-CQaqWnyM.js} +1 -1
  73. package/dist/web/server/assets/{memory-EEgLDfCj.js → memory-Ns2-Z31p.js} +2 -2
  74. package/dist/web/server/assets/{profile-groups-C5isDI2t.js → profile-groups-CiU06yN1.js} +1 -1
  75. package/dist/web/server/assets/{profile-groups-B_kIT6BU.js → profile-groups-D21MYoLM.js} +1 -1
  76. package/dist/web/server/assets/{profile-groups-BW5gU-fG.js → profile-groups-aoJleXHP.js} +2 -2
  77. package/dist/web/server/assets/{profiles-BbPTpmyq.js → profiles-C6a3RKgu.js} +1 -1
  78. package/dist/web/server/assets/{profiles-Cy5auEj8.js → profiles-CZ5NkmVw.js} +2 -2
  79. package/dist/web/server/assets/{profiles-BP1v-jna.js → profiles-LxcC_L6n.js} +1 -1
  80. package/dist/web/server/assets/{router-CL100-Ly.js → router-BrDascdO.js} +21 -21
  81. package/dist/web/server/assets/{routes-D2H1Hnoh.js → routes-C61gBiXa.js} +1 -1
  82. package/dist/web/server/assets/{routes-Dzk8jvIo.js → routes-Ce2VWrU9.js} +1 -1
  83. package/dist/web/server/assets/{routes-CzJLQxcS.js → routes-V9URcp1v.js} +2 -2
  84. package/dist/web/server/assets/{services-DFenjiw0.js → services-B91w2f-X.js} +1 -1
  85. package/dist/web/server/assets/{services-DEgYsWJ4.js → services-Ccc5s2bS.js} +2 -2
  86. package/dist/web/server/assets/{services-Bgj6M2gC.js → services-DhRiNeq0.js} +1 -1
  87. package/dist/web/server/assets/{skills-BASIP_rT.js → skills-CFIWVg32.js} +1 -1
  88. package/dist/web/server/assets/{skills-DZXN680t.js → skills-D89ND2kR.js} +67 -7
  89. package/dist/web/server/assets/{skills-C-JPRCHh.js → skills-l2cyQ3zS.js} +2 -2
  90. package/dist/web/server/assets/start-CYDpZ6cb.js +4 -0
  91. package/dist/web/server/assets/{telegram-sUckI94O.js → telegram-BdaUIjvs.js} +1 -1
  92. package/dist/web/server/assets/{telegram-BbvqVWxa.js → telegram-DfAddLdv.js} +1 -1
  93. package/dist/web/server/assets/{telegram-Bq49AtnP.js → telegram-T3l9KtiE.js} +2 -2
  94. package/dist/web/server/assets/{tokens-Dwn00iV7.js → tokens-BCz3PSoT.js} +1 -1
  95. package/dist/web/server/assets/{tokens-CImgxhDI.js → tokens-CkKqrtk-.js} +1 -1
  96. package/dist/web/server/assets/{tokens-BERRE0wB.js → tokens-DdpnfV_Y.js} +2 -2
  97. package/dist/web/server/assets/{triggers-TyIjwSYn.js → triggers-BcH_6PW1.js} +1 -1
  98. package/dist/web/server/assets/{triggers-DtexqbNH.js → triggers-BcTTwMfy.js} +2 -2
  99. package/dist/web/server/assets/{triggers-_iSeahif.js → triggers-BzJG1nN5.js} +1 -1
  100. package/dist/web/server/assets/{welcome-BkQ9NC5K.js → welcome-CP4CZ9B6.js} +13 -9
  101. package/dist/web/server/server.js +94 -82
  102. package/dist/worker.js +65 -2
  103. package/dist/worker.js.map +1 -1
  104. package/package.json +17 -17
  105. package/dist/web/client/assets/AgentAvatar-Cq7PVBE_.js +0 -1
  106. package/dist/web/client/assets/AgentTabs-M5K8emJ8.js +0 -1
  107. package/dist/web/client/assets/Button-BefUtjMZ.js +0 -1
  108. package/dist/web/client/assets/ChatPane-C8zQfpzH.js +0 -74
  109. package/dist/web/client/assets/ConfigTabs-DRqAymcN.js +0 -1
  110. package/dist/web/client/assets/FieldRow-BqWnxZiX.js +0 -1
  111. package/dist/web/client/assets/MembersEditor-B-47GLUb.js +0 -1
  112. package/dist/web/client/assets/SpawnTeamModal-DiiC7Nc0.js +0 -1
  113. package/dist/web/client/assets/TemplatesTabs-DB4KERTQ.js +0 -1
  114. package/dist/web/client/assets/_id-B7gv1aPQ.js +0 -1
  115. package/dist/web/client/assets/_id-C7d1AqS0.js +0 -1
  116. package/dist/web/client/assets/_id-DhiwjC8u.js +0 -1
  117. package/dist/web/client/assets/_id-p8lUuNFm.js +0 -1
  118. package/dist/web/client/assets/agents-v8G-wt0M.js +0 -1
  119. package/dist/web/client/assets/config-BdmYpS_y.js +0 -3
  120. package/dist/web/client/assets/groups-DiY_ExGM.js +0 -1
  121. package/dist/web/client/assets/inbox-DtfVx246.js +0 -1
  122. package/dist/web/client/assets/index-BQUL6oyH.js +0 -12
  123. package/dist/web/client/assets/login-CVS70W9g.js +0 -1
  124. package/dist/web/client/assets/mcp-BDLQq8OZ.js +0 -1
  125. package/dist/web/client/assets/memory-6GGuAXwx.js +0 -1
  126. package/dist/web/client/assets/profile-groups-BA8rwZMA.js +0 -1
  127. package/dist/web/client/assets/profiles-C0aAcPZg.js +0 -1
  128. package/dist/web/client/assets/routes-DgAhnKFw.js +0 -1
  129. package/dist/web/client/assets/services-BZ86QEah.js +0 -1
  130. package/dist/web/client/assets/skills-mv_NNNwo.js +0 -1
  131. package/dist/web/client/assets/styles-CmqUskDu.css +0 -2
  132. package/dist/web/client/assets/telegram-5f9WXs3x.js +0 -1
  133. package/dist/web/client/assets/tokens-DHiYsFUh.js +0 -1
  134. package/dist/web/client/assets/triggers-CjC8Ljrz.js +0 -1
  135. package/dist/web/client/assets/welcome-C-Cu-ziL.js +0 -1
  136. package/dist/web/server/assets/start-cOXH7eTI.js +0 -4
package/dist/daemon.js CHANGED
@@ -12518,11 +12518,11 @@ var require_util = __commonJS({
12518
12518
  return false;
12519
12519
  }
12520
12520
  exports.schemaHasRules = schemaHasRules;
12521
- function schemaHasRulesButRef(schema, RULES) {
12521
+ function schemaHasRulesButRef(schema, RULES2) {
12522
12522
  if (typeof schema == "boolean")
12523
12523
  return !schema;
12524
12524
  for (const key2 in schema)
12525
- if (key2 !== "$ref" && RULES.all[key2])
12525
+ if (key2 !== "$ref" && RULES2.all[key2])
12526
12526
  return true;
12527
12527
  return false;
12528
12528
  }
@@ -13916,17 +13916,17 @@ var require_validate = __commonJS({
13916
13916
  }
13917
13917
  function schemaKeywords(it, types, typeErrors, errsCount) {
13918
13918
  const { gen, schema, data, allErrors, opts, self } = it;
13919
- const { RULES } = self;
13920
- if (schema.$ref && (opts.ignoreKeywordsWithRef || !(0, util_1.schemaHasRulesButRef)(schema, RULES))) {
13921
- gen.block(() => keywordCode(it, "$ref", RULES.all.$ref.definition));
13919
+ const { RULES: RULES2 } = self;
13920
+ if (schema.$ref && (opts.ignoreKeywordsWithRef || !(0, util_1.schemaHasRulesButRef)(schema, RULES2))) {
13921
+ gen.block(() => keywordCode(it, "$ref", RULES2.all.$ref.definition));
13922
13922
  return;
13923
13923
  }
13924
13924
  if (!opts.jtd)
13925
13925
  checkStrictTypes(it, types);
13926
13926
  gen.block(() => {
13927
- for (const group of RULES.rules)
13927
+ for (const group of RULES2.rules)
13928
13928
  groupKeywords(group);
13929
- groupKeywords(RULES.post);
13929
+ groupKeywords(RULES2.post);
13930
13930
  });
13931
13931
  function groupKeywords(group) {
13932
13932
  if (!(0, applicability_1.shouldUseGroup)(schema, group))
@@ -15715,10 +15715,10 @@ var require_core = __commonJS({
15715
15715
  }
15716
15716
  // Remove keyword
15717
15717
  removeKeyword(keyword) {
15718
- const { RULES } = this;
15719
- delete RULES.keywords[keyword];
15720
- delete RULES.all[keyword];
15721
- for (const group of RULES.rules) {
15718
+ const { RULES: RULES2 } = this;
15719
+ delete RULES2.keywords[keyword];
15720
+ delete RULES2.all[keyword];
15721
+ for (const group of RULES2.rules) {
15722
15722
  const i = group.rules.findIndex((rule) => rule.keyword === keyword);
15723
15723
  if (i >= 0)
15724
15724
  group.rules.splice(i, 1);
@@ -15886,9 +15886,9 @@ var require_core = __commonJS({
15886
15886
  }
15887
15887
  var KEYWORD_NAME = /^[a-z_$][a-z0-9_$:-]*$/i;
15888
15888
  function checkKeyword(keyword, def) {
15889
- const { RULES } = this;
15889
+ const { RULES: RULES2 } = this;
15890
15890
  (0, util_1.eachItem)(keyword, (kwd) => {
15891
- if (RULES.keywords[kwd])
15891
+ if (RULES2.keywords[kwd])
15892
15892
  throw new Error(`Keyword ${kwd} is already defined`);
15893
15893
  if (!KEYWORD_NAME.test(kwd))
15894
15894
  throw new Error(`Keyword ${kwd} has invalid name`);
@@ -15904,13 +15904,13 @@ var require_core = __commonJS({
15904
15904
  const post = definition === null || definition === void 0 ? void 0 : definition.post;
15905
15905
  if (dataType && post)
15906
15906
  throw new Error('keyword with "post" flag cannot have "type"');
15907
- const { RULES } = this;
15908
- let ruleGroup = post ? RULES.post : RULES.rules.find(({ type: t }) => t === dataType);
15907
+ const { RULES: RULES2 } = this;
15908
+ let ruleGroup = post ? RULES2.post : RULES2.rules.find(({ type: t }) => t === dataType);
15909
15909
  if (!ruleGroup) {
15910
15910
  ruleGroup = { type: dataType, rules: [] };
15911
- RULES.rules.push(ruleGroup);
15911
+ RULES2.rules.push(ruleGroup);
15912
15912
  }
15913
- RULES.keywords[keyword] = true;
15913
+ RULES2.keywords[keyword] = true;
15914
15914
  if (!definition)
15915
15915
  return;
15916
15916
  const rule = {
@@ -15925,7 +15925,7 @@ var require_core = __commonJS({
15925
15925
  addBeforeRule.call(this, ruleGroup, rule, definition.before);
15926
15926
  else
15927
15927
  ruleGroup.rules.push(rule);
15928
- RULES.all[keyword] = rule;
15928
+ RULES2.all[keyword] = rule;
15929
15929
  (_a3 = definition.implements) === null || _a3 === void 0 ? void 0 : _a3.forEach((kwd) => this.addKeyword(kwd));
15930
15930
  }
15931
15931
  function addBeforeRule(ruleGroup, rule, before) {
@@ -20747,9 +20747,16 @@ var SERVICES = [
20747
20747
  id: "moonshotai",
20748
20748
  displayName: "Moonshot AI",
20749
20749
  category: "provider",
20750
- hint: "Kimi K2/K2.5/K2.6 \xB7 platform.moonshot.ai",
20750
+ hint: "Kimi K2/K2.5/K2.6/K2.7 \xB7 platform.moonshot.ai",
20751
20751
  fields: [{ envVar: "MOONSHOT_API_KEY", kind: "secret", label: "API key" }]
20752
20752
  },
20753
+ {
20754
+ id: "moonshotai-cn",
20755
+ displayName: "Moonshot AI (CN)",
20756
+ category: "provider",
20757
+ hint: "Kimi models via the China endpoint \xB7 platform.moonshot.cn",
20758
+ fields: [{ envVar: "MOONSHOT_CN_API_KEY", kind: "secret", label: "API key" }]
20759
+ },
20753
20760
  {
20754
20761
  id: "kimi-coding",
20755
20762
  displayName: "Kimi Coding",
@@ -20761,9 +20768,16 @@ var SERVICES = [
20761
20768
  id: "minimax",
20762
20769
  displayName: "MiniMax",
20763
20770
  category: "provider",
20764
- hint: "MiniMax M2 family \xB7 platform.minimaxi.com",
20771
+ hint: "MiniMax M2/M3 family \xB7 platform.minimaxi.com",
20765
20772
  fields: [{ envVar: "MINIMAX_API_KEY", kind: "secret", label: "API key" }]
20766
20773
  },
20774
+ {
20775
+ id: "minimax-cn",
20776
+ displayName: "MiniMax (CN)",
20777
+ category: "provider",
20778
+ hint: "MiniMax M2/M3 family via the China endpoint",
20779
+ fields: [{ envVar: "MINIMAX_CN_API_KEY", kind: "secret", label: "API key" }]
20780
+ },
20767
20781
  {
20768
20782
  id: "xiaomi",
20769
20783
  displayName: "Xiaomi MiMo",
@@ -20771,12 +20785,54 @@ var SERVICES = [
20771
20785
  hint: "API billing endpoint \xB7 platform.xiaomimimo.com",
20772
20786
  fields: [{ envVar: "XIAOMI_API_KEY", kind: "secret", label: "API key" }]
20773
20787
  },
20788
+ {
20789
+ id: "xiaomi-token-plan-ams",
20790
+ displayName: "Xiaomi MiMo Token Plan (AMS)",
20791
+ category: "provider",
20792
+ hint: "MiMo token-plan endpoint in Amsterdam",
20793
+ fields: [{ envVar: "XIAOMI_TOKEN_PLAN_AMS_API_KEY", kind: "secret", label: "API key" }]
20794
+ },
20795
+ {
20796
+ id: "xiaomi-token-plan-cn",
20797
+ displayName: "Xiaomi MiMo Token Plan (CN)",
20798
+ category: "provider",
20799
+ hint: "MiMo token-plan endpoint in China",
20800
+ fields: [{ envVar: "XIAOMI_TOKEN_PLAN_CN_API_KEY", kind: "secret", label: "API key" }]
20801
+ },
20802
+ {
20803
+ id: "xiaomi-token-plan-sgp",
20804
+ displayName: "Xiaomi MiMo Token Plan (SGP)",
20805
+ category: "provider",
20806
+ hint: "MiMo token-plan endpoint in Singapore",
20807
+ fields: [{ envVar: "XIAOMI_TOKEN_PLAN_SGP_API_KEY", kind: "secret", label: "API key" }]
20808
+ },
20809
+ {
20810
+ id: "ant-ling",
20811
+ displayName: "Ant Ling",
20812
+ category: "provider",
20813
+ hint: "Ling/Ring models \xB7 api.ant-ling.com",
20814
+ fields: [{ envVar: "ANT_LING_API_KEY", kind: "secret", label: "API key" }]
20815
+ },
20816
+ {
20817
+ id: "nvidia",
20818
+ displayName: "NVIDIA NIM",
20819
+ category: "provider",
20820
+ hint: "NVIDIA hosted models \xB7 build.nvidia.com",
20821
+ fields: [{ envVar: "NVIDIA_API_KEY", kind: "secret", label: "API key" }]
20822
+ },
20774
20823
  {
20775
20824
  id: "zai",
20776
20825
  displayName: "zAI",
20777
20826
  category: "provider",
20778
20827
  fields: [{ envVar: "ZAI_API_KEY", kind: "secret", label: "API key" }]
20779
20828
  },
20829
+ {
20830
+ id: "zai-coding-cn",
20831
+ displayName: "zAI Coding (CN)",
20832
+ category: "provider",
20833
+ hint: "GLM coding endpoint \xB7 open.bigmodel.cn",
20834
+ fields: [{ envVar: "ZAI_CODING_CN_API_KEY", kind: "secret", label: "API key" }]
20835
+ },
20780
20836
  {
20781
20837
  id: "huggingface",
20782
20838
  displayName: "Hugging Face",
@@ -20835,6 +20891,13 @@ var SERVICES = [
20835
20891
  hint: "OpenAI-compatible proxy from the OpenCode CLI",
20836
20892
  fields: [{ envVar: "OPENCODE_API_KEY", kind: "secret", label: "API key" }]
20837
20893
  },
20894
+ {
20895
+ id: "opencode-go",
20896
+ displayName: "OpenCode Go",
20897
+ category: "provider",
20898
+ hint: "OpenCode hosted Go endpoint",
20899
+ fields: [{ envVar: "OPENCODE_GO_API_KEY", kind: "secret", label: "API key" }]
20900
+ },
20838
20901
  {
20839
20902
  id: "lmstudio",
20840
20903
  displayName: "LM Studio",
@@ -21675,7 +21738,74 @@ function parseSkillFile(path) {
21675
21738
  return parseSkillContent(raw);
21676
21739
  }
21677
21740
 
21741
+ // ../daemon/src/core/skills/scan.ts
21742
+ var SECRET_ENV_RE = /\b(ANTHROPIC_API_KEY|OPENAI_API_KEY|OPENAI_CODEX_OAUTH|GEMINI_API_KEY|GOOGLE_API_KEY|AWS_ACCESS_KEY_ID|AWS_SECRET_ACCESS_KEY|AZURE_OPENAI_API_KEY|MISTRAL_API_KEY|GROQ_API_KEY|BRAVE_API_KEY|SEARXNG_URL)\b/i;
21743
+ var SENSITIVE_PATH_RE = /(~\/\.(ssh|aws|gnupg|config)|\b(auth\.json|bazilion\.db)\b)/i;
21744
+ var SECRET_TARGET_RE = /(secret|credential|token|api[-_\s]?key|env(?:ironment)?(?: variable)?|private key|ssh key|auth\.json|bazilion\.db|~\/\.(ssh|aws|gnupg))/i;
21745
+ var EXFIL_VERB_RE = /(exfiltrat|send|upload|post|curl|webhook|pastebin|remote server|external server|http endpoint)/i;
21746
+ var UNICODE_STEALTH_RE = /[\u200B-\u200F\u202A-\u202E\u2060-\u206F\uFEFF]/;
21747
+ var RULES = [
21748
+ {
21749
+ code: "sensitive-reference",
21750
+ severity: "danger",
21751
+ message: "Mentions a sensitive path, database, auth file, or credential environment variable.",
21752
+ test: (line) => SENSITIVE_PATH_RE.test(line) || SECRET_ENV_RE.test(line)
21753
+ },
21754
+ {
21755
+ code: "secret-exfiltration",
21756
+ severity: "danger",
21757
+ message: "Combines secret/env/file access with exfiltration-style language.",
21758
+ test: (line) => SECRET_TARGET_RE.test(line) && EXFIL_VERB_RE.test(line)
21759
+ },
21760
+ {
21761
+ code: "instruction-hijack",
21762
+ severity: "danger",
21763
+ message: "Contains instruction-hijacking language such as ignoring prior instructions.",
21764
+ test: (line) => /ignore (all )?(previous|prior|system|developer|user) instructions/i.test(line) || /override (the )?(system|developer) (prompt|instructions)/i.test(line) || /bypass (safety|security|policy|guardrails)/i.test(line) || /you are now (root|unrestricted|in developer mode)/i.test(line)
21765
+ },
21766
+ {
21767
+ code: "unicode-stealth",
21768
+ severity: "warning",
21769
+ message: "Contains zero-width, bidi, or byte-order characters that can hide prompt text.",
21770
+ test: (line) => UNICODE_STEALTH_RE.test(line)
21771
+ }
21772
+ ];
21773
+ function addFinding(findings, seen, finding) {
21774
+ const key2 = `${finding.code}:${finding.line ?? 0}`;
21775
+ if (seen.has(key2)) return;
21776
+ seen.add(key2);
21777
+ findings.push(finding);
21778
+ }
21779
+ function scanSkillContent(raw) {
21780
+ const findings = [];
21781
+ const seen = /* @__PURE__ */ new Set();
21782
+ const lines = raw.split(/\r?\n/);
21783
+ lines.forEach((line, index) => {
21784
+ for (const rule of RULES) {
21785
+ if (!rule.test(line)) continue;
21786
+ addFinding(findings, seen, {
21787
+ code: rule.code,
21788
+ severity: rule.severity,
21789
+ message: rule.message,
21790
+ line: index + 1
21791
+ });
21792
+ }
21793
+ });
21794
+ return findings;
21795
+ }
21796
+
21678
21797
  // ../daemon/src/core/skills/import.ts
21798
+ var SkillScanBlockedError = class extends Error {
21799
+ findings;
21800
+ constructor(findings) {
21801
+ const names = Object.keys(findings).sort();
21802
+ super(
21803
+ `skill scan blocked import: ${names.join(", ")} ${names.length === 1 ? "has" : "have"} findings (rerun with --force to confirm)`
21804
+ );
21805
+ this.name = "SkillScanBlockedError";
21806
+ this.findings = findings;
21807
+ }
21808
+ };
21679
21809
  function extractZipSafely(zipPath) {
21680
21810
  const root = mkdtempSync(join10(tmpdir(), "bazilion-skill-zip-"));
21681
21811
  try {
@@ -21742,8 +21872,14 @@ function importSkillsFromDir(paths, source, input) {
21742
21872
  if (candidates.length === 0) {
21743
21873
  throw new Error(`no skills found in ${source}`);
21744
21874
  }
21875
+ const findingsBySkill = {};
21745
21876
  for (const c of candidates) {
21746
- parseSkillFile(join10(c.dir, "SKILL.md"));
21877
+ const parsed = parseSkillFile(join10(c.dir, "SKILL.md"));
21878
+ const findings = scanSkillContent(parsed.raw);
21879
+ if (findings.length > 0) findingsBySkill[c.name] = findings;
21880
+ }
21881
+ if (Object.keys(findingsBySkill).length > 0 && !input.force) {
21882
+ throw new SkillScanBlockedError(findingsBySkill);
21747
21883
  }
21748
21884
  const imported = [];
21749
21885
  const skipped = [];
@@ -21752,14 +21888,19 @@ function importSkillsFromDir(paths, source, input) {
21752
21888
  if (existsSync8(target) && !input.force) {
21753
21889
  skipped.push({
21754
21890
  name: c.name,
21755
- reason: "already exists (use --force to overwrite)"
21891
+ reason: "already exists (use --force to overwrite)",
21892
+ findings: findingsBySkill[c.name]
21756
21893
  });
21757
21894
  continue;
21758
21895
  }
21759
21896
  cpSync(c.dir, target, { recursive: true, force: !!input.force });
21760
21897
  imported.push(c.name);
21761
21898
  }
21762
- return { imported, skipped };
21899
+ return {
21900
+ imported,
21901
+ skipped,
21902
+ findings: Object.keys(findingsBySkill).length > 0 ? findingsBySkill : void 0
21903
+ };
21763
21904
  }
21764
21905
 
21765
21906
  // ../daemon/src/core/skills/resolve.ts
@@ -22488,10 +22629,25 @@ function loadProviderConfigFromEnv(env = process.env, oauth) {
22488
22629
  if (env.FIREWORKS_API_KEY) config2.fireworks = { apiKey: env.FIREWORKS_API_KEY };
22489
22630
  if (env.TOGETHER_API_KEY) config2.together = { apiKey: env.TOGETHER_API_KEY };
22490
22631
  if (env.MOONSHOT_API_KEY) config2.moonshotai = { apiKey: env.MOONSHOT_API_KEY };
22632
+ if (env.MOONSHOT_CN_API_KEY) config2.moonshotaiCn = { apiKey: env.MOONSHOT_CN_API_KEY };
22491
22633
  if (env.KIMI_API_KEY) config2.kimiCoding = { apiKey: env.KIMI_API_KEY };
22492
22634
  if (env.MINIMAX_API_KEY) config2.minimax = { apiKey: env.MINIMAX_API_KEY };
22635
+ if (env.MINIMAX_CN_API_KEY) config2.minimaxCn = { apiKey: env.MINIMAX_CN_API_KEY };
22493
22636
  if (env.XIAOMI_API_KEY) config2.xiaomi = { apiKey: env.XIAOMI_API_KEY };
22637
+ if (env.XIAOMI_TOKEN_PLAN_AMS_API_KEY) {
22638
+ config2.xiaomiTokenPlanAms = { apiKey: env.XIAOMI_TOKEN_PLAN_AMS_API_KEY };
22639
+ }
22640
+ if (env.XIAOMI_TOKEN_PLAN_CN_API_KEY) {
22641
+ config2.xiaomiTokenPlanCn = { apiKey: env.XIAOMI_TOKEN_PLAN_CN_API_KEY };
22642
+ }
22643
+ if (env.XIAOMI_TOKEN_PLAN_SGP_API_KEY) {
22644
+ config2.xiaomiTokenPlanSgp = { apiKey: env.XIAOMI_TOKEN_PLAN_SGP_API_KEY };
22645
+ }
22646
+ if (env.ANT_LING_API_KEY) config2.antLing = { apiKey: env.ANT_LING_API_KEY };
22647
+ if (env.NVIDIA_API_KEY) config2.nvidia = { apiKey: env.NVIDIA_API_KEY };
22494
22648
  if (env.OPENCODE_API_KEY) config2.opencode = { apiKey: env.OPENCODE_API_KEY };
22649
+ if (env.OPENCODE_GO_API_KEY) config2.opencodeGo = { apiKey: env.OPENCODE_GO_API_KEY };
22650
+ if (env.ZAI_CODING_CN_API_KEY) config2.zaiCodingCn = { apiKey: env.ZAI_CODING_CN_API_KEY };
22495
22651
  if (env.COPILOT_GITHUB_TOKEN) config2.githubCopilot = { apiKey: env.COPILOT_GITHUB_TOKEN };
22496
22652
  if (env.CLOUDFLARE_API_KEY && env.CLOUDFLARE_ACCOUNT_ID) {
22497
22653
  config2.cloudflareWorkersAi = {
@@ -22704,6 +22860,16 @@ var PROVIDERS = {
22704
22860
  }),
22705
22861
  hint: "MOONSHOT_API_KEY"
22706
22862
  },
22863
+ "moonshotai-cn": {
22864
+ configured: (c) => !!c.moonshotaiCn,
22865
+ build: (c) => piProvider({
22866
+ providerName: "moonshotai-cn",
22867
+ fallbackApi: "openai-completions",
22868
+ apiKey: c.moonshotaiCn?.apiKey,
22869
+ baseUrl: c.moonshotaiCn?.baseURL
22870
+ }),
22871
+ hint: "MOONSHOT_CN_API_KEY"
22872
+ },
22707
22873
  "kimi-coding": {
22708
22874
  configured: (c) => !!c.kimiCoding,
22709
22875
  build: (c) => piProvider({
@@ -22724,6 +22890,16 @@ var PROVIDERS = {
22724
22890
  }),
22725
22891
  hint: "MINIMAX_API_KEY"
22726
22892
  },
22893
+ "minimax-cn": {
22894
+ configured: (c) => !!c.minimaxCn,
22895
+ build: (c) => piProvider({
22896
+ providerName: "minimax-cn",
22897
+ fallbackApi: "anthropic-messages",
22898
+ apiKey: c.minimaxCn?.apiKey,
22899
+ baseUrl: c.minimaxCn?.baseURL
22900
+ }),
22901
+ hint: "MINIMAX_CN_API_KEY"
22902
+ },
22727
22903
  xiaomi: {
22728
22904
  configured: (c) => !!c.xiaomi,
22729
22905
  build: (c) => piProvider({
@@ -22734,6 +22910,56 @@ var PROVIDERS = {
22734
22910
  }),
22735
22911
  hint: "XIAOMI_API_KEY"
22736
22912
  },
22913
+ "xiaomi-token-plan-ams": {
22914
+ configured: (c) => !!c.xiaomiTokenPlanAms,
22915
+ build: (c) => piProvider({
22916
+ providerName: "xiaomi-token-plan-ams",
22917
+ fallbackApi: "openai-completions",
22918
+ apiKey: c.xiaomiTokenPlanAms?.apiKey,
22919
+ baseUrl: c.xiaomiTokenPlanAms?.baseURL
22920
+ }),
22921
+ hint: "XIAOMI_TOKEN_PLAN_AMS_API_KEY"
22922
+ },
22923
+ "xiaomi-token-plan-cn": {
22924
+ configured: (c) => !!c.xiaomiTokenPlanCn,
22925
+ build: (c) => piProvider({
22926
+ providerName: "xiaomi-token-plan-cn",
22927
+ fallbackApi: "openai-completions",
22928
+ apiKey: c.xiaomiTokenPlanCn?.apiKey,
22929
+ baseUrl: c.xiaomiTokenPlanCn?.baseURL
22930
+ }),
22931
+ hint: "XIAOMI_TOKEN_PLAN_CN_API_KEY"
22932
+ },
22933
+ "xiaomi-token-plan-sgp": {
22934
+ configured: (c) => !!c.xiaomiTokenPlanSgp,
22935
+ build: (c) => piProvider({
22936
+ providerName: "xiaomi-token-plan-sgp",
22937
+ fallbackApi: "openai-completions",
22938
+ apiKey: c.xiaomiTokenPlanSgp?.apiKey,
22939
+ baseUrl: c.xiaomiTokenPlanSgp?.baseURL
22940
+ }),
22941
+ hint: "XIAOMI_TOKEN_PLAN_SGP_API_KEY"
22942
+ },
22943
+ "ant-ling": {
22944
+ configured: (c) => !!c.antLing,
22945
+ build: (c) => piProvider({
22946
+ providerName: "ant-ling",
22947
+ fallbackApi: "openai-completions",
22948
+ apiKey: c.antLing?.apiKey,
22949
+ baseUrl: c.antLing?.baseURL
22950
+ }),
22951
+ hint: "ANT_LING_API_KEY"
22952
+ },
22953
+ nvidia: {
22954
+ configured: (c) => !!c.nvidia,
22955
+ build: (c) => piProvider({
22956
+ providerName: "nvidia",
22957
+ fallbackApi: "openai-completions",
22958
+ apiKey: c.nvidia?.apiKey,
22959
+ baseUrl: c.nvidia?.baseURL
22960
+ }),
22961
+ hint: "NVIDIA_API_KEY"
22962
+ },
22737
22963
  opencode: {
22738
22964
  configured: (c) => !!c.opencode,
22739
22965
  build: (c) => piProvider({
@@ -22744,6 +22970,26 @@ var PROVIDERS = {
22744
22970
  }),
22745
22971
  hint: "OPENCODE_API_KEY"
22746
22972
  },
22973
+ "opencode-go": {
22974
+ configured: (c) => !!c.opencodeGo,
22975
+ build: (c) => piProvider({
22976
+ providerName: "opencode-go",
22977
+ fallbackApi: "openai-completions",
22978
+ apiKey: c.opencodeGo?.apiKey,
22979
+ baseUrl: c.opencodeGo?.baseURL
22980
+ }),
22981
+ hint: "OPENCODE_GO_API_KEY"
22982
+ },
22983
+ "zai-coding-cn": {
22984
+ configured: (c) => !!c.zaiCodingCn,
22985
+ build: (c) => piProvider({
22986
+ providerName: "zai-coding-cn",
22987
+ fallbackApi: "openai-completions",
22988
+ apiKey: c.zaiCodingCn?.apiKey,
22989
+ baseUrl: c.zaiCodingCn?.baseURL
22990
+ }),
22991
+ hint: "ZAI_CODING_CN_API_KEY"
22992
+ },
22747
22993
  "github-copilot": {
22748
22994
  configured: (c) => !!c.githubCopilot,
22749
22995
  build: (c) => piProvider({
@@ -24425,6 +24671,22 @@ function liveEndpointFor(providerName, env) {
24425
24671
  return "https://api.x.ai/v1";
24426
24672
  case "mistral":
24427
24673
  return "https://api.mistral.ai/v1";
24674
+ case "ant-ling":
24675
+ return "https://api.ant-ling.com/v1";
24676
+ case "moonshotai-cn":
24677
+ return "https://api.moonshot.cn/v1";
24678
+ case "nvidia":
24679
+ return "https://integrate.api.nvidia.com/v1";
24680
+ case "opencode-go":
24681
+ return "https://opencode.ai/zen/go/v1";
24682
+ case "xiaomi-token-plan-ams":
24683
+ return "https://token-plan-ams.xiaomimimo.com/v1";
24684
+ case "xiaomi-token-plan-cn":
24685
+ return "https://token-plan-cn.xiaomimimo.com/v1";
24686
+ case "xiaomi-token-plan-sgp":
24687
+ return "https://token-plan-sgp.xiaomimimo.com/v1";
24688
+ case "zai-coding-cn":
24689
+ return "https://open.bigmodel.cn/api/coding/paas/v4";
24428
24690
  default:
24429
24691
  return null;
24430
24692
  }
@@ -24470,6 +24732,22 @@ function apiKeyFor(providerName, env) {
24470
24732
  return env.XAI_API_KEY;
24471
24733
  case "mistral":
24472
24734
  return env.MISTRAL_API_KEY;
24735
+ case "ant-ling":
24736
+ return env.ANT_LING_API_KEY;
24737
+ case "moonshotai-cn":
24738
+ return env.MOONSHOT_CN_API_KEY;
24739
+ case "nvidia":
24740
+ return env.NVIDIA_API_KEY;
24741
+ case "opencode-go":
24742
+ return env.OPENCODE_GO_API_KEY;
24743
+ case "xiaomi-token-plan-ams":
24744
+ return env.XIAOMI_TOKEN_PLAN_AMS_API_KEY;
24745
+ case "xiaomi-token-plan-cn":
24746
+ return env.XIAOMI_TOKEN_PLAN_CN_API_KEY;
24747
+ case "xiaomi-token-plan-sgp":
24748
+ return env.XIAOMI_TOKEN_PLAN_SGP_API_KEY;
24749
+ case "zai-coding-cn":
24750
+ return env.ZAI_CODING_CN_API_KEY;
24473
24751
  default:
24474
24752
  return void 0;
24475
24753
  }
@@ -25510,7 +25788,7 @@ function shouldNotifyInboundThrottle(agentId) {
25510
25788
  return true;
25511
25789
  }
25512
25790
 
25513
- // ../../node_modules/.pnpm/marked@18.0.4/node_modules/marked/lib/marked.esm.js
25791
+ // ../../node_modules/.pnpm/marked@18.0.5/node_modules/marked/lib/marked.esm.js
25514
25792
  function M() {
25515
25793
  return { async: false, breaks: false, extensions: null, gfm: true, hooks: null, pedantic: false, renderer: null, silent: false, tokenizer: null, walkTokens: null };
25516
25794
  }
@@ -25554,15 +25832,15 @@ var F = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|
25554
25832
  var $e = /^[^\n]+/;
25555
25833
  var U = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/;
25556
25834
  var Le = d(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", U).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex();
25557
- var _e = d(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, j).getRegex();
25835
+ var _e = d(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g, j).getRegex();
25558
25836
  var H = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul";
25559
25837
  var K = /<!--(?:-?>|[\s\S]*?(?:-->|$))/;
25560
25838
  var ze = d("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", K).replace("tag", H).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex();
25561
- var le = d(F).replace("hr", B).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", H).getRegex();
25839
+ var le = d(F).replace("hr", B).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", H).getRegex();
25562
25840
  var Me = d(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", le).getRegex();
25563
25841
  var W = { blockquote: Me, code: we, def: Le, fences: ye, heading: Pe, hr: B, html: ze, lheading: ae, list: _e, newline: Oe, paragraph: le, table: _, text: $e };
25564
25842
  var se = d("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", B).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", H).getRegex();
25565
- var Ee = { ...W, lheading: Se, table: se, paragraph: d(F).replace("hr", B).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", se).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", H).getRegex() };
25843
+ var Ee = { ...W, lheading: Se, table: se, paragraph: d(F).replace("hr", B).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", se).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag", H).getRegex() };
25566
25844
  var Ie = { ...W, html: d(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", K).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: _, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, paragraph: d(F).replace("hr", B).replace("heading", ` *#{1,6} *[^
25567
25845
  ]`).replace("lheading", ae).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() };
25568
25846
  var Ae = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/;
@@ -29758,7 +30036,8 @@ agentsRouter.get("/:id/skills", (c) => {
29758
30036
  name: s.name,
29759
30037
  description: s.parsed.frontmatter.description,
29760
30038
  source: meta2?.source ?? null,
29761
- importedAt: meta2?.importedAt ?? null
30039
+ importedAt: meta2?.importedAt ?? null,
30040
+ scanFindings: scanSkillContent(s.parsed.raw)
29762
30041
  };
29763
30042
  }),
29764
30043
  missing: set.missing
@@ -29773,6 +30052,24 @@ agentsRouter.post("/:id/skills", async (c) => {
29773
30052
  const { db, paths, authToken } = getCtx();
29774
30053
  const agent = agents_exports.get(db, c.req.param("id"));
29775
30054
  if (!agent) return c.json({ error: `agent not found: ${c.req.param("id")}` }, 404);
30055
+ const discovered = discoverSkills(paths).find((s) => s.name === body.skill);
30056
+ if (discovered) {
30057
+ try {
30058
+ const parsed = parseSkillFile(discovered.skillFile);
30059
+ const findings = scanSkillContent(parsed.raw);
30060
+ if (findings.length > 0 && !body.allowFindings) {
30061
+ return c.json(
30062
+ {
30063
+ error: `skill scan blocked attach: ${body.skill} has findings`,
30064
+ code: "skill_scan_blocked",
30065
+ findings
30066
+ },
30067
+ 400
30068
+ );
30069
+ }
30070
+ } catch {
30071
+ }
30072
+ }
29776
30073
  agents_exports.attachSkill(db, agent.id, body.skill);
29777
30074
  return c.body(null, 204);
29778
30075
  });
@@ -31291,6 +31588,7 @@ skillsRouter.get("/", (c) => {
31291
31588
  try {
31292
31589
  const parsed = parseSkillFile(s.skillFile);
31293
31590
  entry.description = parsed.frontmatter.description;
31591
+ entry.scanFindings = scanSkillContent(parsed.raw);
31294
31592
  } catch (err) {
31295
31593
  entry.parseError = err.message;
31296
31594
  }
@@ -31321,14 +31619,36 @@ skillsRouter.post("/import", async (c) => {
31321
31619
  for (const name of result.imported) {
31322
31620
  skillMeta_exports.upsert(db, { name, source: input.sourceLabel, importedAt: now });
31323
31621
  }
31324
- const res = { imported: result.imported, skipped: result.skipped };
31622
+ const res = {
31623
+ imported: result.imported,
31624
+ skipped: result.skipped,
31625
+ findings: result.findings
31626
+ };
31325
31627
  return c.json(res);
31326
31628
  } catch (err) {
31629
+ if (err instanceof SkillScanBlockedError) {
31630
+ return c.json(
31631
+ {
31632
+ error: err.message,
31633
+ code: "skill_scan_blocked",
31634
+ findings: flattenFindings(err.findings)
31635
+ },
31636
+ 400
31637
+ );
31638
+ }
31327
31639
  return c.json({ error: err.message }, 400);
31328
31640
  } finally {
31329
31641
  if (input.tempZipPath) rmSync10(input.tempZipPath, { recursive: true, force: true });
31330
31642
  }
31331
31643
  });
31644
+ function flattenFindings(findings) {
31645
+ return Object.entries(findings).flatMap(
31646
+ ([name, items]) => items.map((item) => ({
31647
+ ...item,
31648
+ message: `${name}: ${item.message}`
31649
+ }))
31650
+ );
31651
+ }
31332
31652
  async function parseImportInput(request) {
31333
31653
  const contentType = request.headers.get("content-type") ?? "";
31334
31654
  if (contentType.startsWith("multipart/form-data")) {