@zenobius/opencode-skillful 1.0.0 → 1.1.0-next.3

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 (3) hide show
  1. package/README.md +605 -48
  2. package/dist/index.js +1914 -487
  3. package/package.json +6 -3
package/dist/index.js CHANGED
@@ -3826,13 +3826,7 @@ var require_searchString = __commonJS((exports, module) => {
3826
3826
  module.exports = SearchString;
3827
3827
  });
3828
3828
 
3829
- // src/index.ts
3830
- import { promises as fsPromises } from "fs";
3831
- import { lstat } from "fs/promises";
3832
- import { join, dirname, basename, sep } from "path";
3833
- import os2 from "os";
3834
-
3835
- // node_modules/zod/v4/classic/external.js
3829
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/classic/external.js
3836
3830
  var exports_external = {};
3837
3831
  __export(exports_external, {
3838
3832
  xid: () => xid2,
@@ -4062,7 +4056,7 @@ __export(exports_external, {
4062
4056
  $brand: () => $brand
4063
4057
  });
4064
4058
 
4065
- // node_modules/zod/v4/core/index.js
4059
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/core/index.js
4066
4060
  var exports_core2 = {};
4067
4061
  __export(exports_core2, {
4068
4062
  version: () => version,
@@ -4326,7 +4320,7 @@ __export(exports_core2, {
4326
4320
  $ZodAny: () => $ZodAny
4327
4321
  });
4328
4322
 
4329
- // node_modules/zod/v4/core/core.js
4323
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/core/core.js
4330
4324
  var NEVER = Object.freeze({
4331
4325
  status: "aborted"
4332
4326
  });
@@ -4393,7 +4387,7 @@ function config(newConfig) {
4393
4387
  Object.assign(globalConfig, newConfig);
4394
4388
  return globalConfig;
4395
4389
  }
4396
- // node_modules/zod/v4/core/util.js
4390
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/core/util.js
4397
4391
  var exports_util = {};
4398
4392
  __export(exports_util, {
4399
4393
  unwrapMessage: () => unwrapMessage,
@@ -5022,7 +5016,7 @@ class Class {
5022
5016
  constructor(..._args) {}
5023
5017
  }
5024
5018
 
5025
- // node_modules/zod/v4/core/errors.js
5019
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/core/errors.js
5026
5020
  var initializer = (inst, def) => {
5027
5021
  inst.name = "$ZodError";
5028
5022
  Object.defineProperty(inst, "_zod", {
@@ -5165,7 +5159,7 @@ function prettifyError(error) {
5165
5159
  `);
5166
5160
  }
5167
5161
 
5168
- // node_modules/zod/v4/core/parse.js
5162
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/core/parse.js
5169
5163
  var _parse = (_Err) => (schema, value, _ctx, _params) => {
5170
5164
  const ctx = _ctx ? Object.assign(_ctx, { async: false }) : { async: false };
5171
5165
  const result = schema._zod.run({ value, issues: [] }, ctx);
@@ -5252,7 +5246,7 @@ var _safeDecodeAsync = (_Err) => async (schema, value, _ctx) => {
5252
5246
  return _safeParseAsync(_Err)(schema, value, _ctx);
5253
5247
  };
5254
5248
  var safeDecodeAsync = /* @__PURE__ */ _safeDecodeAsync($ZodRealError);
5255
- // node_modules/zod/v4/core/regexes.js
5249
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/core/regexes.js
5256
5250
  var exports_regexes = {};
5257
5251
  __export(exports_regexes, {
5258
5252
  xid: () => xid,
@@ -5404,7 +5398,7 @@ var sha512_hex = /^[0-9a-fA-F]{128}$/;
5404
5398
  var sha512_base64 = /* @__PURE__ */ fixedBase64(86, "==");
5405
5399
  var sha512_base64url = /* @__PURE__ */ fixedBase64url(86);
5406
5400
 
5407
- // node_modules/zod/v4/core/checks.js
5401
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/core/checks.js
5408
5402
  var $ZodCheck = /* @__PURE__ */ $constructor("$ZodCheck", (inst, def) => {
5409
5403
  var _a;
5410
5404
  inst._zod ?? (inst._zod = {});
@@ -5945,7 +5939,7 @@ var $ZodCheckOverwrite = /* @__PURE__ */ $constructor("$ZodCheckOverwrite", (ins
5945
5939
  };
5946
5940
  });
5947
5941
 
5948
- // node_modules/zod/v4/core/doc.js
5942
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/core/doc.js
5949
5943
  class Doc {
5950
5944
  constructor(args = []) {
5951
5945
  this.content = [];
@@ -5983,14 +5977,14 @@ class Doc {
5983
5977
  }
5984
5978
  }
5985
5979
 
5986
- // node_modules/zod/v4/core/versions.js
5980
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/core/versions.js
5987
5981
  var version = {
5988
5982
  major: 4,
5989
5983
  minor: 1,
5990
5984
  patch: 8
5991
5985
  };
5992
5986
 
5993
- // node_modules/zod/v4/core/schemas.js
5987
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/core/schemas.js
5994
5988
  var $ZodType = /* @__PURE__ */ $constructor("$ZodType", (inst, def) => {
5995
5989
  var _a;
5996
5990
  inst ?? (inst = {});
@@ -7813,7 +7807,7 @@ function handleRefineResult(result, payload, input, inst) {
7813
7807
  payload.issues.push(issue(_iss));
7814
7808
  }
7815
7809
  }
7816
- // node_modules/zod/v4/locales/index.js
7810
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/index.js
7817
7811
  var exports_locales = {};
7818
7812
  __export(exports_locales, {
7819
7813
  zhTW: () => zh_TW_default,
@@ -7864,7 +7858,7 @@ __export(exports_locales, {
7864
7858
  ar: () => ar_default
7865
7859
  });
7866
7860
 
7867
- // node_modules/zod/v4/locales/ar.js
7861
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/ar.js
7868
7862
  var error = () => {
7869
7863
  const Sizable = {
7870
7864
  string: { unit: "\u062D\u0631\u0641", verb: "\u0623\u0646 \u064A\u062D\u0648\u064A" },
@@ -7980,7 +7974,7 @@ function ar_default() {
7980
7974
  localeError: error()
7981
7975
  };
7982
7976
  }
7983
- // node_modules/zod/v4/locales/az.js
7977
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/az.js
7984
7978
  var error2 = () => {
7985
7979
  const Sizable = {
7986
7980
  string: { unit: "simvol", verb: "olmal\u0131d\u0131r" },
@@ -8095,7 +8089,7 @@ function az_default() {
8095
8089
  localeError: error2()
8096
8090
  };
8097
8091
  }
8098
- // node_modules/zod/v4/locales/be.js
8092
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/be.js
8099
8093
  function getBelarusianPlural(count, one, few, many) {
8100
8094
  const absCount = Math.abs(count);
8101
8095
  const lastDigit = absCount % 10;
@@ -8259,7 +8253,7 @@ function be_default() {
8259
8253
  localeError: error3()
8260
8254
  };
8261
8255
  }
8262
- // node_modules/zod/v4/locales/ca.js
8256
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/ca.js
8263
8257
  var error4 = () => {
8264
8258
  const Sizable = {
8265
8259
  string: { unit: "car\xE0cters", verb: "contenir" },
@@ -8376,7 +8370,7 @@ function ca_default() {
8376
8370
  localeError: error4()
8377
8371
  };
8378
8372
  }
8379
- // node_modules/zod/v4/locales/cs.js
8373
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/cs.js
8380
8374
  var error5 = () => {
8381
8375
  const Sizable = {
8382
8376
  string: { unit: "znak\u016F", verb: "m\xEDt" },
@@ -8511,7 +8505,7 @@ function cs_default() {
8511
8505
  localeError: error5()
8512
8506
  };
8513
8507
  }
8514
- // node_modules/zod/v4/locales/da.js
8508
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/da.js
8515
8509
  var error6 = () => {
8516
8510
  const Sizable = {
8517
8511
  string: { unit: "tegn", verb: "havde" },
@@ -8642,7 +8636,7 @@ function da_default() {
8642
8636
  localeError: error6()
8643
8637
  };
8644
8638
  }
8645
- // node_modules/zod/v4/locales/de.js
8639
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/de.js
8646
8640
  var error7 = () => {
8647
8641
  const Sizable = {
8648
8642
  string: { unit: "Zeichen", verb: "zu haben" },
@@ -8758,7 +8752,7 @@ function de_default() {
8758
8752
  localeError: error7()
8759
8753
  };
8760
8754
  }
8761
- // node_modules/zod/v4/locales/en.js
8755
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/en.js
8762
8756
  var parsedType = (data) => {
8763
8757
  const t = typeof data;
8764
8758
  switch (t) {
@@ -8875,7 +8869,7 @@ function en_default() {
8875
8869
  localeError: error8()
8876
8870
  };
8877
8871
  }
8878
- // node_modules/zod/v4/locales/eo.js
8872
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/eo.js
8879
8873
  var parsedType2 = (data) => {
8880
8874
  const t = typeof data;
8881
8875
  switch (t) {
@@ -8991,7 +8985,7 @@ function eo_default() {
8991
8985
  localeError: error9()
8992
8986
  };
8993
8987
  }
8994
- // node_modules/zod/v4/locales/es.js
8988
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/es.js
8995
8989
  var error10 = () => {
8996
8990
  const Sizable = {
8997
8991
  string: { unit: "caracteres", verb: "tener" },
@@ -9139,7 +9133,7 @@ function es_default() {
9139
9133
  localeError: error10()
9140
9134
  };
9141
9135
  }
9142
- // node_modules/zod/v4/locales/fa.js
9136
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/fa.js
9143
9137
  var error11 = () => {
9144
9138
  const Sizable = {
9145
9139
  string: { unit: "\u06A9\u0627\u0631\u0627\u06A9\u062A\u0631", verb: "\u062F\u0627\u0634\u062A\u0647 \u0628\u0627\u0634\u062F" },
@@ -9261,7 +9255,7 @@ function fa_default() {
9261
9255
  localeError: error11()
9262
9256
  };
9263
9257
  }
9264
- // node_modules/zod/v4/locales/fi.js
9258
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/fi.js
9265
9259
  var error12 = () => {
9266
9260
  const Sizable = {
9267
9261
  string: { unit: "merkki\xE4", subject: "merkkijonon" },
@@ -9383,7 +9377,7 @@ function fi_default() {
9383
9377
  localeError: error12()
9384
9378
  };
9385
9379
  }
9386
- // node_modules/zod/v4/locales/fr.js
9380
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/fr.js
9387
9381
  var error13 = () => {
9388
9382
  const Sizable = {
9389
9383
  string: { unit: "caract\xE8res", verb: "avoir" },
@@ -9499,7 +9493,7 @@ function fr_default() {
9499
9493
  localeError: error13()
9500
9494
  };
9501
9495
  }
9502
- // node_modules/zod/v4/locales/fr-CA.js
9496
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/fr-CA.js
9503
9497
  var error14 = () => {
9504
9498
  const Sizable = {
9505
9499
  string: { unit: "caract\xE8res", verb: "avoir" },
@@ -9616,7 +9610,7 @@ function fr_CA_default() {
9616
9610
  localeError: error14()
9617
9611
  };
9618
9612
  }
9619
- // node_modules/zod/v4/locales/he.js
9613
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/he.js
9620
9614
  var error15 = () => {
9621
9615
  const Sizable = {
9622
9616
  string: { unit: "\u05D0\u05D5\u05EA\u05D9\u05D5\u05EA", verb: "\u05DC\u05DB\u05DC\u05D5\u05DC" },
@@ -9732,7 +9726,7 @@ function he_default() {
9732
9726
  localeError: error15()
9733
9727
  };
9734
9728
  }
9735
- // node_modules/zod/v4/locales/hu.js
9729
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/hu.js
9736
9730
  var error16 = () => {
9737
9731
  const Sizable = {
9738
9732
  string: { unit: "karakter", verb: "legyen" },
@@ -9848,7 +9842,7 @@ function hu_default() {
9848
9842
  localeError: error16()
9849
9843
  };
9850
9844
  }
9851
- // node_modules/zod/v4/locales/id.js
9845
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/id.js
9852
9846
  var error17 = () => {
9853
9847
  const Sizable = {
9854
9848
  string: { unit: "karakter", verb: "memiliki" },
@@ -9964,7 +9958,7 @@ function id_default() {
9964
9958
  localeError: error17()
9965
9959
  };
9966
9960
  }
9967
- // node_modules/zod/v4/locales/is.js
9961
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/is.js
9968
9962
  var parsedType3 = (data) => {
9969
9963
  const t = typeof data;
9970
9964
  switch (t) {
@@ -10081,7 +10075,7 @@ function is_default() {
10081
10075
  localeError: error18()
10082
10076
  };
10083
10077
  }
10084
- // node_modules/zod/v4/locales/it.js
10078
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/it.js
10085
10079
  var error19 = () => {
10086
10080
  const Sizable = {
10087
10081
  string: { unit: "caratteri", verb: "avere" },
@@ -10197,7 +10191,7 @@ function it_default() {
10197
10191
  localeError: error19()
10198
10192
  };
10199
10193
  }
10200
- // node_modules/zod/v4/locales/ja.js
10194
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/ja.js
10201
10195
  var error20 = () => {
10202
10196
  const Sizable = {
10203
10197
  string: { unit: "\u6587\u5B57", verb: "\u3067\u3042\u308B" },
@@ -10312,7 +10306,7 @@ function ja_default() {
10312
10306
  localeError: error20()
10313
10307
  };
10314
10308
  }
10315
- // node_modules/zod/v4/locales/ka.js
10309
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/ka.js
10316
10310
  var parsedType4 = (data) => {
10317
10311
  const t = typeof data;
10318
10312
  switch (t) {
@@ -10437,7 +10431,7 @@ function ka_default() {
10437
10431
  localeError: error21()
10438
10432
  };
10439
10433
  }
10440
- // node_modules/zod/v4/locales/km.js
10434
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/km.js
10441
10435
  var error22 = () => {
10442
10436
  const Sizable = {
10443
10437
  string: { unit: "\u178F\u17BD\u17A2\u1780\u17D2\u179F\u179A", verb: "\u1782\u17BD\u179A\u1798\u17B6\u1793" },
@@ -10555,11 +10549,11 @@ function km_default() {
10555
10549
  };
10556
10550
  }
10557
10551
 
10558
- // node_modules/zod/v4/locales/kh.js
10552
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/kh.js
10559
10553
  function kh_default() {
10560
10554
  return km_default();
10561
10555
  }
10562
- // node_modules/zod/v4/locales/ko.js
10556
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/ko.js
10563
10557
  var error23 = () => {
10564
10558
  const Sizable = {
10565
10559
  string: { unit: "\uBB38\uC790", verb: "to have" },
@@ -10680,7 +10674,7 @@ function ko_default() {
10680
10674
  localeError: error23()
10681
10675
  };
10682
10676
  }
10683
- // node_modules/zod/v4/locales/lt.js
10677
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/lt.js
10684
10678
  var parsedType5 = (data) => {
10685
10679
  const t = typeof data;
10686
10680
  return parsedTypeFromType(t, data);
@@ -10909,7 +10903,7 @@ function lt_default() {
10909
10903
  localeError: error24()
10910
10904
  };
10911
10905
  }
10912
- // node_modules/zod/v4/locales/mk.js
10906
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/mk.js
10913
10907
  var error25 = () => {
10914
10908
  const Sizable = {
10915
10909
  string: { unit: "\u0437\u043D\u0430\u0446\u0438", verb: "\u0434\u0430 \u0438\u043C\u0430\u0430\u0442" },
@@ -11026,7 +11020,7 @@ function mk_default() {
11026
11020
  localeError: error25()
11027
11021
  };
11028
11022
  }
11029
- // node_modules/zod/v4/locales/ms.js
11023
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/ms.js
11030
11024
  var error26 = () => {
11031
11025
  const Sizable = {
11032
11026
  string: { unit: "aksara", verb: "mempunyai" },
@@ -11142,7 +11136,7 @@ function ms_default() {
11142
11136
  localeError: error26()
11143
11137
  };
11144
11138
  }
11145
- // node_modules/zod/v4/locales/nl.js
11139
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/nl.js
11146
11140
  var error27 = () => {
11147
11141
  const Sizable = {
11148
11142
  string: { unit: "tekens" },
@@ -11259,7 +11253,7 @@ function nl_default() {
11259
11253
  localeError: error27()
11260
11254
  };
11261
11255
  }
11262
- // node_modules/zod/v4/locales/no.js
11256
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/no.js
11263
11257
  var error28 = () => {
11264
11258
  const Sizable = {
11265
11259
  string: { unit: "tegn", verb: "\xE5 ha" },
@@ -11375,7 +11369,7 @@ function no_default() {
11375
11369
  localeError: error28()
11376
11370
  };
11377
11371
  }
11378
- // node_modules/zod/v4/locales/ota.js
11372
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/ota.js
11379
11373
  var error29 = () => {
11380
11374
  const Sizable = {
11381
11375
  string: { unit: "harf", verb: "olmal\u0131d\u0131r" },
@@ -11491,7 +11485,7 @@ function ota_default() {
11491
11485
  localeError: error29()
11492
11486
  };
11493
11487
  }
11494
- // node_modules/zod/v4/locales/ps.js
11488
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/ps.js
11495
11489
  var error30 = () => {
11496
11490
  const Sizable = {
11497
11491
  string: { unit: "\u062A\u0648\u06A9\u064A", verb: "\u0648\u0644\u0631\u064A" },
@@ -11613,7 +11607,7 @@ function ps_default() {
11613
11607
  localeError: error30()
11614
11608
  };
11615
11609
  }
11616
- // node_modules/zod/v4/locales/pl.js
11610
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/pl.js
11617
11611
  var error31 = () => {
11618
11612
  const Sizable = {
11619
11613
  string: { unit: "znak\xF3w", verb: "mie\u0107" },
@@ -11730,7 +11724,7 @@ function pl_default() {
11730
11724
  localeError: error31()
11731
11725
  };
11732
11726
  }
11733
- // node_modules/zod/v4/locales/pt.js
11727
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/pt.js
11734
11728
  var error32 = () => {
11735
11729
  const Sizable = {
11736
11730
  string: { unit: "caracteres", verb: "ter" },
@@ -11846,7 +11840,7 @@ function pt_default() {
11846
11840
  localeError: error32()
11847
11841
  };
11848
11842
  }
11849
- // node_modules/zod/v4/locales/ru.js
11843
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/ru.js
11850
11844
  function getRussianPlural(count, one, few, many) {
11851
11845
  const absCount = Math.abs(count);
11852
11846
  const lastDigit = absCount % 10;
@@ -12010,7 +12004,7 @@ function ru_default() {
12010
12004
  localeError: error33()
12011
12005
  };
12012
12006
  }
12013
- // node_modules/zod/v4/locales/sl.js
12007
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/sl.js
12014
12008
  var error34 = () => {
12015
12009
  const Sizable = {
12016
12010
  string: { unit: "znakov", verb: "imeti" },
@@ -12127,7 +12121,7 @@ function sl_default() {
12127
12121
  localeError: error34()
12128
12122
  };
12129
12123
  }
12130
- // node_modules/zod/v4/locales/sv.js
12124
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/sv.js
12131
12125
  var error35 = () => {
12132
12126
  const Sizable = {
12133
12127
  string: { unit: "tecken", verb: "att ha" },
@@ -12245,7 +12239,7 @@ function sv_default() {
12245
12239
  localeError: error35()
12246
12240
  };
12247
12241
  }
12248
- // node_modules/zod/v4/locales/ta.js
12242
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/ta.js
12249
12243
  var error36 = () => {
12250
12244
  const Sizable = {
12251
12245
  string: { unit: "\u0B8E\u0BB4\u0BC1\u0BA4\u0BCD\u0BA4\u0BC1\u0B95\u0BCD\u0B95\u0BB3\u0BCD", verb: "\u0B95\u0BCA\u0BA3\u0BCD\u0B9F\u0BBF\u0BB0\u0BC1\u0B95\u0BCD\u0B95 \u0BB5\u0BC7\u0BA3\u0BCD\u0B9F\u0BC1\u0BAE\u0BCD" },
@@ -12362,7 +12356,7 @@ function ta_default() {
12362
12356
  localeError: error36()
12363
12357
  };
12364
12358
  }
12365
- // node_modules/zod/v4/locales/th.js
12359
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/th.js
12366
12360
  var error37 = () => {
12367
12361
  const Sizable = {
12368
12362
  string: { unit: "\u0E15\u0E31\u0E27\u0E2D\u0E31\u0E01\u0E29\u0E23", verb: "\u0E04\u0E27\u0E23\u0E21\u0E35" },
@@ -12479,7 +12473,7 @@ function th_default() {
12479
12473
  localeError: error37()
12480
12474
  };
12481
12475
  }
12482
- // node_modules/zod/v4/locales/tr.js
12476
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/tr.js
12483
12477
  var parsedType6 = (data) => {
12484
12478
  const t = typeof data;
12485
12479
  switch (t) {
@@ -12594,7 +12588,7 @@ function tr_default() {
12594
12588
  localeError: error38()
12595
12589
  };
12596
12590
  }
12597
- // node_modules/zod/v4/locales/uk.js
12591
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/uk.js
12598
12592
  var error39 = () => {
12599
12593
  const Sizable = {
12600
12594
  string: { unit: "\u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432", verb: "\u043C\u0430\u0442\u0438\u043C\u0435" },
@@ -12711,11 +12705,11 @@ function uk_default() {
12711
12705
  };
12712
12706
  }
12713
12707
 
12714
- // node_modules/zod/v4/locales/ua.js
12708
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/ua.js
12715
12709
  function ua_default() {
12716
12710
  return uk_default();
12717
12711
  }
12718
- // node_modules/zod/v4/locales/ur.js
12712
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/ur.js
12719
12713
  var error40 = () => {
12720
12714
  const Sizable = {
12721
12715
  string: { unit: "\u062D\u0631\u0648\u0641", verb: "\u06C1\u0648\u0646\u0627" },
@@ -12832,7 +12826,7 @@ function ur_default() {
12832
12826
  localeError: error40()
12833
12827
  };
12834
12828
  }
12835
- // node_modules/zod/v4/locales/vi.js
12829
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/vi.js
12836
12830
  var error41 = () => {
12837
12831
  const Sizable = {
12838
12832
  string: { unit: "k\xFD t\u1EF1", verb: "c\xF3" },
@@ -12948,7 +12942,7 @@ function vi_default() {
12948
12942
  localeError: error41()
12949
12943
  };
12950
12944
  }
12951
- // node_modules/zod/v4/locales/zh-CN.js
12945
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/zh-CN.js
12952
12946
  var error42 = () => {
12953
12947
  const Sizable = {
12954
12948
  string: { unit: "\u5B57\u7B26", verb: "\u5305\u542B" },
@@ -13064,7 +13058,7 @@ function zh_CN_default() {
13064
13058
  localeError: error42()
13065
13059
  };
13066
13060
  }
13067
- // node_modules/zod/v4/locales/zh-TW.js
13061
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/zh-TW.js
13068
13062
  var error43 = () => {
13069
13063
  const Sizable = {
13070
13064
  string: { unit: "\u5B57\u5143", verb: "\u64C1\u6709" },
@@ -13181,7 +13175,7 @@ function zh_TW_default() {
13181
13175
  localeError: error43()
13182
13176
  };
13183
13177
  }
13184
- // node_modules/zod/v4/locales/yo.js
13178
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/locales/yo.js
13185
13179
  var error44 = () => {
13186
13180
  const Sizable = {
13187
13181
  string: { unit: "\xE0mi", verb: "n\xED" },
@@ -13296,7 +13290,7 @@ function yo_default() {
13296
13290
  localeError: error44()
13297
13291
  };
13298
13292
  }
13299
- // node_modules/zod/v4/core/registries.js
13293
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/core/registries.js
13300
13294
  var $output = Symbol("ZodOutput");
13301
13295
  var $input = Symbol("ZodInput");
13302
13296
 
@@ -13347,7 +13341,7 @@ function registry() {
13347
13341
  return new $ZodRegistry;
13348
13342
  }
13349
13343
  var globalRegistry = /* @__PURE__ */ registry();
13350
- // node_modules/zod/v4/core/api.js
13344
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/core/api.js
13351
13345
  function _string(Class2, params) {
13352
13346
  return new Class2({
13353
13347
  type: "string",
@@ -14225,7 +14219,7 @@ function _stringFormat(Class2, format, fnOrRegex, _params = {}) {
14225
14219
  const inst = new Class2(def);
14226
14220
  return inst;
14227
14221
  }
14228
- // node_modules/zod/v4/core/to-json-schema.js
14222
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/core/to-json-schema.js
14229
14223
  class JSONSchemaGenerator {
14230
14224
  constructor(params) {
14231
14225
  this.counter = 0;
@@ -15029,9 +15023,9 @@ function isTransforming(_schema, _ctx) {
15029
15023
  }
15030
15024
  throw new Error(`Unknown schema type: ${def.type}`);
15031
15025
  }
15032
- // node_modules/zod/v4/core/json-schema.js
15026
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/core/json-schema.js
15033
15027
  var exports_json_schema = {};
15034
- // node_modules/zod/v4/classic/iso.js
15028
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/classic/iso.js
15035
15029
  var exports_iso = {};
15036
15030
  __export(exports_iso, {
15037
15031
  time: () => time2,
@@ -15072,7 +15066,7 @@ function duration2(params) {
15072
15066
  return _isoDuration(ZodISODuration, params);
15073
15067
  }
15074
15068
 
15075
- // node_modules/zod/v4/classic/errors.js
15069
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/classic/errors.js
15076
15070
  var initializer2 = (inst, issues) => {
15077
15071
  $ZodError.init(inst, issues);
15078
15072
  inst.name = "ZodError";
@@ -15107,7 +15101,7 @@ var ZodRealError = $constructor("ZodError", initializer2, {
15107
15101
  Parent: Error
15108
15102
  });
15109
15103
 
15110
- // node_modules/zod/v4/classic/parse.js
15104
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/classic/parse.js
15111
15105
  var parse4 = /* @__PURE__ */ _parse(ZodRealError);
15112
15106
  var parseAsync2 = /* @__PURE__ */ _parseAsync(ZodRealError);
15113
15107
  var safeParse2 = /* @__PURE__ */ _safeParse(ZodRealError);
@@ -15121,7 +15115,7 @@ var safeDecode2 = /* @__PURE__ */ _safeDecode(ZodRealError);
15121
15115
  var safeEncodeAsync2 = /* @__PURE__ */ _safeEncodeAsync(ZodRealError);
15122
15116
  var safeDecodeAsync2 = /* @__PURE__ */ _safeDecodeAsync(ZodRealError);
15123
15117
 
15124
- // node_modules/zod/v4/classic/schemas.js
15118
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/classic/schemas.js
15125
15119
  var ZodType = /* @__PURE__ */ $constructor("ZodType", (inst, def) => {
15126
15120
  $ZodType.init(inst, def);
15127
15121
  inst.def = def;
@@ -16096,7 +16090,7 @@ function json(params) {
16096
16090
  function preprocess(fn, schema) {
16097
16091
  return pipe(transform(fn), schema);
16098
16092
  }
16099
- // node_modules/zod/v4/classic/compat.js
16093
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/classic/compat.js
16100
16094
  var ZodIssueCode = {
16101
16095
  invalid_type: "invalid_type",
16102
16096
  too_big: "too_big",
@@ -16120,7 +16114,7 @@ function getErrorMap() {
16120
16114
  }
16121
16115
  var ZodFirstPartyTypeKind;
16122
16116
  (function(ZodFirstPartyTypeKind2) {})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));
16123
- // node_modules/zod/v4/classic/coerce.js
16117
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/classic/coerce.js
16124
16118
  var exports_coerce = {};
16125
16119
  __export(exports_coerce, {
16126
16120
  string: () => string3,
@@ -16145,69 +16139,1741 @@ function date4(params) {
16145
16139
  return _coercedDate(ZodDate, params);
16146
16140
  }
16147
16141
 
16148
- // node_modules/zod/v4/classic/external.js
16142
+ // node_modules/@opencode-ai/plugin/node_modules/zod/v4/classic/external.js
16149
16143
  config(en_default());
16150
16144
  // node_modules/@opencode-ai/plugin/dist/tool.js
16151
16145
  function tool(input) {
16152
16146
  return input;
16153
16147
  }
16154
16148
  tool.schema = exports_external;
16155
- // node_modules/env-paths/index.js
16156
- import path from "path";
16157
- import os from "os";
16158
- import process from "process";
16159
- var homedir = os.homedir();
16160
- var tmpdir = os.tmpdir();
16161
- var { env } = process;
16162
- var macos = (name) => {
16163
- const library = path.join(homedir, "Library");
16149
+ // src/lib/OpenCodeChat.ts
16150
+ function createInstructionInjector(ctx) {
16151
+ const sendPrompt = async (text, props) => {
16152
+ await ctx.client.session.prompt({
16153
+ path: { id: props.sessionId },
16154
+ body: {
16155
+ noReply: true,
16156
+ parts: [{ type: "text", text }]
16157
+ }
16158
+ });
16159
+ };
16160
+ return sendPrompt;
16161
+ }
16162
+
16163
+ // src/services/logger.ts
16164
+ var namespace = "[OpencodeSkillful]";
16165
+ function createLogger(config2) {
16166
+ function log(type, ...message) {
16167
+ const timestamp = new Date().toISOString();
16168
+ return [`${namespace}[${type}] ${timestamp} - `, ...message];
16169
+ }
16164
16170
  return {
16165
- data: path.join(library, "Application Support", name),
16166
- config: path.join(library, "Preferences", name),
16167
- cache: path.join(library, "Caches", name),
16168
- log: path.join(library, "Logs", name),
16169
- temp: path.join(tmpdir, name)
16171
+ debug(...message) {
16172
+ if (!config2.debug)
16173
+ return;
16174
+ console.debug(...log("debug", ...message));
16175
+ },
16176
+ log(...message) {
16177
+ console.log(...log("log", ...message));
16178
+ },
16179
+ error(...message) {
16180
+ console.error(...log("error", ...message));
16181
+ },
16182
+ warn(...message) {
16183
+ console.warn(...log("warn", ...message));
16184
+ }
16170
16185
  };
16186
+ }
16187
+
16188
+ // src/services/SkillRegistry.ts
16189
+ var import_gray_matter = __toESM(require_gray_matter(), 1);
16190
+ import { dirname, basename, relative } from "path";
16191
+
16192
+ // src/lib/Identifiers.ts
16193
+ import { sep } from "path";
16194
+ function toolName(skillPath) {
16195
+ return skillPath.replace(/SKILL\.md$/, "").split(sep).filter(Boolean).join("_").replace(/-/g, "_");
16196
+ }
16197
+
16198
+ // src/lib/SkillFs.ts
16199
+ import { join } from "path";
16200
+ import { existsSync } from "fs";
16201
+
16202
+ // node_modules/mime/dist/types/other.js
16203
+ var types = {
16204
+ "application/prs.cww": ["cww"],
16205
+ "application/prs.xsf+xml": ["xsf"],
16206
+ "application/vnd.1000minds.decision-model+xml": ["1km"],
16207
+ "application/vnd.3gpp.pic-bw-large": ["plb"],
16208
+ "application/vnd.3gpp.pic-bw-small": ["psb"],
16209
+ "application/vnd.3gpp.pic-bw-var": ["pvb"],
16210
+ "application/vnd.3gpp2.tcap": ["tcap"],
16211
+ "application/vnd.3m.post-it-notes": ["pwn"],
16212
+ "application/vnd.accpac.simply.aso": ["aso"],
16213
+ "application/vnd.accpac.simply.imp": ["imp"],
16214
+ "application/vnd.acucobol": ["acu"],
16215
+ "application/vnd.acucorp": ["atc", "acutc"],
16216
+ "application/vnd.adobe.air-application-installer-package+zip": ["air"],
16217
+ "application/vnd.adobe.formscentral.fcdt": ["fcdt"],
16218
+ "application/vnd.adobe.fxp": ["fxp", "fxpl"],
16219
+ "application/vnd.adobe.xdp+xml": ["xdp"],
16220
+ "application/vnd.adobe.xfdf": ["*xfdf"],
16221
+ "application/vnd.age": ["age"],
16222
+ "application/vnd.ahead.space": ["ahead"],
16223
+ "application/vnd.airzip.filesecure.azf": ["azf"],
16224
+ "application/vnd.airzip.filesecure.azs": ["azs"],
16225
+ "application/vnd.amazon.ebook": ["azw"],
16226
+ "application/vnd.americandynamics.acc": ["acc"],
16227
+ "application/vnd.amiga.ami": ["ami"],
16228
+ "application/vnd.android.package-archive": ["apk"],
16229
+ "application/vnd.anser-web-certificate-issue-initiation": ["cii"],
16230
+ "application/vnd.anser-web-funds-transfer-initiation": ["fti"],
16231
+ "application/vnd.antix.game-component": ["atx"],
16232
+ "application/vnd.apple.installer+xml": ["mpkg"],
16233
+ "application/vnd.apple.keynote": ["key"],
16234
+ "application/vnd.apple.mpegurl": ["m3u8"],
16235
+ "application/vnd.apple.numbers": ["numbers"],
16236
+ "application/vnd.apple.pages": ["pages"],
16237
+ "application/vnd.apple.pkpass": ["pkpass"],
16238
+ "application/vnd.aristanetworks.swi": ["swi"],
16239
+ "application/vnd.astraea-software.iota": ["iota"],
16240
+ "application/vnd.audiograph": ["aep"],
16241
+ "application/vnd.autodesk.fbx": ["fbx"],
16242
+ "application/vnd.balsamiq.bmml+xml": ["bmml"],
16243
+ "application/vnd.blueice.multipass": ["mpm"],
16244
+ "application/vnd.bmi": ["bmi"],
16245
+ "application/vnd.businessobjects": ["rep"],
16246
+ "application/vnd.chemdraw+xml": ["cdxml"],
16247
+ "application/vnd.chipnuts.karaoke-mmd": ["mmd"],
16248
+ "application/vnd.cinderella": ["cdy"],
16249
+ "application/vnd.citationstyles.style+xml": ["csl"],
16250
+ "application/vnd.claymore": ["cla"],
16251
+ "application/vnd.cloanto.rp9": ["rp9"],
16252
+ "application/vnd.clonk.c4group": ["c4g", "c4d", "c4f", "c4p", "c4u"],
16253
+ "application/vnd.cluetrust.cartomobile-config": ["c11amc"],
16254
+ "application/vnd.cluetrust.cartomobile-config-pkg": ["c11amz"],
16255
+ "application/vnd.commonspace": ["csp"],
16256
+ "application/vnd.contact.cmsg": ["cdbcmsg"],
16257
+ "application/vnd.cosmocaller": ["cmc"],
16258
+ "application/vnd.crick.clicker": ["clkx"],
16259
+ "application/vnd.crick.clicker.keyboard": ["clkk"],
16260
+ "application/vnd.crick.clicker.palette": ["clkp"],
16261
+ "application/vnd.crick.clicker.template": ["clkt"],
16262
+ "application/vnd.crick.clicker.wordbank": ["clkw"],
16263
+ "application/vnd.criticaltools.wbs+xml": ["wbs"],
16264
+ "application/vnd.ctc-posml": ["pml"],
16265
+ "application/vnd.cups-ppd": ["ppd"],
16266
+ "application/vnd.curl.car": ["car"],
16267
+ "application/vnd.curl.pcurl": ["pcurl"],
16268
+ "application/vnd.dart": ["dart"],
16269
+ "application/vnd.data-vision.rdz": ["rdz"],
16270
+ "application/vnd.dbf": ["dbf"],
16271
+ "application/vnd.dcmp+xml": ["dcmp"],
16272
+ "application/vnd.dece.data": ["uvf", "uvvf", "uvd", "uvvd"],
16273
+ "application/vnd.dece.ttml+xml": ["uvt", "uvvt"],
16274
+ "application/vnd.dece.unspecified": ["uvx", "uvvx"],
16275
+ "application/vnd.dece.zip": ["uvz", "uvvz"],
16276
+ "application/vnd.denovo.fcselayout-link": ["fe_launch"],
16277
+ "application/vnd.dna": ["dna"],
16278
+ "application/vnd.dolby.mlp": ["mlp"],
16279
+ "application/vnd.dpgraph": ["dpg"],
16280
+ "application/vnd.dreamfactory": ["dfac"],
16281
+ "application/vnd.ds-keypoint": ["kpxx"],
16282
+ "application/vnd.dvb.ait": ["ait"],
16283
+ "application/vnd.dvb.service": ["svc"],
16284
+ "application/vnd.dynageo": ["geo"],
16285
+ "application/vnd.ecowin.chart": ["mag"],
16286
+ "application/vnd.enliven": ["nml"],
16287
+ "application/vnd.epson.esf": ["esf"],
16288
+ "application/vnd.epson.msf": ["msf"],
16289
+ "application/vnd.epson.quickanime": ["qam"],
16290
+ "application/vnd.epson.salt": ["slt"],
16291
+ "application/vnd.epson.ssf": ["ssf"],
16292
+ "application/vnd.eszigno3+xml": ["es3", "et3"],
16293
+ "application/vnd.ezpix-album": ["ez2"],
16294
+ "application/vnd.ezpix-package": ["ez3"],
16295
+ "application/vnd.fdf": ["*fdf"],
16296
+ "application/vnd.fdsn.mseed": ["mseed"],
16297
+ "application/vnd.fdsn.seed": ["seed", "dataless"],
16298
+ "application/vnd.flographit": ["gph"],
16299
+ "application/vnd.fluxtime.clip": ["ftc"],
16300
+ "application/vnd.framemaker": ["fm", "frame", "maker", "book"],
16301
+ "application/vnd.frogans.fnc": ["fnc"],
16302
+ "application/vnd.frogans.ltf": ["ltf"],
16303
+ "application/vnd.fsc.weblaunch": ["fsc"],
16304
+ "application/vnd.fujitsu.oasys": ["oas"],
16305
+ "application/vnd.fujitsu.oasys2": ["oa2"],
16306
+ "application/vnd.fujitsu.oasys3": ["oa3"],
16307
+ "application/vnd.fujitsu.oasysgp": ["fg5"],
16308
+ "application/vnd.fujitsu.oasysprs": ["bh2"],
16309
+ "application/vnd.fujixerox.ddd": ["ddd"],
16310
+ "application/vnd.fujixerox.docuworks": ["xdw"],
16311
+ "application/vnd.fujixerox.docuworks.binder": ["xbd"],
16312
+ "application/vnd.fuzzysheet": ["fzs"],
16313
+ "application/vnd.genomatix.tuxedo": ["txd"],
16314
+ "application/vnd.geogebra.file": ["ggb"],
16315
+ "application/vnd.geogebra.slides": ["ggs"],
16316
+ "application/vnd.geogebra.tool": ["ggt"],
16317
+ "application/vnd.geometry-explorer": ["gex", "gre"],
16318
+ "application/vnd.geonext": ["gxt"],
16319
+ "application/vnd.geoplan": ["g2w"],
16320
+ "application/vnd.geospace": ["g3w"],
16321
+ "application/vnd.gmx": ["gmx"],
16322
+ "application/vnd.google-apps.document": ["gdoc"],
16323
+ "application/vnd.google-apps.drawing": ["gdraw"],
16324
+ "application/vnd.google-apps.form": ["gform"],
16325
+ "application/vnd.google-apps.jam": ["gjam"],
16326
+ "application/vnd.google-apps.map": ["gmap"],
16327
+ "application/vnd.google-apps.presentation": ["gslides"],
16328
+ "application/vnd.google-apps.script": ["gscript"],
16329
+ "application/vnd.google-apps.site": ["gsite"],
16330
+ "application/vnd.google-apps.spreadsheet": ["gsheet"],
16331
+ "application/vnd.google-earth.kml+xml": ["kml"],
16332
+ "application/vnd.google-earth.kmz": ["kmz"],
16333
+ "application/vnd.gov.sk.xmldatacontainer+xml": ["xdcf"],
16334
+ "application/vnd.grafeq": ["gqf", "gqs"],
16335
+ "application/vnd.groove-account": ["gac"],
16336
+ "application/vnd.groove-help": ["ghf"],
16337
+ "application/vnd.groove-identity-message": ["gim"],
16338
+ "application/vnd.groove-injector": ["grv"],
16339
+ "application/vnd.groove-tool-message": ["gtm"],
16340
+ "application/vnd.groove-tool-template": ["tpl"],
16341
+ "application/vnd.groove-vcard": ["vcg"],
16342
+ "application/vnd.hal+xml": ["hal"],
16343
+ "application/vnd.handheld-entertainment+xml": ["zmm"],
16344
+ "application/vnd.hbci": ["hbci"],
16345
+ "application/vnd.hhe.lesson-player": ["les"],
16346
+ "application/vnd.hp-hpgl": ["hpgl"],
16347
+ "application/vnd.hp-hpid": ["hpid"],
16348
+ "application/vnd.hp-hps": ["hps"],
16349
+ "application/vnd.hp-jlyt": ["jlt"],
16350
+ "application/vnd.hp-pcl": ["pcl"],
16351
+ "application/vnd.hp-pclxl": ["pclxl"],
16352
+ "application/vnd.hydrostatix.sof-data": ["sfd-hdstx"],
16353
+ "application/vnd.ibm.minipay": ["mpy"],
16354
+ "application/vnd.ibm.modcap": ["afp", "listafp", "list3820"],
16355
+ "application/vnd.ibm.rights-management": ["irm"],
16356
+ "application/vnd.ibm.secure-container": ["sc"],
16357
+ "application/vnd.iccprofile": ["icc", "icm"],
16358
+ "application/vnd.igloader": ["igl"],
16359
+ "application/vnd.immervision-ivp": ["ivp"],
16360
+ "application/vnd.immervision-ivu": ["ivu"],
16361
+ "application/vnd.insors.igm": ["igm"],
16362
+ "application/vnd.intercon.formnet": ["xpw", "xpx"],
16363
+ "application/vnd.intergeo": ["i2g"],
16364
+ "application/vnd.intu.qbo": ["qbo"],
16365
+ "application/vnd.intu.qfx": ["qfx"],
16366
+ "application/vnd.ipunplugged.rcprofile": ["rcprofile"],
16367
+ "application/vnd.irepository.package+xml": ["irp"],
16368
+ "application/vnd.is-xpr": ["xpr"],
16369
+ "application/vnd.isac.fcs": ["fcs"],
16370
+ "application/vnd.jam": ["jam"],
16371
+ "application/vnd.jcp.javame.midlet-rms": ["rms"],
16372
+ "application/vnd.jisp": ["jisp"],
16373
+ "application/vnd.joost.joda-archive": ["joda"],
16374
+ "application/vnd.kahootz": ["ktz", "ktr"],
16375
+ "application/vnd.kde.karbon": ["karbon"],
16376
+ "application/vnd.kde.kchart": ["chrt"],
16377
+ "application/vnd.kde.kformula": ["kfo"],
16378
+ "application/vnd.kde.kivio": ["flw"],
16379
+ "application/vnd.kde.kontour": ["kon"],
16380
+ "application/vnd.kde.kpresenter": ["kpr", "kpt"],
16381
+ "application/vnd.kde.kspread": ["ksp"],
16382
+ "application/vnd.kde.kword": ["kwd", "kwt"],
16383
+ "application/vnd.kenameaapp": ["htke"],
16384
+ "application/vnd.kidspiration": ["kia"],
16385
+ "application/vnd.kinar": ["kne", "knp"],
16386
+ "application/vnd.koan": ["skp", "skd", "skt", "skm"],
16387
+ "application/vnd.kodak-descriptor": ["sse"],
16388
+ "application/vnd.las.las+xml": ["lasxml"],
16389
+ "application/vnd.llamagraphics.life-balance.desktop": ["lbd"],
16390
+ "application/vnd.llamagraphics.life-balance.exchange+xml": ["lbe"],
16391
+ "application/vnd.lotus-1-2-3": ["123"],
16392
+ "application/vnd.lotus-approach": ["apr"],
16393
+ "application/vnd.lotus-freelance": ["pre"],
16394
+ "application/vnd.lotus-notes": ["nsf"],
16395
+ "application/vnd.lotus-organizer": ["org"],
16396
+ "application/vnd.lotus-screencam": ["scm"],
16397
+ "application/vnd.lotus-wordpro": ["lwp"],
16398
+ "application/vnd.macports.portpkg": ["portpkg"],
16399
+ "application/vnd.mapbox-vector-tile": ["mvt"],
16400
+ "application/vnd.mcd": ["mcd"],
16401
+ "application/vnd.medcalcdata": ["mc1"],
16402
+ "application/vnd.mediastation.cdkey": ["cdkey"],
16403
+ "application/vnd.mfer": ["mwf"],
16404
+ "application/vnd.mfmp": ["mfm"],
16405
+ "application/vnd.micrografx.flo": ["flo"],
16406
+ "application/vnd.micrografx.igx": ["igx"],
16407
+ "application/vnd.mif": ["mif"],
16408
+ "application/vnd.mobius.daf": ["daf"],
16409
+ "application/vnd.mobius.dis": ["dis"],
16410
+ "application/vnd.mobius.mbk": ["mbk"],
16411
+ "application/vnd.mobius.mqy": ["mqy"],
16412
+ "application/vnd.mobius.msl": ["msl"],
16413
+ "application/vnd.mobius.plc": ["plc"],
16414
+ "application/vnd.mobius.txf": ["txf"],
16415
+ "application/vnd.mophun.application": ["mpn"],
16416
+ "application/vnd.mophun.certificate": ["mpc"],
16417
+ "application/vnd.mozilla.xul+xml": ["xul"],
16418
+ "application/vnd.ms-artgalry": ["cil"],
16419
+ "application/vnd.ms-cab-compressed": ["cab"],
16420
+ "application/vnd.ms-excel": ["xls", "xlm", "xla", "xlc", "xlt", "xlw"],
16421
+ "application/vnd.ms-excel.addin.macroenabled.12": ["xlam"],
16422
+ "application/vnd.ms-excel.sheet.binary.macroenabled.12": ["xlsb"],
16423
+ "application/vnd.ms-excel.sheet.macroenabled.12": ["xlsm"],
16424
+ "application/vnd.ms-excel.template.macroenabled.12": ["xltm"],
16425
+ "application/vnd.ms-fontobject": ["eot"],
16426
+ "application/vnd.ms-htmlhelp": ["chm"],
16427
+ "application/vnd.ms-ims": ["ims"],
16428
+ "application/vnd.ms-lrm": ["lrm"],
16429
+ "application/vnd.ms-officetheme": ["thmx"],
16430
+ "application/vnd.ms-outlook": ["msg"],
16431
+ "application/vnd.ms-pki.seccat": ["cat"],
16432
+ "application/vnd.ms-pki.stl": ["*stl"],
16433
+ "application/vnd.ms-powerpoint": ["ppt", "pps", "pot"],
16434
+ "application/vnd.ms-powerpoint.addin.macroenabled.12": ["ppam"],
16435
+ "application/vnd.ms-powerpoint.presentation.macroenabled.12": ["pptm"],
16436
+ "application/vnd.ms-powerpoint.slide.macroenabled.12": ["sldm"],
16437
+ "application/vnd.ms-powerpoint.slideshow.macroenabled.12": ["ppsm"],
16438
+ "application/vnd.ms-powerpoint.template.macroenabled.12": ["potm"],
16439
+ "application/vnd.ms-project": ["*mpp", "mpt"],
16440
+ "application/vnd.ms-visio.viewer": ["vdx"],
16441
+ "application/vnd.ms-word.document.macroenabled.12": ["docm"],
16442
+ "application/vnd.ms-word.template.macroenabled.12": ["dotm"],
16443
+ "application/vnd.ms-works": ["wps", "wks", "wcm", "wdb"],
16444
+ "application/vnd.ms-wpl": ["wpl"],
16445
+ "application/vnd.ms-xpsdocument": ["xps"],
16446
+ "application/vnd.mseq": ["mseq"],
16447
+ "application/vnd.musician": ["mus"],
16448
+ "application/vnd.muvee.style": ["msty"],
16449
+ "application/vnd.mynfc": ["taglet"],
16450
+ "application/vnd.nato.bindingdataobject+xml": ["bdo"],
16451
+ "application/vnd.neurolanguage.nlu": ["nlu"],
16452
+ "application/vnd.nitf": ["ntf", "nitf"],
16453
+ "application/vnd.noblenet-directory": ["nnd"],
16454
+ "application/vnd.noblenet-sealer": ["nns"],
16455
+ "application/vnd.noblenet-web": ["nnw"],
16456
+ "application/vnd.nokia.n-gage.ac+xml": ["*ac"],
16457
+ "application/vnd.nokia.n-gage.data": ["ngdat"],
16458
+ "application/vnd.nokia.n-gage.symbian.install": ["n-gage"],
16459
+ "application/vnd.nokia.radio-preset": ["rpst"],
16460
+ "application/vnd.nokia.radio-presets": ["rpss"],
16461
+ "application/vnd.novadigm.edm": ["edm"],
16462
+ "application/vnd.novadigm.edx": ["edx"],
16463
+ "application/vnd.novadigm.ext": ["ext"],
16464
+ "application/vnd.oasis.opendocument.chart": ["odc"],
16465
+ "application/vnd.oasis.opendocument.chart-template": ["otc"],
16466
+ "application/vnd.oasis.opendocument.database": ["odb"],
16467
+ "application/vnd.oasis.opendocument.formula": ["odf"],
16468
+ "application/vnd.oasis.opendocument.formula-template": ["odft"],
16469
+ "application/vnd.oasis.opendocument.graphics": ["odg"],
16470
+ "application/vnd.oasis.opendocument.graphics-template": ["otg"],
16471
+ "application/vnd.oasis.opendocument.image": ["odi"],
16472
+ "application/vnd.oasis.opendocument.image-template": ["oti"],
16473
+ "application/vnd.oasis.opendocument.presentation": ["odp"],
16474
+ "application/vnd.oasis.opendocument.presentation-template": ["otp"],
16475
+ "application/vnd.oasis.opendocument.spreadsheet": ["ods"],
16476
+ "application/vnd.oasis.opendocument.spreadsheet-template": ["ots"],
16477
+ "application/vnd.oasis.opendocument.text": ["odt"],
16478
+ "application/vnd.oasis.opendocument.text-master": ["odm"],
16479
+ "application/vnd.oasis.opendocument.text-template": ["ott"],
16480
+ "application/vnd.oasis.opendocument.text-web": ["oth"],
16481
+ "application/vnd.olpc-sugar": ["xo"],
16482
+ "application/vnd.oma.dd2+xml": ["dd2"],
16483
+ "application/vnd.openblox.game+xml": ["obgx"],
16484
+ "application/vnd.openofficeorg.extension": ["oxt"],
16485
+ "application/vnd.openstreetmap.data+xml": ["osm"],
16486
+ "application/vnd.openxmlformats-officedocument.presentationml.presentation": [
16487
+ "pptx"
16488
+ ],
16489
+ "application/vnd.openxmlformats-officedocument.presentationml.slide": [
16490
+ "sldx"
16491
+ ],
16492
+ "application/vnd.openxmlformats-officedocument.presentationml.slideshow": [
16493
+ "ppsx"
16494
+ ],
16495
+ "application/vnd.openxmlformats-officedocument.presentationml.template": [
16496
+ "potx"
16497
+ ],
16498
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": ["xlsx"],
16499
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.template": [
16500
+ "xltx"
16501
+ ],
16502
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document": [
16503
+ "docx"
16504
+ ],
16505
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.template": [
16506
+ "dotx"
16507
+ ],
16508
+ "application/vnd.osgeo.mapguide.package": ["mgp"],
16509
+ "application/vnd.osgi.dp": ["dp"],
16510
+ "application/vnd.osgi.subsystem": ["esa"],
16511
+ "application/vnd.palm": ["pdb", "pqa", "oprc"],
16512
+ "application/vnd.pawaafile": ["paw"],
16513
+ "application/vnd.pg.format": ["str"],
16514
+ "application/vnd.pg.osasli": ["ei6"],
16515
+ "application/vnd.picsel": ["efif"],
16516
+ "application/vnd.pmi.widget": ["wg"],
16517
+ "application/vnd.pocketlearn": ["plf"],
16518
+ "application/vnd.powerbuilder6": ["pbd"],
16519
+ "application/vnd.previewsystems.box": ["box"],
16520
+ "application/vnd.procrate.brushset": ["brushset"],
16521
+ "application/vnd.procreate.brush": ["brush"],
16522
+ "application/vnd.procreate.dream": ["drm"],
16523
+ "application/vnd.proteus.magazine": ["mgz"],
16524
+ "application/vnd.publishare-delta-tree": ["qps"],
16525
+ "application/vnd.pvi.ptid1": ["ptid"],
16526
+ "application/vnd.pwg-xhtml-print+xml": ["xhtm"],
16527
+ "application/vnd.quark.quarkxpress": [
16528
+ "qxd",
16529
+ "qxt",
16530
+ "qwd",
16531
+ "qwt",
16532
+ "qxl",
16533
+ "qxb"
16534
+ ],
16535
+ "application/vnd.rar": ["rar"],
16536
+ "application/vnd.realvnc.bed": ["bed"],
16537
+ "application/vnd.recordare.musicxml": ["mxl"],
16538
+ "application/vnd.recordare.musicxml+xml": ["musicxml"],
16539
+ "application/vnd.rig.cryptonote": ["cryptonote"],
16540
+ "application/vnd.rim.cod": ["cod"],
16541
+ "application/vnd.rn-realmedia": ["rm"],
16542
+ "application/vnd.rn-realmedia-vbr": ["rmvb"],
16543
+ "application/vnd.route66.link66+xml": ["link66"],
16544
+ "application/vnd.sailingtracker.track": ["st"],
16545
+ "application/vnd.seemail": ["see"],
16546
+ "application/vnd.sema": ["sema"],
16547
+ "application/vnd.semd": ["semd"],
16548
+ "application/vnd.semf": ["semf"],
16549
+ "application/vnd.shana.informed.formdata": ["ifm"],
16550
+ "application/vnd.shana.informed.formtemplate": ["itp"],
16551
+ "application/vnd.shana.informed.interchange": ["iif"],
16552
+ "application/vnd.shana.informed.package": ["ipk"],
16553
+ "application/vnd.simtech-mindmapper": ["twd", "twds"],
16554
+ "application/vnd.smaf": ["mmf"],
16555
+ "application/vnd.smart.teacher": ["teacher"],
16556
+ "application/vnd.software602.filler.form+xml": ["fo"],
16557
+ "application/vnd.solent.sdkm+xml": ["sdkm", "sdkd"],
16558
+ "application/vnd.spotfire.dxp": ["dxp"],
16559
+ "application/vnd.spotfire.sfs": ["sfs"],
16560
+ "application/vnd.stardivision.calc": ["sdc"],
16561
+ "application/vnd.stardivision.draw": ["sda"],
16562
+ "application/vnd.stardivision.impress": ["sdd"],
16563
+ "application/vnd.stardivision.math": ["smf"],
16564
+ "application/vnd.stardivision.writer": ["sdw", "vor"],
16565
+ "application/vnd.stardivision.writer-global": ["sgl"],
16566
+ "application/vnd.stepmania.package": ["smzip"],
16567
+ "application/vnd.stepmania.stepchart": ["sm"],
16568
+ "application/vnd.sun.wadl+xml": ["wadl"],
16569
+ "application/vnd.sun.xml.calc": ["sxc"],
16570
+ "application/vnd.sun.xml.calc.template": ["stc"],
16571
+ "application/vnd.sun.xml.draw": ["sxd"],
16572
+ "application/vnd.sun.xml.draw.template": ["std"],
16573
+ "application/vnd.sun.xml.impress": ["sxi"],
16574
+ "application/vnd.sun.xml.impress.template": ["sti"],
16575
+ "application/vnd.sun.xml.math": ["sxm"],
16576
+ "application/vnd.sun.xml.writer": ["sxw"],
16577
+ "application/vnd.sun.xml.writer.global": ["sxg"],
16578
+ "application/vnd.sun.xml.writer.template": ["stw"],
16579
+ "application/vnd.sus-calendar": ["sus", "susp"],
16580
+ "application/vnd.svd": ["svd"],
16581
+ "application/vnd.symbian.install": ["sis", "sisx"],
16582
+ "application/vnd.syncml+xml": ["xsm"],
16583
+ "application/vnd.syncml.dm+wbxml": ["bdm"],
16584
+ "application/vnd.syncml.dm+xml": ["xdm"],
16585
+ "application/vnd.syncml.dmddf+xml": ["ddf"],
16586
+ "application/vnd.tao.intent-module-archive": ["tao"],
16587
+ "application/vnd.tcpdump.pcap": ["pcap", "cap", "dmp"],
16588
+ "application/vnd.tmobile-livetv": ["tmo"],
16589
+ "application/vnd.trid.tpt": ["tpt"],
16590
+ "application/vnd.triscape.mxs": ["mxs"],
16591
+ "application/vnd.trueapp": ["tra"],
16592
+ "application/vnd.ufdl": ["ufd", "ufdl"],
16593
+ "application/vnd.uiq.theme": ["utz"],
16594
+ "application/vnd.umajin": ["umj"],
16595
+ "application/vnd.unity": ["unityweb"],
16596
+ "application/vnd.uoml+xml": ["uoml", "uo"],
16597
+ "application/vnd.vcx": ["vcx"],
16598
+ "application/vnd.visio": ["vsd", "vst", "vss", "vsw", "vsdx", "vtx"],
16599
+ "application/vnd.visionary": ["vis"],
16600
+ "application/vnd.vsf": ["vsf"],
16601
+ "application/vnd.wap.wbxml": ["wbxml"],
16602
+ "application/vnd.wap.wmlc": ["wmlc"],
16603
+ "application/vnd.wap.wmlscriptc": ["wmlsc"],
16604
+ "application/vnd.webturbo": ["wtb"],
16605
+ "application/vnd.wolfram.player": ["nbp"],
16606
+ "application/vnd.wordperfect": ["wpd"],
16607
+ "application/vnd.wqd": ["wqd"],
16608
+ "application/vnd.wt.stf": ["stf"],
16609
+ "application/vnd.xara": ["xar"],
16610
+ "application/vnd.xfdl": ["xfdl"],
16611
+ "application/vnd.yamaha.hv-dic": ["hvd"],
16612
+ "application/vnd.yamaha.hv-script": ["hvs"],
16613
+ "application/vnd.yamaha.hv-voice": ["hvp"],
16614
+ "application/vnd.yamaha.openscoreformat": ["osf"],
16615
+ "application/vnd.yamaha.openscoreformat.osfpvg+xml": ["osfpvg"],
16616
+ "application/vnd.yamaha.smaf-audio": ["saf"],
16617
+ "application/vnd.yamaha.smaf-phrase": ["spf"],
16618
+ "application/vnd.yellowriver-custom-menu": ["cmp"],
16619
+ "application/vnd.zul": ["zir", "zirz"],
16620
+ "application/vnd.zzazz.deck+xml": ["zaz"],
16621
+ "application/x-7z-compressed": ["7z"],
16622
+ "application/x-abiword": ["abw"],
16623
+ "application/x-ace-compressed": ["ace"],
16624
+ "application/x-apple-diskimage": ["*dmg"],
16625
+ "application/x-arj": ["arj"],
16626
+ "application/x-authorware-bin": ["aab", "x32", "u32", "vox"],
16627
+ "application/x-authorware-map": ["aam"],
16628
+ "application/x-authorware-seg": ["aas"],
16629
+ "application/x-bcpio": ["bcpio"],
16630
+ "application/x-bdoc": ["*bdoc"],
16631
+ "application/x-bittorrent": ["torrent"],
16632
+ "application/x-blender": ["blend"],
16633
+ "application/x-blorb": ["blb", "blorb"],
16634
+ "application/x-bzip": ["bz"],
16635
+ "application/x-bzip2": ["bz2", "boz"],
16636
+ "application/x-cbr": ["cbr", "cba", "cbt", "cbz", "cb7"],
16637
+ "application/x-cdlink": ["vcd"],
16638
+ "application/x-cfs-compressed": ["cfs"],
16639
+ "application/x-chat": ["chat"],
16640
+ "application/x-chess-pgn": ["pgn"],
16641
+ "application/x-chrome-extension": ["crx"],
16642
+ "application/x-cocoa": ["cco"],
16643
+ "application/x-compressed": ["*rar"],
16644
+ "application/x-conference": ["nsc"],
16645
+ "application/x-cpio": ["cpio"],
16646
+ "application/x-csh": ["csh"],
16647
+ "application/x-debian-package": ["*deb", "udeb"],
16648
+ "application/x-dgc-compressed": ["dgc"],
16649
+ "application/x-director": [
16650
+ "dir",
16651
+ "dcr",
16652
+ "dxr",
16653
+ "cst",
16654
+ "cct",
16655
+ "cxt",
16656
+ "w3d",
16657
+ "fgd",
16658
+ "swa"
16659
+ ],
16660
+ "application/x-doom": ["wad"],
16661
+ "application/x-dtbncx+xml": ["ncx"],
16662
+ "application/x-dtbook+xml": ["dtb"],
16663
+ "application/x-dtbresource+xml": ["res"],
16664
+ "application/x-dvi": ["dvi"],
16665
+ "application/x-envoy": ["evy"],
16666
+ "application/x-eva": ["eva"],
16667
+ "application/x-font-bdf": ["bdf"],
16668
+ "application/x-font-ghostscript": ["gsf"],
16669
+ "application/x-font-linux-psf": ["psf"],
16670
+ "application/x-font-pcf": ["pcf"],
16671
+ "application/x-font-snf": ["snf"],
16672
+ "application/x-font-type1": ["pfa", "pfb", "pfm", "afm"],
16673
+ "application/x-freearc": ["arc"],
16674
+ "application/x-futuresplash": ["spl"],
16675
+ "application/x-gca-compressed": ["gca"],
16676
+ "application/x-glulx": ["ulx"],
16677
+ "application/x-gnumeric": ["gnumeric"],
16678
+ "application/x-gramps-xml": ["gramps"],
16679
+ "application/x-gtar": ["gtar"],
16680
+ "application/x-hdf": ["hdf"],
16681
+ "application/x-httpd-php": ["php"],
16682
+ "application/x-install-instructions": ["install"],
16683
+ "application/x-ipynb+json": ["ipynb"],
16684
+ "application/x-iso9660-image": ["*iso"],
16685
+ "application/x-iwork-keynote-sffkey": ["*key"],
16686
+ "application/x-iwork-numbers-sffnumbers": ["*numbers"],
16687
+ "application/x-iwork-pages-sffpages": ["*pages"],
16688
+ "application/x-java-archive-diff": ["jardiff"],
16689
+ "application/x-java-jnlp-file": ["jnlp"],
16690
+ "application/x-keepass2": ["kdbx"],
16691
+ "application/x-latex": ["latex"],
16692
+ "application/x-lua-bytecode": ["luac"],
16693
+ "application/x-lzh-compressed": ["lzh", "lha"],
16694
+ "application/x-makeself": ["run"],
16695
+ "application/x-mie": ["mie"],
16696
+ "application/x-mobipocket-ebook": ["*prc", "mobi"],
16697
+ "application/x-ms-application": ["application"],
16698
+ "application/x-ms-shortcut": ["lnk"],
16699
+ "application/x-ms-wmd": ["wmd"],
16700
+ "application/x-ms-wmz": ["wmz"],
16701
+ "application/x-ms-xbap": ["xbap"],
16702
+ "application/x-msaccess": ["mdb"],
16703
+ "application/x-msbinder": ["obd"],
16704
+ "application/x-mscardfile": ["crd"],
16705
+ "application/x-msclip": ["clp"],
16706
+ "application/x-msdos-program": ["*exe"],
16707
+ "application/x-msdownload": ["*exe", "*dll", "com", "bat", "*msi"],
16708
+ "application/x-msmediaview": ["mvb", "m13", "m14"],
16709
+ "application/x-msmetafile": ["*wmf", "*wmz", "*emf", "emz"],
16710
+ "application/x-msmoney": ["mny"],
16711
+ "application/x-mspublisher": ["pub"],
16712
+ "application/x-msschedule": ["scd"],
16713
+ "application/x-msterminal": ["trm"],
16714
+ "application/x-mswrite": ["wri"],
16715
+ "application/x-netcdf": ["nc", "cdf"],
16716
+ "application/x-ns-proxy-autoconfig": ["pac"],
16717
+ "application/x-nzb": ["nzb"],
16718
+ "application/x-perl": ["pl", "pm"],
16719
+ "application/x-pilot": ["*prc", "*pdb"],
16720
+ "application/x-pkcs12": ["p12", "pfx"],
16721
+ "application/x-pkcs7-certificates": ["p7b", "spc"],
16722
+ "application/x-pkcs7-certreqresp": ["p7r"],
16723
+ "application/x-rar-compressed": ["*rar"],
16724
+ "application/x-redhat-package-manager": ["rpm"],
16725
+ "application/x-research-info-systems": ["ris"],
16726
+ "application/x-sea": ["sea"],
16727
+ "application/x-sh": ["sh"],
16728
+ "application/x-shar": ["shar"],
16729
+ "application/x-shockwave-flash": ["swf"],
16730
+ "application/x-silverlight-app": ["xap"],
16731
+ "application/x-sql": ["*sql"],
16732
+ "application/x-stuffit": ["sit"],
16733
+ "application/x-stuffitx": ["sitx"],
16734
+ "application/x-subrip": ["srt"],
16735
+ "application/x-sv4cpio": ["sv4cpio"],
16736
+ "application/x-sv4crc": ["sv4crc"],
16737
+ "application/x-t3vm-image": ["t3"],
16738
+ "application/x-tads": ["gam"],
16739
+ "application/x-tar": ["tar"],
16740
+ "application/x-tcl": ["tcl", "tk"],
16741
+ "application/x-tex": ["tex"],
16742
+ "application/x-tex-tfm": ["tfm"],
16743
+ "application/x-texinfo": ["texinfo", "texi"],
16744
+ "application/x-tgif": ["*obj"],
16745
+ "application/x-ustar": ["ustar"],
16746
+ "application/x-virtualbox-hdd": ["hdd"],
16747
+ "application/x-virtualbox-ova": ["ova"],
16748
+ "application/x-virtualbox-ovf": ["ovf"],
16749
+ "application/x-virtualbox-vbox": ["vbox"],
16750
+ "application/x-virtualbox-vbox-extpack": ["vbox-extpack"],
16751
+ "application/x-virtualbox-vdi": ["vdi"],
16752
+ "application/x-virtualbox-vhd": ["vhd"],
16753
+ "application/x-virtualbox-vmdk": ["vmdk"],
16754
+ "application/x-wais-source": ["src"],
16755
+ "application/x-web-app-manifest+json": ["webapp"],
16756
+ "application/x-x509-ca-cert": ["der", "crt", "pem"],
16757
+ "application/x-xfig": ["fig"],
16758
+ "application/x-xliff+xml": ["*xlf"],
16759
+ "application/x-xpinstall": ["xpi"],
16760
+ "application/x-xz": ["xz"],
16761
+ "application/x-zip-compressed": ["*zip"],
16762
+ "application/x-zmachine": ["z1", "z2", "z3", "z4", "z5", "z6", "z7", "z8"],
16763
+ "audio/vnd.dece.audio": ["uva", "uvva"],
16764
+ "audio/vnd.digital-winds": ["eol"],
16765
+ "audio/vnd.dra": ["dra"],
16766
+ "audio/vnd.dts": ["dts"],
16767
+ "audio/vnd.dts.hd": ["dtshd"],
16768
+ "audio/vnd.lucent.voice": ["lvp"],
16769
+ "audio/vnd.ms-playready.media.pya": ["pya"],
16770
+ "audio/vnd.nuera.ecelp4800": ["ecelp4800"],
16771
+ "audio/vnd.nuera.ecelp7470": ["ecelp7470"],
16772
+ "audio/vnd.nuera.ecelp9600": ["ecelp9600"],
16773
+ "audio/vnd.rip": ["rip"],
16774
+ "audio/x-aac": ["*aac"],
16775
+ "audio/x-aiff": ["aif", "aiff", "aifc"],
16776
+ "audio/x-caf": ["caf"],
16777
+ "audio/x-flac": ["flac"],
16778
+ "audio/x-m4a": ["*m4a"],
16779
+ "audio/x-matroska": ["mka"],
16780
+ "audio/x-mpegurl": ["m3u"],
16781
+ "audio/x-ms-wax": ["wax"],
16782
+ "audio/x-ms-wma": ["wma"],
16783
+ "audio/x-pn-realaudio": ["ram", "ra"],
16784
+ "audio/x-pn-realaudio-plugin": ["rmp"],
16785
+ "audio/x-realaudio": ["*ra"],
16786
+ "audio/x-wav": ["*wav"],
16787
+ "chemical/x-cdx": ["cdx"],
16788
+ "chemical/x-cif": ["cif"],
16789
+ "chemical/x-cmdf": ["cmdf"],
16790
+ "chemical/x-cml": ["cml"],
16791
+ "chemical/x-csml": ["csml"],
16792
+ "chemical/x-xyz": ["xyz"],
16793
+ "image/prs.btif": ["btif", "btf"],
16794
+ "image/prs.pti": ["pti"],
16795
+ "image/vnd.adobe.photoshop": ["psd"],
16796
+ "image/vnd.airzip.accelerator.azv": ["azv"],
16797
+ "image/vnd.blockfact.facti": ["facti"],
16798
+ "image/vnd.dece.graphic": ["uvi", "uvvi", "uvg", "uvvg"],
16799
+ "image/vnd.djvu": ["djvu", "djv"],
16800
+ "image/vnd.dvb.subtitle": ["*sub"],
16801
+ "image/vnd.dwg": ["dwg"],
16802
+ "image/vnd.dxf": ["dxf"],
16803
+ "image/vnd.fastbidsheet": ["fbs"],
16804
+ "image/vnd.fpx": ["fpx"],
16805
+ "image/vnd.fst": ["fst"],
16806
+ "image/vnd.fujixerox.edmics-mmr": ["mmr"],
16807
+ "image/vnd.fujixerox.edmics-rlc": ["rlc"],
16808
+ "image/vnd.microsoft.icon": ["ico"],
16809
+ "image/vnd.ms-dds": ["dds"],
16810
+ "image/vnd.ms-modi": ["mdi"],
16811
+ "image/vnd.ms-photo": ["wdp"],
16812
+ "image/vnd.net-fpx": ["npx"],
16813
+ "image/vnd.pco.b16": ["b16"],
16814
+ "image/vnd.tencent.tap": ["tap"],
16815
+ "image/vnd.valve.source.texture": ["vtf"],
16816
+ "image/vnd.wap.wbmp": ["wbmp"],
16817
+ "image/vnd.xiff": ["xif"],
16818
+ "image/vnd.zbrush.pcx": ["pcx"],
16819
+ "image/x-3ds": ["3ds"],
16820
+ "image/x-adobe-dng": ["dng"],
16821
+ "image/x-cmu-raster": ["ras"],
16822
+ "image/x-cmx": ["cmx"],
16823
+ "image/x-freehand": ["fh", "fhc", "fh4", "fh5", "fh7"],
16824
+ "image/x-icon": ["*ico"],
16825
+ "image/x-jng": ["jng"],
16826
+ "image/x-mrsid-image": ["sid"],
16827
+ "image/x-ms-bmp": ["*bmp"],
16828
+ "image/x-pcx": ["*pcx"],
16829
+ "image/x-pict": ["pic", "pct"],
16830
+ "image/x-portable-anymap": ["pnm"],
16831
+ "image/x-portable-bitmap": ["pbm"],
16832
+ "image/x-portable-graymap": ["pgm"],
16833
+ "image/x-portable-pixmap": ["ppm"],
16834
+ "image/x-rgb": ["rgb"],
16835
+ "image/x-tga": ["tga"],
16836
+ "image/x-xbitmap": ["xbm"],
16837
+ "image/x-xpixmap": ["xpm"],
16838
+ "image/x-xwindowdump": ["xwd"],
16839
+ "message/vnd.wfa.wsc": ["wsc"],
16840
+ "model/vnd.bary": ["bary"],
16841
+ "model/vnd.cld": ["cld"],
16842
+ "model/vnd.collada+xml": ["dae"],
16843
+ "model/vnd.dwf": ["dwf"],
16844
+ "model/vnd.gdl": ["gdl"],
16845
+ "model/vnd.gtw": ["gtw"],
16846
+ "model/vnd.mts": ["*mts"],
16847
+ "model/vnd.opengex": ["ogex"],
16848
+ "model/vnd.parasolid.transmit.binary": ["x_b"],
16849
+ "model/vnd.parasolid.transmit.text": ["x_t"],
16850
+ "model/vnd.pytha.pyox": ["pyo", "pyox"],
16851
+ "model/vnd.sap.vds": ["vds"],
16852
+ "model/vnd.usda": ["usda"],
16853
+ "model/vnd.usdz+zip": ["usdz"],
16854
+ "model/vnd.valve.source.compiled-map": ["bsp"],
16855
+ "model/vnd.vtu": ["vtu"],
16856
+ "text/prs.lines.tag": ["dsc"],
16857
+ "text/vnd.curl": ["curl"],
16858
+ "text/vnd.curl.dcurl": ["dcurl"],
16859
+ "text/vnd.curl.mcurl": ["mcurl"],
16860
+ "text/vnd.curl.scurl": ["scurl"],
16861
+ "text/vnd.dvb.subtitle": ["sub"],
16862
+ "text/vnd.familysearch.gedcom": ["ged"],
16863
+ "text/vnd.fly": ["fly"],
16864
+ "text/vnd.fmi.flexstor": ["flx"],
16865
+ "text/vnd.graphviz": ["gv"],
16866
+ "text/vnd.in3d.3dml": ["3dml"],
16867
+ "text/vnd.in3d.spot": ["spot"],
16868
+ "text/vnd.sun.j2me.app-descriptor": ["jad"],
16869
+ "text/vnd.wap.wml": ["wml"],
16870
+ "text/vnd.wap.wmlscript": ["wmls"],
16871
+ "text/x-asm": ["s", "asm"],
16872
+ "text/x-c": ["c", "cc", "cxx", "cpp", "h", "hh", "dic"],
16873
+ "text/x-component": ["htc"],
16874
+ "text/x-fortran": ["f", "for", "f77", "f90"],
16875
+ "text/x-handlebars-template": ["hbs"],
16876
+ "text/x-java-source": ["java"],
16877
+ "text/x-lua": ["lua"],
16878
+ "text/x-markdown": ["mkd"],
16879
+ "text/x-nfo": ["nfo"],
16880
+ "text/x-opml": ["opml"],
16881
+ "text/x-org": ["*org"],
16882
+ "text/x-pascal": ["p", "pas"],
16883
+ "text/x-processing": ["pde"],
16884
+ "text/x-sass": ["sass"],
16885
+ "text/x-scss": ["scss"],
16886
+ "text/x-setext": ["etx"],
16887
+ "text/x-sfv": ["sfv"],
16888
+ "text/x-suse-ymp": ["ymp"],
16889
+ "text/x-uuencode": ["uu"],
16890
+ "text/x-vcalendar": ["vcs"],
16891
+ "text/x-vcard": ["vcf"],
16892
+ "video/vnd.dece.hd": ["uvh", "uvvh"],
16893
+ "video/vnd.dece.mobile": ["uvm", "uvvm"],
16894
+ "video/vnd.dece.pd": ["uvp", "uvvp"],
16895
+ "video/vnd.dece.sd": ["uvs", "uvvs"],
16896
+ "video/vnd.dece.video": ["uvv", "uvvv"],
16897
+ "video/vnd.dvb.file": ["dvb"],
16898
+ "video/vnd.fvt": ["fvt"],
16899
+ "video/vnd.mpegurl": ["mxu", "m4u"],
16900
+ "video/vnd.ms-playready.media.pyv": ["pyv"],
16901
+ "video/vnd.uvvu.mp4": ["uvu", "uvvu"],
16902
+ "video/vnd.vivo": ["viv"],
16903
+ "video/x-f4v": ["f4v"],
16904
+ "video/x-fli": ["fli"],
16905
+ "video/x-flv": ["flv"],
16906
+ "video/x-m4v": ["m4v"],
16907
+ "video/x-matroska": ["mkv", "mk3d", "mks"],
16908
+ "video/x-mng": ["mng"],
16909
+ "video/x-ms-asf": ["asf", "asx"],
16910
+ "video/x-ms-vob": ["vob"],
16911
+ "video/x-ms-wm": ["wm"],
16912
+ "video/x-ms-wmv": ["wmv"],
16913
+ "video/x-ms-wmx": ["wmx"],
16914
+ "video/x-ms-wvx": ["wvx"],
16915
+ "video/x-msvideo": ["avi"],
16916
+ "video/x-sgi-movie": ["movie"],
16917
+ "video/x-smv": ["smv"],
16918
+ "x-conference/x-cooltalk": ["ice"]
16171
16919
  };
16172
- var windows = (name) => {
16173
- const appData = env.APPDATA || path.join(homedir, "AppData", "Roaming");
16174
- const localAppData = env.LOCALAPPDATA || path.join(homedir, "AppData", "Local");
16920
+ Object.freeze(types);
16921
+ var other_default = types;
16922
+
16923
+ // node_modules/mime/dist/types/standard.js
16924
+ var types2 = {
16925
+ "application/andrew-inset": ["ez"],
16926
+ "application/appinstaller": ["appinstaller"],
16927
+ "application/applixware": ["aw"],
16928
+ "application/appx": ["appx"],
16929
+ "application/appxbundle": ["appxbundle"],
16930
+ "application/atom+xml": ["atom"],
16931
+ "application/atomcat+xml": ["atomcat"],
16932
+ "application/atomdeleted+xml": ["atomdeleted"],
16933
+ "application/atomsvc+xml": ["atomsvc"],
16934
+ "application/atsc-dwd+xml": ["dwd"],
16935
+ "application/atsc-held+xml": ["held"],
16936
+ "application/atsc-rsat+xml": ["rsat"],
16937
+ "application/automationml-aml+xml": ["aml"],
16938
+ "application/automationml-amlx+zip": ["amlx"],
16939
+ "application/bdoc": ["bdoc"],
16940
+ "application/calendar+xml": ["xcs"],
16941
+ "application/ccxml+xml": ["ccxml"],
16942
+ "application/cdfx+xml": ["cdfx"],
16943
+ "application/cdmi-capability": ["cdmia"],
16944
+ "application/cdmi-container": ["cdmic"],
16945
+ "application/cdmi-domain": ["cdmid"],
16946
+ "application/cdmi-object": ["cdmio"],
16947
+ "application/cdmi-queue": ["cdmiq"],
16948
+ "application/cpl+xml": ["cpl"],
16949
+ "application/cu-seeme": ["cu"],
16950
+ "application/cwl": ["cwl"],
16951
+ "application/dash+xml": ["mpd"],
16952
+ "application/dash-patch+xml": ["mpp"],
16953
+ "application/davmount+xml": ["davmount"],
16954
+ "application/dicom": ["dcm"],
16955
+ "application/docbook+xml": ["dbk"],
16956
+ "application/dssc+der": ["dssc"],
16957
+ "application/dssc+xml": ["xdssc"],
16958
+ "application/ecmascript": ["ecma"],
16959
+ "application/emma+xml": ["emma"],
16960
+ "application/emotionml+xml": ["emotionml"],
16961
+ "application/epub+zip": ["epub"],
16962
+ "application/exi": ["exi"],
16963
+ "application/express": ["exp"],
16964
+ "application/fdf": ["fdf"],
16965
+ "application/fdt+xml": ["fdt"],
16966
+ "application/font-tdpfr": ["pfr"],
16967
+ "application/geo+json": ["geojson"],
16968
+ "application/gml+xml": ["gml"],
16969
+ "application/gpx+xml": ["gpx"],
16970
+ "application/gxf": ["gxf"],
16971
+ "application/gzip": ["gz"],
16972
+ "application/hjson": ["hjson"],
16973
+ "application/hyperstudio": ["stk"],
16974
+ "application/inkml+xml": ["ink", "inkml"],
16975
+ "application/ipfix": ["ipfix"],
16976
+ "application/its+xml": ["its"],
16977
+ "application/java-archive": ["jar", "war", "ear"],
16978
+ "application/java-serialized-object": ["ser"],
16979
+ "application/java-vm": ["class"],
16980
+ "application/javascript": ["*js"],
16981
+ "application/json": ["json", "map"],
16982
+ "application/json5": ["json5"],
16983
+ "application/jsonml+json": ["jsonml"],
16984
+ "application/ld+json": ["jsonld"],
16985
+ "application/lgr+xml": ["lgr"],
16986
+ "application/lost+xml": ["lostxml"],
16987
+ "application/mac-binhex40": ["hqx"],
16988
+ "application/mac-compactpro": ["cpt"],
16989
+ "application/mads+xml": ["mads"],
16990
+ "application/manifest+json": ["webmanifest"],
16991
+ "application/marc": ["mrc"],
16992
+ "application/marcxml+xml": ["mrcx"],
16993
+ "application/mathematica": ["ma", "nb", "mb"],
16994
+ "application/mathml+xml": ["mathml"],
16995
+ "application/mbox": ["mbox"],
16996
+ "application/media-policy-dataset+xml": ["mpf"],
16997
+ "application/mediaservercontrol+xml": ["mscml"],
16998
+ "application/metalink+xml": ["metalink"],
16999
+ "application/metalink4+xml": ["meta4"],
17000
+ "application/mets+xml": ["mets"],
17001
+ "application/mmt-aei+xml": ["maei"],
17002
+ "application/mmt-usd+xml": ["musd"],
17003
+ "application/mods+xml": ["mods"],
17004
+ "application/mp21": ["m21", "mp21"],
17005
+ "application/mp4": ["*mp4", "*mpg4", "mp4s", "m4p"],
17006
+ "application/msix": ["msix"],
17007
+ "application/msixbundle": ["msixbundle"],
17008
+ "application/msword": ["doc", "dot"],
17009
+ "application/mxf": ["mxf"],
17010
+ "application/n-quads": ["nq"],
17011
+ "application/n-triples": ["nt"],
17012
+ "application/node": ["cjs"],
17013
+ "application/octet-stream": [
17014
+ "bin",
17015
+ "dms",
17016
+ "lrf",
17017
+ "mar",
17018
+ "so",
17019
+ "dist",
17020
+ "distz",
17021
+ "pkg",
17022
+ "bpk",
17023
+ "dump",
17024
+ "elc",
17025
+ "deploy",
17026
+ "exe",
17027
+ "dll",
17028
+ "deb",
17029
+ "dmg",
17030
+ "iso",
17031
+ "img",
17032
+ "msi",
17033
+ "msp",
17034
+ "msm",
17035
+ "buffer"
17036
+ ],
17037
+ "application/oda": ["oda"],
17038
+ "application/oebps-package+xml": ["opf"],
17039
+ "application/ogg": ["ogx"],
17040
+ "application/omdoc+xml": ["omdoc"],
17041
+ "application/onenote": [
17042
+ "onetoc",
17043
+ "onetoc2",
17044
+ "onetmp",
17045
+ "onepkg",
17046
+ "one",
17047
+ "onea"
17048
+ ],
17049
+ "application/oxps": ["oxps"],
17050
+ "application/p2p-overlay+xml": ["relo"],
17051
+ "application/patch-ops-error+xml": ["xer"],
17052
+ "application/pdf": ["pdf"],
17053
+ "application/pgp-encrypted": ["pgp"],
17054
+ "application/pgp-keys": ["asc"],
17055
+ "application/pgp-signature": ["sig", "*asc"],
17056
+ "application/pics-rules": ["prf"],
17057
+ "application/pkcs10": ["p10"],
17058
+ "application/pkcs7-mime": ["p7m", "p7c"],
17059
+ "application/pkcs7-signature": ["p7s"],
17060
+ "application/pkcs8": ["p8"],
17061
+ "application/pkix-attr-cert": ["ac"],
17062
+ "application/pkix-cert": ["cer"],
17063
+ "application/pkix-crl": ["crl"],
17064
+ "application/pkix-pkipath": ["pkipath"],
17065
+ "application/pkixcmp": ["pki"],
17066
+ "application/pls+xml": ["pls"],
17067
+ "application/postscript": ["ai", "eps", "ps"],
17068
+ "application/provenance+xml": ["provx"],
17069
+ "application/pskc+xml": ["pskcxml"],
17070
+ "application/raml+yaml": ["raml"],
17071
+ "application/rdf+xml": ["rdf", "owl"],
17072
+ "application/reginfo+xml": ["rif"],
17073
+ "application/relax-ng-compact-syntax": ["rnc"],
17074
+ "application/resource-lists+xml": ["rl"],
17075
+ "application/resource-lists-diff+xml": ["rld"],
17076
+ "application/rls-services+xml": ["rs"],
17077
+ "application/route-apd+xml": ["rapd"],
17078
+ "application/route-s-tsid+xml": ["sls"],
17079
+ "application/route-usd+xml": ["rusd"],
17080
+ "application/rpki-ghostbusters": ["gbr"],
17081
+ "application/rpki-manifest": ["mft"],
17082
+ "application/rpki-roa": ["roa"],
17083
+ "application/rsd+xml": ["rsd"],
17084
+ "application/rss+xml": ["rss"],
17085
+ "application/rtf": ["rtf"],
17086
+ "application/sbml+xml": ["sbml"],
17087
+ "application/scvp-cv-request": ["scq"],
17088
+ "application/scvp-cv-response": ["scs"],
17089
+ "application/scvp-vp-request": ["spq"],
17090
+ "application/scvp-vp-response": ["spp"],
17091
+ "application/sdp": ["sdp"],
17092
+ "application/senml+xml": ["senmlx"],
17093
+ "application/sensml+xml": ["sensmlx"],
17094
+ "application/set-payment-initiation": ["setpay"],
17095
+ "application/set-registration-initiation": ["setreg"],
17096
+ "application/shf+xml": ["shf"],
17097
+ "application/sieve": ["siv", "sieve"],
17098
+ "application/smil+xml": ["smi", "smil"],
17099
+ "application/sparql-query": ["rq"],
17100
+ "application/sparql-results+xml": ["srx"],
17101
+ "application/sql": ["sql"],
17102
+ "application/srgs": ["gram"],
17103
+ "application/srgs+xml": ["grxml"],
17104
+ "application/sru+xml": ["sru"],
17105
+ "application/ssdl+xml": ["ssdl"],
17106
+ "application/ssml+xml": ["ssml"],
17107
+ "application/swid+xml": ["swidtag"],
17108
+ "application/tei+xml": ["tei", "teicorpus"],
17109
+ "application/thraud+xml": ["tfi"],
17110
+ "application/timestamped-data": ["tsd"],
17111
+ "application/toml": ["toml"],
17112
+ "application/trig": ["trig"],
17113
+ "application/ttml+xml": ["ttml"],
17114
+ "application/ubjson": ["ubj"],
17115
+ "application/urc-ressheet+xml": ["rsheet"],
17116
+ "application/urc-targetdesc+xml": ["td"],
17117
+ "application/voicexml+xml": ["vxml"],
17118
+ "application/wasm": ["wasm"],
17119
+ "application/watcherinfo+xml": ["wif"],
17120
+ "application/widget": ["wgt"],
17121
+ "application/winhlp": ["hlp"],
17122
+ "application/wsdl+xml": ["wsdl"],
17123
+ "application/wspolicy+xml": ["wspolicy"],
17124
+ "application/xaml+xml": ["xaml"],
17125
+ "application/xcap-att+xml": ["xav"],
17126
+ "application/xcap-caps+xml": ["xca"],
17127
+ "application/xcap-diff+xml": ["xdf"],
17128
+ "application/xcap-el+xml": ["xel"],
17129
+ "application/xcap-ns+xml": ["xns"],
17130
+ "application/xenc+xml": ["xenc"],
17131
+ "application/xfdf": ["xfdf"],
17132
+ "application/xhtml+xml": ["xhtml", "xht"],
17133
+ "application/xliff+xml": ["xlf"],
17134
+ "application/xml": ["xml", "xsl", "xsd", "rng"],
17135
+ "application/xml-dtd": ["dtd"],
17136
+ "application/xop+xml": ["xop"],
17137
+ "application/xproc+xml": ["xpl"],
17138
+ "application/xslt+xml": ["*xsl", "xslt"],
17139
+ "application/xspf+xml": ["xspf"],
17140
+ "application/xv+xml": ["mxml", "xhvml", "xvml", "xvm"],
17141
+ "application/yang": ["yang"],
17142
+ "application/yin+xml": ["yin"],
17143
+ "application/zip": ["zip"],
17144
+ "application/zip+dotlottie": ["lottie"],
17145
+ "audio/3gpp": ["*3gpp"],
17146
+ "audio/aac": ["adts", "aac"],
17147
+ "audio/adpcm": ["adp"],
17148
+ "audio/amr": ["amr"],
17149
+ "audio/basic": ["au", "snd"],
17150
+ "audio/midi": ["mid", "midi", "kar", "rmi"],
17151
+ "audio/mobile-xmf": ["mxmf"],
17152
+ "audio/mp3": ["*mp3"],
17153
+ "audio/mp4": ["m4a", "mp4a", "m4b"],
17154
+ "audio/mpeg": ["mpga", "mp2", "mp2a", "mp3", "m2a", "m3a"],
17155
+ "audio/ogg": ["oga", "ogg", "spx", "opus"],
17156
+ "audio/s3m": ["s3m"],
17157
+ "audio/silk": ["sil"],
17158
+ "audio/wav": ["wav"],
17159
+ "audio/wave": ["*wav"],
17160
+ "audio/webm": ["weba"],
17161
+ "audio/xm": ["xm"],
17162
+ "font/collection": ["ttc"],
17163
+ "font/otf": ["otf"],
17164
+ "font/ttf": ["ttf"],
17165
+ "font/woff": ["woff"],
17166
+ "font/woff2": ["woff2"],
17167
+ "image/aces": ["exr"],
17168
+ "image/apng": ["apng"],
17169
+ "image/avci": ["avci"],
17170
+ "image/avcs": ["avcs"],
17171
+ "image/avif": ["avif"],
17172
+ "image/bmp": ["bmp", "dib"],
17173
+ "image/cgm": ["cgm"],
17174
+ "image/dicom-rle": ["drle"],
17175
+ "image/dpx": ["dpx"],
17176
+ "image/emf": ["emf"],
17177
+ "image/fits": ["fits"],
17178
+ "image/g3fax": ["g3"],
17179
+ "image/gif": ["gif"],
17180
+ "image/heic": ["heic"],
17181
+ "image/heic-sequence": ["heics"],
17182
+ "image/heif": ["heif"],
17183
+ "image/heif-sequence": ["heifs"],
17184
+ "image/hej2k": ["hej2"],
17185
+ "image/ief": ["ief"],
17186
+ "image/jaii": ["jaii"],
17187
+ "image/jais": ["jais"],
17188
+ "image/jls": ["jls"],
17189
+ "image/jp2": ["jp2", "jpg2"],
17190
+ "image/jpeg": ["jpg", "jpeg", "jpe"],
17191
+ "image/jph": ["jph"],
17192
+ "image/jphc": ["jhc"],
17193
+ "image/jpm": ["jpm", "jpgm"],
17194
+ "image/jpx": ["jpx", "jpf"],
17195
+ "image/jxl": ["jxl"],
17196
+ "image/jxr": ["jxr"],
17197
+ "image/jxra": ["jxra"],
17198
+ "image/jxrs": ["jxrs"],
17199
+ "image/jxs": ["jxs"],
17200
+ "image/jxsc": ["jxsc"],
17201
+ "image/jxsi": ["jxsi"],
17202
+ "image/jxss": ["jxss"],
17203
+ "image/ktx": ["ktx"],
17204
+ "image/ktx2": ["ktx2"],
17205
+ "image/pjpeg": ["jfif"],
17206
+ "image/png": ["png"],
17207
+ "image/sgi": ["sgi"],
17208
+ "image/svg+xml": ["svg", "svgz"],
17209
+ "image/t38": ["t38"],
17210
+ "image/tiff": ["tif", "tiff"],
17211
+ "image/tiff-fx": ["tfx"],
17212
+ "image/webp": ["webp"],
17213
+ "image/wmf": ["wmf"],
17214
+ "message/disposition-notification": ["disposition-notification"],
17215
+ "message/global": ["u8msg"],
17216
+ "message/global-delivery-status": ["u8dsn"],
17217
+ "message/global-disposition-notification": ["u8mdn"],
17218
+ "message/global-headers": ["u8hdr"],
17219
+ "message/rfc822": ["eml", "mime", "mht", "mhtml"],
17220
+ "model/3mf": ["3mf"],
17221
+ "model/gltf+json": ["gltf"],
17222
+ "model/gltf-binary": ["glb"],
17223
+ "model/iges": ["igs", "iges"],
17224
+ "model/jt": ["jt"],
17225
+ "model/mesh": ["msh", "mesh", "silo"],
17226
+ "model/mtl": ["mtl"],
17227
+ "model/obj": ["obj"],
17228
+ "model/prc": ["prc"],
17229
+ "model/step": ["step", "stp", "stpnc", "p21", "210"],
17230
+ "model/step+xml": ["stpx"],
17231
+ "model/step+zip": ["stpz"],
17232
+ "model/step-xml+zip": ["stpxz"],
17233
+ "model/stl": ["stl"],
17234
+ "model/u3d": ["u3d"],
17235
+ "model/vrml": ["wrl", "vrml"],
17236
+ "model/x3d+binary": ["*x3db", "x3dbz"],
17237
+ "model/x3d+fastinfoset": ["x3db"],
17238
+ "model/x3d+vrml": ["*x3dv", "x3dvz"],
17239
+ "model/x3d+xml": ["x3d", "x3dz"],
17240
+ "model/x3d-vrml": ["x3dv"],
17241
+ "text/cache-manifest": ["appcache", "manifest"],
17242
+ "text/calendar": ["ics", "ifb"],
17243
+ "text/coffeescript": ["coffee", "litcoffee"],
17244
+ "text/css": ["css"],
17245
+ "text/csv": ["csv"],
17246
+ "text/html": ["html", "htm", "shtml"],
17247
+ "text/jade": ["jade"],
17248
+ "text/javascript": ["js", "mjs"],
17249
+ "text/jsx": ["jsx"],
17250
+ "text/less": ["less"],
17251
+ "text/markdown": ["md", "markdown"],
17252
+ "text/mathml": ["mml"],
17253
+ "text/mdx": ["mdx"],
17254
+ "text/n3": ["n3"],
17255
+ "text/plain": ["txt", "text", "conf", "def", "list", "log", "in", "ini"],
17256
+ "text/richtext": ["rtx"],
17257
+ "text/rtf": ["*rtf"],
17258
+ "text/sgml": ["sgml", "sgm"],
17259
+ "text/shex": ["shex"],
17260
+ "text/slim": ["slim", "slm"],
17261
+ "text/spdx": ["spdx"],
17262
+ "text/stylus": ["stylus", "styl"],
17263
+ "text/tab-separated-values": ["tsv"],
17264
+ "text/troff": ["t", "tr", "roff", "man", "me", "ms"],
17265
+ "text/turtle": ["ttl"],
17266
+ "text/uri-list": ["uri", "uris", "urls"],
17267
+ "text/vcard": ["vcard"],
17268
+ "text/vtt": ["vtt"],
17269
+ "text/wgsl": ["wgsl"],
17270
+ "text/xml": ["*xml"],
17271
+ "text/yaml": ["yaml", "yml"],
17272
+ "video/3gpp": ["3gp", "3gpp"],
17273
+ "video/3gpp2": ["3g2"],
17274
+ "video/h261": ["h261"],
17275
+ "video/h263": ["h263"],
17276
+ "video/h264": ["h264"],
17277
+ "video/iso.segment": ["m4s"],
17278
+ "video/jpeg": ["jpgv"],
17279
+ "video/jpm": ["*jpm", "*jpgm"],
17280
+ "video/mj2": ["mj2", "mjp2"],
17281
+ "video/mp2t": ["ts", "m2t", "m2ts", "mts"],
17282
+ "video/mp4": ["mp4", "mp4v", "mpg4"],
17283
+ "video/mpeg": ["mpeg", "mpg", "mpe", "m1v", "m2v"],
17284
+ "video/ogg": ["ogv"],
17285
+ "video/quicktime": ["qt", "mov"],
17286
+ "video/webm": ["webm"]
17287
+ };
17288
+ Object.freeze(types2);
17289
+ var standard_default = types2;
17290
+
17291
+ // node_modules/mime/dist/src/Mime.js
17292
+ var __classPrivateFieldGet = function(receiver, state, kind, f) {
17293
+ if (kind === "a" && !f)
17294
+ throw new TypeError("Private accessor was defined without a getter");
17295
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
17296
+ throw new TypeError("Cannot read private member from an object whose class did not declare it");
17297
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
17298
+ };
17299
+ var _Mime_extensionToType;
17300
+ var _Mime_typeToExtension;
17301
+ var _Mime_typeToExtensions;
17302
+
17303
+ class Mime {
17304
+ constructor(...args) {
17305
+ _Mime_extensionToType.set(this, new Map);
17306
+ _Mime_typeToExtension.set(this, new Map);
17307
+ _Mime_typeToExtensions.set(this, new Map);
17308
+ for (const arg of args) {
17309
+ this.define(arg);
17310
+ }
17311
+ }
17312
+ define(typeMap, force = false) {
17313
+ for (let [type, extensions] of Object.entries(typeMap)) {
17314
+ type = type.toLowerCase();
17315
+ extensions = extensions.map((ext) => ext.toLowerCase());
17316
+ if (!__classPrivateFieldGet(this, _Mime_typeToExtensions, "f").has(type)) {
17317
+ __classPrivateFieldGet(this, _Mime_typeToExtensions, "f").set(type, new Set);
17318
+ }
17319
+ const allExtensions = __classPrivateFieldGet(this, _Mime_typeToExtensions, "f").get(type);
17320
+ let first = true;
17321
+ for (let extension of extensions) {
17322
+ const starred = extension.startsWith("*");
17323
+ extension = starred ? extension.slice(1) : extension;
17324
+ allExtensions?.add(extension);
17325
+ if (first) {
17326
+ __classPrivateFieldGet(this, _Mime_typeToExtension, "f").set(type, extension);
17327
+ }
17328
+ first = false;
17329
+ if (starred)
17330
+ continue;
17331
+ const currentType = __classPrivateFieldGet(this, _Mime_extensionToType, "f").get(extension);
17332
+ if (currentType && currentType != type && !force) {
17333
+ throw new Error(`"${type} -> ${extension}" conflicts with "${currentType} -> ${extension}". Pass \`force=true\` to override this definition.`);
17334
+ }
17335
+ __classPrivateFieldGet(this, _Mime_extensionToType, "f").set(extension, type);
17336
+ }
17337
+ }
17338
+ return this;
17339
+ }
17340
+ getType(path) {
17341
+ if (typeof path !== "string")
17342
+ return null;
17343
+ const last = path.replace(/^.*[/\\]/s, "").toLowerCase();
17344
+ const ext = last.replace(/^.*\./s, "").toLowerCase();
17345
+ const hasPath = last.length < path.length;
17346
+ const hasDot = ext.length < last.length - 1;
17347
+ if (!hasDot && hasPath)
17348
+ return null;
17349
+ return __classPrivateFieldGet(this, _Mime_extensionToType, "f").get(ext) ?? null;
17350
+ }
17351
+ getExtension(type) {
17352
+ if (typeof type !== "string")
17353
+ return null;
17354
+ type = type?.split?.(";")[0];
17355
+ return (type && __classPrivateFieldGet(this, _Mime_typeToExtension, "f").get(type.trim().toLowerCase())) ?? null;
17356
+ }
17357
+ getAllExtensions(type) {
17358
+ if (typeof type !== "string")
17359
+ return null;
17360
+ return __classPrivateFieldGet(this, _Mime_typeToExtensions, "f").get(type.toLowerCase()) ?? null;
17361
+ }
17362
+ _freeze() {
17363
+ this.define = () => {
17364
+ throw new Error("define() not allowed for built-in Mime objects. See https://github.com/broofa/mime/blob/main/README.md#custom-mime-instances");
17365
+ };
17366
+ Object.freeze(this);
17367
+ for (const extensions of __classPrivateFieldGet(this, _Mime_typeToExtensions, "f").values()) {
17368
+ Object.freeze(extensions);
17369
+ }
17370
+ return this;
17371
+ }
17372
+ _getTestState() {
17373
+ return {
17374
+ types: __classPrivateFieldGet(this, _Mime_extensionToType, "f"),
17375
+ extensions: __classPrivateFieldGet(this, _Mime_typeToExtension, "f")
17376
+ };
17377
+ }
17378
+ }
17379
+ _Mime_extensionToType = new WeakMap, _Mime_typeToExtension = new WeakMap, _Mime_typeToExtensions = new WeakMap;
17380
+ var Mime_default = Mime;
17381
+
17382
+ // node_modules/mime/dist/src/index.js
17383
+ var src_default = new Mime_default(standard_default, other_default)._freeze();
17384
+
17385
+ // src/lib/SkillFs.ts
17386
+ var readSkillFile = async (path) => {
17387
+ const file2 = Bun.file(path);
17388
+ return file2.text();
17389
+ };
17390
+ var listSkillFiles = (skillPath, subdirectory) => {
17391
+ const glob = new Bun.Glob(join(subdirectory, "**", "*"));
17392
+ return Array.from(glob.scanSync({ cwd: skillPath, absolute: true }));
17393
+ };
17394
+ var findSkillPaths = async (basePath) => {
17395
+ const glob = new Bun.Glob("**/SKILL.md");
17396
+ const results = [];
17397
+ for await (const path of glob.scan({ cwd: basePath, absolute: true })) {
17398
+ results.push(path);
17399
+ }
17400
+ return results;
17401
+ };
17402
+ var doesPathExist = (path) => {
17403
+ return existsSync(path);
17404
+ };
17405
+ var detectMimeType = (filePath) => {
17406
+ return src_default.getType(filePath) || "application/octet-stream";
17407
+ };
17408
+
17409
+ // src/services/SkillSearcher.ts
17410
+ var import_search_string = __toESM(require_searchString(), 1);
17411
+ function parseQuery(queryString) {
17412
+ const queries = Array.isArray(queryString) ? queryString : [queryString];
17413
+ const textSegments = queries.map((query) => {
17414
+ const instance = import_search_string.default.parse(query);
17415
+ return instance.getTextSegments();
17416
+ }).flat();
17417
+ const include = textSegments.filter((s) => !s.negated).map((s) => s.text.toLowerCase()).filter((s) => s.trim().length > 0);
17418
+ const exclude = textSegments.filter((s) => s.negated).map((s) => s.text.toLowerCase()).filter((s) => s.trim().length > 0);
16175
17419
  return {
16176
- data: path.join(localAppData, name, "Data"),
16177
- config: path.join(appData, name, "Config"),
16178
- cache: path.join(localAppData, name, "Cache"),
16179
- log: path.join(localAppData, name, "Log"),
16180
- temp: path.join(tmpdir, name)
17420
+ include,
17421
+ exclude,
17422
+ originalQuery: queries.filter((q) => q.trim().length > 0),
17423
+ hasExclusions: exclude.length > 0,
17424
+ termCount: textSegments.length
17425
+ };
17426
+ }
17427
+ function rankSkill(skill, includeTerms) {
17428
+ const skillName = skill.name.toLowerCase();
17429
+ const skillDesc = skill.description.toLowerCase();
17430
+ let nameMatches = 0;
17431
+ let descMatches = 0;
17432
+ for (const term of includeTerms) {
17433
+ if (skillName.includes(term)) {
17434
+ nameMatches++;
17435
+ } else if (skillDesc.includes(term)) {
17436
+ descMatches++;
17437
+ }
17438
+ }
17439
+ let exactBonus = 0;
17440
+ if (includeTerms.length === 1 && skillName === includeTerms[0]) {
17441
+ exactBonus = 10;
17442
+ }
17443
+ const totalScore = nameMatches * 3 + descMatches * 1 + exactBonus;
17444
+ return { skill, nameMatches, descMatches, totalScore };
17445
+ }
17446
+ function shouldIncludeSkill(skill, excludeTerms) {
17447
+ if (excludeTerms.length === 0) {
17448
+ return true;
17449
+ }
17450
+ const haystack = `${skill.name} ${skill.description}`.toLowerCase();
17451
+ return !excludeTerms.some((term) => haystack.includes(term));
17452
+ }
17453
+ function generateFeedback(query, matchCount) {
17454
+ const parts = [];
17455
+ if (query.include.length > 0) {
17456
+ parts.push(`Searching for: "**${query.originalQuery.join(" ")}**"`);
17457
+ } else {
17458
+ parts.push(`No include search terms provided`);
17459
+ }
17460
+ if (query.hasExclusions) {
17461
+ parts.push(`Excluding: **${query.exclude.join(", ")}**`);
17462
+ }
17463
+ if (matchCount === 0) {
17464
+ parts.push(`No matches found`);
17465
+ parts.push(`- Try different or fewer search terms.`);
17466
+ parts.push(`- Use skill_find("*") to list all skills.`);
17467
+ } else if (matchCount === 1) {
17468
+ parts.push(`Found 1 match`);
17469
+ } else {
17470
+ parts.push(`Found ${matchCount} matches`);
17471
+ }
17472
+ return parts.join(" | ");
17473
+ }
17474
+ function createSkillSearcher(registry2) {
17475
+ function resolveQuery(queryString) {
17476
+ const query = parseQuery(queryString);
17477
+ const skills = registry2.skills;
17478
+ const output = {
17479
+ matches: [],
17480
+ totalMatches: 0,
17481
+ totalSkills: registry2.skills.length,
17482
+ feedback: "",
17483
+ query
17484
+ };
17485
+ if (queryString === "" || queryString === "*" || query.include.length === 1 && query.include[0] === "*" || query.include.length === 0 && query.hasExclusions === false) {
17486
+ output.matches = skills;
17487
+ output.totalMatches = skills.length;
17488
+ output.feedback = `Listing all ${skills.length} skills`;
17489
+ return output;
17490
+ }
17491
+ let results = skills.filter((skill) => {
17492
+ const haystack = `${skill.toolName} ${skill.name} ${skill.description}`.toLowerCase();
17493
+ return query.include.every((term) => haystack.includes(term));
17494
+ });
17495
+ output.matches = results;
17496
+ output.totalMatches = results.length;
17497
+ output.feedback = generateFeedback(query, results.length);
17498
+ return output;
17499
+ }
17500
+ return function search(queryString) {
17501
+ const resolved = resolveQuery(queryString);
17502
+ const results = resolved.matches.filter((skill) => shouldIncludeSkill(skill, resolved.query.exclude));
17503
+ const totalMatches = results.length;
17504
+ const ranked = results.map((skill) => rankSkill(skill, resolved.query.include)).sort((a, b) => {
17505
+ if (b.totalScore !== a.totalScore) {
17506
+ return b.totalScore - a.totalScore;
17507
+ }
17508
+ if (b.nameMatches !== a.nameMatches) {
17509
+ return b.nameMatches - a.nameMatches;
17510
+ }
17511
+ return a.skill.name.localeCompare(b.skill.name);
17512
+ });
17513
+ const matches = ranked.map((r) => r.skill);
17514
+ return {
17515
+ matches,
17516
+ totalMatches,
17517
+ feedback: resolved.feedback,
17518
+ query: resolved.query,
17519
+ totalSkills: registry2.skills.length
17520
+ };
17521
+ };
17522
+ }
17523
+
17524
+ // src/lib/ReadyStateMachine.ts
17525
+ function createReadyStateMachine() {
17526
+ const state = {
17527
+ status: "idle",
17528
+ watchers: new Set
17529
+ };
17530
+ const setStatus = (newStatus) => {
17531
+ state.status = newStatus;
17532
+ state.watchers.forEach((watcher) => watcher(state.status));
17533
+ };
17534
+ const watchReady = (callback) => {
17535
+ state.watchers.add(callback);
17536
+ return () => {
17537
+ state.watchers.delete(callback);
17538
+ };
17539
+ };
17540
+ const whenReady = async () => {
17541
+ while (state.status !== "ready" && state.status !== "error") {
17542
+ await new Promise((resolve) => {
17543
+ const unsubscribe = watchReady(() => {
17544
+ unsubscribe();
17545
+ resolve(null);
17546
+ });
17547
+ });
17548
+ }
17549
+ if (state.status === "error") {
17550
+ throw new Error("Ready state machine failed to initialize");
17551
+ }
16181
17552
  };
16182
- };
16183
- var linux = (name) => {
16184
- const username = path.basename(homedir);
16185
17553
  return {
16186
- data: path.join(env.XDG_DATA_HOME || path.join(homedir, ".local", "share"), name),
16187
- config: path.join(env.XDG_CONFIG_HOME || path.join(homedir, ".config"), name),
16188
- cache: path.join(env.XDG_CACHE_HOME || path.join(homedir, ".cache"), name),
16189
- log: path.join(env.XDG_STATE_HOME || path.join(homedir, ".local", "state"), name),
16190
- temp: path.join(tmpdir, username, name)
17554
+ setStatus,
17555
+ watchReady,
17556
+ whenReady
16191
17557
  };
16192
- };
16193
- function envPaths(name, { suffix = "nodejs" } = {}) {
16194
- if (typeof name !== "string") {
16195
- throw new TypeError(`Expected a string, got ${typeof name}`);
17558
+ }
17559
+
17560
+ // src/services/SkillRegistry.ts
17561
+ var SkillFrontmatterSchema = tool.schema.object({
17562
+ name: tool.schema.string().optional(),
17563
+ description: tool.schema.string().min(20, "Description must be at least 20 characters for discoverability"),
17564
+ license: tool.schema.string().optional(),
17565
+ "allowed-tools": tool.schema.array(tool.schema.string()).optional(),
17566
+ metadata: tool.schema.record(tool.schema.string(), tool.schema.string()).optional()
17567
+ });
17568
+ function createSkillRegistryController() {
17569
+ const store = new Map;
17570
+ const controller = {
17571
+ ready: createReadyStateMachine(),
17572
+ get skills() {
17573
+ return Array.from(store.values()).sort((a, b) => a.name.localeCompare(b.name));
17574
+ },
17575
+ get ids() {
17576
+ return Array.from(store.keys()).sort();
17577
+ },
17578
+ delete(_key) {
17579
+ store.delete(_key);
17580
+ },
17581
+ clear: () => store.clear(),
17582
+ has: (key) => store.has(key),
17583
+ get: (key) => store.get(key),
17584
+ set: (key, skill) => {
17585
+ store.set(key, skill);
17586
+ }
17587
+ };
17588
+ return controller;
17589
+ }
17590
+ async function createSkillRegistry(config2, logger) {
17591
+ const controller = createSkillRegistryController();
17592
+ const debug = {
17593
+ discovered: 0,
17594
+ parsed: 0,
17595
+ rejected: 0,
17596
+ errors: []
17597
+ };
17598
+ const initialise = async () => {
17599
+ controller.ready.setStatus("loading");
17600
+ try {
17601
+ const paths = [];
17602
+ const existingBasePaths = config2.basePaths.filter(doesPathExist);
17603
+ if (existingBasePaths.length === 0) {
17604
+ logger.warn("[OpencodeSkillful] No valid base paths found for skill discovery:", config2.basePaths);
17605
+ controller.ready.setStatus("ready");
17606
+ return;
17607
+ }
17608
+ logger.debug("[SkillRegistryController] Discovering skills in base paths:", existingBasePaths);
17609
+ for (const basePath of existingBasePaths) {
17610
+ const found = await findSkillPaths(basePath);
17611
+ paths.push(...found);
17612
+ }
17613
+ logger.debug("[SkillRegistryController] skills.discovered", paths.length);
17614
+ debug.discovered = paths.length;
17615
+ if (paths.length === 0) {
17616
+ controller.ready.setStatus("ready");
17617
+ logger.debug("[SkillRegistryController] No skills found");
17618
+ return;
17619
+ }
17620
+ const results = await register(...paths);
17621
+ logger.debug("[SkillRegistryController] skills.initialise results", results);
17622
+ debug.parsed = results.parsed;
17623
+ debug.rejected = results.rejected;
17624
+ debug.errors = results.errors;
17625
+ controller.ready.setStatus("ready");
17626
+ } catch (error45) {
17627
+ const errorMessage = error45 instanceof Error ? error45.message : String(error45);
17628
+ logger.error("[SkillRegistryController] Initialization failed:", errorMessage);
17629
+ controller.ready.setStatus("error");
17630
+ }
17631
+ };
17632
+ const matchBasePath = (absolutePath) => {
17633
+ for (const basePath of config2.basePaths) {
17634
+ if (absolutePath.startsWith(basePath)) {
17635
+ return basePath;
17636
+ }
17637
+ }
17638
+ return null;
17639
+ };
17640
+ const register = async (...paths) => {
17641
+ logger.debug(`[SkillRegistryController] register [${paths.length}] skills`);
17642
+ const summary = {
17643
+ discovered: paths.length,
17644
+ parsed: 0,
17645
+ rejected: 0,
17646
+ errors: []
17647
+ };
17648
+ for await (const path of paths) {
17649
+ try {
17650
+ const content = await readSkillFile(path);
17651
+ const skill = await parseSkill({
17652
+ skillPath: path,
17653
+ basePath: matchBasePath(path) || "",
17654
+ content
17655
+ });
17656
+ if (!skill) {
17657
+ summary.rejected++;
17658
+ summary.errors.push(`[NOSKILLERROR] Failed to parse skill at ${path}`);
17659
+ logger.debug("[SkillRegistryController] error [NOSKILLERROR]", path, "=> NO SKILL");
17660
+ continue;
17661
+ }
17662
+ controller.set(skill.toolName, skill);
17663
+ summary.parsed++;
17664
+ } catch (error45) {
17665
+ summary.rejected++;
17666
+ summary.errors.push(error45 instanceof Error ? error45.message : `[UNKNOWNERROR] Unknown error at ${path}`);
17667
+ continue;
17668
+ }
17669
+ }
17670
+ logger.debug("errors", JSON.stringify(summary.errors, null, 2));
17671
+ return summary;
17672
+ };
17673
+ const isSkillPath = (path) => {
17674
+ return path.endsWith("SKILL.md") && config2.basePaths.some((basePath) => path.startsWith(basePath));
17675
+ };
17676
+ const getToolnameFromSkillPath = (path) => {
17677
+ if (!isSkillPath(path)) {
17678
+ return null;
17679
+ }
17680
+ const relativePath = relative(config2.basePaths.find((basePath) => path.startsWith(basePath)) || "", path);
17681
+ return toolName(relativePath);
17682
+ };
17683
+ const search = createSkillSearcher(controller);
17684
+ return {
17685
+ config: config2,
17686
+ controller,
17687
+ initialise,
17688
+ register,
17689
+ isSkillPath,
17690
+ getToolnameFromSkillPath,
17691
+ search,
17692
+ debug,
17693
+ logger
17694
+ };
17695
+ }
17696
+ async function parseSkill(args) {
17697
+ const relativePath = relative(args.basePath, args.skillPath);
17698
+ if (!relativePath) {
17699
+ throw new Error(`\u274C Skill path does not match expected pattern: ${args.skillPath}`);
17700
+ }
17701
+ if (!args.content) {
17702
+ throw new Error(`\u274C Unable to read skill file: ${args.skillPath}`);
17703
+ }
17704
+ const parsed = import_gray_matter.default(args.content);
17705
+ const frontmatter = SkillFrontmatterSchema.safeParse(parsed.data);
17706
+ if (!frontmatter.success) {
17707
+ throw new Error(`[FrontMatterInvalid] ${args.skillPath} [${JSON.stringify(frontmatter.error.issues)}]`, {
17708
+ cause: frontmatter.error
17709
+ });
16196
17710
  }
16197
- if (suffix) {
16198
- name += `-${suffix}`;
17711
+ const shortName = basename(dirname(args.skillPath));
17712
+ const skillFullPath = dirname(args.skillPath);
17713
+ const scriptPaths = listSkillFiles(skillFullPath, "scripts");
17714
+ const referencePaths = listSkillFiles(skillFullPath, "references");
17715
+ const assetPaths = listSkillFiles(skillFullPath, "assets");
17716
+ return {
17717
+ allowedTools: frontmatter.data["allowed-tools"],
17718
+ content: parsed.content.trim(),
17719
+ description: frontmatter.data.description,
17720
+ fullPath: skillFullPath,
17721
+ toolName: toolName(relativePath),
17722
+ license: frontmatter.data.license,
17723
+ metadata: frontmatter.data.metadata,
17724
+ name: shortName,
17725
+ path: args.skillPath,
17726
+ scripts: createSkillResourceMap(skillFullPath, scriptPaths),
17727
+ references: createSkillResourceMap(skillFullPath, referencePaths),
17728
+ assets: createSkillResourceMap(skillFullPath, assetPaths)
17729
+ };
17730
+ }
17731
+ function createSkillResourceMap(skillPath, filePaths) {
17732
+ const output = new Map;
17733
+ for (const filePath of filePaths) {
17734
+ const relativePath = relative(skillPath, filePath);
17735
+ output.set(relativePath, {
17736
+ absolutePath: filePath,
17737
+ mimeType: detectMimeType(filePath)
17738
+ });
16199
17739
  }
16200
- if (process.platform === "darwin") {
16201
- return macos(name);
17740
+ return output;
17741
+ }
17742
+
17743
+ // src/tools/SkillFinder.ts
17744
+ function createSkillFinder(provider) {
17745
+ return async (args) => {
17746
+ await provider.controller.ready.whenReady();
17747
+ const result = provider.search(args.query);
17748
+ const skills = result.matches.map((skill) => ({
17749
+ name: skill.toolName,
17750
+ description: skill.description
17751
+ }));
17752
+ return {
17753
+ query: args.query,
17754
+ skills,
17755
+ summary: {
17756
+ total: provider.controller.skills.length,
17757
+ matches: result.totalMatches,
17758
+ feedback: result.feedback
17759
+ },
17760
+ debug: provider.debug
17761
+ };
17762
+ };
17763
+ }
17764
+
17765
+ // src/tools/SkillResourceReader.ts
17766
+ import path from "path";
17767
+
17768
+ // src/services/SkillResourceResolver.ts
17769
+ function createSkillResourceResolver(provider) {
17770
+ const resolveResourceMap = (skill, type) => {
17771
+ if (type === "script") {
17772
+ return skill.scripts;
17773
+ } else if (type === "asset") {
17774
+ return skill.assets;
17775
+ } else if (type === "reference") {
17776
+ return skill.references;
17777
+ } else {
17778
+ throw new Error(`Unknown resource type: ${type}`);
17779
+ }
17780
+ };
17781
+ return async (args) => {
17782
+ const skill = provider.controller.get(args.skill_name);
17783
+ if (!skill) {
17784
+ throw new Error(`Skill not found: ${args.skill_name}`);
17785
+ }
17786
+ const resourceMap = resolveResourceMap(skill, args.type);
17787
+ if (!resourceMap) {
17788
+ throw new Error(`Skill "${args.skill_name}" does not have any resources of type "${args.type}"`);
17789
+ }
17790
+ const resourceEntry = resourceMap.get(args.relative_path);
17791
+ if (!resourceEntry) {
17792
+ throw new Error(`Resource not found: Skill "${args.skill_name}" does not have a ${args.type} at path "${args.relative_path}"`);
17793
+ }
17794
+ try {
17795
+ const content = await readSkillFile(resourceEntry.absolutePath);
17796
+ return {
17797
+ absolute_path: resourceEntry.absolutePath,
17798
+ content,
17799
+ mimeType: resourceEntry.mimeType
17800
+ };
17801
+ } catch (error45) {
17802
+ throw new Error(`Failed to read resource at ${resourceEntry.absolutePath}: ${error45 instanceof Error ? error45.message : String(error45)}`);
17803
+ }
17804
+ };
17805
+ }
17806
+
17807
+ // src/types.ts
17808
+ var ResourceTypes = ["script", "asset", "reference"];
17809
+ var assertIsValidResourceType = (type) => {
17810
+ if (!ResourceTypes.includes(type)) {
17811
+ throw new Error(`Invalid resource type: ${type}`);
16202
17812
  }
16203
- if (process.platform === "win32") {
16204
- return windows(name);
17813
+ };
17814
+
17815
+ // src/tools/SkillResourceReader.ts
17816
+ function createSkillResourceReader(provider) {
17817
+ const skillResourceResolver = createSkillResourceResolver(provider);
17818
+ return async (args) => {
17819
+ await provider.controller.ready.whenReady();
17820
+ const [type, ...restPath] = args.relative_path.split("/");
17821
+ assertIsValidResourceType(type);
17822
+ const resource = await skillResourceResolver({
17823
+ skill_name: args.skill_name,
17824
+ type,
17825
+ relative_path: path.join(...restPath)
17826
+ });
17827
+ const injection = {
17828
+ skill_name: args.skill_name,
17829
+ resource_path: args.relative_path,
17830
+ resource_mimetype: resource.mimeType,
17831
+ content: resource.content
17832
+ };
17833
+ return {
17834
+ injection
17835
+ };
17836
+ };
17837
+ }
17838
+
17839
+ // src/tools/SkillUser.ts
17840
+ function createSkillLoader(provider) {
17841
+ const registry2 = provider.controller;
17842
+ async function loadSkills(skillNames) {
17843
+ await provider.controller.ready.whenReady();
17844
+ const loaded = [];
17845
+ const notFound = [];
17846
+ for (const name of skillNames) {
17847
+ const skill = registry2.get(name);
17848
+ if (skill) {
17849
+ loaded.push(skill);
17850
+ } else {
17851
+ notFound.push(name);
17852
+ }
17853
+ }
17854
+ return {
17855
+ loaded,
17856
+ notFound
17857
+ };
16205
17858
  }
16206
- return linux(name);
17859
+ return loadSkills;
16207
17860
  }
16208
17861
 
16209
- // src/index.ts
16210
- var import_gray_matter = __toESM(require_gray_matter(), 1);
17862
+ // src/api.ts
17863
+ var createApi = async (config2) => {
17864
+ const logger = createLogger(config2);
17865
+ const registry2 = await createSkillRegistry(config2, logger);
17866
+ return {
17867
+ registry: registry2,
17868
+ logger,
17869
+ findSkills: createSkillFinder(registry2),
17870
+ readResource: createSkillResourceReader(registry2),
17871
+ loadSkill: createSkillLoader(registry2)
17872
+ };
17873
+ };
17874
+
17875
+ // src/config.ts
17876
+ import { join as join2 } from "path";
16211
17877
 
16212
17878
  // node_modules/ramda/es/internal/_isPlaceholder.js
16213
17879
  function _isPlaceholder(a) {
@@ -16330,396 +17996,157 @@ var mergeDeepLeft = /* @__PURE__ */ _curry2(function mergeDeepLeft2(lObj, rObj)
16330
17996
  }, lObj, rObj);
16331
17997
  });
16332
17998
  var mergeDeepLeft_default = mergeDeepLeft;
16333
- // src/index.ts
16334
- var import_search_string = __toESM(require_searchString(), 1);
16335
- var SKILL_PATH_PATTERN = /skills\/.*\/SKILL.md$/;
16336
-
16337
- class SkillSearcher {
16338
- skills;
16339
- constructor(skills) {
16340
- this.skills = skills;
16341
- }
16342
- parseQuery(queryString) {
16343
- const searchStringInstance = import_search_string.default.parse(queryString);
16344
- const textSegments = searchStringInstance.getTextSegments();
16345
- const include = textSegments.filter((s) => !s.negated).map((s) => s.text.toLowerCase()).filter((s) => s.length > 0);
16346
- const exclude = textSegments.filter((s) => s.negated).map((s) => s.text.toLowerCase()).filter((s) => s.length > 0);
16347
- return {
16348
- include,
16349
- exclude,
16350
- originalQuery: queryString,
16351
- hasExclusions: exclude.length > 0,
16352
- termCount: textSegments.length
16353
- };
16354
- }
16355
- rankSkill(skill, includeTerms) {
16356
- const skillName = skill.name.toLowerCase();
16357
- const skillDesc = skill.description.toLowerCase();
16358
- let nameMatches = 0;
16359
- let descMatches = 0;
16360
- for (const term of includeTerms) {
16361
- if (skillName.includes(term)) {
16362
- nameMatches++;
16363
- } else if (skillDesc.includes(term)) {
16364
- descMatches++;
16365
- }
16366
- }
16367
- let exactBonus = 0;
16368
- if (includeTerms.length === 1 && skillName === includeTerms[0]) {
16369
- exactBonus = 10;
16370
- }
16371
- const totalScore = nameMatches * 3 + descMatches * 1 + exactBonus;
16372
- return { skill, nameMatches, descMatches, totalScore };
16373
- }
16374
- shouldIncludeSkill(skill, excludeTerms) {
16375
- if (excludeTerms.length === 0) {
16376
- return true;
16377
- }
16378
- const haystack = `${skill.name} ${skill.description}`.toLowerCase();
16379
- return !excludeTerms.some((term) => haystack.includes(term));
16380
- }
16381
- generateFeedback(query, matchCount) {
16382
- const parts = [];
16383
- if (query.include.length > 0) {
16384
- parts.push(`\uD83D\uDCDD Searching for: **${query.include.join(", ")}**`);
16385
- }
16386
- if (query.hasExclusions) {
16387
- parts.push(`\uD83D\uDEAB Excluding: **${query.exclude.join(", ")}**`);
16388
- }
16389
- if (matchCount === 0) {
16390
- parts.push(`\u274C No matches found`);
16391
- } else if (matchCount === 1) {
16392
- parts.push(`\u2705 Found 1 match`);
16393
- } else {
16394
- parts.push(`\u2705 Found ${matchCount} matches`);
16395
- }
16396
- return parts.join(" | ");
16397
- }
16398
- search(queryString) {
16399
- const query = this.parseQuery(queryString);
16400
- if (query.include.length === 0) {
16401
- return {
16402
- matches: [],
16403
- totalMatches: 0,
16404
- feedback: this.generateFeedback(query, 0),
16405
- query
16406
- };
16407
- }
16408
- let results = this.skills.filter((skill) => {
16409
- const haystack = `${skill.name} ${skill.description}`.toLowerCase();
16410
- return query.include.every((term) => haystack.includes(term));
16411
- });
16412
- const totalMatches = results.length;
16413
- results = results.filter((skill) => this.shouldIncludeSkill(skill, query.exclude));
16414
- const ranked = results.map((skill) => this.rankSkill(skill, query.include)).sort((a, b) => {
16415
- if (b.totalScore !== a.totalScore) {
16416
- return b.totalScore - a.totalScore;
16417
- }
16418
- if (b.nameMatches !== a.nameMatches) {
16419
- return b.nameMatches - a.nameMatches;
16420
- }
16421
- return a.skill.name.localeCompare(b.skill.name);
16422
- });
16423
- const matches = ranked.map((r) => r.skill);
16424
- const feedback = this.generateFeedback(query, matches.length);
16425
- return {
16426
- matches,
16427
- totalMatches,
16428
- feedback,
16429
- query
16430
- };
16431
- }
16432
- }
16433
- function createSkillRegistryController() {
16434
- const registry2 = new Map;
17999
+ // node_modules/env-paths/index.js
18000
+ import path2 from "path";
18001
+ import os from "os";
18002
+ import process from "process";
18003
+ var homedir = os.homedir();
18004
+ var tmpdir = os.tmpdir();
18005
+ var { env } = process;
18006
+ var macos = (name) => {
18007
+ const library = path2.join(homedir, "Library");
16435
18008
  return {
16436
- registry: registry2,
16437
- has: (key) => registry2.has(key),
16438
- get: (key) => registry2.get(key),
16439
- add: (key, skill) => {
16440
- registry2.set(key, skill);
16441
- },
16442
- search: (...args) => {
16443
- const results = [];
16444
- const query = args.map((a) => a.toLowerCase());
16445
- for (const skill of registry2.values()) {
16446
- const haystack = `${skill.name} ${skill.description}`.toLowerCase();
16447
- if (query.every((q) => haystack.includes(q))) {
16448
- results.push(skill);
16449
- }
16450
- }
16451
- return results;
16452
- }
18009
+ data: path2.join(library, "Application Support", name),
18010
+ config: path2.join(library, "Preferences", name),
18011
+ cache: path2.join(library, "Caches", name),
18012
+ log: path2.join(library, "Logs", name),
18013
+ temp: path2.join(tmpdir, name)
16453
18014
  };
16454
- }
16455
- var SkillFrontmatterSchema = tool.schema.object({
16456
- name: tool.schema.string().regex(/^[a-z0-9-]+$/, "Name must be lowercase alphanumeric with hyphens").min(1, "Name cannot be empty"),
16457
- description: tool.schema.string().min(20, "Description must be at least 20 characters for discoverability"),
16458
- license: tool.schema.string().optional(),
16459
- "allowed-tools": tool.schema.array(tool.schema.string()).optional(),
16460
- metadata: tool.schema.record(tool.schema.string(), tool.schema.string()).optional()
16461
- });
16462
- function toolName(skillPath) {
16463
- return skillPath.replace(/\/SKILL\.md$/, "").split(sep).join("_").replace(/-/g, "_");
16464
- }
16465
- async function findSkillPaths(basePaths) {
16466
- const basePathsArray = Array.isArray(basePaths) ? basePaths : [basePaths];
16467
- try {
16468
- const paths = [];
16469
- for (const basePath of basePathsArray) {
16470
- const stat = await lstat(basePath).catch(() => null);
16471
- if (!stat?.isDirectory()) {
16472
- continue;
16473
- }
16474
- paths.push(basePath);
16475
- }
16476
- const patterns = paths.map((basePath) => join(basePath, "**/SKILL.md"));
16477
- const matches = await fsPromises.glob(patterns);
16478
- return matches;
16479
- } catch {
16480
- return [];
16481
- }
16482
- }
16483
- async function parseSkill(skillPath) {
16484
- try {
16485
- const relativePath = skillPath.match(SKILL_PATH_PATTERN)?.[0];
16486
- if (!relativePath) {
16487
- console.error(`\u274C Skill path does not match expected pattern: ${skillPath}`);
16488
- return null;
16489
- }
16490
- const content = await Bun.file(skillPath).text();
16491
- const parsed = import_gray_matter.default(content);
16492
- const frontmatter = SkillFrontmatterSchema.safeParse(parsed.data);
16493
- if (!frontmatter.success) {
16494
- console.error(`\u274C Invalid frontmatter in ${skillPath}:`);
16495
- frontmatter.error.flatten().formErrors.forEach((err) => {
16496
- console.error(` - ${err}`);
16497
- });
16498
- return null;
16499
- }
16500
- const skillDir = basename(dirname(skillPath));
16501
- if (frontmatter.data.name !== skillDir) {
16502
- console.error(`\u274C Name mismatch in ${skillPath}:`, `
16503
- Frontmatter name: "${frontmatter.data.name}"`, `
16504
- Directory name: "${skillDir}"`, `
16505
- Fix: Update the 'name' field in SKILL.md to match the directory name`);
16506
- return null;
16507
- }
16508
- return {
16509
- allowedTools: frontmatter.data["allowed-tools"],
16510
- content: parsed.content.trim(),
16511
- description: frontmatter.data.description,
16512
- fullPath: dirname(skillPath),
16513
- toolName: toolName(relativePath),
16514
- license: frontmatter.data.license,
16515
- metadata: frontmatter.data.metadata,
16516
- name: frontmatter.data.name,
16517
- path: skillPath
16518
- };
16519
- } catch (error45) {
16520
- console.error(`\u274C Error parsing skill ${skillPath}:`, error45 instanceof Error ? error45.message : String(error45));
16521
- return null;
16522
- }
16523
- }
16524
- function createInstructionInjector(ctx) {
16525
- const sendPrompt = async (text, props) => {
16526
- ctx.client.session.prompt({
16527
- path: { id: props.sessionId },
16528
- body: {
16529
- noReply: true,
16530
- parts: [{ type: "text", text }]
16531
- }
16532
- });
18015
+ };
18016
+ var windows = (name) => {
18017
+ const appData = env.APPDATA || path2.join(homedir, "AppData", "Roaming");
18018
+ const localAppData = env.LOCALAPPDATA || path2.join(homedir, "AppData", "Local");
18019
+ return {
18020
+ data: path2.join(localAppData, name, "Data"),
18021
+ config: path2.join(appData, name, "Config"),
18022
+ cache: path2.join(localAppData, name, "Cache"),
18023
+ log: path2.join(localAppData, name, "Log"),
18024
+ temp: path2.join(tmpdir, name)
16533
18025
  };
16534
- return sendPrompt;
16535
- }
16536
- async function loadSkill(skill, options2) {
16537
- const sendPrompt = createInstructionInjector(options2.ctx);
16538
- await sendPrompt(`The "${skill.name}" skill is loading
16539
- ${skill.name}`, {
16540
- sessionId: options2.sessionID
16541
- });
16542
- await sendPrompt(`Base directory for this skill: ${skill.fullPath}
16543
-
16544
- ${skill.content}`, {
16545
- sessionId: options2.sessionID
16546
- });
16547
- }
16548
- async function loadSkills(skillNames, manager, options2) {
16549
- const loaded = [];
16550
- const notFound = [];
16551
- for (const skillName of skillNames) {
16552
- let skill = manager.byFQDN.get(skillName);
16553
- if (!skill) {
16554
- skill = manager.byName.get(skillName);
16555
- }
16556
- if (!skill) {
16557
- notFound.push(skillName);
16558
- continue;
16559
- }
16560
- await loadSkill(skill, {
16561
- ctx: options2.ctx,
16562
- sessionID: options2.sessionID
16563
- });
16564
- loaded.push(skill.toolName);
18026
+ };
18027
+ var linux = (name) => {
18028
+ const username = path2.basename(homedir);
18029
+ return {
18030
+ data: path2.join(env.XDG_DATA_HOME || path2.join(homedir, ".local", "share"), name),
18031
+ config: path2.join(env.XDG_CONFIG_HOME || path2.join(homedir, ".config"), name),
18032
+ cache: path2.join(env.XDG_CACHE_HOME || path2.join(homedir, ".cache"), name),
18033
+ log: path2.join(env.XDG_STATE_HOME || path2.join(homedir, ".local", "state"), name),
18034
+ temp: path2.join(tmpdir, username, name)
18035
+ };
18036
+ };
18037
+ function envPaths(name, { suffix = "nodejs" } = {}) {
18038
+ if (typeof name !== "string") {
18039
+ throw new TypeError(`Expected a string, got ${typeof name}`);
16565
18040
  }
16566
- return { loaded, notFound };
16567
- }
16568
- function createUseSkillsTool(ctx, registry2) {
16569
- return tool({
16570
- description: "Load one or more skills into the chat. Provide an array of skill names to load them as user messages.",
16571
- args: {
16572
- skill_names: tool.schema.array(tool.schema.string()).min(1, "Must provide at least one skill name")
16573
- },
16574
- execute: async (args, toolCtx) => {
16575
- const response = await loadSkills(args.skill_names, registry2, {
16576
- ctx,
16577
- sessionID: toolCtx.sessionID
16578
- });
16579
- let result = `Loaded ${response.loaded.length} skill(s): ${response.loaded.join(", ")}`;
16580
- if (response.notFound.length > 0) {
16581
- result += `
16582
-
16583
- Skills not found: ${response.notFound.join(", ")}`;
16584
- }
16585
- return result;
16586
- }
16587
- });
16588
- }
16589
- function normalizePathQuery(query) {
16590
- return query.replace(/[/-]/g, "_").toLowerCase();
16591
- }
16592
- function stripSkillsPrefix(toolName2) {
16593
- return toolName2.replace(/^skills_/, "");
16594
- }
16595
- function createFindSkillsTool(ctx, registry2) {
16596
- return tool({
16597
- description: "Search for skills using natural query syntax. Supports path prefixes (e.g., 'experts', 'superpowers/writing'), negation (-term), quoted phrases, and free text. Use '*' to list all skills.",
16598
- args: {
16599
- query: tool.schema.string()
16600
- },
16601
- execute: async (args) => {
16602
- const allSkills = Array.from(registry2.byName.registry.values());
16603
- const query = args.query.trim();
16604
- if (query === "" || query === "*") {
16605
- const resultsList2 = allSkills.sort((a, b) => a.toolName.localeCompare(b.toolName)).map((m) => `- **${m.name}** \`${m.toolName}\`
16606
- ${m.description}`).join(`
16607
- `);
16608
- return `Found ${allSkills.length} skill(s):
16609
-
16610
- ${resultsList2}`;
16611
- }
16612
- const normalizedQuery = normalizePathQuery(query);
16613
- const prefixMatches = allSkills.filter((skill) => {
16614
- const shortName = stripSkillsPrefix(skill.toolName);
16615
- return shortName.startsWith(normalizedQuery);
16616
- });
16617
- if (prefixMatches.length > 0) {
16618
- const resultsList2 = prefixMatches.sort((a, b) => a.toolName.localeCompare(b.toolName)).map((m) => `- **${m.name}** \`${m.toolName}\`
16619
- ${m.description}`).join(`
16620
- `);
16621
- return `Found ${prefixMatches.length} skill(s) matching path "${query}":
16622
-
16623
- ${resultsList2}`;
16624
- }
16625
- const searcher = new SkillSearcher(allSkills);
16626
- const result = searcher.search(query);
16627
- if (result.matches.length === 0) {
16628
- return `${result.feedback}
16629
-
16630
- No skills found matching "${query}"`;
16631
- }
16632
- const resultsList = result.matches.map((m) => `- **${m.name}** \`${m.toolName}\`
16633
- ${m.description}`).join(`
16634
- `);
16635
- return `${result.feedback}
16636
-
16637
- ${resultsList}`;
16638
- }
16639
- });
16640
- }
16641
- function createToolResourceReader(ctx, registry2) {
16642
- const sendPrompt = createInstructionInjector(ctx);
16643
- return tool({
16644
- description: "Read [[<relative_path>]] from a skill's resources and inject content silently. If loading skills, use the skills_<skillname> instead.",
16645
- args: {
16646
- skill_name: tool.schema.string(),
16647
- relative_path: tool.schema.string()
16648
- },
16649
- execute: async (args, toolCtx) => {
16650
- let skill = registry2.byFQDN.get(args.skill_name) || registry2.byName.get(args.skill_name);
16651
- if (!skill) {
16652
- throw new Error(`Skill not found: ${args.skill_name}`);
16653
- }
16654
- const resourcePath = join(skill.fullPath, args.relative_path);
16655
- try {
16656
- const content = await Bun.file(resourcePath).text();
16657
- await sendPrompt(`Resource loaded from skill "${skill.name}": ${args.relative_path}
16658
-
16659
- ${content}`, { sessionId: toolCtx.sessionID });
16660
- return `Resource "${args.relative_path}" from skill "${skill.name}" has been loaded successfully.`;
16661
- } catch (error45) {
16662
- throw new Error(`Failed to read resource at ${resourcePath}: ${error45 instanceof Error ? error45.message : String(error45)}`);
16663
- }
16664
- }
16665
- });
16666
- }
16667
- async function createSkillRegistry(ctx, config2) {
16668
- const byFQDN = createSkillRegistryController();
16669
- const byName = createSkillRegistryController();
16670
- const matches = await findSkillPaths(config2.basePaths);
16671
- const dupes = [];
16672
- for await (const match of matches) {
16673
- const skill = await parseSkill(match);
16674
- if (!skill) {
16675
- continue;
16676
- }
16677
- if (byFQDN.has(skill.toolName)) {
16678
- dupes.push(skill.toolName);
16679
- continue;
16680
- }
16681
- byName.add(skill.name, skill);
16682
- byFQDN.add(skill.toolName, skill);
18041
+ if (suffix) {
18042
+ name += `-${suffix}`;
16683
18043
  }
16684
- if (dupes.length) {
16685
- console.warn(`\u26A0\uFE0F Duplicate skills detected (skipped): ${dupes.join(", ")}`);
18044
+ if (process.platform === "darwin") {
18045
+ return macos(name);
16686
18046
  }
16687
- function search(query) {
16688
- const resultsByName = byName.search(query);
16689
- const resultsByFQDN = byFQDN.search(query);
16690
- const allResults = [...resultsByName, ...resultsByFQDN];
16691
- const uniqueResultsMap = new Map;
16692
- for (const skill of allResults) {
16693
- uniqueResultsMap.set(skill.toolName, skill);
16694
- }
16695
- return Array.from(uniqueResultsMap.values());
18047
+ if (process.platform === "win32") {
18048
+ return windows(name);
16696
18049
  }
16697
- return {
16698
- byName,
16699
- byFQDN,
16700
- search
16701
- };
18050
+ return linux(name);
16702
18051
  }
18052
+
18053
+ // src/config.ts
16703
18054
  var OpenCodePaths = envPaths("opencode", { suffix: "" });
16704
18055
  async function getPluginConfig(ctx) {
16705
18056
  const base = {
16706
18057
  debug: false,
16707
18058
  basePaths: [
16708
- join(os2.homedir(), ".opencode/skills"),
16709
- join(OpenCodePaths.config, "skills"),
16710
- join(ctx.directory, ".opencode/skills")
18059
+ join2(OpenCodePaths.config, "skills"),
18060
+ join2(ctx.directory, ".opencode", "skills")
16711
18061
  ]
16712
18062
  };
16713
18063
  return mergeDeepLeft_default({}, base);
16714
18064
  }
18065
+
18066
+ // src/lib/xml.ts
18067
+ function escapeXml(str2) {
18068
+ return String(str2).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
18069
+ }
18070
+ function jsonToXml(json2, rootElement = "root") {
18071
+ let xml = `<${rootElement}>`;
18072
+ for (const key in json2) {
18073
+ if (!Object.hasOwn(json2, key)) {
18074
+ continue;
18075
+ }
18076
+ if (typeof key !== "string") {
18077
+ continue;
18078
+ }
18079
+ const value = Object.getOwnPropertyDescriptor(json2, key)?.value;
18080
+ if (Array.isArray(value)) {
18081
+ for (const item of value) {
18082
+ xml += jsonToXml(item, key);
18083
+ }
18084
+ } else if (typeof value === "object" && value !== null) {
18085
+ xml += jsonToXml(value, key);
18086
+ } else if (value !== undefined && value !== null) {
18087
+ xml += `<${key}>${escapeXml(String(value))}</${key}>`;
18088
+ } else {
18089
+ xml += `<${key}/>`;
18090
+ }
18091
+ }
18092
+ xml += `</${rootElement}>`;
18093
+ return xml;
18094
+ }
18095
+
18096
+ // src/index.ts
16715
18097
  var SkillsPlugin = async (ctx) => {
16716
18098
  const config2 = await getPluginConfig(ctx);
16717
- const registry2 = await createSkillRegistry(ctx, config2);
18099
+ const api2 = await createApi(config2);
18100
+ const sendPrompt = createInstructionInjector(ctx);
18101
+ api2.registry.initialise();
16718
18102
  return {
16719
18103
  tool: {
16720
- skill_use: createUseSkillsTool(ctx, registry2),
16721
- skill_find: createFindSkillsTool(ctx, registry2),
16722
- skill_resource: createToolResourceReader(ctx, registry2)
18104
+ skill_use: tool({
18105
+ description: "Load one or more skills into the chat. Provide an array of skill names to load them as user messages.",
18106
+ args: {
18107
+ skill_names: tool.schema.array(tool.schema.string()).describe("An array of skill names to load.")
18108
+ },
18109
+ execute: async (args, toolCtx) => {
18110
+ const results = await api2.loadSkill(args.skill_names);
18111
+ for await (const skill of results.loaded) {
18112
+ await sendPrompt(jsonToXml(skill, "Skill"), { sessionId: toolCtx.sessionID });
18113
+ }
18114
+ return JSON.stringify({
18115
+ loaded: results.loaded.map((skill) => skill.toolName),
18116
+ not_found: results.notFound
18117
+ });
18118
+ }
18119
+ }),
18120
+ skill_find: tool({
18121
+ description: `Search for skills using natural query syntax`,
18122
+ args: {
18123
+ query: tool.schema.union([tool.schema.string(), tool.schema.array(tool.schema.string())]).describe("The search query string or array of strings.")
18124
+ },
18125
+ execute: async (args) => {
18126
+ const results = await api2.findSkills(args);
18127
+ const output = jsonToXml(results, "SkillSearchResults");
18128
+ return output;
18129
+ }
18130
+ }),
18131
+ skill_resource: tool({
18132
+ description: `Read a resource file from a skill.`,
18133
+ args: {
18134
+ skill_name: tool.schema.string().describe("The skill id to read the resource from."),
18135
+ relative_path: tool.schema.string().describe("The relative path to the resource file within the skill directory.")
18136
+ },
18137
+ execute: async (args, toolCtx) => {
18138
+ const result = await api2.readResource(args);
18139
+ if (!result.injection) {
18140
+ throw new Error("Failed to read resource");
18141
+ }
18142
+ await sendPrompt(jsonToXml(result.injection), { sessionId: toolCtx.sessionID });
18143
+ return JSON.stringify({
18144
+ result: "Resource injected successfully",
18145
+ resource_path: result.injection.resource_path,
18146
+ resource_mimetype: result.injection.resource_mimetype
18147
+ });
18148
+ }
18149
+ })
16723
18150
  }
16724
18151
  };
16725
18152
  };