@geminixiang/mikan 1.2.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/dist/adapters/slack/bot.js +1 -1
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/env-manifest.js +1 -1
- package/dist/env-manifest.js.map +1 -1
- package/dist/harness/jev.d.ts +2 -7
- package/dist/harness/jev.d.ts.map +1 -1
- package/dist/harness/jev.js +30 -19
- package/dist/harness/jev.js.map +1 -1
- package/dist/harness/models.d.ts.map +1 -1
- package/dist/harness/models.js +23 -37
- package/dist/harness/models.js.map +1 -1
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +0 -7
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/tools/index.d.ts +1 -2
- package/dist/harness/tools/index.d.ts.map +1 -1
- package/dist/harness/tools/index.js +2 -2
- package/dist/harness/tools/index.js.map +1 -1
- package/dist/harness/tools/jev-browser.d.ts +1 -2
- package/dist/harness/tools/jev-browser.d.ts.map +1 -1
- package/dist/harness/tools/jev-browser.js +50 -18
- package/dist/harness/tools/jev-browser.js.map +1 -1
- package/dist/harness/tools/jev.d.ts.map +1 -1
- package/dist/harness/tools/jev.js +1 -1
- package/dist/harness/tools/jev.js.map +1 -1
- package/dist/main.js +3 -5
- package/dist/main.js.map +1 -1
- package/dist/settings/index.d.ts +0 -6
- package/dist/settings/index.d.ts.map +1 -1
- package/dist/settings/index.js +0 -5
- package/dist/settings/index.js.map +1 -1
- package/package.json +1 -1
package/dist/env-manifest.js
CHANGED
|
@@ -65,7 +65,7 @@ export const ENV_MANIFEST = [
|
|
|
65
65
|
{
|
|
66
66
|
name: "OPENROUTER_API_KEY",
|
|
67
67
|
secret: true,
|
|
68
|
-
doc: "OpenRouter API key (chat models routed through OpenRouter, and Jev
|
|
68
|
+
doc: "OpenRouter API key (chat models routed through OpenRouter, and Jev's first choice in harness/jev.ts)",
|
|
69
69
|
},
|
|
70
70
|
],
|
|
71
71
|
},
|
package/dist/env-manifest.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-manifest.js","sourceRoot":"","sources":["../src/env-manifest.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;IACtC,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IAEpB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;IACtD,OAAO,QAAQ,IAAI,SAAS,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAwB;IAC/C;QACE,GAAG,EAAE,OAAO;QACZ,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE;YACJ;gBACE,IAAI,EAAE,iBAAiB;gBACvB,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,IAAI;gBACZ,GAAG,EAAE,gCAAgC;aACtC;YACD,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,oBAAoB,EAAE;SACrF;KACF;IACD;QACE,GAAG,EAAE,UAAU;QACf,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,iBAAiB,EAAE,CAAC;KAC7F;IACD;QACE,GAAG,EAAE,SAAS;QACd,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;KACtF;IACD;QACE,GAAG,EAAE,QAAQ;QACb,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,UAAU;QAChB,GAAG,EAAE,0HAA0H;QAC/H,IAAI,EAAE;YACJ;gBACE,IAAI,EAAE,oBAAoB;gBAC1B,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,IAAI;gBACZ,GAAG,EAAE,wEAAwE;aAC9E;YACD;gBACE,IAAI,EAAE,uBAAuB;gBAC7B,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,IAAI;gBACZ,GAAG,EAAE,kEAAkE;aACxE;SACF;KACF;IACD;QACE,GAAG,EAAE,KAAK;QACV,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,mBAAmB,EAAE;YACrE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,gBAAgB,EAAE;YAC/D;gBACE,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAE,IAAI;gBACZ,GAAG,EAAE,wHAAwH;aAC9H;SACF;KACF;IACD;QACE,GAAG,EAAE,MAAM;QACX,KAAK,EAAE,mBAAmB;QAC1B,IAAI,EAAE,SAAS;QACf,GAAG,EAAE,iEAAiE;QACtE,IAAI,EAAE;YACJ,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,6DAA6D,EAAE;YACxF,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,iDAAiD,EAAE;YAC7E;gBACE,IAAI,EAAE,WAAW;gBACjB,GAAG,EAAE,0EAA0E;aAChF;YACD,EAAE,IAAI,EAAE,wBAAwB,EAAE,GAAG,EAAE,qCAAqC,EAAE;YAC9E,EAAE,IAAI,EAAE,4BAA4B,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,yBAAyB,EAAE;YACpF,EAAE,IAAI,EAAE,gCAAgC,EAAE,GAAG,EAAE,0CAA0C,EAAE;YAC3F;gBACE,IAAI,EAAE,oCAAoC;gBAC1C,MAAM,EAAE,IAAI;gBACZ,GAAG,EAAE,+BAA+B;aACrC;YACD,EAAE,IAAI,EAAE,4BAA4B,EAAE,GAAG,EAAE,0CAA0C,EAAE;YACvF;gBACE,IAAI,EAAE,gCAAgC;gBACtC,MAAM,EAAE,IAAI;gBACZ,GAAG,EAAE,+BAA+B;aACrC;YACD;gBACE,IAAI,EAAE,mCAAmC;gBACzC,GAAG,EAAE,+DAA+D;aACrE;YACD;gBACE,IAAI,EAAE,+BAA+B;gBACrC,GAAG,EAAE,+DAA+D;aACrE;YACD;gBACE,IAAI,EAAE,qBAAqB;gBAC3B,GAAG,EAAE,sFAAsF;aAC5F;YACD;gBACE,IAAI,EAAE,qBAAqB;gBAC3B,MAAM,EAAE,IAAI;gBACZ,GAAG,EAAE,sDAAsD;aAC5D;SACF;KACF;IACD;QACE,GAAG,EAAE,eAAe;QACpB,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,SAAS;QACf,GAAG,EAAE,kGAAkG;QACvG,IAAI,EAAE;YACJ;gBACE,IAAI,EAAE,wBAAwB;gBAC9B,GAAG,EAAE,+EAA+E;aACrF;YACD;gBACE,IAAI,EAAE,2BAA2B;gBACjC,MAAM,EAAE,IAAI;gBACZ,GAAG,EAAE,8FAA8F;aACpG;SACF;KACF;IACD;QACE,GAAG,EAAE,eAAe;QACpB,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,6CAA6C,EAAE;YACxF;gBACE,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAE,KAAK;gBACb,GAAG,EAAE,6CAA6C;aACnD;YACD;gBACE,IAAI,EAAE,2BAA2B;gBACjC,MAAM,EAAE,KAAK;gBACb,GAAG,EAAE,wEAAwE;aAC9E;SACF;KACF;IACD;QACE,GAAG,EAAE,MAAM;QACX,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,IAAI;QACZ,GAAG,EAAE,yEAAyE;QAC9E,IAAI,EAAE;YACJ,EAAE,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,sCAAsC,EAAE;YAC1E,EAAE,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,mCAAmC,EAAE;YACvE;gBACE,IAAI,EAAE,0BAA0B;gBAChC,MAAM,EAAE,IAAI;gBACZ,GAAG,EAAE,qCAAqC;aAC3C;YACD,EAAE,IAAI,EAAE,sBAAsB,EAAE,GAAG,EAAE,8BAA8B,EAAE;YACrE,EAAE,IAAI,EAAE,uBAAuB,EAAE,GAAG,EAAE,gCAAgC,EAAE;YACxE,EAAE,IAAI,EAAE,6BAA6B,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,yBAAyB,EAAE;YACrF,EAAE,IAAI,EAAE,oCAAoC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,sBAAsB,EAAE;YACzF,EAAE,IAAI,EAAE,qCAAqC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,uBAAuB,EAAE;YAC3F,EAAE,IAAI,EAAE,4BAA4B,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,0BAA0B,EAAE;YACrF,EAAE,IAAI,EAAE,mCAAmC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,oBAAoB,EAAE;YACtF,EAAE,IAAI,EAAE,oCAAoC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,qBAAqB,EAAE;YACxF,EAAE,IAAI,EAAE,6BAA6B,EAAE,GAAG,EAAE,wCAAwC,EAAE;YACtF,EAAE,IAAI,EAAE,oCAAoC,EAAE,GAAG,EAAE,yBAAyB,EAAE;YAC9E,EAAE,IAAI,EAAE,qCAAqC,EAAE,GAAG,EAAE,0BAA0B,EAAE;YAChF,EAAE,IAAI,EAAE,4BAA4B,EAAE,GAAG,EAAE,qCAAqC,EAAE;YAClF,EAAE,IAAI,EAAE,mCAAmC,EAAE,GAAG,EAAE,+BAA+B,EAAE;YACnF,EAAE,IAAI,EAAE,oCAAoC,EAAE,GAAG,EAAE,gCAAgC,EAAE;YACrF,EAAE,IAAI,EAAE,6BAA6B,EAAE,GAAG,EAAE,wCAAwC,EAAE;YACtF,EAAE,IAAI,EAAE,4BAA4B,EAAE,GAAG,EAAE,uCAAuC,EAAE;SACrF;KACF;CACF,CAAC;AAEF,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,OAAO,GAAG,4BAA4B,CAAC;AAChD,CAAC;AAED,MAAM,aAAa,GAAG,2DAA2D,CAAC;AAElF,MAAM,WAAW,GAA8C;IAC7D,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,CAAC,cAAc,CAAC,EAAE;IAC/D,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,eAAe,CAAC,oBAAoB,CAAC,EAAE;IAC5E,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,CAAC,cAAc,CAAC,EAAE;IAC/D;QACE,IAAI,EAAE,uBAAuB;QAC7B,IAAI,EAAE,eAAe,CAAC,sBAAsB,CAAC;KAC9C;IACD,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,eAAe,CAAC,iBAAiB,CAAC,EAAE;IACrE;QACE,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE,eAAe,CAAC,qBAAqB,CAAC;KAC7C;IACD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE;IAC9C,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,aAAa,EAAE;IAC5D,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,aAAa,EAAE;IACvD;QACE,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,yDAAyD;KAChE;IACD,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,oDAAoD,EAAE;IACtF,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,yCAAyC,EAAE;IACtE,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,qCAAqC,EAAE;IAC/E,EAAE,IAAI,EAAE,0BAA0B,EAAE,IAAI,EAAE,qCAAqC,EAAE;CAClF,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAChC,GAAG,GAAyC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS;IAE5F,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAC5C,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;SACnC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,QAAQ,KAAK,IAAI,EAAE,CAAC,CAC7C,CAAC;AACJ,CAAC;AAID,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,GAAG,GAAc,OAAO;IACpE,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IACtE,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAC;IAClE,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,cAAc,CAAC,KAAe;IACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrF,OAAO,GAAG,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC;SACtE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;SAC5C,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,0CAA0C,OAAO,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,GAAG,CAClE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,cAAc,CAAC,KAAK,CAAC,EAAE,CACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAG,GAAc,OAAO;IAChD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,MAAM,GACV,KAAK,CAAC,IAAI,KAAK,UAAU;YACvB,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;gBAChC,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,aAAa;YACjB,CAAC,CAAC,EAAE,CAAC;QACT,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;YAC/D,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,SAAS,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC;YAC7F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,SAAS;QACX,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3E,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;YAChD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;iBACzE,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,KAAK,CAAC,IAAI,CACR,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE,CAC1F,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IACnF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAG,GAAc,OAAO;IACnD,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACzF,OAAO;QACL,gBAAgB;QAChB,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7D,oDAAoD;KACrD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,IAAI,GAAyC,OAAO;IAEpD,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChC,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC","sourcesContent":["import type { EnvGroup } from \"./types.js\";\n\nexport function readEnv(name: string): string | undefined {\n const raw = process.env[name]?.trim();\n if (raw) return raw;\n\n const prefixed = process.env[`MIKAN_${name}`]?.trim();\n return prefixed || undefined;\n}\n\nexport function readStandardEnv(name: string): string | undefined {\n return process.env[name]?.trim() || undefined;\n}\n\nexport const ENV_MANIFEST: readonly EnvGroup[] = [\n {\n key: \"slack\",\n title: \"Slack\",\n kind: \"platform\",\n vars: [\n {\n name: \"SLACK_APP_TOKEN\",\n required: true,\n secret: true,\n doc: \"Socket-mode app token (xapp-…)\",\n },\n { name: \"SLACK_BOT_TOKEN\", required: true, secret: true, doc: \"Bot token (xoxb-…)\" },\n ],\n },\n {\n key: \"telegram\",\n title: \"Telegram\",\n kind: \"platform\",\n vars: [{ name: \"TELEGRAM_BOT_TOKEN\", required: true, secret: true, doc: \"BotFather token\" }],\n },\n {\n key: \"discord\",\n title: \"Discord\",\n kind: \"platform\",\n vars: [{ name: \"DISCORD_BOT_TOKEN\", required: true, secret: true, doc: \"Bot token\" }],\n },\n {\n key: \"github\",\n title: \"GitHub\",\n kind: \"platform\",\n doc: \"Issue/PR conversations as a bound GitHub account, driven by webhooks (needs LINK_PORT and github.repos in settings.json)\",\n vars: [\n {\n name: \"GITHUB_AGENT_TOKEN\",\n required: true,\n secret: true,\n doc: \"Fine-grained PAT of the agent account; mikan acts on GitHub only as it\",\n },\n {\n name: \"GITHUB_WEBHOOK_SECRET\",\n required: true,\n secret: true,\n doc: \"Secret of the webhook that delivers to <LINK_URL>/github/webhook\",\n },\n ],\n },\n {\n key: \"llm\",\n title: \"LLM providers\",\n kind: \"feature\",\n vars: [\n { name: \"ANTHROPIC_API_KEY\", secret: true, doc: \"Anthropic API key\" },\n { name: \"OPENAI_API_KEY\", secret: true, doc: \"OpenAI API key\" },\n {\n name: \"OPENROUTER_API_KEY\",\n secret: true,\n doc: \"OpenRouter API key (chat models routed through OpenRouter, and Jev when settings.json names no other classifier model)\",\n },\n ],\n },\n {\n key: \"link\",\n title: \"Link/OAuth server\",\n kind: \"feature\",\n doc: \"Credential onboarding links, session view, and the Admin portal\",\n vars: [\n { name: \"LINK_URL\", doc: \"Externally visible base URL, e.g. https://mikan.example.com\" },\n { name: \"LINK_PORT\", doc: \"Listen port (default 8181 when LINK_URL is set)\" },\n {\n name: \"LINK_HOST\",\n doc: \"Listen address (default 127.0.0.1, for a reverse proxy on the same host)\",\n },\n { name: \"GITHUB_OAUTH_CLIENT_ID\", doc: \"GitHub OAuth app for /login linking\" },\n { name: \"GITHUB_OAUTH_CLIENT_SECRET\", secret: true, doc: \"GitHub OAuth app secret\" },\n { name: \"GOOGLE_WORKSPACE_CLI_CLIENT_ID\", doc: \"Google Workspace OAuth client for /login\" },\n {\n name: \"GOOGLE_WORKSPACE_CLI_CLIENT_SECRET\",\n secret: true,\n doc: \"Google Workspace OAuth secret\",\n },\n { name: \"GOOGLE_CLOUD_SDK_CLIENT_ID\", doc: \"Google Cloud SDK OAuth client for /login\" },\n {\n name: \"GOOGLE_CLOUD_SDK_CLIENT_SECRET\",\n secret: true,\n doc: \"Google Cloud SDK OAuth secret\",\n },\n {\n name: \"GOOGLE_WORKSPACE_CLI_OAUTH_SCOPES\",\n doc: \"Scopes /login requests for Google Workspace (space-separated)\",\n },\n {\n name: \"GOOGLE_CLOUD_SDK_OAUTH_SCOPES\",\n doc: \"Scopes /login requests for Google Cloud SDK (space-separated)\",\n },\n {\n name: \"GITHUB_OAUTH_SCOPES\",\n doc: \"Scopes /login requests from GitHub (default repo read:user user:email read:org gist)\",\n },\n {\n name: \"OAUTH_SERVICES_JSON\",\n secret: true,\n doc: \"JSON array of extra OAuth services offered by /login\",\n },\n ],\n },\n {\n key: \"openconnector\",\n title: \"OpenConnector\",\n kind: \"feature\",\n doc: \"Default open-connector MCP server and the admin token that mints per-conversation runtime tokens\",\n vars: [\n {\n name: \"OPENCONNECTOR_ENDPOINT\",\n doc: \"Default MCP endpoint used when a conversation does not declare open-connector\",\n },\n {\n name: \"OPENCONNECTOR_ADMIN_TOKEN\",\n secret: true,\n doc: \"Host-only admin token used to mint one runtime token per conversation for the default server\",\n },\n ],\n },\n {\n key: \"observability\",\n title: \"Observability\",\n kind: \"feature\",\n vars: [\n { name: \"SENTRY_DSN\", secret: true, doc: \"Sentry DSN; Sentry is off while it is unset\" },\n {\n name: \"SENTRY_ENVIRONMENT\",\n deploy: false,\n doc: \"Sentry environment tag (default production)\",\n },\n {\n name: \"SENTRY_TRACES_SAMPLE_RATE\",\n deploy: false,\n doc: \"Sentry trace sample rate, 0 to 1 (default 1; ignored with OTLP traces)\",\n },\n ],\n },\n {\n key: \"otel\",\n title: \"OpenTelemetry\",\n kind: \"feature\",\n folded: true,\n doc: \"Standard OTEL_* exporter variables; mikan sends OTLP over HTTP/protobuf\",\n vars: [\n { name: \"OTEL_SDK_DISABLED\", doc: \"Set to true to disable OpenTelemetry\" },\n { name: \"OTEL_SERVICE_NAME\", doc: \"OTLP service name (default mikan)\" },\n {\n name: \"OTEL_RESOURCE_ATTRIBUTES\",\n secret: true,\n doc: \"Comma-separated safe resource attrs\",\n },\n { name: \"OTEL_TRACES_EXPORTER\", doc: \"Trace exporter: otlp or none\" },\n { name: \"OTEL_METRICS_EXPORTER\", doc: \"Metrics exporter: otlp or none\" },\n { name: \"OTEL_EXPORTER_OTLP_ENDPOINT\", secret: true, doc: \"Base OTLP HTTP endpoint\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT\", secret: true, doc: \"OTLP traces endpoint\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_ENDPOINT\", secret: true, doc: \"OTLP metrics endpoint\" },\n { name: \"OTEL_EXPORTER_OTLP_HEADERS\", secret: true, doc: \"Shared OTLP auth headers\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_HEADERS\", secret: true, doc: \"OTLP trace headers\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_HEADERS\", secret: true, doc: \"OTLP metric headers\" },\n { name: \"OTEL_EXPORTER_OTLP_PROTOCOL\", doc: \"OTLP protocol; http/protobuf supported\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_PROTOCOL\", doc: \"Trace protocol override\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_PROTOCOL\", doc: \"Metric protocol override\" },\n { name: \"OTEL_EXPORTER_OTLP_TIMEOUT\", doc: \"Shared OTLP timeout in milliseconds\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_TIMEOUT\", doc: \"Trace timeout in milliseconds\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_TIMEOUT\", doc: \"Metric timeout in milliseconds\" },\n { name: \"OTEL_METRIC_EXPORT_INTERVAL\", doc: \"Metric export interval in milliseconds\" },\n { name: \"OTEL_METRIC_EXPORT_TIMEOUT\", doc: \"Metric export timeout in milliseconds\" },\n ],\n },\n];\n\nfunction movedToSettings(key: string): string {\n return `set ${key} in ~/.mikan/settings.json`;\n}\n\nconst NO_GITHUB_APP = \"removed; GitHub runs as the account of GITHUB_AGENT_TOKEN\";\n\nconst RETIRED_ENV: readonly { name: string; note: string }[] = [\n { name: \"GITHUB_REPOS\", note: movedToSettings(\"github.repos\") },\n { name: \"GITHUB_PUBLIC_REPOS\", note: movedToSettings(\"github.publicRepos\") },\n { name: \"GITHUB_USERS\", note: movedToSettings(\"github.users\") },\n {\n name: \"GITHUB_MIN_PERMISSION\",\n note: movedToSettings(\"github.minPermission\"),\n },\n { name: \"GITHUB_TRIGGERS\", note: movedToSettings(\"github.triggers\") },\n {\n name: \"GITHUB_CAPABILITIES\",\n note: movedToSettings(\"github.capabilities\"),\n },\n { name: \"GITHUB_APP_ID\", note: NO_GITHUB_APP },\n { name: \"GITHUB_APP_PRIVATE_KEY_PATH\", note: NO_GITHUB_APP },\n { name: \"GITHUB_INSTALLATION_ID\", note: NO_GITHUB_APP },\n {\n name: \"HTTP_IDLE_TIMEOUT\",\n note: \"removed; outbound HTTP streams time out after 5 minutes\",\n },\n { name: \"SENTRY_ENABLED\", note: \"removed; leave SENTRY_DSN unset to turn Sentry off\" },\n { name: \"STATE_DIR\", note: \"removed; state always lives in ~/.mikan\" },\n { name: \"CLOUDFLARE_SANDBOX_URL\", note: \"removed with the cloudflare sandbox\" },\n { name: \"CLOUDFLARE_SANDBOX_TOKEN\", note: \"removed with the cloudflare sandbox\" },\n];\n\nexport function retiredEnvWarnings(\n env: (name: string) => string | undefined = (name) => process.env[name]?.trim() || undefined,\n): string[] {\n return RETIRED_ENV.flatMap(({ name, note }) =>\n [name, `MIKAN_${name}`]\n .filter((spelling) => env(spelling))\n .map((spelling) => `${spelling}: ${note}`),\n );\n}\n\ntype EnvLookup = (name: string) => string | undefined;\n\nexport function platformIsActive(key: string, env: EnvLookup = readEnv): boolean {\n const group = ENV_MANIFEST.find((candidate) => candidate.key === key);\n if (!group) throw new Error(`Unknown env-manifest group: ${key}`);\n return group.vars.filter((spec) => spec.required).every((spec) => env(spec.name));\n}\n\nfunction platformRecipe(group: EnvGroup): string {\n const required = group.vars.filter((spec) => spec.required).map((spec) => spec.name);\n return `${group.title}: ${required.join(\" + \")}`;\n}\n\nexport function noPlatformsMessage(): string {\n const recipes = ENV_MANIFEST.filter((group) => group.kind === \"platform\")\n .map((group) => ` ${platformRecipe(group)}`)\n .join(\"\\n\");\n return `No platform tokens found. Set one of:\\n${recipes}`;\n}\n\nexport function envSummaryLines(): string[] {\n return ENV_MANIFEST.filter((group) => group.kind === \"platform\").map(\n (group) => ` ${platformRecipe(group)}`,\n );\n}\n\nexport function envReport(env: EnvLookup = readEnv): string {\n const lines: string[] = [];\n for (const group of ENV_MANIFEST) {\n const active =\n group.kind === \"platform\"\n ? platformIsActive(group.key, env)\n ? \" — active\"\n : \" — inactive\"\n : \"\";\n if (group.folded) {\n const set = group.vars.filter((spec) => env(spec.name)).length;\n const pattern = `${group.vars[0]!.name.split(\"_\")[0]}_*`;\n lines.push(group.title);\n lines.push(` ${pattern.padEnd(36)} ${set} of ${group.vars.length} set ${group.doc ?? \"\"}`);\n lines.push(\"\");\n continue;\n }\n lines.push(`${group.title}${active}${group.doc ? ` · ${group.doc}` : \"\"}`);\n for (const spec of group.vars) {\n const status = env(spec.name) ? \"set\" : \"unset\";\n const marks = [spec.required ? \"required\" : \"\", spec.secret ? \"secret\" : \"\"]\n .filter(Boolean)\n .join(\", \");\n lines.push(\n ` ${spec.name.padEnd(36)} ${status.padEnd(6)}${marks ? ` [${marks}]` : \"\"} ${spec.doc}`,\n );\n }\n lines.push(\"\");\n }\n lines.push(\"Each var also accepts a MIKAN_-prefixed alias (e.g. MIKAN_LINK_URL).\");\n return lines.join(\"\\n\");\n}\n\nexport function envSetReport(env: EnvLookup = readEnv): string {\n const set = ENV_MANIFEST.flatMap((group) => group.vars).filter((spec) => env(spec.name));\n return [\n \"Variables set:\",\n ...set.map((spec) => ` ${spec.name.padEnd(36)} ${spec.doc}`),\n \"Run `mikan env` to see every variable mikan reads.\",\n ].join(\"\\n\");\n}\n\nexport function resolveLinkListenHost(\n read: (name: string) => string | undefined = readEnv,\n): string {\n return read(\"LINK_HOST\") ?? \"127.0.0.1\";\n}\n\nexport function resolveLinkBaseUrl(): string | undefined {\n const raw = readEnv(\"LINK_URL\");\n if (!raw) return undefined;\n return raw.replace(/\\/+$/, \"\");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"env-manifest.js","sourceRoot":"","sources":["../src/env-manifest.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EnvGroup } from \"./types.js\";\n\nexport function readEnv(name: string): string | undefined {\n const raw = process.env[name]?.trim();\n if (raw) return raw;\n\n const prefixed = process.env[`MIKAN_${name}`]?.trim();\n return prefixed || undefined;\n}\n\nexport function readStandardEnv(name: string): string | undefined {\n return process.env[name]?.trim() || undefined;\n}\n\nexport const ENV_MANIFEST: readonly EnvGroup[] = [\n {\n key: \"slack\",\n title: \"Slack\",\n kind: \"platform\",\n vars: [\n {\n name: \"SLACK_APP_TOKEN\",\n required: true,\n secret: true,\n doc: \"Socket-mode app token (xapp-…)\",\n },\n { name: \"SLACK_BOT_TOKEN\", required: true, secret: true, doc: \"Bot token (xoxb-…)\" },\n ],\n },\n {\n key: \"telegram\",\n title: \"Telegram\",\n kind: \"platform\",\n vars: [{ name: \"TELEGRAM_BOT_TOKEN\", required: true, secret: true, doc: \"BotFather token\" }],\n },\n {\n key: \"discord\",\n title: \"Discord\",\n kind: \"platform\",\n vars: [{ name: \"DISCORD_BOT_TOKEN\", required: true, secret: true, doc: \"Bot token\" }],\n },\n {\n key: \"github\",\n title: \"GitHub\",\n kind: \"platform\",\n doc: \"Issue/PR conversations as a bound GitHub account, driven by webhooks (needs LINK_PORT and github.repos in settings.json)\",\n vars: [\n {\n name: \"GITHUB_AGENT_TOKEN\",\n required: true,\n secret: true,\n doc: \"Fine-grained PAT of the agent account; mikan acts on GitHub only as it\",\n },\n {\n name: \"GITHUB_WEBHOOK_SECRET\",\n required: true,\n secret: true,\n doc: \"Secret of the webhook that delivers to <LINK_URL>/github/webhook\",\n },\n ],\n },\n {\n key: \"llm\",\n title: \"LLM providers\",\n kind: \"feature\",\n vars: [\n { name: \"ANTHROPIC_API_KEY\", secret: true, doc: \"Anthropic API key\" },\n { name: \"OPENAI_API_KEY\", secret: true, doc: \"OpenAI API key\" },\n {\n name: \"OPENROUTER_API_KEY\",\n secret: true,\n doc: \"OpenRouter API key (chat models routed through OpenRouter, and Jev's first choice in harness/jev.ts)\",\n },\n ],\n },\n {\n key: \"link\",\n title: \"Link/OAuth server\",\n kind: \"feature\",\n doc: \"Credential onboarding links, session view, and the Admin portal\",\n vars: [\n { name: \"LINK_URL\", doc: \"Externally visible base URL, e.g. https://mikan.example.com\" },\n { name: \"LINK_PORT\", doc: \"Listen port (default 8181 when LINK_URL is set)\" },\n {\n name: \"LINK_HOST\",\n doc: \"Listen address (default 127.0.0.1, for a reverse proxy on the same host)\",\n },\n { name: \"GITHUB_OAUTH_CLIENT_ID\", doc: \"GitHub OAuth app for /login linking\" },\n { name: \"GITHUB_OAUTH_CLIENT_SECRET\", secret: true, doc: \"GitHub OAuth app secret\" },\n { name: \"GOOGLE_WORKSPACE_CLI_CLIENT_ID\", doc: \"Google Workspace OAuth client for /login\" },\n {\n name: \"GOOGLE_WORKSPACE_CLI_CLIENT_SECRET\",\n secret: true,\n doc: \"Google Workspace OAuth secret\",\n },\n { name: \"GOOGLE_CLOUD_SDK_CLIENT_ID\", doc: \"Google Cloud SDK OAuth client for /login\" },\n {\n name: \"GOOGLE_CLOUD_SDK_CLIENT_SECRET\",\n secret: true,\n doc: \"Google Cloud SDK OAuth secret\",\n },\n {\n name: \"GOOGLE_WORKSPACE_CLI_OAUTH_SCOPES\",\n doc: \"Scopes /login requests for Google Workspace (space-separated)\",\n },\n {\n name: \"GOOGLE_CLOUD_SDK_OAUTH_SCOPES\",\n doc: \"Scopes /login requests for Google Cloud SDK (space-separated)\",\n },\n {\n name: \"GITHUB_OAUTH_SCOPES\",\n doc: \"Scopes /login requests from GitHub (default repo read:user user:email read:org gist)\",\n },\n {\n name: \"OAUTH_SERVICES_JSON\",\n secret: true,\n doc: \"JSON array of extra OAuth services offered by /login\",\n },\n ],\n },\n {\n key: \"openconnector\",\n title: \"OpenConnector\",\n kind: \"feature\",\n doc: \"Default open-connector MCP server and the admin token that mints per-conversation runtime tokens\",\n vars: [\n {\n name: \"OPENCONNECTOR_ENDPOINT\",\n doc: \"Default MCP endpoint used when a conversation does not declare open-connector\",\n },\n {\n name: \"OPENCONNECTOR_ADMIN_TOKEN\",\n secret: true,\n doc: \"Host-only admin token used to mint one runtime token per conversation for the default server\",\n },\n ],\n },\n {\n key: \"observability\",\n title: \"Observability\",\n kind: \"feature\",\n vars: [\n { name: \"SENTRY_DSN\", secret: true, doc: \"Sentry DSN; Sentry is off while it is unset\" },\n {\n name: \"SENTRY_ENVIRONMENT\",\n deploy: false,\n doc: \"Sentry environment tag (default production)\",\n },\n {\n name: \"SENTRY_TRACES_SAMPLE_RATE\",\n deploy: false,\n doc: \"Sentry trace sample rate, 0 to 1 (default 1; ignored with OTLP traces)\",\n },\n ],\n },\n {\n key: \"otel\",\n title: \"OpenTelemetry\",\n kind: \"feature\",\n folded: true,\n doc: \"Standard OTEL_* exporter variables; mikan sends OTLP over HTTP/protobuf\",\n vars: [\n { name: \"OTEL_SDK_DISABLED\", doc: \"Set to true to disable OpenTelemetry\" },\n { name: \"OTEL_SERVICE_NAME\", doc: \"OTLP service name (default mikan)\" },\n {\n name: \"OTEL_RESOURCE_ATTRIBUTES\",\n secret: true,\n doc: \"Comma-separated safe resource attrs\",\n },\n { name: \"OTEL_TRACES_EXPORTER\", doc: \"Trace exporter: otlp or none\" },\n { name: \"OTEL_METRICS_EXPORTER\", doc: \"Metrics exporter: otlp or none\" },\n { name: \"OTEL_EXPORTER_OTLP_ENDPOINT\", secret: true, doc: \"Base OTLP HTTP endpoint\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT\", secret: true, doc: \"OTLP traces endpoint\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_ENDPOINT\", secret: true, doc: \"OTLP metrics endpoint\" },\n { name: \"OTEL_EXPORTER_OTLP_HEADERS\", secret: true, doc: \"Shared OTLP auth headers\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_HEADERS\", secret: true, doc: \"OTLP trace headers\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_HEADERS\", secret: true, doc: \"OTLP metric headers\" },\n { name: \"OTEL_EXPORTER_OTLP_PROTOCOL\", doc: \"OTLP protocol; http/protobuf supported\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_PROTOCOL\", doc: \"Trace protocol override\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_PROTOCOL\", doc: \"Metric protocol override\" },\n { name: \"OTEL_EXPORTER_OTLP_TIMEOUT\", doc: \"Shared OTLP timeout in milliseconds\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_TIMEOUT\", doc: \"Trace timeout in milliseconds\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_TIMEOUT\", doc: \"Metric timeout in milliseconds\" },\n { name: \"OTEL_METRIC_EXPORT_INTERVAL\", doc: \"Metric export interval in milliseconds\" },\n { name: \"OTEL_METRIC_EXPORT_TIMEOUT\", doc: \"Metric export timeout in milliseconds\" },\n ],\n },\n];\n\nfunction movedToSettings(key: string): string {\n return `set ${key} in ~/.mikan/settings.json`;\n}\n\nconst NO_GITHUB_APP = \"removed; GitHub runs as the account of GITHUB_AGENT_TOKEN\";\n\nconst RETIRED_ENV: readonly { name: string; note: string }[] = [\n { name: \"GITHUB_REPOS\", note: movedToSettings(\"github.repos\") },\n { name: \"GITHUB_PUBLIC_REPOS\", note: movedToSettings(\"github.publicRepos\") },\n { name: \"GITHUB_USERS\", note: movedToSettings(\"github.users\") },\n {\n name: \"GITHUB_MIN_PERMISSION\",\n note: movedToSettings(\"github.minPermission\"),\n },\n { name: \"GITHUB_TRIGGERS\", note: movedToSettings(\"github.triggers\") },\n {\n name: \"GITHUB_CAPABILITIES\",\n note: movedToSettings(\"github.capabilities\"),\n },\n { name: \"GITHUB_APP_ID\", note: NO_GITHUB_APP },\n { name: \"GITHUB_APP_PRIVATE_KEY_PATH\", note: NO_GITHUB_APP },\n { name: \"GITHUB_INSTALLATION_ID\", note: NO_GITHUB_APP },\n {\n name: \"HTTP_IDLE_TIMEOUT\",\n note: \"removed; outbound HTTP streams time out after 5 minutes\",\n },\n { name: \"SENTRY_ENABLED\", note: \"removed; leave SENTRY_DSN unset to turn Sentry off\" },\n { name: \"STATE_DIR\", note: \"removed; state always lives in ~/.mikan\" },\n { name: \"CLOUDFLARE_SANDBOX_URL\", note: \"removed with the cloudflare sandbox\" },\n { name: \"CLOUDFLARE_SANDBOX_TOKEN\", note: \"removed with the cloudflare sandbox\" },\n];\n\nexport function retiredEnvWarnings(\n env: (name: string) => string | undefined = (name) => process.env[name]?.trim() || undefined,\n): string[] {\n return RETIRED_ENV.flatMap(({ name, note }) =>\n [name, `MIKAN_${name}`]\n .filter((spelling) => env(spelling))\n .map((spelling) => `${spelling}: ${note}`),\n );\n}\n\ntype EnvLookup = (name: string) => string | undefined;\n\nexport function platformIsActive(key: string, env: EnvLookup = readEnv): boolean {\n const group = ENV_MANIFEST.find((candidate) => candidate.key === key);\n if (!group) throw new Error(`Unknown env-manifest group: ${key}`);\n return group.vars.filter((spec) => spec.required).every((spec) => env(spec.name));\n}\n\nfunction platformRecipe(group: EnvGroup): string {\n const required = group.vars.filter((spec) => spec.required).map((spec) => spec.name);\n return `${group.title}: ${required.join(\" + \")}`;\n}\n\nexport function noPlatformsMessage(): string {\n const recipes = ENV_MANIFEST.filter((group) => group.kind === \"platform\")\n .map((group) => ` ${platformRecipe(group)}`)\n .join(\"\\n\");\n return `No platform tokens found. Set one of:\\n${recipes}`;\n}\n\nexport function envSummaryLines(): string[] {\n return ENV_MANIFEST.filter((group) => group.kind === \"platform\").map(\n (group) => ` ${platformRecipe(group)}`,\n );\n}\n\nexport function envReport(env: EnvLookup = readEnv): string {\n const lines: string[] = [];\n for (const group of ENV_MANIFEST) {\n const active =\n group.kind === \"platform\"\n ? platformIsActive(group.key, env)\n ? \" — active\"\n : \" — inactive\"\n : \"\";\n if (group.folded) {\n const set = group.vars.filter((spec) => env(spec.name)).length;\n const pattern = `${group.vars[0]!.name.split(\"_\")[0]}_*`;\n lines.push(group.title);\n lines.push(` ${pattern.padEnd(36)} ${set} of ${group.vars.length} set ${group.doc ?? \"\"}`);\n lines.push(\"\");\n continue;\n }\n lines.push(`${group.title}${active}${group.doc ? ` · ${group.doc}` : \"\"}`);\n for (const spec of group.vars) {\n const status = env(spec.name) ? \"set\" : \"unset\";\n const marks = [spec.required ? \"required\" : \"\", spec.secret ? \"secret\" : \"\"]\n .filter(Boolean)\n .join(\", \");\n lines.push(\n ` ${spec.name.padEnd(36)} ${status.padEnd(6)}${marks ? ` [${marks}]` : \"\"} ${spec.doc}`,\n );\n }\n lines.push(\"\");\n }\n lines.push(\"Each var also accepts a MIKAN_-prefixed alias (e.g. MIKAN_LINK_URL).\");\n return lines.join(\"\\n\");\n}\n\nexport function envSetReport(env: EnvLookup = readEnv): string {\n const set = ENV_MANIFEST.flatMap((group) => group.vars).filter((spec) => env(spec.name));\n return [\n \"Variables set:\",\n ...set.map((spec) => ` ${spec.name.padEnd(36)} ${spec.doc}`),\n \"Run `mikan env` to see every variable mikan reads.\",\n ].join(\"\\n\");\n}\n\nexport function resolveLinkListenHost(\n read: (name: string) => string | undefined = readEnv,\n): string {\n return read(\"LINK_HOST\") ?? \"127.0.0.1\";\n}\n\nexport function resolveLinkBaseUrl(): string | undefined {\n const raw = readEnv(\"LINK_URL\");\n if (!raw) return undefined;\n return raw.replace(/\\/+$/, \"\");\n}\n"]}
|
package/dist/harness/jev.d.ts
CHANGED
|
@@ -49,12 +49,7 @@ export interface JevResult<QUESTIONS extends JevQuestions> {
|
|
|
49
49
|
readonly model: string;
|
|
50
50
|
}
|
|
51
51
|
export declare class JevNotConfiguredError extends Error {
|
|
52
|
-
constructor(
|
|
53
|
-
}
|
|
54
|
-
export interface JevBinding {
|
|
55
|
-
models: MikanModels;
|
|
56
|
-
provider: string;
|
|
57
|
-
model: string;
|
|
52
|
+
constructor();
|
|
58
53
|
}
|
|
59
54
|
export declare class JevRequestError extends Error {
|
|
60
55
|
constructor(message: string);
|
|
@@ -63,7 +58,7 @@ export interface EvaluateWithJevOptions {
|
|
|
63
58
|
abortSignal?: AbortSignal;
|
|
64
59
|
caller: JevCaller;
|
|
65
60
|
}
|
|
66
|
-
export declare function
|
|
61
|
+
export declare function useJevModels(registry: MikanModels | undefined): void;
|
|
67
62
|
export declare function evaluateWithJev<const QUESTIONS extends JevQuestions>(state: JevEntry, questions: QUESTIONS, options: EvaluateWithJevOptions): Promise<JevResult<QUESTIONS>>;
|
|
68
63
|
export {};
|
|
69
64
|
//# sourceMappingURL=jev.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jev.d.ts","sourceRoot":"","sources":["../../src/harness/jev.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jev.d.ts","sourceRoot":"","sources":["../../src/harness/jev.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAY/C,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,QAAQ,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAA;CAAE,CAAC;AAEnG,MAAM,MAAM,WAAW,GACnB;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,QAAQ,CAAC;IACvB,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;QAAC,KAAK,CAAC,EAAE,QAAQ,CAAA;KAAE,CAAC;CAClD,GACD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,YAAY,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;CAAE,GAC9E;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,SAAS,QAAQ,EAAE,CAAA;CAAE,CAAC;AAE7E,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEvD,KAAK,SAAS,CAAC,QAAQ,SAAS,WAAW,IAAI,QAAQ,SAAS;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC9E;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;CACpB,GACD,QAAQ,SAAS;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/C,MAAM,WAAW,SAAS,CAAC,SAAS,SAAS,YAAY;IACvD,QAAQ,CAAC,OAAO,EAAE;SAAG,EAAE,IAAI,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;KAAE,CAAC;IACxE,QAAQ,CAAC,KAAK,EAAE;QACd,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;QAChC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;QACjC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;KAC1B,CAAC;IACF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,cAKC;CACF;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,EAAE,SAAS,CAAC;CACnB;AAcD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAEpE;AA6DD,wBAAsB,eAAe,CAAC,KAAK,CAAC,SAAS,SAAS,YAAY,EACxE,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAsD/B"}
|
package/dist/harness/jev.js
CHANGED
|
@@ -2,13 +2,18 @@ import { builtinModels } from "@earendil-works/pi-ai/providers/all";
|
|
|
2
2
|
import { readEnv } from "../env-manifest.js";
|
|
3
3
|
import { isRecord } from "../unknown-values.js";
|
|
4
4
|
import { recordJevOutcome } from "../observability/index.js";
|
|
5
|
-
const
|
|
6
|
-
|
|
5
|
+
const JEV_MODELS = [
|
|
6
|
+
["openrouter", "~typesafe/jev-latest"],
|
|
7
|
+
["typesafe", "jev-latest"],
|
|
8
|
+
["vercel-ai-gateway", "typesafe-ai/jev"],
|
|
9
|
+
["cloudflare-workers-ai", "typesafe/jev"],
|
|
10
|
+
["opencode", "jev-1.13"],
|
|
11
|
+
];
|
|
7
12
|
const JEV_TIMEOUT_MS = 30_000;
|
|
8
13
|
const JEV_MAX_RETRIES = 2;
|
|
9
14
|
export class JevNotConfiguredError extends Error {
|
|
10
|
-
constructor(
|
|
11
|
-
super(`Jev
|
|
15
|
+
constructor() {
|
|
16
|
+
super(`Jev has no provider with a key. Configure one of ${JEV_MODELS.map(([provider, id]) => `${provider}/${id}`).join(", ")}, for example with OPENROUTER_API_KEY or TYPESAFE_API_KEY.`);
|
|
12
17
|
this.name = "JevNotConfiguredError";
|
|
13
18
|
}
|
|
14
19
|
}
|
|
@@ -26,16 +31,24 @@ const mikanAuthContext = {
|
|
|
26
31
|
return false;
|
|
27
32
|
},
|
|
28
33
|
};
|
|
29
|
-
let
|
|
30
|
-
let
|
|
31
|
-
export function
|
|
32
|
-
|
|
34
|
+
let cachedModels;
|
|
35
|
+
let daemonModels;
|
|
36
|
+
export function useJevModels(registry) {
|
|
37
|
+
daemonModels = registry;
|
|
33
38
|
}
|
|
34
|
-
function
|
|
35
|
-
if (
|
|
36
|
-
return
|
|
37
|
-
|
|
38
|
-
return
|
|
39
|
+
function models() {
|
|
40
|
+
if (daemonModels)
|
|
41
|
+
return daemonModels.models;
|
|
42
|
+
cachedModels ??= builtinModels({ authContext: mikanAuthContext });
|
|
43
|
+
return cachedModels;
|
|
44
|
+
}
|
|
45
|
+
async function availableJev() {
|
|
46
|
+
for (const [provider, id] of JEV_MODELS) {
|
|
47
|
+
const model = models().getModelOfType("classifier", provider, id);
|
|
48
|
+
if (model && (await models().getAuth(model)))
|
|
49
|
+
return model;
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
39
52
|
}
|
|
40
53
|
function text(entry, fallback) {
|
|
41
54
|
if (entry === undefined || entry === null)
|
|
@@ -92,12 +105,10 @@ export async function evaluateWithJev(state, questions, options) {
|
|
|
92
105
|
});
|
|
93
106
|
throw error;
|
|
94
107
|
};
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
const result = await jev.models.classify(model, {
|
|
108
|
+
const model = await availableJev();
|
|
109
|
+
if (!model)
|
|
110
|
+
return fail(new JevNotConfiguredError());
|
|
111
|
+
const result = await models().classify(model, {
|
|
101
112
|
state: toState(state),
|
|
102
113
|
questions: Object.fromEntries(Object.entries(questions).map(([id, question]) => [id, toClassifierQuestion(question)])),
|
|
103
114
|
}, { signal: options.abortSignal, timeoutMs: JEV_TIMEOUT_MS, maxRetries: JEV_MAX_RETRIES });
|
package/dist/harness/jev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jev.js","sourceRoot":"","sources":["../../src/harness/jev.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AuthContext,\n ClassifierAnswer,\n ClassifierQuestion,\n JsonObject,\n Models,\n} from \"@earendil-works/pi-ai\";\nimport { builtinModels } from \"@earendil-works/pi-ai/providers/all\";\nimport { readEnv } from \"../env-manifest.js\";\nimport { isRecord } from \"../unknown-values.js\";\nimport { recordJevOutcome } from \"../observability/index.js\";\nimport type { JevCaller } from \"../observability/types.js\";\nimport type { MikanModels } from \"./models.js\";\n\nconst DEFAULT_JEV_PROVIDER = \"openrouter\";\nconst DEFAULT_JEV_MODEL = \"~typesafe/jev-latest\";\nconst JEV_TIMEOUT_MS = 30_000;\nconst JEV_MAX_RETRIES = 2;\n\nexport type JevEntry = string | number | boolean | null | JevEntry[] | { [key: string]: JevEntry };\n\nexport type JevQuestion =\n | {\n type: \"boolean\";\n instructions: JevEntry;\n criteria?: { true?: JevEntry; false?: JevEntry };\n }\n | { type: \"choice\"; instructions: JevEntry; criteria: Record<string, JevEntry> }\n | { type: \"score\"; instructions: JevEntry; criteria: readonly JevEntry[] };\n\nexport type JevQuestions = Record<string, JevQuestion>;\n\ntype JevAnswer<QUESTION extends JevQuestion> = QUESTION extends { type: \"choice\" }\n ? {\n type: \"choice\";\n choice: string;\n probabilities: Record<string, number>;\n confidence: number;\n }\n : QUESTION extends { type: \"score\" }\n ? { type: \"score\"; score: number; confidence: number }\n : { type: \"boolean\"; probability: number };\n\nexport interface JevResult<QUESTIONS extends JevQuestions> {\n readonly answers: { [ID in keyof QUESTIONS]: JevAnswer<QUESTIONS[ID]> };\n readonly usage: {\n inputTokens: number | undefined;\n outputTokens: number | undefined;\n cost: number | undefined;\n };\n readonly model: string;\n}\n\nexport class JevNotConfiguredError extends Error {\n constructor(provider: string, model: string) {\n super(\n `Jev model ${provider}/${model} is not available: define it in models.json or set its provider's API key (OPENROUTER_API_KEY for the default ${DEFAULT_JEV_PROVIDER}/${DEFAULT_JEV_MODEL}).`,\n );\n this.name = \"JevNotConfiguredError\";\n }\n}\n\nexport interface JevBinding {\n models: MikanModels;\n provider: string;\n model: string;\n}\n\nexport class JevRequestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"JevRequestError\";\n }\n}\n\nexport interface EvaluateWithJevOptions {\n abortSignal?: AbortSignal;\n caller: JevCaller;\n}\n\nconst mikanAuthContext: AuthContext = {\n async env(name) {\n return readEnv(name);\n },\n async fileExists() {\n return false;\n },\n};\n\nlet defaultModels: Models | undefined;\nlet binding: JevBinding | undefined;\n\nexport function configureJev(next: JevBinding | undefined): void {\n binding = next;\n}\n\nfunction jevModels(): { models: Models; provider: string; model: string } {\n if (binding)\n return { models: binding.models.models, provider: binding.provider, model: binding.model };\n defaultModels ??= builtinModels({ authContext: mikanAuthContext });\n return { models: defaultModels, provider: DEFAULT_JEV_PROVIDER, model: DEFAULT_JEV_MODEL };\n}\n\nfunction text(entry: JevEntry | undefined, fallback: string): string {\n if (entry === undefined || entry === null) return fallback;\n return typeof entry === \"string\" ? entry : JSON.stringify(entry);\n}\n\nfunction toState(state: JevEntry): JsonObject {\n if (typeof state === \"string\") return { text: state };\n if (isRecord(state)) return state;\n return { value: state };\n}\n\nfunction toClassifierQuestion(question: JevQuestion): ClassifierQuestion {\n const instructions = text(question.instructions, \"\");\n if (question.type === \"boolean\") {\n return {\n type: \"bool\",\n instructions,\n criteria: {\n true: text(question.criteria?.true, \"Yes\"),\n false: text(question.criteria?.false, \"No\"),\n },\n };\n }\n if (question.type === \"choice\") {\n return {\n type: \"choice\",\n instructions,\n criteria: Object.fromEntries(\n Object.entries(question.criteria).map(([id, value]) => [id, text(value, id)]),\n ),\n };\n }\n if (question.criteria.length < 2) throw new Error(\"score questions need at least two levels\");\n return {\n type: \"score\",\n instructions,\n criteria: question.criteria.map((level) => text(level, \"\")),\n };\n}\n\nfunction fromClassifierAnswer(answer: ClassifierAnswer): JevAnswer<JevQuestion> {\n if (answer.type === \"bool\") return { type: \"boolean\", probability: answer.probability };\n return answer;\n}\n\nexport async function evaluateWithJev<const QUESTIONS extends JevQuestions>(\n state: JevEntry,\n questions: QUESTIONS,\n options: EvaluateWithJevOptions,\n): Promise<JevResult<QUESTIONS>> {\n const startedAt = Date.now();\n const fail = (error: Error): never => {\n recordJevOutcome({\n caller: options.caller,\n status: \"error\",\n errorType: error.name,\n durationMs: Date.now() - startedAt,\n });\n throw error;\n };\n\n const jev = jevModels();\n const model = jev.models.getModelOfType(\"classifier\", jev.provider, jev.model);\n if (!model || !(await jev.models.getAuth(model))) {\n return fail(new JevNotConfiguredError(jev.provider, jev.model));\n }\n\n const result = await jev.models.classify(\n model,\n {\n state: toState(state),\n questions: Object.fromEntries(\n Object.entries(questions).map(([id, question]) => [id, toClassifierQuestion(question)]),\n ),\n },\n { signal: options.abortSignal, timeoutMs: JEV_TIMEOUT_MS, maxRetries: JEV_MAX_RETRIES },\n );\n if (result.stopReason !== \"stop\") {\n return fail(new JevRequestError(result.errorMessage ?? `Jev request ${result.stopReason}`));\n }\n\n recordJevOutcome({\n caller: options.caller,\n status: \"ok\",\n inputTokens: result.usage?.input,\n outputTokens: result.usage?.output,\n costUsd: result.usage?.cost.total,\n durationMs: Date.now() - startedAt,\n });\n\n const answers = {} as { [ID in keyof QUESTIONS]: JevAnswer<QUESTIONS[ID]> };\n for (const id of Object.keys(questions)) {\n const answer = result.answers[id];\n if (!answer) return fail(new JevRequestError(`Jev response missing answer for \"${id}\"`));\n (answers as Record<string, JevAnswer<JevQuestion>>)[id] = fromClassifierAnswer(answer);\n }\n\n return {\n answers,\n usage: {\n inputTokens: result.usage?.input,\n outputTokens: result.usage?.output,\n cost: result.usage?.cost.total,\n },\n model: result.model,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"jev.js","sourceRoot":"","sources":["../../src/harness/jev.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AuthContext,\n ClassifierAnswer,\n ClassifierApi,\n ClassifierModel,\n ClassifierQuestion,\n JsonObject,\n Models,\n} from \"@earendil-works/pi-ai\";\nimport { builtinModels } from \"@earendil-works/pi-ai/providers/all\";\nimport { readEnv } from \"../env-manifest.js\";\nimport { isRecord } from \"../unknown-values.js\";\nimport { recordJevOutcome } from \"../observability/index.js\";\nimport type { JevCaller } from \"../observability/types.js\";\nimport type { MikanModels } from \"./models.js\";\n\nconst JEV_MODELS: readonly (readonly [provider: string, id: string])[] = [\n [\"openrouter\", \"~typesafe/jev-latest\"],\n [\"typesafe\", \"jev-latest\"],\n [\"vercel-ai-gateway\", \"typesafe-ai/jev\"],\n [\"cloudflare-workers-ai\", \"typesafe/jev\"],\n [\"opencode\", \"jev-1.13\"],\n];\nconst JEV_TIMEOUT_MS = 30_000;\nconst JEV_MAX_RETRIES = 2;\n\nexport type JevEntry = string | number | boolean | null | JevEntry[] | { [key: string]: JevEntry };\n\nexport type JevQuestion =\n | {\n type: \"boolean\";\n instructions: JevEntry;\n criteria?: { true?: JevEntry; false?: JevEntry };\n }\n | { type: \"choice\"; instructions: JevEntry; criteria: Record<string, JevEntry> }\n | { type: \"score\"; instructions: JevEntry; criteria: readonly JevEntry[] };\n\nexport type JevQuestions = Record<string, JevQuestion>;\n\ntype JevAnswer<QUESTION extends JevQuestion> = QUESTION extends { type: \"choice\" }\n ? {\n type: \"choice\";\n choice: string;\n probabilities: Record<string, number>;\n confidence: number;\n }\n : QUESTION extends { type: \"score\" }\n ? { type: \"score\"; score: number; confidence: number }\n : { type: \"boolean\"; probability: number };\n\nexport interface JevResult<QUESTIONS extends JevQuestions> {\n readonly answers: { [ID in keyof QUESTIONS]: JevAnswer<QUESTIONS[ID]> };\n readonly usage: {\n inputTokens: number | undefined;\n outputTokens: number | undefined;\n cost: number | undefined;\n };\n readonly model: string;\n}\n\nexport class JevNotConfiguredError extends Error {\n constructor() {\n super(\n `Jev has no provider with a key. Configure one of ${JEV_MODELS.map(([provider, id]) => `${provider}/${id}`).join(\", \")}, for example with OPENROUTER_API_KEY or TYPESAFE_API_KEY.`,\n );\n this.name = \"JevNotConfiguredError\";\n }\n}\n\nexport class JevRequestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"JevRequestError\";\n }\n}\n\nexport interface EvaluateWithJevOptions {\n abortSignal?: AbortSignal;\n caller: JevCaller;\n}\n\nconst mikanAuthContext: AuthContext = {\n async env(name) {\n return readEnv(name);\n },\n async fileExists() {\n return false;\n },\n};\n\nlet cachedModels: Models | undefined;\nlet daemonModels: MikanModels | undefined;\n\nexport function useJevModels(registry: MikanModels | undefined): void {\n daemonModels = registry;\n}\n\nfunction models(): Models {\n if (daemonModels) return daemonModels.models;\n cachedModels ??= builtinModels({ authContext: mikanAuthContext });\n return cachedModels;\n}\n\nasync function availableJev(): Promise<ClassifierModel<ClassifierApi> | undefined> {\n for (const [provider, id] of JEV_MODELS) {\n const model = models().getModelOfType(\"classifier\", provider, id);\n if (model && (await models().getAuth(model))) return model;\n }\n return undefined;\n}\n\nfunction text(entry: JevEntry | undefined, fallback: string): string {\n if (entry === undefined || entry === null) return fallback;\n return typeof entry === \"string\" ? entry : JSON.stringify(entry);\n}\n\nfunction toState(state: JevEntry): JsonObject {\n if (typeof state === \"string\") return { text: state };\n if (isRecord(state)) return state;\n return { value: state };\n}\n\nfunction toClassifierQuestion(question: JevQuestion): ClassifierQuestion {\n const instructions = text(question.instructions, \"\");\n if (question.type === \"boolean\") {\n return {\n type: \"bool\",\n instructions,\n criteria: {\n true: text(question.criteria?.true, \"Yes\"),\n false: text(question.criteria?.false, \"No\"),\n },\n };\n }\n if (question.type === \"choice\") {\n return {\n type: \"choice\",\n instructions,\n criteria: Object.fromEntries(\n Object.entries(question.criteria).map(([id, value]) => [id, text(value, id)]),\n ),\n };\n }\n if (question.criteria.length < 2) throw new Error(\"score questions need at least two levels\");\n return {\n type: \"score\",\n instructions,\n criteria: question.criteria.map((level) => text(level, \"\")),\n };\n}\n\nfunction fromClassifierAnswer(answer: ClassifierAnswer): JevAnswer<JevQuestion> {\n if (answer.type === \"bool\") return { type: \"boolean\", probability: answer.probability };\n return answer;\n}\n\nexport async function evaluateWithJev<const QUESTIONS extends JevQuestions>(\n state: JevEntry,\n questions: QUESTIONS,\n options: EvaluateWithJevOptions,\n): Promise<JevResult<QUESTIONS>> {\n const startedAt = Date.now();\n const fail = (error: Error): never => {\n recordJevOutcome({\n caller: options.caller,\n status: \"error\",\n errorType: error.name,\n durationMs: Date.now() - startedAt,\n });\n throw error;\n };\n\n const model = await availableJev();\n if (!model) return fail(new JevNotConfiguredError());\n\n const result = await models().classify(\n model,\n {\n state: toState(state),\n questions: Object.fromEntries(\n Object.entries(questions).map(([id, question]) => [id, toClassifierQuestion(question)]),\n ),\n },\n { signal: options.abortSignal, timeoutMs: JEV_TIMEOUT_MS, maxRetries: JEV_MAX_RETRIES },\n );\n if (result.stopReason !== \"stop\") {\n return fail(new JevRequestError(result.errorMessage ?? `Jev request ${result.stopReason}`));\n }\n\n recordJevOutcome({\n caller: options.caller,\n status: \"ok\",\n inputTokens: result.usage?.input,\n outputTokens: result.usage?.output,\n costUsd: result.usage?.cost.total,\n durationMs: Date.now() - startedAt,\n });\n\n const answers = {} as { [ID in keyof QUESTIONS]: JevAnswer<QUESTIONS[ID]> };\n for (const id of Object.keys(questions)) {\n const answer = result.answers[id];\n if (!answer) return fail(new JevRequestError(`Jev response missing answer for \"${id}\"`));\n (answers as Record<string, JevAnswer<JevQuestion>>)[id] = fromClassifierAnswer(answer);\n }\n\n return {\n answers,\n usage: {\n inputTokens: result.usage?.input,\n outputTokens: result.usage?.output,\n cost: result.usage?.cost.total,\n },\n model: result.model,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/harness/models.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,GAAG,EACR,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/harness/models.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,GAAG,EACR,KAAK,UAAU,EACf,KAAK,KAAK,EACV,KAAK,MAAM,EAIZ,MAAM,uBAAuB,CAAC;AAS/B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AA8C3D,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9D;AAgJD,qBAAa,WAAW;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,SAAS,CAAqB;IAEtC,OAAO,eAGN;IAED,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,wBAAwB,GAAG,WAAW,CAI5D;IAED,QAAQ,IAAI,MAAM,GAAG,SAAS,CAE7B;IAED,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAErB;IAED,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAE9D;IAED,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAMrD;IAEK,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAW1C;IAED,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAE1D;IAEK,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAOxE;CACF"}
|
package/dist/harness/models.js
CHANGED
|
@@ -7,7 +7,6 @@ import { googleGenerativeAIApi } from "@earendil-works/pi-ai/api/google-generati
|
|
|
7
7
|
import { mistralConversationsApi } from "@earendil-works/pi-ai/api/mistral-conversations.lazy";
|
|
8
8
|
import { openAICompletionsApi } from "@earendil-works/pi-ai/api/openai-completions.lazy";
|
|
9
9
|
import { openAIResponsesApi } from "@earendil-works/pi-ai/api/openai-responses.lazy";
|
|
10
|
-
import { typesafeSystemOneApi } from "@earendil-works/pi-ai/api/typesafe-system-one.lazy";
|
|
11
10
|
import { readJsonFileIfExists } from "../file-guards.js";
|
|
12
11
|
import { errorMessage } from "../unknown-values.js";
|
|
13
12
|
const CUSTOM_API_STREAMS = {
|
|
@@ -18,9 +17,6 @@ const CUSTOM_API_STREAMS = {
|
|
|
18
17
|
"openai-completions": openAICompletionsApi,
|
|
19
18
|
"openai-responses": openAIResponsesApi,
|
|
20
19
|
};
|
|
21
|
-
const CUSTOM_CLASSIFIER_APIS = {
|
|
22
|
-
"typesafe-system-one": typesafeSystemOneApi,
|
|
23
|
-
};
|
|
24
20
|
const DEFAULT_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
|
|
25
21
|
const DEFAULT_CONTEXT_WINDOW = 128000;
|
|
26
22
|
const DEFAULT_MAX_TOKENS = 16384;
|
|
@@ -46,19 +42,14 @@ function isModelsJsonConfig(parsed) {
|
|
|
46
42
|
if (!Array.isArray(models)) {
|
|
47
43
|
throw new Error(`models.json provider "${name}" models must be an array`);
|
|
48
44
|
}
|
|
45
|
+
const api = config.api;
|
|
46
|
+
if (typeof api !== "string" || !(api in CUSTOM_API_STREAMS)) {
|
|
47
|
+
throw new Error(`models.json provider "${name}" needs an "api" of: ${Object.keys(CUSTOM_API_STREAMS).join(", ")}`);
|
|
48
|
+
}
|
|
49
49
|
for (const model of models) {
|
|
50
50
|
if (!model || typeof model !== "object" || typeof model.id !== "string") {
|
|
51
51
|
throw new Error(`models.json provider "${name}" has a model without a string "id"`);
|
|
52
52
|
}
|
|
53
|
-
if (model.type === "classifier" &&
|
|
54
|
-
!(model.api !== undefined && model.api in CUSTOM_CLASSIFIER_APIS)) {
|
|
55
|
-
throw new Error(`models.json provider "${name}" classifier model "${model.id}" needs an "api" of: ${Object.keys(CUSTOM_CLASSIFIER_APIS).join(", ")}`);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
const api = config.api;
|
|
59
|
-
const hasChatModels = models.some((model) => model.type !== "classifier");
|
|
60
|
-
if (hasChatModels && (typeof api !== "string" || !(api in CUSTOM_API_STREAMS))) {
|
|
61
|
-
throw new Error(`models.json provider "${name}" needs an "api" of: ${Object.keys(CUSTOM_API_STREAMS).join(", ")}`);
|
|
62
53
|
}
|
|
63
54
|
}
|
|
64
55
|
}
|
|
@@ -74,7 +65,7 @@ function applyModelsJson(models, modelsJsonPath) {
|
|
|
74
65
|
if (providerConfig.models && providerConfig.models.length > 0) {
|
|
75
66
|
models.setProvider(buildCustomProvider(providerName, providerConfig));
|
|
76
67
|
}
|
|
77
|
-
else if (providerConfig.baseUrl || providerConfig.compat) {
|
|
68
|
+
else if (providerConfig.baseUrl || providerConfig.apiKey || providerConfig.compat) {
|
|
78
69
|
const builtin = models.getProvider(providerName);
|
|
79
70
|
if (builtin) {
|
|
80
71
|
models.setProvider(overrideBuiltinProvider(builtin, providerConfig));
|
|
@@ -91,21 +82,7 @@ function buildCustomProvider(providerName, config) {
|
|
|
91
82
|
const api = config.api;
|
|
92
83
|
const displayName = config.name ?? providerName;
|
|
93
84
|
const envVar = envVarNameFor(providerName);
|
|
94
|
-
const
|
|
95
|
-
const classifierConfigs = configs.filter((modelConfig) => modelConfig.type === "classifier");
|
|
96
|
-
const classifiers = classifierConfigs.map((modelConfig) => ({
|
|
97
|
-
type: "classifier",
|
|
98
|
-
id: modelConfig.id,
|
|
99
|
-
name: modelConfig.name ?? modelConfig.id,
|
|
100
|
-
api: modelConfig.api,
|
|
101
|
-
provider: providerName,
|
|
102
|
-
baseUrl: modelConfig.baseUrl ?? config.baseUrl ?? "",
|
|
103
|
-
input: modelConfig.input ?? ["text"],
|
|
104
|
-
cost: modelConfig.cost ?? DEFAULT_COST,
|
|
105
|
-
contextWindow: modelConfig.contextWindow ?? DEFAULT_CONTEXT_WINDOW,
|
|
106
|
-
}));
|
|
107
|
-
const chatConfigs = configs.filter((modelConfig) => modelConfig.type !== "classifier");
|
|
108
|
-
const models = chatConfigs.map((modelConfig) => {
|
|
85
|
+
const models = (config.models ?? []).map((modelConfig) => {
|
|
109
86
|
const model = {
|
|
110
87
|
id: modelConfig.id,
|
|
111
88
|
name: modelConfig.name ?? modelConfig.id,
|
|
@@ -147,14 +124,8 @@ function buildCustomProvider(providerName, config) {
|
|
|
147
124
|
},
|
|
148
125
|
},
|
|
149
126
|
},
|
|
150
|
-
models
|
|
151
|
-
api:
|
|
152
|
-
classifiers: classifiers.length > 0
|
|
153
|
-
? Object.fromEntries([...new Set(classifiers.map((model) => model.api))].map((classifierApi) => [
|
|
154
|
-
classifierApi,
|
|
155
|
-
CUSTOM_CLASSIFIER_APIS[classifierApi](),
|
|
156
|
-
]))
|
|
157
|
-
: undefined,
|
|
127
|
+
models,
|
|
128
|
+
api: CUSTOM_API_STREAMS[api](),
|
|
158
129
|
});
|
|
159
130
|
}
|
|
160
131
|
function overrideBuiltinProvider(provider, config) {
|
|
@@ -166,9 +137,24 @@ function overrideBuiltinProvider(provider, config) {
|
|
|
166
137
|
overridden.compat = config.compat;
|
|
167
138
|
return overridden;
|
|
168
139
|
});
|
|
140
|
+
const otherModels = (provider.getAllModels?.() ?? [])
|
|
141
|
+
.filter((model) => model.type !== "chat")
|
|
142
|
+
.map((model) => Object.assign({}, model, config.baseUrl ? { baseUrl: config.baseUrl } : {}));
|
|
143
|
+
const apiKey = config.apiKey;
|
|
169
144
|
return {
|
|
170
145
|
...provider,
|
|
146
|
+
auth: apiKey
|
|
147
|
+
? {
|
|
148
|
+
...provider.auth,
|
|
149
|
+
apiKey: {
|
|
150
|
+
name: provider.auth.apiKey?.name ?? `${provider.name} API key`,
|
|
151
|
+
check: async () => ({ type: "api_key", source: "models.json" }),
|
|
152
|
+
resolve: async () => ({ auth: { apiKey }, source: "models.json" }),
|
|
153
|
+
},
|
|
154
|
+
}
|
|
155
|
+
: provider.auth,
|
|
171
156
|
getModels: () => models,
|
|
157
|
+
getAllModels: () => [...models, ...otherModels],
|
|
172
158
|
};
|
|
173
159
|
}
|
|
174
160
|
export class MikanModels {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/harness/models.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport {\n createProvider,\n type Api,\n type AuthResult,\n type ClassifierApi,\n type ClassifierModel,\n type Model,\n type Models,\n type MutableModels,\n type Provider,\n type ProviderClassifier,\n type ProviderStreams,\n} from \"@earendil-works/pi-ai\";\nimport { builtinModels } from \"@earendil-works/pi-ai/providers/all\";\nimport { anthropicMessagesApi } from \"@earendil-works/pi-ai/api/anthropic-messages.lazy\";\nimport { azureOpenAIResponsesApi } from \"@earendil-works/pi-ai/api/azure-openai-responses.lazy\";\nimport { googleGenerativeAIApi } from \"@earendil-works/pi-ai/api/google-generative-ai.lazy\";\nimport { mistralConversationsApi } from \"@earendil-works/pi-ai/api/mistral-conversations.lazy\";\nimport { openAICompletionsApi } from \"@earendil-works/pi-ai/api/openai-completions.lazy\";\nimport { openAIResponsesApi } from \"@earendil-works/pi-ai/api/openai-responses.lazy\";\nimport { typesafeSystemOneApi } from \"@earendil-works/pi-ai/api/typesafe-system-one.lazy\";\nimport { readJsonFileIfExists } from \"../file-guards.js\";\nimport type { CreateMikanModelsOptions } from \"./types.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\nconst CUSTOM_API_STREAMS: Record<string, () => ProviderStreams> = {\n \"anthropic-messages\": anthropicMessagesApi,\n \"azure-openai-responses\": azureOpenAIResponsesApi,\n \"google-generative-ai\": googleGenerativeAIApi,\n \"mistral-conversations\": mistralConversationsApi,\n \"openai-completions\": openAICompletionsApi,\n \"openai-responses\": openAIResponsesApi,\n};\n\nconst CUSTOM_CLASSIFIER_APIS: Record<string, () => ProviderClassifier> = {\n \"typesafe-system-one\": typesafeSystemOneApi,\n};\n\nconst DEFAULT_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\nconst DEFAULT_CONTEXT_WINDOW = 128000;\nconst DEFAULT_MAX_TOKENS = 16384;\n\ninterface CustomModelConfig {\n id: string;\n type?: \"classifier\";\n name?: string;\n api?: string;\n baseUrl?: string;\n reasoning?: boolean;\n input?: (\"text\" | \"image\")[];\n cost?: { input: number; output: number; cacheRead: number; cacheWrite: number };\n contextWindow?: number;\n maxTokens?: number;\n maxOutputTokens?: number;\n thinkingLevelMap?: Model<Api>[\"thinkingLevelMap\"];\n headers?: Record<string, string>;\n compat?: unknown;\n}\n\ninterface CustomProviderConfig {\n name?: string;\n api?: string;\n baseUrl?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n compat?: unknown;\n models?: CustomModelConfig[];\n}\n\ninterface ModelsJsonConfig {\n providers?: Record<string, CustomProviderConfig>;\n}\n\nexport function defaultModelsJsonPath(stateDir: string): string {\n return join(stateDir, \"models.json\");\n}\n\nfunction isModelsJsonConfig(parsed: unknown): parsed is ModelsJsonConfig {\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(\"models.json must be a JSON object\");\n }\n const providers = (parsed as { providers?: unknown }).providers;\n if (providers === undefined) return true;\n if (!providers || typeof providers !== \"object\" || Array.isArray(providers)) {\n throw new Error('models.json \"providers\" must be an object');\n }\n for (const [name, config] of Object.entries(providers)) {\n if (!config || typeof config !== \"object\") {\n throw new Error(`models.json provider \"${name}\" must be an object`);\n }\n const models = (config as CustomProviderConfig).models;\n if (models !== undefined) {\n if (!Array.isArray(models)) {\n throw new Error(`models.json provider \"${name}\" models must be an array`);\n }\n for (const model of models) {\n if (!model || typeof model !== \"object\" || typeof model.id !== \"string\") {\n throw new Error(`models.json provider \"${name}\" has a model without a string \"id\"`);\n }\n if (\n model.type === \"classifier\" &&\n !(model.api !== undefined && model.api in CUSTOM_CLASSIFIER_APIS)\n ) {\n throw new Error(\n `models.json provider \"${name}\" classifier model \"${model.id}\" needs an \"api\" of: ${Object.keys(CUSTOM_CLASSIFIER_APIS).join(\", \")}`,\n );\n }\n }\n const api = (config as CustomProviderConfig).api;\n const hasChatModels = models.some((model) => model.type !== \"classifier\");\n if (hasChatModels && (typeof api !== \"string\" || !(api in CUSTOM_API_STREAMS))) {\n throw new Error(\n `models.json provider \"${name}\" needs an \"api\" of: ${Object.keys(CUSTOM_API_STREAMS).join(\", \")}`,\n );\n }\n }\n }\n return true;\n}\n\nfunction envVarNameFor(providerName: string): string {\n return `${providerName.replace(/[^a-zA-Z0-9]+/g, \"_\").toUpperCase()}_API_KEY`;\n}\n\nfunction applyModelsJson(\n models: ReturnType<typeof builtinModels>,\n modelsJsonPath: string,\n): string | undefined {\n try {\n const config = readJsonFileIfExists(\n modelsJsonPath,\n isModelsJsonConfig,\n (detail) => `models.json is invalid: ${detail}`,\n );\n for (const [providerName, providerConfig] of Object.entries(config?.providers ?? {})) {\n if (providerConfig.models && providerConfig.models.length > 0) {\n models.setProvider(buildCustomProvider(providerName, providerConfig));\n } else if (providerConfig.baseUrl || providerConfig.compat) {\n const builtin = models.getProvider(providerName);\n if (builtin) {\n models.setProvider(overrideBuiltinProvider(builtin, providerConfig));\n }\n }\n }\n return undefined;\n } catch (err) {\n return `Failed to load ${modelsJsonPath}: ${errorMessage(err)}`;\n }\n}\n\nfunction buildCustomProvider(providerName: string, config: CustomProviderConfig): Provider {\n const api = config.api;\n const displayName = config.name ?? providerName;\n const envVar = envVarNameFor(providerName);\n const configs = config.models ?? [];\n const classifierConfigs = configs.filter((modelConfig) => modelConfig.type === \"classifier\");\n const classifiers = classifierConfigs.map(\n (modelConfig): ClassifierModel<ClassifierApi> => ({\n type: \"classifier\",\n id: modelConfig.id,\n name: modelConfig.name ?? modelConfig.id,\n api: modelConfig.api!,\n provider: providerName,\n baseUrl: modelConfig.baseUrl ?? config.baseUrl ?? \"\",\n input: modelConfig.input ?? [\"text\"],\n cost: modelConfig.cost ?? DEFAULT_COST,\n contextWindow: modelConfig.contextWindow ?? DEFAULT_CONTEXT_WINDOW,\n }),\n );\n const chatConfigs = configs.filter((modelConfig) => modelConfig.type !== \"classifier\");\n const models = chatConfigs.map((modelConfig): Model<Api> => {\n const model: Model<Api> = {\n id: modelConfig.id,\n name: modelConfig.name ?? modelConfig.id,\n api: (modelConfig.api ?? api!) as Api,\n provider: providerName,\n baseUrl: modelConfig.baseUrl ?? config.baseUrl ?? \"\",\n reasoning: modelConfig.reasoning ?? false,\n input: modelConfig.input ?? [\"text\"],\n cost: modelConfig.cost ?? DEFAULT_COST,\n contextWindow: modelConfig.contextWindow ?? DEFAULT_CONTEXT_WINDOW,\n maxTokens: modelConfig.maxTokens ?? modelConfig.maxOutputTokens ?? DEFAULT_MAX_TOKENS,\n };\n if (modelConfig.thinkingLevelMap) model.thinkingLevelMap = modelConfig.thinkingLevelMap;\n if (modelConfig.headers ?? config.headers) {\n model.headers = { ...config.headers, ...modelConfig.headers };\n }\n const compat = modelConfig.compat ?? config.compat;\n if (compat) model.compat = compat as Model<Api>[\"compat\"];\n return model;\n });\n\n return createProvider({\n id: providerName,\n name: displayName,\n baseUrl: config.baseUrl,\n headers: config.headers,\n auth: {\n apiKey: {\n name: `${displayName} API key`,\n resolve: async ({ ctx, credential }) => {\n const key =\n (credential?.type === \"api_key\" ? credential.key : undefined) ??\n config.apiKey ??\n (await ctx.env(envVar));\n if (!key) return undefined;\n const source = config.apiKey ? \"models.json\" : envVar;\n return { auth: { apiKey: key }, source };\n },\n },\n },\n models: [...models, ...classifiers],\n api: api && chatConfigs.length > 0 ? CUSTOM_API_STREAMS[api]!() : undefined,\n classifiers:\n classifiers.length > 0\n ? Object.fromEntries(\n [...new Set(classifiers.map((model) => model.api))].map((classifierApi) => [\n classifierApi,\n CUSTOM_CLASSIFIER_APIS[classifierApi]!(),\n ]),\n )\n : undefined,\n });\n}\n\nfunction overrideBuiltinProvider(provider: Provider, config: CustomProviderConfig): Provider {\n const models = provider.getModels().map((model): Model<Api> => {\n const overridden: Model<Api> = Object.assign({}, model);\n if (config.baseUrl) overridden.baseUrl = config.baseUrl;\n if (config.compat) overridden.compat = config.compat as Model<Api>[\"compat\"];\n return overridden;\n });\n return {\n ...provider,\n getModels: () => models,\n };\n}\n\nexport class MikanModels {\n readonly models: Models;\n private loadError: string | undefined;\n\n private constructor(models: MutableModels, loadError: string | undefined) {\n this.models = models;\n this.loadError = loadError;\n }\n\n static create(options: CreateMikanModelsOptions): MikanModels {\n const models = builtinModels();\n const loadError = applyModelsJson(models, options.modelsJsonPath);\n return new MikanModels(models, loadError);\n }\n\n getError(): string | undefined {\n return this.loadError;\n }\n\n getAll(): Model<Api>[] {\n return [...this.models.getModels()];\n }\n\n find(provider: string, modelId: string): Model<Api> | undefined {\n return this.models.getModel(provider, modelId);\n }\n\n resolve(provider: string, modelId: string): Model<Api> {\n const model = this.find(provider, modelId);\n if (model) return model;\n throw new Error(\n `Unknown model \"${provider}/${modelId}\". Configure it in pi models.json or choose a registered model.`,\n );\n }\n\n async getAvailable(): Promise<Model<Api>[]> {\n const available = await Promise.all(\n this.models.getProviders().map(async (provider) => {\n try {\n return await this.models.getAvailable(provider.id);\n } catch {\n return [];\n }\n }),\n );\n return available.flat();\n }\n\n getAuth(model: Model<Api>): Promise<AuthResult | undefined> {\n return this.models.getAuth(model);\n }\n\n async getApiKeyForProvider(provider: string): Promise<string | undefined> {\n try {\n const auth = await this.models.getAuth(provider);\n return auth?.auth.apiKey;\n } catch {\n return undefined;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/harness/models.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport {\n createProvider,\n type Api,\n type AuthResult,\n type Model,\n type Models,\n type MutableModels,\n type Provider,\n type ProviderStreams,\n} from \"@earendil-works/pi-ai\";\nimport { builtinModels } from \"@earendil-works/pi-ai/providers/all\";\nimport { anthropicMessagesApi } from \"@earendil-works/pi-ai/api/anthropic-messages.lazy\";\nimport { azureOpenAIResponsesApi } from \"@earendil-works/pi-ai/api/azure-openai-responses.lazy\";\nimport { googleGenerativeAIApi } from \"@earendil-works/pi-ai/api/google-generative-ai.lazy\";\nimport { mistralConversationsApi } from \"@earendil-works/pi-ai/api/mistral-conversations.lazy\";\nimport { openAICompletionsApi } from \"@earendil-works/pi-ai/api/openai-completions.lazy\";\nimport { openAIResponsesApi } from \"@earendil-works/pi-ai/api/openai-responses.lazy\";\nimport { readJsonFileIfExists } from \"../file-guards.js\";\nimport type { CreateMikanModelsOptions } from \"./types.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\nconst CUSTOM_API_STREAMS: Record<string, () => ProviderStreams> = {\n \"anthropic-messages\": anthropicMessagesApi,\n \"azure-openai-responses\": azureOpenAIResponsesApi,\n \"google-generative-ai\": googleGenerativeAIApi,\n \"mistral-conversations\": mistralConversationsApi,\n \"openai-completions\": openAICompletionsApi,\n \"openai-responses\": openAIResponsesApi,\n};\n\nconst DEFAULT_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\nconst DEFAULT_CONTEXT_WINDOW = 128000;\nconst DEFAULT_MAX_TOKENS = 16384;\n\ninterface CustomModelConfig {\n id: string;\n name?: string;\n api?: string;\n baseUrl?: string;\n reasoning?: boolean;\n input?: (\"text\" | \"image\")[];\n cost?: { input: number; output: number; cacheRead: number; cacheWrite: number };\n contextWindow?: number;\n maxTokens?: number;\n maxOutputTokens?: number;\n thinkingLevelMap?: Model<Api>[\"thinkingLevelMap\"];\n headers?: Record<string, string>;\n compat?: unknown;\n}\n\ninterface CustomProviderConfig {\n name?: string;\n api?: string;\n baseUrl?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n compat?: unknown;\n models?: CustomModelConfig[];\n}\n\ninterface ModelsJsonConfig {\n providers?: Record<string, CustomProviderConfig>;\n}\n\nexport function defaultModelsJsonPath(stateDir: string): string {\n return join(stateDir, \"models.json\");\n}\n\nfunction isModelsJsonConfig(parsed: unknown): parsed is ModelsJsonConfig {\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(\"models.json must be a JSON object\");\n }\n const providers = (parsed as { providers?: unknown }).providers;\n if (providers === undefined) return true;\n if (!providers || typeof providers !== \"object\" || Array.isArray(providers)) {\n throw new Error('models.json \"providers\" must be an object');\n }\n for (const [name, config] of Object.entries(providers)) {\n if (!config || typeof config !== \"object\") {\n throw new Error(`models.json provider \"${name}\" must be an object`);\n }\n const models = (config as CustomProviderConfig).models;\n if (models !== undefined) {\n if (!Array.isArray(models)) {\n throw new Error(`models.json provider \"${name}\" models must be an array`);\n }\n const api = (config as CustomProviderConfig).api;\n if (typeof api !== \"string\" || !(api in CUSTOM_API_STREAMS)) {\n throw new Error(\n `models.json provider \"${name}\" needs an \"api\" of: ${Object.keys(CUSTOM_API_STREAMS).join(\", \")}`,\n );\n }\n for (const model of models) {\n if (!model || typeof model !== \"object\" || typeof model.id !== \"string\") {\n throw new Error(`models.json provider \"${name}\" has a model without a string \"id\"`);\n }\n }\n }\n }\n return true;\n}\n\nfunction envVarNameFor(providerName: string): string {\n return `${providerName.replace(/[^a-zA-Z0-9]+/g, \"_\").toUpperCase()}_API_KEY`;\n}\n\nfunction applyModelsJson(\n models: ReturnType<typeof builtinModels>,\n modelsJsonPath: string,\n): string | undefined {\n try {\n const config = readJsonFileIfExists(\n modelsJsonPath,\n isModelsJsonConfig,\n (detail) => `models.json is invalid: ${detail}`,\n );\n for (const [providerName, providerConfig] of Object.entries(config?.providers ?? {})) {\n if (providerConfig.models && providerConfig.models.length > 0) {\n models.setProvider(buildCustomProvider(providerName, providerConfig));\n } else if (providerConfig.baseUrl || providerConfig.apiKey || providerConfig.compat) {\n const builtin = models.getProvider(providerName);\n if (builtin) {\n models.setProvider(overrideBuiltinProvider(builtin, providerConfig));\n }\n }\n }\n return undefined;\n } catch (err) {\n return `Failed to load ${modelsJsonPath}: ${errorMessage(err)}`;\n }\n}\n\nfunction buildCustomProvider(providerName: string, config: CustomProviderConfig): Provider {\n const api = config.api!;\n const displayName = config.name ?? providerName;\n const envVar = envVarNameFor(providerName);\n const models = (config.models ?? []).map((modelConfig): Model<Api> => {\n const model: Model<Api> = {\n id: modelConfig.id,\n name: modelConfig.name ?? modelConfig.id,\n api: (modelConfig.api ?? api) as Api,\n provider: providerName,\n baseUrl: modelConfig.baseUrl ?? config.baseUrl ?? \"\",\n reasoning: modelConfig.reasoning ?? false,\n input: modelConfig.input ?? [\"text\"],\n cost: modelConfig.cost ?? DEFAULT_COST,\n contextWindow: modelConfig.contextWindow ?? DEFAULT_CONTEXT_WINDOW,\n maxTokens: modelConfig.maxTokens ?? modelConfig.maxOutputTokens ?? DEFAULT_MAX_TOKENS,\n };\n if (modelConfig.thinkingLevelMap) model.thinkingLevelMap = modelConfig.thinkingLevelMap;\n if (modelConfig.headers ?? config.headers) {\n model.headers = { ...config.headers, ...modelConfig.headers };\n }\n const compat = modelConfig.compat ?? config.compat;\n if (compat) model.compat = compat as Model<Api>[\"compat\"];\n return model;\n });\n\n return createProvider({\n id: providerName,\n name: displayName,\n baseUrl: config.baseUrl,\n headers: config.headers,\n auth: {\n apiKey: {\n name: `${displayName} API key`,\n resolve: async ({ ctx, credential }) => {\n const key =\n (credential?.type === \"api_key\" ? credential.key : undefined) ??\n config.apiKey ??\n (await ctx.env(envVar));\n if (!key) return undefined;\n const source = config.apiKey ? \"models.json\" : envVar;\n return { auth: { apiKey: key }, source };\n },\n },\n },\n models,\n api: CUSTOM_API_STREAMS[api]!(),\n });\n}\n\nfunction overrideBuiltinProvider(provider: Provider, config: CustomProviderConfig): Provider {\n const models = provider.getModels().map((model): Model<Api> => {\n const overridden: Model<Api> = Object.assign({}, model);\n if (config.baseUrl) overridden.baseUrl = config.baseUrl;\n if (config.compat) overridden.compat = config.compat as Model<Api>[\"compat\"];\n return overridden;\n });\n const otherModels = (provider.getAllModels?.() ?? [])\n .filter((model) => model.type !== \"chat\")\n .map((model) => Object.assign({}, model, config.baseUrl ? { baseUrl: config.baseUrl } : {}));\n const apiKey = config.apiKey;\n return {\n ...provider,\n auth: apiKey\n ? {\n ...provider.auth,\n apiKey: {\n name: provider.auth.apiKey?.name ?? `${provider.name} API key`,\n check: async () => ({ type: \"api_key\", source: \"models.json\" }),\n resolve: async () => ({ auth: { apiKey }, source: \"models.json\" }),\n },\n }\n : provider.auth,\n getModels: () => models,\n getAllModels: () => [...models, ...otherModels],\n };\n}\n\nexport class MikanModels {\n readonly models: Models;\n private loadError: string | undefined;\n\n private constructor(models: MutableModels, loadError: string | undefined) {\n this.models = models;\n this.loadError = loadError;\n }\n\n static create(options: CreateMikanModelsOptions): MikanModels {\n const models = builtinModels();\n const loadError = applyModelsJson(models, options.modelsJsonPath);\n return new MikanModels(models, loadError);\n }\n\n getError(): string | undefined {\n return this.loadError;\n }\n\n getAll(): Model<Api>[] {\n return [...this.models.getModels()];\n }\n\n find(provider: string, modelId: string): Model<Api> | undefined {\n return this.models.getModel(provider, modelId);\n }\n\n resolve(provider: string, modelId: string): Model<Api> {\n const model = this.find(provider, modelId);\n if (model) return model;\n throw new Error(\n `Unknown model \"${provider}/${modelId}\". Configure it in pi models.json or choose a registered model.`,\n );\n }\n\n async getAvailable(): Promise<Model<Api>[]> {\n const available = await Promise.all(\n this.models.getProviders().map(async (provider) => {\n try {\n return await this.models.getAvailable(provider.id);\n } catch {\n return [];\n }\n }),\n );\n return available.flat();\n }\n\n getAuth(model: Model<Api>): Promise<AuthResult | undefined> {\n return this.models.getAuth(model);\n }\n\n async getApiKeyForProvider(provider: string): Promise<string | undefined> {\n try {\n const auth = await this.models.getAuth(provider);\n return auth?.auth.apiKey;\n } catch {\n return undefined;\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/harness/runner.ts"],"names":[],"mappings":"AA8CA,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA6uBvE,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/harness/runner.ts"],"names":[],"mappings":"AA8CA,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA6uBvE,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CAyFxF"}
|
package/dist/harness/runner.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { contentText } from "@earendil-works/pi-ai";
|
|
2
1
|
import { SessionStore } from "../sessions/session-store.js";
|
|
3
2
|
import { CONTROL_INPUT_CUSTOM_TYPE, RUN_CAUSE_CUSTOM_TYPE, } from "../sessions/types.js";
|
|
4
3
|
import { MikanAgentSession, DEFAULT_EVENT_BUDGET } from "./session.js";
|
|
@@ -532,12 +531,6 @@ export async function createRunner(options) {
|
|
|
532
531
|
model,
|
|
533
532
|
getApiKey: () => modelRegistry.getApiKeyForProvider(model.provider),
|
|
534
533
|
outputDir: office.dir,
|
|
535
|
-
}, async (systemPrompt, user, signal) => {
|
|
536
|
-
const reply = await modelRegistry.models.completeSimple(model, { systemPrompt, messages: [{ role: "user", content: user, timestamp: Date.now() }] }, { signal });
|
|
537
|
-
if (reply.stopReason === "error" || reply.stopReason === "aborted") {
|
|
538
|
-
throw new Error(reply.errorMessage ?? `Text generation ${reply.stopReason}`);
|
|
539
|
-
}
|
|
540
|
-
return contentText(reply.content);
|
|
541
534
|
});
|
|
542
535
|
const systemPrompt = await buildInitialSystemPrompt({
|
|
543
536
|
office,
|