threenative-asset-mcp 0.9.0 → 0.9.2
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/README.md +87 -0
- package/dist/audio/fsutil.d.ts +7 -0
- package/dist/audio/fsutil.d.ts.map +1 -0
- package/dist/audio/fsutil.js +37 -0
- package/dist/audio/fsutil.js.map +1 -0
- package/dist/audio/generate.d.ts +95 -0
- package/dist/audio/generate.d.ts.map +1 -0
- package/dist/audio/generate.js +405 -0
- package/dist/audio/generate.js.map +1 -0
- package/dist/audio/inspect.d.ts +123 -0
- package/dist/audio/inspect.d.ts.map +1 -0
- package/dist/audio/inspect.js +464 -0
- package/dist/audio/inspect.js.map +1 -0
- package/dist/audio/semantic.d.ts +66 -0
- package/dist/audio/semantic.d.ts.map +1 -0
- package/dist/audio/semantic.js +197 -0
- package/dist/audio/semantic.js.map +1 -0
- package/dist/rig/fit.d.ts.map +1 -1
- package/dist/rig/fit.js +16 -3
- package/dist/rig/fit.js.map +1 -1
- package/dist/rig/preview.d.ts.map +1 -1
- package/dist/rig/preview.js +17 -5
- package/dist/rig/preview.js.map +1 -1
- package/dist/server.d.ts +5 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +33 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/audio.d.ts +622 -0
- package/dist/tools/audio.d.ts.map +1 -1
- package/dist/tools/audio.js +217 -1
- package/dist/tools/audio.js.map +1 -1
- package/dist/unreal/importer.d.ts +1 -1
- package/dist/unreal/importer.d.ts.map +1 -1
- package/dist/unreal/importer.js +17 -12
- package/dist/unreal/importer.js.map +1 -1
- package/dist/unreal/provision.d.ts +4 -1
- package/dist/unreal/provision.d.ts.map +1 -1
- package/dist/unreal/provision.js +8 -2
- package/dist/unreal/provision.js.map +1 -1
- package/dist/unreal/psa.d.ts.map +1 -1
- package/dist/unreal/psa.js +27 -9
- package/dist/unreal/psa.js.map +1 -1
- package/package.json +3 -1
- package/scripts/audio-semantic.py +168 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/audio/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EACL,cAAc,GAIf,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AA6BlD,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEzB,IAAI;IAEJ,SAAS;IAH3B,YACkB,IAA4B,EAC5C,OAAe,EACC,SAAS,GAAG,KAAK;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAJC,IAAI;yBAEJ,SAAS;QAGzB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,QAAQ,GAAG,+CAA+C,CAAC;AACjE,MAAM,QAAQ,GAAG,yBAAyB,CAAC;AAC3C,MAAM,aAAa,GAAG,eAAe,CAAC;AACtC,MAAM,kBAAkB,GACtB,kHAAkH,CAAC;AAErH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,sDAAsD;IACtD,cAAc,EAAE,KAAK;IACrB,kBAAkB,EAAE,GAAG;IACvB,kBAAkB,EAAE,EAAE;IACtB,gBAAgB,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;IAClC,SAAS,EAAE,OAAO;CACV,CAAC;AAqEX,MAAM,OAAO,cAAc;IACR,KAAK,CAA0B;IAC/B,QAAQ,CAAS;IACjB,cAAc,CAAqB;IACnC,UAAU,CAAS;IACnB,SAAS,CAAiB;IAE3C,YAAY,OAAO,GAA0B,EAAE;QAC7C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;QAC/C,IAAI,CAAC,QAAQ,GAAG,OAAO,CACrB,OAAO,CAAC,QAAQ;YACd,OAAO,CAAC,GAAG,CAAC,kBAAkB;YAC9B,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,uBAAuB,EAAE,OAAO,CAAC,CACjE,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;QACrC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,QAAQ,CAAC;QACjD,IAAI,CAAC,SAAS,GAAG,IAAI,cAAc,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED;;;;OAIG;IACK,MAAM;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAClE,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,kBAAkB,CAC1B,+BAA+B,EAC/B,uFAAuF;gBACrF,oFAAoF;gBACpF,iEAAiE,CACpE,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAA6B;QAC1C,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,cAAc,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAChE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAE9C,qFAAqF;QACrF,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAEnC,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,QAAQ,CAAC,cAAc,KAAK,cAAc,EAAE,CAAC;gBAC/C,MAAM,IAAI,kBAAkB,CAC1B,iCAAiC,EACjC,gGAAgG,CACjG,CAAC;YACJ,CAAC;YACD,IAAI,QAAQ,CAAC,KAAK,KAAK,iBAAiB,EAAE,CAAC;gBACzC,MAAM,IAAI,kBAAkB,CAC1B,gCAAgC,EAChC,+FAA+F;oBAC7F,8FAA8F,CACjG,CAAC;YACJ,CAAC;YACD,gEAAgE;YAChE,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE;YACnC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,KAAK,EAAE,WAAW;YAClB,cAAc;YACd,UAAU;YACV,QAAQ,EAAE,YAAY;YACtB,KAAK,EAAE,QAAQ;YACf,aAAa,EAAE,YAAY;YAC3B,gBAAgB,EAAE,kBAAkB;SACrC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAY;YACvB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,KAAK,EAAE,cAAc;YACrB,cAAc;YACd,UAAU;YACV,QAAQ,EAAE,YAAY;YACtB,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,KAAK,SAAS;gBAC1C,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC;YACtD,GAAG,CAAC,QAAQ,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC;YACvF,aAAa,EAAE,YAAY;YAC3B,gBAAgB,EAAE,kBAAkB;SACrC,CAAC;QAEF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC3C,MAAM,cAAc,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChD,OAAO,CAAC,MAAM,GAAG;YACf,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC;YAClC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU;SACpC,CAAC;QACF,MAAM,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAEzC,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED,kGAAkG;IAC1F,KAAK,CAAC,MAAM,CAClB,OAAgB,EAChB,GAAW,EACX,WAAmB,EACnB,OAA6B;QAE7B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,8FAA8F;YAC9F,uEAAuE;YACvE,MAAM,OAAO,CAAC,KAAK,KAAK,WAAW;gBACjC,CAAC,CAAC,IAAI,kBAAkB,CACpB,iCAAiC,EACjC,2EAA2E,CAC5E;gBACH,CAAC,CAAC,IAAI,kBAAkB,CACpB,gCAAgC,EAChC,8EAA8E,CAC/E,CAAC;QACR,CAAC;QACD,wFAAwF;QACxF,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,KAAK,UAAU,CAAC;QAC9C,uFAAuF;QACvF,IAAI,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACtE,MAAM,IAAI,kBAAkB,CAC1B,8BAA8B,EAC9B,iFAAiF,CAClF,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,GAAG;gBACZ,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,MAAM,UAAU,CAAC,OAAO,CAAC;gBACjC,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;aACtC,CAAC;YACF,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC;YAC5B,MAAM,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;aAAM,IAAI,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAC9D,MAAM,IAAI,kBAAkB,CAC1B,8BAA8B,EAC9B,wEAAwE,CACzE,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAC9C,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;YAC7B,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI;YAC7B,uBAAuB,EAAE,OAAO,CAAC,UAAU,CAAC,gBAAgB;YAC5D,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI;SACxC,CAAC,CAAC;QAEH,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC;QAC3B,OAAO,CAAC,kBAAkB,GAAG,UAAU,CAAC,QAAQ,CAAC;QACjD,MAAM,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAEzC,OAAO;YACL,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,QAAQ,EAAE,YAAY;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,iBAAiB,EAAE,OAAO,CAAC,UAAU;YACrC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5D,UAAU,EAAE,OAAO;YACnB,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI;YAC/B,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM;YACnC,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS;YACzC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI;YACzB,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM;YAC7B,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS;YACnC,GAAG,CAAC,OAAO,CAAC,iBAAiB,KAAK,SAAS;gBACzC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACrD,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;YACrF,aAAa,EAAE,YAAY;YAC3B,gBAAgB,EAAE,kBAAkB;YACpC,WAAW;YACX,QAAQ;YACR,UAAU;SACX,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,OAA6B;QAChE,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,kBAAkB,CAC1B,wBAAwB,EACxB,4EAA4E,CAC7E,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,OAAO,CAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;YACrC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CACrF,KAAK;gBACH,CAAC,CAAC,IAAI,CACF,IAAI,kBAAkB,CACpB,qCAAqC,EACrC,uFAAuF,CACxF,CACF;gBACH,CAAC,CAAC,IAAI,EAAE,CACX,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,CAAC;QACrC,6FAA6F;QAC7F,IAAI,OAAO,CAAC,UAAU,EAAE,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,iBAAiB,EAAE,CAAC,EAAE,CAAC;YAC5E,MAAM,IAAI,kBAAkB,CAC1B,qCAAqC,EACrC,wGAAwG,CACzG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,kFAAkF;IAC1E,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,WAAmB,EAAE,OAAgB;QACtE,IAAI,MAAM,CAAC;QACX,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,kBAAkB,CAC1B,iCAAiC,EACjC,2EAA2E,CAC5E,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QACD,KAAK,GAAG,CAAC;IACX,CAAC;IAEO,KAAK,CAAC,MAAM,CAClB,UAA6B,EAC7B,WAAmB;QAEnB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;QAEhE,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC/B,MAAM,EAAE,MAAM;gBACd,6EAA6E;gBAC7E,QAAQ,EAAE,OAAO;gBACjB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC;gBACtD,OAAO,EAAE;oBACP,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE;oBAC3B,cAAc,EAAE,kBAAkB;oBAClC,MAAM,EAAE,YAAY;oBACpB,YAAY,EAAE,uBAAuB;iBACtC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,IAAI,EAAE,UAAU,CAAC,IAAI;oBACrB,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;oBAC7C,IAAI,EAAE,UAAU,CAAC,IAAI;oBACrB,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;oBAC7C,QAAQ,EAAE,UAAU,CAAC,QAAQ;iBAC9B,CAAC;aACH,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,oFAAoF;YACpF,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;YAC/B,MAAM,IAAI,kBAAkB,CAC1B,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,yBAAyB,EACvE,yGAAyG,CAC1G,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,uFAAuF;YACvF,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACvC,MAAM,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC;QAC1E,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,SAAS,CAAC;QAEzE,IAAI,IAAgB,CAAC;QACrB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;gBACxC,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;YAC/B,MAAM,IAAI,kBAAkB,CAC1B,yBAAyB,EACzB,8EAA8E,CAC/E,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;YAC/B,MAAM,IAAI,kBAAkB,CAC1B,yBAAyB,EACzB,yEAAyE,CAC1E,CAAC;QACJ,CAAC;QACD,OAAO;YACL,IAAI;YACJ,GAAG,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC;YACjE,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;SACxD,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,KAAK,CAAC,UAAkB,EAAE,OAAe;QACrD,MAAM,SAAS,GAAG,GAAG,OAAO,UAAU,CAAC;QACvC,MAAM,IAAI,OAAO,CAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;YACrC,QAAQ,CACN,IAAI,CAAC,UAAU,EACf,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,EACpF,EAAE,OAAO,EAAE,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,EAC9D,CAAC,KAAK,EAAE,EAAE,CACR,KAAK;gBACH,CAAC,CAAC,IAAI,CACF,IAAI,kBAAkB,CACpB,+BAA+B,EAC/B,6EAA6E,EAC7E,IAAI,CACL,CACF;gBACH,CAAC,CAAC,IAAI,EAAE,CACb,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;CACF;AAED,SAAS,SAAS,CAAC,OAA6B;IAC9C,MAAM,IAAI,GAAG,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,cAAc,EAAE,CAAC;QACtE,MAAM,IAAI,kBAAkB,CAC1B,8BAA8B,EAC9B,oCAAoC,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,cAAc,CACzF,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC;IAC9C,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC1B,QAAQ,GAAG,eAAe,CAAC,kBAAkB;QAC7C,QAAQ,GAAG,eAAe,CAAC,kBAAkB,EAC7C,CAAC;QACD,MAAM,IAAI,kBAAkB,CAC1B,8BAA8B,EAC9B,mCAAmC,MAAM,CAAC,eAAe,CAAC,kBAAkB,CAAC,QAAQ,MAAM,CAAC,eAAe,CAAC,kBAAkB,CAAC,GAAG,CACnI,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,eAAe,IAAI,GAAG,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,kBAAkB,CAC1B,8BAA8B,EAC9B,0CAA0C,CAC3C,CAAC;IACJ,CAAC;IACD,oGAAoG;IACpG,MAAM,WAAW,GAAG,OAAO,CAAC,UAAiD,CAAC;IAC9E,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,CAAC;QAChF,IAAI,WAAW,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,kBAAkB,CAC1B,8BAA8B,EAC9B,cAAc,GAAG,wDAAwD,CAC1E,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO;QACL,IAAI;QACJ,gBAAgB,EAAE,QAAQ;QAC1B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK;QAC3B,gBAAgB,EAAE,SAAS;QAC3B,QAAQ,EAAE,QAAQ;QAClB,aAAa,EAAE,aAAa;KAC7B,CAAC;AACJ,CAAC;AAED,sFAAsF;AACtF,SAAS,iBAAiB,CAAC,MAAc;IACvC,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACrC,OAAO,IAAI,kBAAkB,CAC3B,4BAA4B,EAC5B,yGAAyG,CAC1G,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,IAAI,kBAAkB,CAC3B,6BAA6B,EAC7B,sFAAsF,EACtF,IAAI,CACL,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACrC,OAAO,IAAI,kBAAkB,CAC3B,yBAAyB,EACzB,gEAAgE,CACjE,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,kBAAkB,CAC3B,yBAAyB,EACzB,sCAAsC,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAC3E,MAAM,IAAI,GAAG,CACd,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,QAAkB,EAAE,GAAW;IACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,CAAC;IACvE,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,GAAG,EAAE,CAAC;QAChD,MAAM,IAAI,kBAAkB,CAC1B,0BAA0B,EAC1B,wEAAwE,CACzE,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;IAC1C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACjE,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,SAAS,CAAC;QACR,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI;YAAE,MAAM;QAChB,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC;YAC1B,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;gBAChB,wDAAwD;gBACxD,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,IAAI,kBAAkB,CAC1B,0BAA0B,EAC1B,wEAAwE,CACzE,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;IAC7B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,YAAY,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;AAClG,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,WAAmB;IAC5C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;IAC/C,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,MAAM,YAAY,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY;IACrC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,OAAgB;IACxD,MAAM,SAAS,GAAG,GAAG,IAAI,UAAU,CAAC;IACpC,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9E,MAAM,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,KAAiB;IAC3D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { type SemanticResult } from "./semantic.js";
|
|
2
|
+
/**
|
|
3
|
+
* Wrap the existing `threenative-playtest audio` inspector.
|
|
4
|
+
*
|
|
5
|
+
* Every measurement and every judgement about peaks, silence, bands and loop seams belongs to that
|
|
6
|
+
* package. This module only decides which bytes get inspected, translates the caller's expectations
|
|
7
|
+
* into its manifest, and turns its report into an agent-facing result that never overstates what was
|
|
8
|
+
* actually checked. It does not re-implement a single DSP routine, and it never repairs the input.
|
|
9
|
+
*/
|
|
10
|
+
export type AudioInspectErrorCode = "AUDIO_INSPECT_INVALID_INPUT" | "AUDIO_INSPECT_NOT_FOUND" | "AUDIO_INSPECT_OUTSIDE_ROOT" | "AUDIO_INSPECT_TOO_LARGE" | "AUDIO_INSPECT_UNSUPPORTED" | "AUDIO_INSPECT_TOOL_MISSING" | "AUDIO_INSPECT_FAILED";
|
|
11
|
+
export declare class AudioInspectError extends Error {
|
|
12
|
+
readonly code: AudioInspectErrorCode;
|
|
13
|
+
readonly retryable: boolean;
|
|
14
|
+
constructor(code: AudioInspectErrorCode, message: string, retryable?: boolean);
|
|
15
|
+
}
|
|
16
|
+
/** v1 limits, reported in every result so a caller never has to guess why something was refused. */
|
|
17
|
+
export declare const INSPECT_LIMITS: {
|
|
18
|
+
readonly maxBytes: number;
|
|
19
|
+
readonly maxSeconds: 60;
|
|
20
|
+
readonly maxChannels: 2;
|
|
21
|
+
readonly maxSampleRate: 96000;
|
|
22
|
+
/** Wall clock for the inspector subprocess itself. */
|
|
23
|
+
readonly timeoutMs: 120000;
|
|
24
|
+
/** stdout is a JSON report, not a stream; a runaway one is a failure, not something to buffer. */
|
|
25
|
+
readonly maxOutputBytes: number;
|
|
26
|
+
};
|
|
27
|
+
export declare const AUDIO_BAND_NAMES: readonly ["sub", "low", "mid", "high", "air"];
|
|
28
|
+
export type AudioBandName = (typeof AUDIO_BAND_NAMES)[number];
|
|
29
|
+
export interface AudioBandBound {
|
|
30
|
+
min?: number | undefined;
|
|
31
|
+
max?: number | undefined;
|
|
32
|
+
}
|
|
33
|
+
export interface AudioEmotionRequest {
|
|
34
|
+
sourceDescription: string;
|
|
35
|
+
targetMood: string;
|
|
36
|
+
alternativeMoods: string[];
|
|
37
|
+
}
|
|
38
|
+
type PartialBands = {
|
|
39
|
+
[K in AudioBandName]?: AudioBandBound | undefined;
|
|
40
|
+
};
|
|
41
|
+
export interface AudioInspectRequest {
|
|
42
|
+
path: string;
|
|
43
|
+
loop: boolean;
|
|
44
|
+
expectedDurationSeconds?: number | undefined;
|
|
45
|
+
expectedPrompt?: string | undefined;
|
|
46
|
+
alternativePrompts?: string[] | undefined;
|
|
47
|
+
emotion?: AudioEmotionRequest | undefined;
|
|
48
|
+
bands?: PartialBands | undefined;
|
|
49
|
+
peakMax?: number | undefined;
|
|
50
|
+
silenceRms?: number | undefined;
|
|
51
|
+
seamMaxRatio?: number | undefined;
|
|
52
|
+
semantic?: "off" | "clap" | undefined;
|
|
53
|
+
}
|
|
54
|
+
export interface AudioFinding {
|
|
55
|
+
name: string;
|
|
56
|
+
severity: "error" | "warning";
|
|
57
|
+
reason: string;
|
|
58
|
+
remedy?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface AudioMeasured {
|
|
61
|
+
durationSeconds: number;
|
|
62
|
+
sampleRate: number;
|
|
63
|
+
channels: number;
|
|
64
|
+
peak: number;
|
|
65
|
+
rms: number;
|
|
66
|
+
dc: number;
|
|
67
|
+
bands: Record<AudioBandName, number>;
|
|
68
|
+
seam?: {
|
|
69
|
+
wrap: number;
|
|
70
|
+
nearP99: number;
|
|
71
|
+
ratio: number;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export interface AudioInspectResult {
|
|
75
|
+
inputPath: string;
|
|
76
|
+
inputSha256: string;
|
|
77
|
+
inputSizeBytes: number;
|
|
78
|
+
analysis: {
|
|
79
|
+
inspector: string;
|
|
80
|
+
inspectorVersion: string;
|
|
81
|
+
adapterVersion: string;
|
|
82
|
+
};
|
|
83
|
+
limits: typeof INSPECT_LIMITS;
|
|
84
|
+
effectiveExpectations: Record<string, unknown>;
|
|
85
|
+
measured?: AudioMeasured;
|
|
86
|
+
findings: AudioFinding[];
|
|
87
|
+
spectrogramPath?: string;
|
|
88
|
+
technicalStatus: "pass" | "warn" | "fail" | "unverified";
|
|
89
|
+
promptFit: "consistent" | "possible_mismatch" | "unverified";
|
|
90
|
+
emotionFit: SemanticResult["emotionFit"];
|
|
91
|
+
semantic: SemanticResult["content"];
|
|
92
|
+
artisticQuality: "unverified";
|
|
93
|
+
recommendation: "reject" | "review" | "audition";
|
|
94
|
+
notes: string[];
|
|
95
|
+
cacheKey: string;
|
|
96
|
+
cached: boolean;
|
|
97
|
+
}
|
|
98
|
+
export interface AudioInspectorOptions {
|
|
99
|
+
/** Extra roots a caller may inspect, beyond the canonical audio download directory. */
|
|
100
|
+
inspectRoots?: string[];
|
|
101
|
+
audioDir?: string;
|
|
102
|
+
/** Overridden only by tests that need a fake inspector; production resolves the pinned package. */
|
|
103
|
+
inspectorBin?: string;
|
|
104
|
+
}
|
|
105
|
+
export declare class AudioInspector {
|
|
106
|
+
private readonly audioDir;
|
|
107
|
+
private readonly extraRoots;
|
|
108
|
+
private readonly inspectorBinOverride;
|
|
109
|
+
constructor(options?: AudioInspectorOptions);
|
|
110
|
+
/** Absolute path of the pinned inspector's declared binary. Never `npx`, never a shell lookup. */
|
|
111
|
+
resolveInspectorBin(): string;
|
|
112
|
+
private inspectorVersion;
|
|
113
|
+
inspect(request: AudioInspectRequest): Promise<AudioInspectResult>;
|
|
114
|
+
private resolveInput;
|
|
115
|
+
private allowedRoots;
|
|
116
|
+
private runInspection;
|
|
117
|
+
private semantics;
|
|
118
|
+
private keepSpectrogram;
|
|
119
|
+
private runInspector;
|
|
120
|
+
private assemble;
|
|
121
|
+
}
|
|
122
|
+
export {};
|
|
123
|
+
//# sourceMappingURL=inspect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../src/audio/inspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { homedir, tmpdir } from "node:os";
|
|
4
|
+
import { copyFile, lstat, mkdir, mkdtemp, readFile, readdir, realpath, rm, stat, writeFile, } from "node:fs/promises";
|
|
5
|
+
import { dirname, extname, join, resolve } from "node:path";
|
|
6
|
+
import { isInside, sha256File, sha256Json } from "./fsutil.js";
|
|
7
|
+
import { inspectSemantics } from "./semantic.js";
|
|
8
|
+
export class AudioInspectError extends Error {
|
|
9
|
+
code;
|
|
10
|
+
retryable;
|
|
11
|
+
constructor(code, message, retryable = false) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.code = code;
|
|
14
|
+
this.retryable = retryable;
|
|
15
|
+
this.name = "AudioInspectError";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/** v1 limits, reported in every result so a caller never has to guess why something was refused. */
|
|
19
|
+
export const INSPECT_LIMITS = {
|
|
20
|
+
maxBytes: 64 * 1024 * 1024,
|
|
21
|
+
maxSeconds: 60,
|
|
22
|
+
maxChannels: 2,
|
|
23
|
+
maxSampleRate: 96_000,
|
|
24
|
+
/** Wall clock for the inspector subprocess itself. */
|
|
25
|
+
timeoutMs: 120_000,
|
|
26
|
+
/** stdout is a JSON report, not a stream; a runaway one is a failure, not something to buffer. */
|
|
27
|
+
maxOutputBytes: 8 * 1024 * 1024,
|
|
28
|
+
};
|
|
29
|
+
const DECODABLE_EXTENSIONS = new Set([".wav", ".ogg", ".oga", ".mp3", ".flac"]);
|
|
30
|
+
/** Exit 69 from the inspector: ffmpeg absent. "I could not check" is never "I checked and it passed". */
|
|
31
|
+
const NO_DECODER_EXIT = 69;
|
|
32
|
+
export const AUDIO_BAND_NAMES = ["sub", "low", "mid", "high", "air"];
|
|
33
|
+
/** Bumped whenever this adapter changes how it translates or judges, so old cache entries retire. */
|
|
34
|
+
const ADAPTER_VERSION = "1";
|
|
35
|
+
export class AudioInspector {
|
|
36
|
+
audioDir;
|
|
37
|
+
extraRoots;
|
|
38
|
+
inspectorBinOverride;
|
|
39
|
+
constructor(options = {}) {
|
|
40
|
+
this.audioDir = resolve(options.audioDir ??
|
|
41
|
+
process.env.AUDIO_DOWNLOAD_DIR ??
|
|
42
|
+
join(homedir(), "Downloads", "threenative-asset-mcp", "audio"));
|
|
43
|
+
const configured = options.inspectRoots ??
|
|
44
|
+
(process.env.AUDIO_INSPECT_ROOTS ?? "")
|
|
45
|
+
.split(":")
|
|
46
|
+
.map((entry) => entry.trim())
|
|
47
|
+
.filter((entry) => entry.length > 0);
|
|
48
|
+
// The launch directory is included by default so an agent can inspect the game it is working in.
|
|
49
|
+
this.extraRoots = [...configured, process.cwd()].map((entry) => resolve(entry));
|
|
50
|
+
this.inspectorBinOverride = options.inspectorBin;
|
|
51
|
+
}
|
|
52
|
+
/** Absolute path of the pinned inspector's declared binary. Never `npx`, never a shell lookup. */
|
|
53
|
+
resolveInspectorBin() {
|
|
54
|
+
if (this.inspectorBinOverride !== undefined)
|
|
55
|
+
return this.inspectorBinOverride;
|
|
56
|
+
let manifestPath;
|
|
57
|
+
try {
|
|
58
|
+
manifestPath = createRequire(import.meta.url).resolve("@threenative/playtest/package.json");
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
throw new AudioInspectError("AUDIO_INSPECT_TOOL_MISSING", "The pinned @threenative/playtest inspector is not installed, so no audio was inspected.");
|
|
62
|
+
}
|
|
63
|
+
return join(dirname(manifestPath), "dist", "runner", "cli.js");
|
|
64
|
+
}
|
|
65
|
+
inspectorVersion() {
|
|
66
|
+
if (this.inspectorBinOverride !== undefined)
|
|
67
|
+
return "test-stub";
|
|
68
|
+
const manifest = createRequire(import.meta.url)("@threenative/playtest/package.json");
|
|
69
|
+
return manifest.version ?? "unknown";
|
|
70
|
+
}
|
|
71
|
+
async inspect(request) {
|
|
72
|
+
const file = await this.resolveInput(request.path);
|
|
73
|
+
const inputSha256 = await sha256File(file.path);
|
|
74
|
+
const expectations = effectiveExpectations(request);
|
|
75
|
+
const semanticRequest = semanticRequestOf(request);
|
|
76
|
+
const cacheKey = sha256Json({
|
|
77
|
+
adapter: ADAPTER_VERSION,
|
|
78
|
+
inspector: this.inspectorVersion(),
|
|
79
|
+
input: inputSha256,
|
|
80
|
+
expectations,
|
|
81
|
+
semantic: semanticRequest,
|
|
82
|
+
});
|
|
83
|
+
const cacheDir = join(this.audioDir, "inspections", cacheKey);
|
|
84
|
+
const cached = await readCached(cacheDir);
|
|
85
|
+
if (cached)
|
|
86
|
+
return { ...cached, cached: true };
|
|
87
|
+
const result = await this.runInspection({
|
|
88
|
+
cacheDir,
|
|
89
|
+
expectations,
|
|
90
|
+
file,
|
|
91
|
+
inputSha256,
|
|
92
|
+
request,
|
|
93
|
+
semanticRequest,
|
|
94
|
+
});
|
|
95
|
+
// The source bytes must be exactly what we measured; a changed file invalidates the whole result.
|
|
96
|
+
if ((await sha256File(file.path)) !== inputSha256) {
|
|
97
|
+
throw new AudioInspectError("AUDIO_INSPECT_FAILED", "The input file changed while it was being inspected, so the result would not describe it.", true);
|
|
98
|
+
}
|
|
99
|
+
await mkdir(cacheDir, { recursive: true, mode: 0o700 });
|
|
100
|
+
await writeFile(join(cacheDir, "result.json"), JSON.stringify(result, null, 2), {
|
|
101
|
+
mode: 0o600,
|
|
102
|
+
});
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
async resolveInput(rawPath) {
|
|
106
|
+
if (typeof rawPath !== "string" || rawPath.trim().length === 0) {
|
|
107
|
+
throw new AudioInspectError("AUDIO_INSPECT_INVALID_INPUT", "The audio path is empty.");
|
|
108
|
+
}
|
|
109
|
+
const candidate = resolve(rawPath);
|
|
110
|
+
let link;
|
|
111
|
+
try {
|
|
112
|
+
link = await lstat(candidate);
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
throw new AudioInspectError("AUDIO_INSPECT_NOT_FOUND", "No audio file exists at that path.");
|
|
116
|
+
}
|
|
117
|
+
if (!link.isFile() && !link.isSymbolicLink()) {
|
|
118
|
+
throw new AudioInspectError("AUDIO_INSPECT_INVALID_INPUT", "Only a regular audio file can be inspected.");
|
|
119
|
+
}
|
|
120
|
+
// Resolve first, then contain: a symlink that points outside the roots must not smuggle a file in.
|
|
121
|
+
let real;
|
|
122
|
+
try {
|
|
123
|
+
real = await realpath(candidate);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
throw new AudioInspectError("AUDIO_INSPECT_NOT_FOUND", "No audio file exists at that path.");
|
|
127
|
+
}
|
|
128
|
+
const info = await stat(real);
|
|
129
|
+
if (!info.isFile()) {
|
|
130
|
+
throw new AudioInspectError("AUDIO_INSPECT_INVALID_INPUT", "Only a regular audio file can be inspected.");
|
|
131
|
+
}
|
|
132
|
+
const roots = await this.allowedRoots();
|
|
133
|
+
if (!roots.some((root) => isInside(real, root))) {
|
|
134
|
+
throw new AudioInspectError("AUDIO_INSPECT_OUTSIDE_ROOT", "That path is outside the audio download directory and every configured AUDIO_INSPECT_ROOTS entry.");
|
|
135
|
+
}
|
|
136
|
+
if (!DECODABLE_EXTENSIONS.has(extname(real).toLowerCase())) {
|
|
137
|
+
throw new AudioInspectError("AUDIO_INSPECT_UNSUPPORTED", `Inspection accepts ${[...DECODABLE_EXTENSIONS].join(", ")}; playlists and other containers are refused.`);
|
|
138
|
+
}
|
|
139
|
+
if (info.size > INSPECT_LIMITS.maxBytes) {
|
|
140
|
+
throw new AudioInspectError("AUDIO_INSPECT_TOO_LARGE", `The file is larger than the ${String(INSPECT_LIMITS.maxBytes)}-byte inspection limit.`);
|
|
141
|
+
}
|
|
142
|
+
return { path: real, sizeBytes: info.size };
|
|
143
|
+
}
|
|
144
|
+
async allowedRoots() {
|
|
145
|
+
const roots = [];
|
|
146
|
+
for (const candidate of [this.audioDir, ...this.extraRoots]) {
|
|
147
|
+
try {
|
|
148
|
+
roots.push(await realpath(candidate));
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// A configured root that does not exist yet simply grants nothing.
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return roots;
|
|
155
|
+
}
|
|
156
|
+
async runInspection(context) {
|
|
157
|
+
const { file, request, semanticRequest } = context;
|
|
158
|
+
const workDir = await mkdtemp(join(tmpdir(), "asset-mcp-inspect-"));
|
|
159
|
+
const notes = [];
|
|
160
|
+
try {
|
|
161
|
+
// An immutable snapshot: the inspector reads our copy, so the caller's file cannot be touched
|
|
162
|
+
// and cannot change underneath the measurement.
|
|
163
|
+
const clipName = `clip${extname(file.path).toLowerCase()}`;
|
|
164
|
+
await copyFile(file.path, join(workDir, clipName));
|
|
165
|
+
const outDir = join(workDir, "artifacts");
|
|
166
|
+
await writeFile(join(workDir, "expect.json"), JSON.stringify(manifestFor(clipName, request), null, 2));
|
|
167
|
+
const run = await this.runInspector(workDir, outDir);
|
|
168
|
+
if (run.code === NO_DECODER_EXIT) {
|
|
169
|
+
notes.push("FFmpeg is not installed, so nothing was decoded and nothing was measured. This is not a pass.");
|
|
170
|
+
return this.assemble({
|
|
171
|
+
...context,
|
|
172
|
+
findings: [],
|
|
173
|
+
measured: undefined,
|
|
174
|
+
notes,
|
|
175
|
+
semantic: await this.semantics(semanticRequest, file.path, notes, false),
|
|
176
|
+
spectrogramPath: undefined,
|
|
177
|
+
technicalStatus: "unverified",
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
if (run.code !== 0 && run.code !== 1) {
|
|
181
|
+
throw new AudioInspectError("AUDIO_INSPECT_FAILED", `The inspector did not complete (exit ${String(run.code)}), so nothing was verified.`, true);
|
|
182
|
+
}
|
|
183
|
+
const report = parseReport(run.stdout);
|
|
184
|
+
const clip = report.clips.find((entry) => entry.path === clipName);
|
|
185
|
+
const findings = report.checks
|
|
186
|
+
.filter((check) => check.status !== "ok")
|
|
187
|
+
.map((check) => ({
|
|
188
|
+
name: check.name,
|
|
189
|
+
severity: check.status === "fail" ? "error" : "warning",
|
|
190
|
+
reason: check.detail,
|
|
191
|
+
...(check.fix === undefined ? {} : { remedy: check.fix }),
|
|
192
|
+
}));
|
|
193
|
+
if (report.checks.length === 0) {
|
|
194
|
+
throw new AudioInspectError("AUDIO_INSPECT_FAILED", "The inspector asserted nothing about this clip, so nothing was verified.", true);
|
|
195
|
+
}
|
|
196
|
+
const measured = clip ? measuredOf(clip.analysis) : undefined;
|
|
197
|
+
if (measured) {
|
|
198
|
+
findings.push(...limitFindings(measured));
|
|
199
|
+
findings.push(...durationFindings(measured, request.expectedDurationSeconds, notes));
|
|
200
|
+
}
|
|
201
|
+
const spectrogramPath = await this.keepSpectrogram(outDir, context.cacheDir);
|
|
202
|
+
const semantic = await this.semantics(semanticRequest, file.path, notes, true);
|
|
203
|
+
const hasError = findings.some((finding) => finding.severity === "error");
|
|
204
|
+
return this.assemble({
|
|
205
|
+
...context,
|
|
206
|
+
findings,
|
|
207
|
+
measured,
|
|
208
|
+
notes,
|
|
209
|
+
semantic,
|
|
210
|
+
spectrogramPath,
|
|
211
|
+
technicalStatus: hasError ? "fail" : findings.length > 0 ? "warn" : "pass",
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
finally {
|
|
215
|
+
await rm(workDir, { recursive: true, force: true });
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
async semantics(request, audioPath, notes, decoded) {
|
|
219
|
+
if (!request)
|
|
220
|
+
return inspectSemantics(undefined, audioPath);
|
|
221
|
+
if (!decoded) {
|
|
222
|
+
notes.push("Semantic comparison was skipped because the audio never decoded.");
|
|
223
|
+
return inspectSemantics(undefined, audioPath);
|
|
224
|
+
}
|
|
225
|
+
const result = await inspectSemantics(request, audioPath);
|
|
226
|
+
if (result.unavailableReason)
|
|
227
|
+
notes.push(result.unavailableReason);
|
|
228
|
+
return result;
|
|
229
|
+
}
|
|
230
|
+
async keepSpectrogram(outDir, cacheDir) {
|
|
231
|
+
let names;
|
|
232
|
+
try {
|
|
233
|
+
names = await readdir(outDir);
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
return undefined;
|
|
237
|
+
}
|
|
238
|
+
const png = names.find((name) => name.endsWith(".png"));
|
|
239
|
+
if (png === undefined)
|
|
240
|
+
return undefined;
|
|
241
|
+
await mkdir(cacheDir, { recursive: true, mode: 0o700 });
|
|
242
|
+
const kept = join(cacheDir, png);
|
|
243
|
+
await copyFile(join(outDir, png), kept);
|
|
244
|
+
return kept;
|
|
245
|
+
}
|
|
246
|
+
runInspector(workDir, outDir) {
|
|
247
|
+
const bin = this.resolveInspectorBin();
|
|
248
|
+
return new Promise((done, fail) => {
|
|
249
|
+
execFile(process.execPath, [bin, "audio", "--root", workDir, "--expect", "expect.json", "--out", outDir], {
|
|
250
|
+
timeout: INSPECT_LIMITS.timeoutMs,
|
|
251
|
+
maxBuffer: INSPECT_LIMITS.maxOutputBytes,
|
|
252
|
+
// No shell, an argument array, and nothing inherited that could redirect the decoder.
|
|
253
|
+
env: { PATH: process.env.PATH ?? "", HOME: process.env.HOME ?? "" },
|
|
254
|
+
windowsHide: true,
|
|
255
|
+
}, (error, stdout, stderr) => {
|
|
256
|
+
const code = error && typeof error.code === "number"
|
|
257
|
+
? error.code
|
|
258
|
+
: error
|
|
259
|
+
? -1
|
|
260
|
+
: 0;
|
|
261
|
+
if (code === -1) {
|
|
262
|
+
fail(new AudioInspectError("AUDIO_INSPECT_FAILED", "The inspector process could not be run to completion.", true));
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
done({ code, stdout, stderr });
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
assemble(context) {
|
|
270
|
+
const { semantic, technicalStatus } = context;
|
|
271
|
+
return {
|
|
272
|
+
inputPath: context.file.path,
|
|
273
|
+
inputSha256: context.inputSha256,
|
|
274
|
+
inputSizeBytes: context.file.sizeBytes,
|
|
275
|
+
analysis: {
|
|
276
|
+
inspector: "@threenative/playtest audio",
|
|
277
|
+
inspectorVersion: this.inspectorVersion(),
|
|
278
|
+
adapterVersion: ADAPTER_VERSION,
|
|
279
|
+
},
|
|
280
|
+
limits: INSPECT_LIMITS,
|
|
281
|
+
effectiveExpectations: context.expectations,
|
|
282
|
+
...(context.measured === undefined ? {} : { measured: context.measured }),
|
|
283
|
+
findings: context.findings,
|
|
284
|
+
...(context.spectrogramPath === undefined
|
|
285
|
+
? {}
|
|
286
|
+
: { spectrogramPath: context.spectrogramPath }),
|
|
287
|
+
technicalStatus,
|
|
288
|
+
promptFit: semantic.content.status,
|
|
289
|
+
emotionFit: semantic.emotionFit,
|
|
290
|
+
semantic: semantic.content,
|
|
291
|
+
artisticQuality: "unverified",
|
|
292
|
+
recommendation: recommend(technicalStatus, semantic),
|
|
293
|
+
notes: [
|
|
294
|
+
...context.notes,
|
|
295
|
+
"An audition recommendation is not a judgement of artistic quality; nobody listened to this.",
|
|
296
|
+
],
|
|
297
|
+
cacheKey: context.cacheDir.split("/").pop() ?? "",
|
|
298
|
+
cached: false,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/** Definite technical failures reject; anything incomplete or merely suspicious asks for review. */
|
|
303
|
+
function recommend(technicalStatus, semantic) {
|
|
304
|
+
if (technicalStatus === "fail")
|
|
305
|
+
return "reject";
|
|
306
|
+
if (technicalStatus === "warn" || technicalStatus === "unverified")
|
|
307
|
+
return "review";
|
|
308
|
+
// A requested check that could not be completed is not a check that passed.
|
|
309
|
+
if (semantic.content.status === "possible_mismatch")
|
|
310
|
+
return "review";
|
|
311
|
+
if (semantic.content.requested && semantic.content.status === "unverified")
|
|
312
|
+
return "review";
|
|
313
|
+
if (semantic.emotionFit.status === "possible_mismatch")
|
|
314
|
+
return "review";
|
|
315
|
+
if (semantic.emotionFit.status === "unverified")
|
|
316
|
+
return "review";
|
|
317
|
+
return "audition";
|
|
318
|
+
}
|
|
319
|
+
function manifestFor(clipName, request) {
|
|
320
|
+
return {
|
|
321
|
+
version: 1,
|
|
322
|
+
clips: [
|
|
323
|
+
{
|
|
324
|
+
path: clipName,
|
|
325
|
+
loop: request.loop,
|
|
326
|
+
...(request.bands === undefined ? {} : { bands: request.bands }),
|
|
327
|
+
...(request.peakMax === undefined ? {} : { peakMax: request.peakMax }),
|
|
328
|
+
...(request.silenceRms === undefined ? {} : { silenceRms: request.silenceRms }),
|
|
329
|
+
// The inspector refuses a seam bound on a one-shot, and it is right to.
|
|
330
|
+
...(request.seamMaxRatio === undefined || !request.loop
|
|
331
|
+
? {}
|
|
332
|
+
: { seamMaxRatio: request.seamMaxRatio }),
|
|
333
|
+
},
|
|
334
|
+
],
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
function effectiveExpectations(request) {
|
|
338
|
+
return {
|
|
339
|
+
loop: request.loop,
|
|
340
|
+
// Echoed exactly as sent, including the inspector's own defaults left unnamed, so a caller can
|
|
341
|
+
// see which floor they were actually held to.
|
|
342
|
+
peakMax: request.peakMax ?? 0.98,
|
|
343
|
+
silenceRms: request.silenceRms ?? 1e-4,
|
|
344
|
+
...(request.loop ? { seamMaxRatio: request.seamMaxRatio ?? 1.5 } : {}),
|
|
345
|
+
...(request.bands === undefined ? {} : { bands: request.bands }),
|
|
346
|
+
...(request.expectedDurationSeconds === undefined
|
|
347
|
+
? {}
|
|
348
|
+
: { expectedDurationSeconds: request.expectedDurationSeconds }),
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
function semanticRequestOf(request) {
|
|
352
|
+
if (request.semantic !== "clap")
|
|
353
|
+
return undefined;
|
|
354
|
+
return {
|
|
355
|
+
...(request.expectedPrompt === undefined ? {} : { expectedPrompt: request.expectedPrompt }),
|
|
356
|
+
...(request.alternativePrompts === undefined
|
|
357
|
+
? {}
|
|
358
|
+
: { alternativePrompts: request.alternativePrompts }),
|
|
359
|
+
...(request.emotion === undefined ? {} : { emotion: request.emotion }),
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
function parseReport(stdout) {
|
|
363
|
+
let raw;
|
|
364
|
+
try {
|
|
365
|
+
raw = JSON.parse(stdout);
|
|
366
|
+
}
|
|
367
|
+
catch {
|
|
368
|
+
throw new AudioInspectError("AUDIO_INSPECT_FAILED", "The inspector did not return a JSON report, so nothing was verified.", true);
|
|
369
|
+
}
|
|
370
|
+
if (typeof raw !== "object" ||
|
|
371
|
+
raw === null ||
|
|
372
|
+
!Array.isArray(raw.checks) ||
|
|
373
|
+
!Array.isArray(raw.clips)) {
|
|
374
|
+
throw new AudioInspectError("AUDIO_INSPECT_FAILED", "The inspector's report was not in the expected shape, so nothing was verified.", true);
|
|
375
|
+
}
|
|
376
|
+
return raw;
|
|
377
|
+
}
|
|
378
|
+
function measuredOf(analysis) {
|
|
379
|
+
const bands = Object.fromEntries(AUDIO_BAND_NAMES.map((name) => [name, analysis.bands[name] ?? 0]));
|
|
380
|
+
return {
|
|
381
|
+
durationSeconds: analysis.seconds,
|
|
382
|
+
sampleRate: analysis.sampleRate,
|
|
383
|
+
channels: analysis.channels,
|
|
384
|
+
peak: analysis.peak,
|
|
385
|
+
rms: analysis.rms,
|
|
386
|
+
dc: analysis.dc,
|
|
387
|
+
bands,
|
|
388
|
+
...(analysis.seam === undefined ? {} : { seam: analysis.seam }),
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
/** A nonfinite measurement is a broken measurement, never a quiet pass. */
|
|
392
|
+
function limitFindings(measured) {
|
|
393
|
+
const findings = [];
|
|
394
|
+
for (const [name, value] of [
|
|
395
|
+
["duration", measured.durationSeconds],
|
|
396
|
+
["peak", measured.peak],
|
|
397
|
+
["rms", measured.rms],
|
|
398
|
+
["dc", measured.dc],
|
|
399
|
+
]) {
|
|
400
|
+
if (!Number.isFinite(value)) {
|
|
401
|
+
findings.push({
|
|
402
|
+
name: `${name} is finite`,
|
|
403
|
+
severity: "error",
|
|
404
|
+
reason: `The inspector measured a non-finite ${name}, so this file's audio is not valid.`,
|
|
405
|
+
remedy: "Re-encode or regenerate the source; a non-finite sample cannot be played.",
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
if (measured.durationSeconds > INSPECT_LIMITS.maxSeconds) {
|
|
410
|
+
findings.push({
|
|
411
|
+
name: "within duration limit",
|
|
412
|
+
severity: "error",
|
|
413
|
+
reason: `The clip is ${measured.durationSeconds.toFixed(2)}s; this v1 inspects at most ${String(INSPECT_LIMITS.maxSeconds)}s.`,
|
|
414
|
+
remedy: "Inspect a shorter excerpt, or split the file.",
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
if (measured.channels > INSPECT_LIMITS.maxChannels) {
|
|
418
|
+
findings.push({
|
|
419
|
+
name: "within channel limit",
|
|
420
|
+
severity: "error",
|
|
421
|
+
reason: `The clip has ${String(measured.channels)} channels; this v1 inspects at most ${String(INSPECT_LIMITS.maxChannels)}.`,
|
|
422
|
+
remedy: "Downmix to mono or stereo before inspecting.",
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
if (measured.sampleRate > INSPECT_LIMITS.maxSampleRate) {
|
|
426
|
+
findings.push({
|
|
427
|
+
name: "within sample-rate limit",
|
|
428
|
+
severity: "error",
|
|
429
|
+
reason: `The clip is ${String(measured.sampleRate)} Hz; this v1 inspects at most ${String(INSPECT_LIMITS.maxSampleRate)} Hz.`,
|
|
430
|
+
remedy: "Inspect a copy at 96 kHz or below.",
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
return findings;
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Duration is the one expectation the inspector's manifest has no field for, so this adapter owns
|
|
437
|
+
* it. A mismatch is reported; the file is never trimmed to make the number true.
|
|
438
|
+
*/
|
|
439
|
+
function durationFindings(measured, expected, notes) {
|
|
440
|
+
if (expected === undefined)
|
|
441
|
+
return [];
|
|
442
|
+
const tolerance = Math.max(0.1, expected * 0.02);
|
|
443
|
+
const delta = Math.abs(measured.durationSeconds - expected);
|
|
444
|
+
if (delta <= tolerance)
|
|
445
|
+
return [];
|
|
446
|
+
notes.push(`Requested ${expected.toFixed(2)}s, measured ${measured.durationSeconds.toFixed(2)}s; nothing was trimmed.`);
|
|
447
|
+
return [
|
|
448
|
+
{
|
|
449
|
+
name: "duration matches request",
|
|
450
|
+
severity: "error",
|
|
451
|
+
reason: `The clip is ${measured.durationSeconds.toFixed(2)}s against a requested ${expected.toFixed(2)}s, outside the ${tolerance.toFixed(2)}s tolerance.`,
|
|
452
|
+
remedy: "Regenerate with the duration you want; this tool will not silently trim audio.",
|
|
453
|
+
},
|
|
454
|
+
];
|
|
455
|
+
}
|
|
456
|
+
async function readCached(cacheDir) {
|
|
457
|
+
try {
|
|
458
|
+
return JSON.parse(await readFile(join(cacheDir, "result.json"), "utf8"));
|
|
459
|
+
}
|
|
460
|
+
catch {
|
|
461
|
+
return undefined;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/audio/inspect.ts"],"names":[],"mappings":"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"}
|